@paralleltechnologies/hey-nestjs-generic-repository
v1.0.0
Published
Reusable code (decorators, DTOs, entities, filters, guards, interceptors and logger) for NestJs services
Downloads
2
Readme
para-nestjs-generic-repository
Description
Npm package with reusable code for data abstraction layer (generic-repository) and DynamoDB implementation (generic dyanmodb-repository) for NestJs services exposing a REST api.
Instanciation example can be found in hey-nestjs-template
Note that for table with TTL two behavior can be obtained
- with data retention (
dataRetentionInDays > 0
), query and get items returned are getting filtered out if TTL attribute is set, usingdelete
orbulkDelete
will set the TTL attribute - without data retention , items with TTL set will be returned by
query
,get
andbulkGet
, usingdelete
orbulkDelete
will delete items from the DB.
Exposed Methods
abstract query(conditions: BaseCondition[], params: Params): Promise<DocumentsRetrieverResponse<T>>;
abstract get(id: unknown): Promise<T>;
abstract bulkGet(items: T[]): Promise<(T | undefined)[]>;
abstract create(item: T): Promise<T>;
abstract bulkCreate(items: T[]): Promise<T[]>;
abstract update(id: unknown, item: T, conditions?: BaseCondition[]): Promise<T>;
abstract delete(id: unknown, conditions?: BaseCondition[]): Promise<void>;
abstract bulkDelete(conditionalItems: ConditionalItems<T>[]): Promise<void>;
Interfaces
interface DocumentsRetrieverResponse<T> {
data: T[];
metadata?: Cursor;
}
interface ConditionalItems<T> {
item: T;
conditions: BaseCondition[];
}
Conditions
Condition array can be passed to query
to filter results or to update
and delete
mainly to ensure collision-free operation.
KeyCondition
are used to require a specific value on a key attribute (HASH or RANGE)KeyBeginsWithCondition
are used to require a field beginning with a specific value on a key attribute (RANGE only)FilterCondition
are used to require a specific value for a non-key attribute (path can be specified for nested properties)ContainsCondition
are used to require that a specific value be contained in a array (path can be specified for nested array)BeginsWithCondition
are used to require a field beginning with a specific value and on a non-key attribute (path can be specified for nested properties)
Note that all conditions passed to a function must be satisfied (AND conditions only)
Example
For an item with the following structure :
{
itemId: '1',
numberProp: 1,
metadata: {
createdAt: '2022-11-21T23:04:47.926Z',
comment: 'Created',
version: 1,
updatedAt: '2022-11-21T23:04:48.368Z',
},
arrayProp: ['array1', 'array2'],
groupId: 'QUERY_GROUP',
stringProp: 'option1',
}
with itemId
and groupId
being the RANGE and HASH keys
The metadata version can be passed to update or delete operation to prevent collision on concurrent calls :
const conditions = [
new KeyCondition({
itemId:'1'
groupId:'QUERY_GROUP'
}),
new FilterCondition({'metadata.version':1})
];