1.0.0 • Published 1 year ago

@paralleltechonologies/hey-nestjs-generic-repository v1.0.0

Weekly downloads
-
License
UNLICENSED
Repository
-
Last release
1 year ago

para-nestjs-generic-repository

Serverless NestJS

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, using delete or bulkDelete will set the TTL attribute
  • without data retention , items with TTL set will be returned by query, get and bulkGet, using delete or bulkDelete 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})
     ];