db
- Project README
- Release/Build Status
- Changelog
- License
- Contribution Guidelines
- Code of Conduct
- Secure Coding Guidelines
Table of Contents
- Description
- Structure and Organisation
- Class Diagram
- Functionality
- Data Types
- Testing
- Proposed Functionality/Requirements
- References
Specification
Description
The db package contains the configuration and functionality of database used by the DMS
Structure and Organisation
Here is quick overview of the contents of this pacakge:
Files
-
README: Current file which is aimed towards developers who wish to use and modify the database functionality.
-
generic_repository: This file defines the interface defining the main methods for db pacakge. It is designed using generic types and can be adapted to specific data type as needed.
-
generic_entity_repository: This file contains the interface for those databases which will hold only a single record.
-
deployment: This file specifies a database interface having
types.DeploymentRequestFlatdata type. -
elk_stats: This file specifies a database interface having
types.RequestTrackerdata type. -
errors: This file specifies the different types of errors.
-
firecracker: This file specifies a database interface having
types.VirtualMachinedata type. -
machine: This file defines database interfaces of various data types.
-
utils: This file contains some utility functions with respect to database operations.
-
utils_test: This file contains unit tests for functions defined in utils.go file.
Subpackages
- clover: This folder contains CloverDB database implementation.
Class Diagram
The class diagram for the db package is shown below.
Source file
Rendered from source file
!$rootUrlGitlab = "https://gitlab.com/nunet/device-management-service/-/raw/main"
!$packageRelativePath = "/db/repositories"
!$packageUrlGitlab = $rootUrlGitlab + $packageRelativePath
!include $packageUrlGitlab/specs/class_diagram.puml
Functionality
There are two types of interfaces defined to cover database operations:
-
GenericRepository -
GenericEntityRepository
These interfaces are described below.
GenericRepository Interface
GenericRepository interface defines basic CRUD operations and standard querying methods. It is defined with generic data types. This allows it to be used for any data type.
- interface definition:
type GenericRepository[T ModelType] interface
The methods of GenericRepository are as follows:
Create
-
signature:
Create(ctx context.Context, data T) -> (T, error) -
input #1: Go context
-
input #2: Data to be added to the database. It should be of type used to initialize the repository
-
output (success): Data type used to initialize the repository
-
output (error): error message
Create function adds a new record to the database.
Get
-
signature:
Get(ctx context.Context, id interface{}) -> (T, error) -
input #1: Go context
-
input #2: Identifier of the record. Can be any data type
-
output (success): Data with the identifier provided. It is of type used to initialize the repository
-
output (error): error message
Get function retrieves a record from the database by its identifier.
Update
-
signature:
Update(ctx context.Context, id interface{}, data T) -> (T, error) -
input #1: Go context
-
input #2: Identifier of the record. Can be any data type
-
input #3: New data of type used to initialize the repository
-
output (success): Updated record of type used to initialize the repository
-
output (error): error message
Update function modifies an existing record in the database using its identifier.
Delete
-
signature:
Delete(ctx context.Context, id interface{}) -> error -
input #1: Go context
-
input #2: Identifier of the record. Can be any data type
-
output (success): None
-
output (error): error message
Delete function deletes an existing record in the database using its identifier.
Find
-
signature:
Find(ctx context.Context, query Query[T]) -> (T, error) -
input #1: Go context
-
input #2: Query of type
db.query -
output (success): Result of query having the data type used to initialize the repository
-
output (error): error message
Find function retrieves a single record from the database based on a query.
FindAll
-
signature:
FindAll(ctx context.Context, query Query[T]) -> ([]T, error) -
input #1: Go context
-
input #2: Query of type
db.query -
output (success): Lists of records based on query result. The data type of each record will be what was used to initialize the repository
-
output (error): error message
FindAll function retrieves multiple records from the database based on a query.
GetQuery
-
signature:
GetQuery() -> Query[T] -
input: None
-
output: Query of type
db.query
GetQuery function returns an empty query instance for the repository's type.
GenericEntityRepository Interface
GenericEntityRepository defines basic CRUD operations for repositories handling a single record. It is defined with generic data types. This allows it to be used for any data type.
- interface definition:
type GenericEntityRepository[T ModelType] interface
The methods of GenericEntityRepository are as follows:
Save
-
signature:
Save(ctx context.Context, data T) -> (T, error) -
input #1: Go context
-
input #2: Data to be saved of type used to initialize the database
-
output (success): Updated record of type used to initialize the repository
-
output (error): error message
Save function adds or updates a single record in the repository
Get
-
signature:
Get(ctx context.Context) -> (T, error) -
input: Go context
-
output (success): Record of type used to initialize the repository
-
output (error): error message
Get function retrieves the single record from the database.
Clear
-
signature:
Clear(ctx context.Context) -> error -
input: Go context
-
output (success): None
-
output (error): error
Clear function removes the record and its history from the repository.
History
-
signature:
History(ctx context.Context, qiery Query[T]) -> ([]T, error) -
input #1: Go context
-
input #2: query of type
db.query -
output (success):List of records of repository's type
-
output (error): error
History function retrieves previous records from the repository which satisfy the query conditions.
GetQuery
-
signature:
GetQuery() -> Query[T] -
input: None
-
output: New query of type
db.query
GetQuery function returns an empty query instance for the repository's type.
Data Types
db.Query: This contains parameters related to a query that is passed to the database.
type Query[T any] struct {
Instance T // Instance is an optional object of type T used to build conditions from its fields.
Conditions []db.QueryCondition // Conditions represent the conditions applied to the query.
SortBy string // SortBy specifies the field by which the query results should be sorted.
Limit int // Limit specifies the maximum number of results to return.
Offset int // Offset specifies the number of results to skip before starting to return data.
}
db.QueryCondition: This contains parameters defining a query condition.
type QueryCondition struct {
Field string // Field specifies the database or struct field to which the condition applies.
Operator string // Operator defines the comparison operator (e.g., "=", ">", "<").
Value interface{} // Value is the expected value for the given field.
}
Testing
The unit tests for utility functions are defined in utils_test.go. Refer to *_test.go files for unit tests of various implementations covered in subpackages.
Proposed Functionality / Requirements
List of issues
All issues that are related to the implementation of db package can be found below. These include any proposals for modifications to the package or new functionality needed to cover the requirements of other packages.