aws-service-stack 0.18.391 → 0.18.392

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,8 +7,8 @@ export declare class BaseRepoDBImpl<T extends BaseEntity> implements BaseRepoDB<
7
7
  private readonly DYNAMO_QUERY_LIMIT;
8
8
  deleteFields(id: string, fieldNames: string[]): Promise<Partial<T>>;
9
9
  fieldNotExists(fieldName: string, from: number, size: number): Promise<T[]>;
10
- incrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T>;
11
- decrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T>;
10
+ incrementValueByField(entityId: string, fieldName: string, value?: number, nestedFieldSeparator?: string): Promise<T>;
11
+ decrementValueByField(entityId: string, fieldName: string, value?: number, nestedFieldSeparator?: string): Promise<T>;
12
12
  transactWrite?(operations: any[]): Promise<boolean>;
13
13
  update(entity: Partial<T>): Promise<T>;
14
14
  updateMany(entityList: Partial<T>[], fields: string[], isTransactional: boolean): Promise<boolean>;
@@ -134,6 +134,32 @@ export interface BaseRepoDB<T extends BaseEntity> extends CoreRepo<T> {
134
134
  find(filter: Filter): Promise<List<Partial<T>>>;
135
135
  /** Executes a DynamoDB Scan with optional non-index filters. */
136
136
  scan(filter: Filter): Promise<List<Partial<T>>>;
137
- incrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T>;
138
- decrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T>;
137
+ /**
138
+ * Atomically increments a numeric field. Supports nested map attributes via `nestedFieldSeparator`.
139
+ * Initializes to `0` if the field does not exist. Leaf field must be in `indexMap.numberFields`.
140
+ *
141
+ * @param entityId - Partition key of the item.
142
+ * @param fieldName - Field name or separator-delimited path (e.g. `"stats.views"`).
143
+ * @param value - Amount to increment. Defaults to `1`. Must be positive.
144
+ * @param nestedFieldSeparator - If provided, splits `fieldName` into a nested path.
145
+ *
146
+ * @example
147
+ * repo.incrementValueByField(id, "views");
148
+ * repo.incrementValueByField(id, "stats.monthly.views", 5, ".");
149
+ */
150
+ incrementValueByField(entityId: string, fieldName: string, value?: number, nestedFieldSeparator?: string): Promise<T>;
151
+ /**
152
+ * Atomically decrements a numeric field. Supports nested map attributes via `nestedFieldSeparator`.
153
+ * Initializes to `0` if the field does not exist. Leaf field must be in `indexMap.numberFields`.
154
+ *
155
+ * @param entityId - Partition key of the item.
156
+ * @param fieldName - Field name or separator-delimited path (e.g. `"stats.stock"`).
157
+ * @param value - Amount to decrement. Defaults to `-1`. Must be negative.
158
+ * @param nestedFieldSeparator - If provided, splits `fieldName` into a nested path.
159
+ *
160
+ * @example
161
+ * repo.decrementValueByField(id, "stock");
162
+ * repo.decrementValueByField(id, "stats.monthly.stock", -3, ".");
163
+ */
164
+ decrementValueByField(entityId: string, fieldName: string, value?: number, nestedFieldSeparator?: string): Promise<T>;
139
165
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base-db.repo.interface.js","sourceRoot":"","sources":["../../src/repositories/base-db.repo.interface.ts"],"names":[],"mappings":"","sourcesContent":["import { DynamoIndexMap, List } from \"../index\";\nimport { CoreRepo } from \"./base-core.repo.interface\";\n\nimport { BaseEntity, Filter } from \"@chinggis/types\";\n\nexport interface BaseRepoDB<T extends BaseEntity> extends CoreRepo<T> {\n /**\n * Saves an entity by either creating it (if it does not exist) or updating it (if it does).\n *\n * @param entity - The entity to save.\n * @returns The saved entity.\n */\n save(entity: Partial<T>): Promise<T>;\n\n /**\n * Saves multiple entities by either creating or updating each one.\n *\n * @param entities - An array of entities to save.\n * @param isTransactional - Optional flag to indicate if the operation should be transactional.\n * @returns An array of saved entities.\n */\n saveMany(entities: Partial<T>[], isTransactional?: boolean): Promise<Partial<T>[]>;\n\n /**\n * Updates an existing entity.\n * Fails if the entity does not exist.\n *\n * @param entity - The entity with updated data.\n * @returns The updated entity.\n */\n update(entity: Partial<T>): Promise<T>;\n\n /**\n * Updates multiple existing entities.\n *\n * If `fieldNames` is **not provided**, the method performs a **batch update**\n * (e.g., using `BatchWriteItem` in DynamoDB, if supported). In this case, entire entities\n * are replaced or merged as a whole.\n *\n * If `fieldNames` **is provided**, each entity is updated individually, and only the\n * specified fields in `fieldNames` will be modified. This approach avoids overwriting\n * the entire entity and is useful for partial updates.\n *\n * Note:\n * - Entities must already exist in the data store.\n * - Batch update is not truly atomic; some partial updates may occur if errors happen mid-way.\n * - If partial field updates are needed, `fieldNames` must be used.\n *\n * @param entities - An array of entities with partial data to update.\n * @param isTransactional - Optional flag to indicate if the operation should be transactional.\n * @param fields - field names to update\n * @returns An array of successfully updated entities.\n */\n updateMany(entities: Partial<T>[], fields: string[], isTransactional?: boolean): Promise<boolean>;\n\n /**\n * Deletes an entity by its unique identifier.\n *\n * @param id - The ID of the entity to delete.\n * @returns True if the entity was successfully deleted; otherwise, false.\n */\n delete(id: string): Promise<boolean>;\n\n /**\n * Deletes multiple entities by their unique identifiers.\n *\n * @param ids - An array of entity IDs to delete.\n * @returns True if all entities were successfully deleted; otherwise, false.\n */\n deleteMany(ids: string[]): Promise<boolean>;\n\n /**\n * Executes a transactional write operation.\n * DynamoDB typically supports this for atomic operations.\n *\n * @param operations - An array of write operations (create, update, delete) to perform atomically.\n * @returns True if the transaction was successful; otherwise, false.\n */\n transactionWrite(operations: {\n create?: { tableName: string; item: Record<string, any> }[];\n update?: {\n tableName: string;\n key: { id: string };\n updateData: Record<string, any>;\n }[];\n delete?: { tableName: string; key: { id: string } }[];\n }): Promise<boolean>;\n\n /**\n * Executes a transactional read operation.\n * DynamoDB typically supports this for atomic read operations.\n *\n * @param operations - An array of read operations to perform atomically.\n * @returns An array of results from the transaction.\n */\n transactionRead<T>(operations: { id: string; sortKey?: string }[]): Promise<T[]>;\n\n /**\n * (Optional) Executes a transactional write operation.\n * DynamoDB typically only supports this.\n *\n * @param operations - An array of write operations to perform atomically.\n * @returns True if the transaction was successful; otherwise, false.\n */\n transactWrite?(operations: any[]): Promise<boolean>;\n\n /**\n * Deletes one or more fields (attributes) from a DynamoDB item by its partition key.\n *\n * This method uses the `REMOVE` operation of the UpdateExpression to remove specific fields\n * from an existing item in the table. It dynamically constructs the expression and returns\n * the updated item (after removal).\n *\n * @param id - The value of the partition key for the item to update.\n * @param fieldNames - An array of attribute names to be removed from the item.\n * @returns The updated item as a partial object, or `undefined` if no update was performed.\n */\n deleteFields(id: string, fieldNames: string[]): Promise<Partial<T>>;\n\n /**\n * (Optional) Executes a transactional read operation.\n * DynamoDB typically only supports this.\n *\n * @param operations - An array of read operations to perform atomically.\n * @returns An array of results from the transaction.\n */\n transactRead?<TResult = any>(operations: any[]): Promise<TResult[]>;\n\n setIndexMap(value: DynamoIndexMap): boolean;\n\n getIndexMap(): DynamoIndexMap;\n\n setTable(name: string): boolean;\n\n getTableName(): string;\n\n /** Executes a DynamoDB Query strictly (requires indexName and indexValue). */\n find(filter: Filter): Promise<List<Partial<T>>>;\n\n /** Executes a DynamoDB Scan with optional non-index filters. */\n scan(filter: Filter): Promise<List<Partial<T>>>;\n\n incrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T>;\n decrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T>;\n}\n"]}
1
+ {"version":3,"file":"base-db.repo.interface.js","sourceRoot":"","sources":["../../src/repositories/base-db.repo.interface.ts"],"names":[],"mappings":"","sourcesContent":["import { DynamoIndexMap, List } from \"../index\";\nimport { CoreRepo } from \"./base-core.repo.interface\";\n\nimport { BaseEntity, Filter } from \"@chinggis/types\";\n\nexport interface BaseRepoDB<T extends BaseEntity> extends CoreRepo<T> {\n /**\n * Saves an entity by either creating it (if it does not exist) or updating it (if it does).\n *\n * @param entity - The entity to save.\n * @returns The saved entity.\n */\n save(entity: Partial<T>): Promise<T>;\n\n /**\n * Saves multiple entities by either creating or updating each one.\n *\n * @param entities - An array of entities to save.\n * @param isTransactional - Optional flag to indicate if the operation should be transactional.\n * @returns An array of saved entities.\n */\n saveMany(entities: Partial<T>[], isTransactional?: boolean): Promise<Partial<T>[]>;\n\n /**\n * Updates an existing entity.\n * Fails if the entity does not exist.\n *\n * @param entity - The entity with updated data.\n * @returns The updated entity.\n */\n update(entity: Partial<T>): Promise<T>;\n\n /**\n * Updates multiple existing entities.\n *\n * If `fieldNames` is **not provided**, the method performs a **batch update**\n * (e.g., using `BatchWriteItem` in DynamoDB, if supported). In this case, entire entities\n * are replaced or merged as a whole.\n *\n * If `fieldNames` **is provided**, each entity is updated individually, and only the\n * specified fields in `fieldNames` will be modified. This approach avoids overwriting\n * the entire entity and is useful for partial updates.\n *\n * Note:\n * - Entities must already exist in the data store.\n * - Batch update is not truly atomic; some partial updates may occur if errors happen mid-way.\n * - If partial field updates are needed, `fieldNames` must be used.\n *\n * @param entities - An array of entities with partial data to update.\n * @param isTransactional - Optional flag to indicate if the operation should be transactional.\n * @param fields - field names to update\n * @returns An array of successfully updated entities.\n */\n updateMany(entities: Partial<T>[], fields: string[], isTransactional?: boolean): Promise<boolean>;\n\n /**\n * Deletes an entity by its unique identifier.\n *\n * @param id - The ID of the entity to delete.\n * @returns True if the entity was successfully deleted; otherwise, false.\n */\n delete(id: string): Promise<boolean>;\n\n /**\n * Deletes multiple entities by their unique identifiers.\n *\n * @param ids - An array of entity IDs to delete.\n * @returns True if all entities were successfully deleted; otherwise, false.\n */\n deleteMany(ids: string[]): Promise<boolean>;\n\n /**\n * Executes a transactional write operation.\n * DynamoDB typically supports this for atomic operations.\n *\n * @param operations - An array of write operations (create, update, delete) to perform atomically.\n * @returns True if the transaction was successful; otherwise, false.\n */\n transactionWrite(operations: {\n create?: { tableName: string; item: Record<string, any> }[];\n update?: {\n tableName: string;\n key: { id: string };\n updateData: Record<string, any>;\n }[];\n delete?: { tableName: string; key: { id: string } }[];\n }): Promise<boolean>;\n\n /**\n * Executes a transactional read operation.\n * DynamoDB typically supports this for atomic read operations.\n *\n * @param operations - An array of read operations to perform atomically.\n * @returns An array of results from the transaction.\n */\n transactionRead<T>(operations: { id: string; sortKey?: string }[]): Promise<T[]>;\n\n /**\n * (Optional) Executes a transactional write operation.\n * DynamoDB typically only supports this.\n *\n * @param operations - An array of write operations to perform atomically.\n * @returns True if the transaction was successful; otherwise, false.\n */\n transactWrite?(operations: any[]): Promise<boolean>;\n\n /**\n * Deletes one or more fields (attributes) from a DynamoDB item by its partition key.\n *\n * This method uses the `REMOVE` operation of the UpdateExpression to remove specific fields\n * from an existing item in the table. It dynamically constructs the expression and returns\n * the updated item (after removal).\n *\n * @param id - The value of the partition key for the item to update.\n * @param fieldNames - An array of attribute names to be removed from the item.\n * @returns The updated item as a partial object, or `undefined` if no update was performed.\n */\n deleteFields(id: string, fieldNames: string[]): Promise<Partial<T>>;\n\n /**\n * (Optional) Executes a transactional read operation.\n * DynamoDB typically only supports this.\n *\n * @param operations - An array of read operations to perform atomically.\n * @returns An array of results from the transaction.\n */\n transactRead?<TResult = any>(operations: any[]): Promise<TResult[]>;\n\n setIndexMap(value: DynamoIndexMap): boolean;\n\n getIndexMap(): DynamoIndexMap;\n\n setTable(name: string): boolean;\n\n getTableName(): string;\n\n /** Executes a DynamoDB Query strictly (requires indexName and indexValue). */\n find(filter: Filter): Promise<List<Partial<T>>>;\n\n /** Executes a DynamoDB Scan with optional non-index filters. */\n scan(filter: Filter): Promise<List<Partial<T>>>;\n\n /**\n * Atomically increments a numeric field. Supports nested map attributes via `nestedFieldSeparator`.\n * Initializes to `0` if the field does not exist. Leaf field must be in `indexMap.numberFields`.\n *\n * @param entityId - Partition key of the item.\n * @param fieldName - Field name or separator-delimited path (e.g. `\"stats.views\"`).\n * @param value - Amount to increment. Defaults to `1`. Must be positive.\n * @param nestedFieldSeparator - If provided, splits `fieldName` into a nested path.\n *\n * @example\n * repo.incrementValueByField(id, \"views\");\n * repo.incrementValueByField(id, \"stats.monthly.views\", 5, \".\");\n */\n incrementValueByField(entityId: string, fieldName: string, value?: number, nestedFieldSeparator?: string): Promise<T>;\n\n /**\n * Atomically decrements a numeric field. Supports nested map attributes via `nestedFieldSeparator`.\n * Initializes to `0` if the field does not exist. Leaf field must be in `indexMap.numberFields`.\n *\n * @param entityId - Partition key of the item.\n * @param fieldName - Field name or separator-delimited path (e.g. `\"stats.stock\"`).\n * @param value - Amount to decrement. Defaults to `-1`. Must be negative.\n * @param nestedFieldSeparator - If provided, splits `fieldName` into a nested path.\n *\n * @example\n * repo.decrementValueByField(id, \"stock\");\n * repo.decrementValueByField(id, \"stats.monthly.stock\", -3, \".\");\n */\n decrementValueByField(entityId: string, fieldName: string, value?: number, nestedFieldSeparator?: string): Promise<T>;\n}"]}
@@ -74,17 +74,19 @@ class BaseRepoDBImpl {
74
74
  fieldNotExists(fieldName, from, size) {
75
75
  throw new Error("Method not implemented.");
76
76
  }
77
- incrementValueByField(entityId, fieldName, value) {
77
+ incrementValueByField(entityId, fieldName, value, nestedFieldSeparator) {
78
78
  if (value < 0) {
79
79
  throw new Error("Increment operation only supports positive values");
80
80
  }
81
- return this.incrementOrDecrementFieldValue(entityId, fieldName, value ?? 1);
81
+ const fieldPath = nestedFieldSeparator ? fieldName.split(nestedFieldSeparator) : [fieldName];
82
+ return this.incrementOrDecrementFieldValue(entityId, fieldPath, value ?? 1);
82
83
  }
83
- decrementValueByField(entityId, fieldName, value) {
84
+ decrementValueByField(entityId, fieldName, value, nestedFieldSeparator) {
84
85
  if (value > 0) {
85
86
  throw new errors_1.ErrorDynamoDB(this._tableName, `Decrement operation only supports negative values, inputValue: ${value}, for field: ${fieldName}`);
86
87
  }
87
- return this.incrementOrDecrementFieldValue(entityId, fieldName, value ?? -1);
88
+ const fieldPath = nestedFieldSeparator ? fieldName.split(nestedFieldSeparator) : [fieldName];
89
+ return this.incrementOrDecrementFieldValue(entityId, fieldPath, value ?? -1);
88
90
  }
89
91
  transactWrite(operations) {
90
92
  throw new Error("Method not implemented.");
@@ -421,18 +423,22 @@ class BaseRepoDBImpl {
421
423
  }
422
424
  return allSavedEntities;
423
425
  }
424
- async incrementOrDecrementFieldValue(entityId, fieldName, delta) {
426
+ async incrementOrDecrementFieldValue(entityId, fieldPath, delta) {
425
427
  const partitionKey = this._indexMap.partitionKey;
426
- if (!this?._indexMap?.numberFields?.includes(fieldName)) {
427
- throw new Error(`${fieldName} field not found in indexMap.numberFields`);
428
+ const leafField = fieldPath[fieldPath.length - 1];
429
+ if (!this?._indexMap?.numberFields?.includes(leafField)) {
430
+ throw new Error(`${leafField} field not found in indexMap.numberFields`);
428
431
  }
432
+ const expressionAttributeNames = {};
433
+ fieldPath.forEach((segment, i) => {
434
+ expressionAttributeNames[`#f${i}`] = segment;
435
+ });
436
+ const pathExpr = fieldPath.map((_, i) => `#f${i}`).join(".");
429
437
  const params = {
430
438
  TableName: this._tableName,
431
439
  Key: (0, util_dynamodb_1.marshall)({ [partitionKey]: entityId }),
432
- UpdateExpression: `SET #field = if_not_exists(#field, :start) + :delta`,
433
- ExpressionAttributeNames: {
434
- "#field": fieldName,
435
- },
440
+ UpdateExpression: `SET ${pathExpr} = if_not_exists(${pathExpr}, :start) + :delta`,
441
+ ExpressionAttributeNames: expressionAttributeNames,
436
442
  ExpressionAttributeValues: {
437
443
  ":delta": (0, util_dynamodb_1.marshall)(delta),
438
444
  ":start": (0, util_dynamodb_1.marshall)(0),
@@ -1 +1 @@
1
- {"version":3,"file":"base-db.repo.js","sourceRoot":"","sources":["../../src/repositories/base-db.repo.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AttributeValue,\n BatchGetItemCommand,\n BatchWriteItemCommand,\n BatchWriteItemCommandInput,\n DeleteItemCommand,\n GetItemCommand,\n PutItemCommand,\n QueryCommand,\n QueryCommandInput,\n QueryCommandOutput,\n ReturnValue,\n ScanCommand,\n ScanCommandInput,\n ScanCommandOutput,\n TransactWriteItemsCommand,\n TransactWriteItemsCommandInput,\n UpdateItemCommand,\n UpdateItemCommandInput,\n} from \"@aws-sdk/client-dynamodb\";\nimport { marshall, unmarshall } from \"@aws-sdk/util-dynamodb\";\nimport {\n addIndexValue,\n BaseRepoDB,\n buildDynamoDBFilterConditions,\n buildDynamoDBQueryCommand,\n buildDynamoDBScanCommand,\n buildQueryDB,\n buildUpdateExpressions,\n chunkArray,\n DBClientDynamoDB,\n DynamoIndexMap,\n generateLastEvaluatedKey,\n generateUUID,\n List,\n parseIndexFilter,\n parseLastEvaluatedKey,\n removeFields,\n toBase64,\n unMarshall,\n} from \"../index\";\nimport Container, { Service } from \"typedi\";\nimport { ErrorDynamoDB } from \"../exception/errors\";\nimport { BaseEntity, Filter } from \"@chinggis/types\";\n\nService(\"BaseRepoDB\");\n\nexport class BaseRepoDBImpl<T extends BaseEntity> implements BaseRepoDB<T> {\n private readonly dynamoDb: DBClientDynamoDB = Container.get(\"DBClientDynamoDB\");\n private _tableName: string;\n private _indexMap: DynamoIndexMap;\n private readonly DYNAMO_QUERY_LIMIT: number = 25;\n\n async deleteFields(id: string, fieldNames: string[]): Promise<Partial<T>> {\n if (!id || fieldNames.length === 0) {\n return undefined;\n }\n\n const partitionKey = this._indexMap.partitionKey;\n const expressionAttributeNames: Record<string, string> = {};\n const removeExpressions: string[] = [];\n\n for (const field of fieldNames) {\n const placeholder = `#${field}`;\n expressionAttributeNames[placeholder] = field;\n removeExpressions.push(placeholder);\n }\n\n const updateExpression = `REMOVE ${removeExpressions.join(\", \")}`;\n\n const params = {\n TableName: this._tableName,\n Key: marshall({ [partitionKey]: id }),\n UpdateExpression: updateExpression,\n ExpressionAttributeNames: expressionAttributeNames,\n ReturnValues: \"ALL_NEW\" as const,\n };\n\n const result = await this.dynamoDb.send(new UpdateItemCommand(params));\n if (!result.Attributes) {\n throw new Error(\"No attributes returned from UpdateItem.\");\n }\n\n return unmarshall(result.Attributes) as Partial<T>;\n }\n\n fieldNotExists(fieldName: string, from: number, size: number): Promise<T[]> {\n throw new Error(\"Method not implemented.\");\n }\n\n incrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T> {\n if (value < 0) {\n throw new Error(\"Increment operation only supports positive values\");\n }\n\n return this.incrementOrDecrementFieldValue(entityId, fieldName, value ?? 1);\n }\n\n decrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T> {\n if (value > 0) {\n throw new ErrorDynamoDB(\n this._tableName,\n `Decrement operation only supports negative values, inputValue: ${value}, for field: ${fieldName}`,\n );\n }\n return this.incrementOrDecrementFieldValue(entityId, fieldName, value ?? -1);\n }\n\n transactWrite?(operations: any[]): Promise<boolean> {\n throw new Error(\"Method not implemented.\");\n }\n\n async update(entity: Partial<T>): Promise<T> {\n const partitionKey = this._indexMap.partitionKey;\n\n if (!entity[partitionKey]) {\n throw new ErrorDynamoDB(this._tableName, `Entity must have value in field ${partitionKey}`);\n }\n\n const indexedItem = addIndexValue(entity, this._indexMap);\n\n const { UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues } = buildUpdateExpressions(\n indexedItem,\n [partitionKey],\n );\n\n const params = {\n TableName: this._tableName,\n Key: marshall({ [partitionKey]: indexedItem[partitionKey] }),\n UpdateExpression,\n ExpressionAttributeNames,\n ExpressionAttributeValues,\n ReturnValues: ReturnValue.ALL_NEW,\n };\n\n const result = await this.dynamoDb.send(new UpdateItemCommand(params));\n if (!result.Attributes) {\n throw new Error(\"No attributes returned from UpdateItem.\");\n }\n return unmarshall(result.Attributes) as T;\n }\n\n async updateMany(entityList: Partial<T>[], fields: string[], isTransactional: boolean): Promise<boolean> {\n if (isTransactional === undefined || isTransactional === false || isTransactional === null)\n return await this.updateManyNormal(entityList, fields);\n\n return await this.updateManyTransactional(entityList, fields);\n }\n\n async save(entity: Partial<T>): Promise<T> {\n const partitionKey = this._indexMap.partitionKey;\n\n if (!entity[partitionKey]) throw new Error(`Entity must have a ${partitionKey} field.`);\n\n const indexedItem = addIndexValue(entity, this._indexMap);\n\n const params = {\n TableName: this._tableName,\n Item: marshall(indexedItem, { removeUndefinedValues: true }),\n };\n try {\n await this.dynamoDb.send(new PutItemCommand(params));\n\n return entity as T;\n } catch (error) {\n console.error(\"Error saving entity:\", error);\n throw new ErrorDynamoDB(this._tableName, params, error);\n }\n }\n\n async saveMany(entities: Partial<T>[], isTransactional?: boolean): Promise<Partial<T>[]> {\n if (isTransactional === undefined || isTransactional === null || isTransactional === false)\n return await this.saveManyNormal(entities);\n return await this.saveManyTransactional(entities);\n }\n\n async delete(id: string): Promise<boolean> {\n const params = {\n TableName: this._tableName,\n Key: marshall({ [this._indexMap.partitionKey]: id }),\n };\n\n try {\n await this.dynamoDb.send(new DeleteItemCommand(params));\n return true;\n } catch (error) {\n console.error(\"Error deleting item:\", error);\n throw new ErrorDynamoDB(this._tableName, params, error);\n }\n }\n\n async deleteMany(ids: string[]): Promise<boolean> {\n if (ids?.length === 0) return false;\n const chunked = chunkArray(ids, 25);\n for (const chunk of chunked) {\n const deleteRequests = chunk.map((id) => {\n return {\n DeleteRequest: {\n Key: marshall({ [this._indexMap.partitionKey]: id }),\n },\n };\n });\n\n const params = {\n RequestItems: {\n [this._tableName]: deleteRequests,\n },\n };\n\n await this.dynamoDb.send(new BatchWriteItemCommand(params));\n }\n return true;\n }\n\n async findById(id: string): Promise<T> {\n const params = {\n TableName: this._tableName,\n Key: marshall({ [this._indexMap.partitionKey]: id }),\n };\n\n try {\n const result = await this.dynamoDb.send(new GetItemCommand(params));\n if (!result.Item) return null;\n return unmarshall(result.Item) as T;\n } catch (error) {\n console.error(\"Error getting item:\", error);\n throw new ErrorDynamoDB(this._tableName, params, error);\n }\n }\n\n async findByIds(ids: string[]): Promise<T[]> {\n let items: T[] = [];\n if (!ids || ids.length === 0) throw new Error(\"Item must have entityIds\");\n\n const chunked = chunkArray(ids, 100);\n for (const chunk of chunked) {\n const keys = chunk.map((id) => ({ [this._indexMap.partitionKey]: { S: id } }));\n const params = {\n RequestItems: {\n [this._tableName]: { Keys: keys },\n },\n };\n\n const response = await this.dynamoDb.send(new BatchGetItemCommand(params));\n\n items = items.concat(response.Responses?.[this._tableName]?.map((item) => unmarshall(item)) as T[]) ?? [];\n }\n return items;\n }\n\n async find(filter: Filter): Promise<List<Partial<T>>> {\n if (!filter) filter = { size: this.DYNAMO_QUERY_LIMIT };\n\n // Enforce Query-only: require indexName & indexValue; otherwise instruct the caller to use scan\n if (!filter.indexName || filter.indexValue === undefined || filter.indexValue === null) {\n throw new ErrorDynamoDB(\n this._tableName,\n \"find in by index\",\n \"find requires indexName and indexValue; use scan() otherwise\",\n );\n }\n\n const dbQuery = buildDynamoDBQueryCommand({\n tableName: this._tableName,\n filter,\n filterCondition: buildDynamoDBFilterConditions(filter, this._indexMap),\n indexMap: this._indexMap,\n });\n\n const response = await this.sendCommandDeep<T>(dbQuery, filter?.lastKey);\n const fieldsRemoved = removeFields(response?.items, filter.fieldsInclude, filter.fieldsExclude);\n return { items: fieldsRemoved, lastKey: response?.lastKey };\n }\n\n async scan(filter: Filter): Promise<List<Partial<T>>> {\n if (!filter) filter = { size: this.DYNAMO_QUERY_LIMIT };\n const expression = buildDynamoDBFilterConditions(filter, this._indexMap);\n const scanInput = buildDynamoDBScanCommand({ tableName: this._tableName, filter, expression });\n const response = await this.sendCommandDeep<T>(scanInput, filter?.lastKey);\n const fieldsRemoved = removeFields(response?.items, filter.fieldsInclude, filter.fieldsExclude);\n return { items: fieldsRemoved, lastKey: response?.lastKey };\n }\n\n async findOne(filter: Filter): Promise<T> {\n const queryInput = buildQueryDB(this._tableName, filter, this._indexMap);\n queryInput.Limit = 1;\n\n const result = await this.dynamoDb.send(new QueryCommand(queryInput));\n\n if (!result.Items || result.Items.length === 0) return null;\n return unmarshall(result.Items[0]) as T;\n }\n\n findByIndex(indexName: string, value: string): Promise<List<Partial<T>>> {\n return this.find(parseIndexFilter(indexName + \"=\" + value, this._indexMap));\n }\n\n async count(filter: Filter): Promise<number> {\n const queryInput = buildQueryDB(this._tableName, filter, this._indexMap);\n queryInput.Select = \"COUNT\";\n\n const result = await this.dynamoDb.send(new QueryCommand(queryInput));\n return result.Count ?? 0;\n }\n\n async exists(id: string): Promise<boolean> {\n const key = marshall({ [this._indexMap.partitionKey]: id });\n\n const result = await this.dynamoDb.send(\n new GetItemCommand({\n TableName: this._tableName,\n Key: key,\n ProjectionExpression: this._indexMap.partitionKey,\n }),\n );\n\n return !!result.Item;\n }\n\n async getRaw(filter: Filter): Promise<any> {\n const queryInput = buildQueryDB(this._tableName, filter, this._indexMap);\n return this.dynamoDb.send(new QueryCommand(queryInput));\n }\n\n async transactionRead<T>(operations: { id: string; sortKey?: string }[]): Promise<T[]> {\n throw new Error(\"Method not implemented.\");\n }\n\n async transactRead?<TResult = any>(operations: any[]): Promise<TResult[]> {\n throw new Error(\"Method not implemented.\");\n }\n\n async transactionWrite(operations: {\n create?: { tableName: string; item: Record<string, any> }[];\n update?: {\n tableName: string;\n key: { id: string };\n updateData: Record<string, any>;\n }[];\n delete?: { tableName: string; key: { id: string } }[];\n }): Promise<boolean> {\n const transactItems: any[] = [];\n\n // Create operations\n if (operations.create) {\n for (const { tableName, item } of operations.create) {\n if (!item?.id) {\n item.id = generateUUID();\n }\n transactItems.push({\n Put: {\n TableName: tableName,\n Item: marshall(item, { removeUndefinedValues: true }),\n },\n });\n }\n }\n\n // Update operations\n if (operations.update) {\n for (const { tableName, key, updateData } of operations.update) {\n const { UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues } = buildUpdateExpressions(\n updateData,\n [\"id\"],\n );\n\n transactItems.push({\n Update: {\n TableName: tableName,\n Key: marshall(key),\n UpdateExpression,\n ExpressionAttributeNames,\n ExpressionAttributeValues,\n },\n });\n }\n }\n\n // Delete operations\n if (operations.delete) {\n for (const { tableName, key } of operations.delete) {\n transactItems.push({\n Delete: {\n TableName: tableName,\n Key: marshall(key),\n },\n });\n }\n }\n\n if (transactItems.length === 0) return false;\n\n // Execute transaction\n try {\n await this.dynamoDb.send(new TransactWriteItemsCommand({ TransactItems: transactItems }));\n return true;\n } catch (error) {\n console.error(\"Transaction failed:\", error);\n throw new ErrorDynamoDB(this._tableName, transactItems, error);\n }\n }\n\n getTableName() {\n return this._tableName;\n }\n\n setIndexMap(indexMap: DynamoIndexMap): boolean {\n this._indexMap = indexMap;\n return true;\n }\n\n setTable(tableName: string): boolean {\n this._tableName = tableName;\n return true;\n }\n\n getIndexMap(): DynamoIndexMap {\n return this._indexMap;\n }\n\n private async updateManyNormal(entityList: Partial<T>[], fieldNames: string[]): Promise<boolean> {\n return this.updateManyTransactional(entityList, fieldNames); // todo implement normal updateMany\n }\n\n private async updateManyTransactional(entityList: Partial<T>[], fieldNames: string[]): Promise<boolean> {\n if (entityList.length === 0) return false;\n\n if (!fieldNames || fieldNames.length === 0) {\n await this.saveMany(entityList, true);\n return true;\n }\n\n const partitionKey = this._indexMap.partitionKey;\n fieldNames.push(partitionKey);\n const entityListCleaned = removeFields(entityList, fieldNames);\n\n const indexedItems = entityListCleaned.map((entity) => {\n return addIndexValue(entity, this._indexMap);\n });\n\n const transactItems = indexedItems\n .map((item) => {\n if (!item[partitionKey])\n throw new Error(\n `Item must have an ${partitionKey} field. Entity: ${JSON.stringify(item, null, 2)}, \\nupdateFields: ${JSON.stringify(fieldNames)}`,\n );\n\n const { UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues } = buildUpdateExpressions(item, [\n partitionKey,\n ]);\n\n return {\n Update: {\n TableName: this._tableName,\n Key: { [partitionKey]: { S: item[partitionKey] } }, // id-г шууд key болгож дамжуулах\n UpdateExpression,\n ExpressionAttributeValues,\n ExpressionAttributeNames,\n },\n };\n })\n .filter(Boolean) as any[]; // filter(Boolean) нь хоосон утгуудыг арилгана.\n\n if (transactItems.length < 1) return false;\n\n const chunkedItems = chunkArray(transactItems, 25); // 25-аас дээш бол багцлах\n\n for (const chunk of chunkedItems) await this.dynamoDb.send(new TransactWriteItemsCommand({ TransactItems: chunk }));\n\n return true;\n }\n\n private async saveManyNormal(entities: Partial<T>[]): Promise<Partial<T>[]> {\n if (entities.length === 0) throw new Error(\"Cannot save an empty array of entities.\");\n\n const allSavedEntities: Partial<T>[] = [];\n\n for (const chunk of chunkArray(entities, 25)) {\n chunk.forEach((item) => addIndexValue(item, this._indexMap));\n const putRequests = chunk.map((entity) => ({\n PutRequest: { Item: marshall(entity, { removeUndefinedValues: true }) },\n }));\n\n const params: BatchWriteItemCommandInput = { RequestItems: { [this._tableName]: putRequests } };\n\n const result = await this.dynamoDb.send(new BatchWriteItemCommand(params));\n\n if (result.UnprocessedItems && Object.keys(result.UnprocessedItems).length > 0)\n console.warn(\"⚠️ Some items were unprocessed and need to be retried.\", result.UnprocessedItems);\n\n allSavedEntities.push(...chunk);\n }\n\n return allSavedEntities;\n }\n\n private async saveManyTransactional(entities: Partial<T>[]): Promise<Partial<T>[]> {\n if (entities.length === 0) throw new Error(\"Cannot save an empty array of entities.\");\n\n const allSavedEntities: Partial<T>[] = [];\n\n // DynamoDB TransactWrite limit: 25 actions per request\n for (const chunk of chunkArray(entities, 25)) {\n chunk.forEach((item) => addIndexValue(item, this._indexMap));\n\n const transactItems = chunk.map((entity) => ({\n Put: {\n TableName: this._tableName,\n Item: marshall(entity, { removeUndefinedValues: true }),\n },\n }));\n\n const params: TransactWriteItemsCommandInput = {\n TransactItems: transactItems,\n };\n\n try {\n await this.dynamoDb.send(new TransactWriteItemsCommand(params));\n allSavedEntities.push(...chunk);\n } catch (err) {\n console.error(\"❌ Transaction failed:\", err);\n throw err; // Re-throw so the caller knows it failed\n }\n }\n\n return allSavedEntities;\n }\n\n private async incrementOrDecrementFieldValue(entityId: string, fieldName: string, delta: number): Promise<T> {\n const partitionKey = this._indexMap.partitionKey;\n if (!this?._indexMap?.numberFields?.includes(fieldName)) {\n throw new Error(`${fieldName} field not found in indexMap.numberFields`);\n }\n\n const params: UpdateItemCommandInput = {\n TableName: this._tableName,\n Key: marshall({ [partitionKey]: entityId }),\n UpdateExpression: `SET #field = if_not_exists(#field, :start) + :delta`,\n ExpressionAttributeNames: {\n \"#field\": fieldName,\n },\n ExpressionAttributeValues: {\n \":delta\": marshall(delta),\n \":start\": marshall(0),\n },\n ReturnValues: ReturnValue.ALL_NEW,\n };\n\n const result = await this.dynamoDb.send(new UpdateItemCommand(params));\n\n return unmarshall(result.Attributes) as T;\n }\n\n /**\n * Executes a DynamoDB Query or Scan and returns up to the desired number of items,\n * respecting DynamoDB's 1MB limit (pagination continuation via LastEvaluatedKey).\n * @param queryInput - QueryCommandInput or ScanCommandInput\n * @param startKey - Optional start key for pagination\n */\n\n private async sendCommandDeep<T>(\n queryInput: QueryCommandInput | ScanCommandInput,\n startKey?: string | Record<string, any>,\n ): Promise<List<T>> {\n const result: List<T> = { items: [] };\n\n const size: number = (queryInput as any)?.Limit ?? 10;\n\n let lastEvaluatedKey: Record<string, AttributeValue>;\n\n if (startKey) {\n lastEvaluatedKey =\n typeof startKey === \"string\"\n ? parseLastEvaluatedKey<Record<string, AttributeValue>>(startKey) // will throw if invalid\n : startKey;\n }\n\n do {\n const response: QueryCommandOutput = await this.sendCommand({\n ...queryInput,\n ExclusiveStartKey: lastEvaluatedKey,\n });\n\n // no more items to fetch\n if (response.LastEvaluatedKey == undefined) {\n result?.items.push(...unMarshall<T>(response.Items));\n result.lastKey = undefined;\n return result;\n }\n\n if (response?.Items.length === 0 && response.LastEvaluatedKey) {\n lastEvaluatedKey = response.LastEvaluatedKey;\n continue;\n }\n\n if (result?.items.length + response?.Items.length <= size) {\n result?.items.push(...unMarshall<T>(response.Items));\n lastEvaluatedKey = response.LastEvaluatedKey;\n if (result?.items.length === size) {\n result.lastKey = toBase64(JSON.stringify(response.LastEvaluatedKey));\n return result;\n }\n continue;\n }\n\n const elementIndex = size - result?.items.length - 1;\n result?.items.push(...unMarshall<T>(response.Items.slice(0, elementIndex)));\n\n const index = this._indexMap.get(queryInput.IndexName);\n result.lastKey = generateLastEvaluatedKey(response.Items[elementIndex], index?.field, index?.sortKeyField);\n break;\n } while (lastEvaluatedKey);\n\n return result;\n }\n\n /**\n * Executes a single Query/Scan and returns the result as-is.\n * Supports pagination via ExclusiveStartKey.\n */\n private async sendCommand(\n commandInput: QueryCommandInput | ScanCommandInput,\n ): Promise<ScanCommandOutput | QueryCommandOutput> {\n commandInput.TableName = this._tableName;\n\n // if (startKey) {\n // commandInput.ExclusiveStartKey = typeof startKey === \"string\" ? parseLastEvaluatedKey(startKey) : startKey;\n // }\n\n if (!commandInput.Limit) {\n commandInput.Limit = this.DYNAMO_QUERY_LIMIT;\n }\n\n const isQuery = \"KeyConditionExpression\" in commandInput;\n const command = isQuery ? new QueryCommand(commandInput) : new ScanCommand(commandInput);\n\n log.debug(\"Sending command:\", commandInput);\n\n if (!this.dynamoDb) throw new ErrorDynamoDB(this._tableName, commandInput, \"dynamoDB client not initialized\");\n\n try {\n return await this.dynamoDb.send(command);\n } catch (error) {\n throw new ErrorDynamoDB(this._tableName, commandInput, error);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"base-db.repo.js","sourceRoot":"","sources":["../../src/repositories/base-db.repo.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AttributeValue,\n BatchGetItemCommand,\n BatchWriteItemCommand,\n BatchWriteItemCommandInput,\n DeleteItemCommand,\n GetItemCommand,\n PutItemCommand,\n QueryCommand,\n QueryCommandInput,\n QueryCommandOutput,\n ReturnValue,\n ScanCommand,\n ScanCommandInput,\n ScanCommandOutput,\n TransactWriteItemsCommand,\n TransactWriteItemsCommandInput,\n UpdateItemCommand,\n UpdateItemCommandInput,\n} from \"@aws-sdk/client-dynamodb\";\nimport { marshall, unmarshall } from \"@aws-sdk/util-dynamodb\";\nimport {\n addIndexValue,\n BaseRepoDB,\n buildDynamoDBFilterConditions,\n buildDynamoDBQueryCommand,\n buildDynamoDBScanCommand,\n buildQueryDB,\n buildUpdateExpressions,\n chunkArray,\n DBClientDynamoDB,\n DynamoIndexMap,\n generateLastEvaluatedKey,\n generateUUID,\n List,\n parseIndexFilter,\n parseLastEvaluatedKey,\n removeFields,\n toBase64,\n unMarshall,\n} from \"../index\";\nimport Container, { Service } from \"typedi\";\nimport { ErrorDynamoDB } from \"../exception/errors\";\nimport { BaseEntity, Filter } from \"@chinggis/types\";\n\nService(\"BaseRepoDB\");\n\nexport class BaseRepoDBImpl<T extends BaseEntity> implements BaseRepoDB<T> {\n private readonly dynamoDb: DBClientDynamoDB = Container.get(\"DBClientDynamoDB\");\n private _tableName: string;\n private _indexMap: DynamoIndexMap;\n private readonly DYNAMO_QUERY_LIMIT: number = 25;\n\n async deleteFields(id: string, fieldNames: string[]): Promise<Partial<T>> {\n if (!id || fieldNames.length === 0) {\n return undefined;\n }\n\n const partitionKey = this._indexMap.partitionKey;\n const expressionAttributeNames: Record<string, string> = {};\n const removeExpressions: string[] = [];\n\n for (const field of fieldNames) {\n const placeholder = `#${field}`;\n expressionAttributeNames[placeholder] = field;\n removeExpressions.push(placeholder);\n }\n\n const updateExpression = `REMOVE ${removeExpressions.join(\", \")}`;\n\n const params = {\n TableName: this._tableName,\n Key: marshall({ [partitionKey]: id }),\n UpdateExpression: updateExpression,\n ExpressionAttributeNames: expressionAttributeNames,\n ReturnValues: \"ALL_NEW\" as const,\n };\n\n const result = await this.dynamoDb.send(new UpdateItemCommand(params));\n if (!result.Attributes) {\n throw new Error(\"No attributes returned from UpdateItem.\");\n }\n\n return unmarshall(result.Attributes) as Partial<T>;\n }\n\n fieldNotExists(fieldName: string, from: number, size: number): Promise<T[]> {\n throw new Error(\"Method not implemented.\");\n }\n\n incrementValueByField(entityId: string, fieldName: string, value?: number, nestedFieldSeparator?: string): Promise<T> {\n if (value < 0) {\n throw new Error(\"Increment operation only supports positive values\");\n }\n const fieldPath = nestedFieldSeparator ? fieldName.split(nestedFieldSeparator) : [fieldName];\n return this.incrementOrDecrementFieldValue(entityId, fieldPath, value ?? 1);\n }\n\n decrementValueByField(entityId: string, fieldName: string, value?: number, nestedFieldSeparator?: string): Promise<T> {\n if (value > 0) {\n throw new ErrorDynamoDB(\n this._tableName,\n `Decrement operation only supports negative values, inputValue: ${value}, for field: ${fieldName}`,\n );\n }\n const fieldPath = nestedFieldSeparator ? fieldName.split(nestedFieldSeparator) : [fieldName];\n return this.incrementOrDecrementFieldValue(entityId, fieldPath, value ?? -1);\n }\n\n transactWrite?(operations: any[]): Promise<boolean> {\n throw new Error(\"Method not implemented.\");\n }\n\n async update(entity: Partial<T>): Promise<T> {\n const partitionKey = this._indexMap.partitionKey;\n\n if (!entity[partitionKey]) {\n throw new ErrorDynamoDB(this._tableName, `Entity must have value in field ${partitionKey}`);\n }\n\n const indexedItem = addIndexValue(entity, this._indexMap);\n\n const { UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues } = buildUpdateExpressions(\n indexedItem,\n [partitionKey],\n );\n\n const params = {\n TableName: this._tableName,\n Key: marshall({ [partitionKey]: indexedItem[partitionKey] }),\n UpdateExpression,\n ExpressionAttributeNames,\n ExpressionAttributeValues,\n ReturnValues: ReturnValue.ALL_NEW,\n };\n\n const result = await this.dynamoDb.send(new UpdateItemCommand(params));\n if (!result.Attributes) {\n throw new Error(\"No attributes returned from UpdateItem.\");\n }\n return unmarshall(result.Attributes) as T;\n }\n\n async updateMany(entityList: Partial<T>[], fields: string[], isTransactional: boolean): Promise<boolean> {\n if (isTransactional === undefined || isTransactional === false || isTransactional === null)\n return await this.updateManyNormal(entityList, fields);\n\n return await this.updateManyTransactional(entityList, fields);\n }\n\n async save(entity: Partial<T>): Promise<T> {\n const partitionKey = this._indexMap.partitionKey;\n\n if (!entity[partitionKey]) throw new Error(`Entity must have a ${partitionKey} field.`);\n\n const indexedItem = addIndexValue(entity, this._indexMap);\n\n const params = {\n TableName: this._tableName,\n Item: marshall(indexedItem, { removeUndefinedValues: true }),\n };\n try {\n await this.dynamoDb.send(new PutItemCommand(params));\n\n return entity as T;\n } catch (error) {\n console.error(\"Error saving entity:\", error);\n throw new ErrorDynamoDB(this._tableName, params, error);\n }\n }\n\n async saveMany(entities: Partial<T>[], isTransactional?: boolean): Promise<Partial<T>[]> {\n if (isTransactional === undefined || isTransactional === null || isTransactional === false)\n return await this.saveManyNormal(entities);\n return await this.saveManyTransactional(entities);\n }\n\n async delete(id: string): Promise<boolean> {\n const params = {\n TableName: this._tableName,\n Key: marshall({ [this._indexMap.partitionKey]: id }),\n };\n\n try {\n await this.dynamoDb.send(new DeleteItemCommand(params));\n return true;\n } catch (error) {\n console.error(\"Error deleting item:\", error);\n throw new ErrorDynamoDB(this._tableName, params, error);\n }\n }\n\n async deleteMany(ids: string[]): Promise<boolean> {\n if (ids?.length === 0) return false;\n const chunked = chunkArray(ids, 25);\n for (const chunk of chunked) {\n const deleteRequests = chunk.map((id) => {\n return {\n DeleteRequest: {\n Key: marshall({ [this._indexMap.partitionKey]: id }),\n },\n };\n });\n\n const params = {\n RequestItems: {\n [this._tableName]: deleteRequests,\n },\n };\n\n await this.dynamoDb.send(new BatchWriteItemCommand(params));\n }\n return true;\n }\n\n async findById(id: string): Promise<T> {\n const params = {\n TableName: this._tableName,\n Key: marshall({ [this._indexMap.partitionKey]: id }),\n };\n\n try {\n const result = await this.dynamoDb.send(new GetItemCommand(params));\n if (!result.Item) return null;\n return unmarshall(result.Item) as T;\n } catch (error) {\n console.error(\"Error getting item:\", error);\n throw new ErrorDynamoDB(this._tableName, params, error);\n }\n }\n\n async findByIds(ids: string[]): Promise<T[]> {\n let items: T[] = [];\n if (!ids || ids.length === 0) throw new Error(\"Item must have entityIds\");\n\n const chunked = chunkArray(ids, 100);\n for (const chunk of chunked) {\n const keys = chunk.map((id) => ({ [this._indexMap.partitionKey]: { S: id } }));\n const params = {\n RequestItems: {\n [this._tableName]: { Keys: keys },\n },\n };\n\n const response = await this.dynamoDb.send(new BatchGetItemCommand(params));\n\n items = items.concat(response.Responses?.[this._tableName]?.map((item) => unmarshall(item)) as T[]) ?? [];\n }\n return items;\n }\n\n async find(filter: Filter): Promise<List<Partial<T>>> {\n if (!filter) filter = { size: this.DYNAMO_QUERY_LIMIT };\n\n // Enforce Query-only: require indexName & indexValue; otherwise instruct the caller to use scan\n if (!filter.indexName || filter.indexValue === undefined || filter.indexValue === null) {\n throw new ErrorDynamoDB(\n this._tableName,\n \"find in by index\",\n \"find requires indexName and indexValue; use scan() otherwise\",\n );\n }\n\n const dbQuery = buildDynamoDBQueryCommand({\n tableName: this._tableName,\n filter,\n filterCondition: buildDynamoDBFilterConditions(filter, this._indexMap),\n indexMap: this._indexMap,\n });\n\n const response = await this.sendCommandDeep<T>(dbQuery, filter?.lastKey);\n const fieldsRemoved = removeFields(response?.items, filter.fieldsInclude, filter.fieldsExclude);\n return { items: fieldsRemoved, lastKey: response?.lastKey };\n }\n\n async scan(filter: Filter): Promise<List<Partial<T>>> {\n if (!filter) filter = { size: this.DYNAMO_QUERY_LIMIT };\n const expression = buildDynamoDBFilterConditions(filter, this._indexMap);\n const scanInput = buildDynamoDBScanCommand({ tableName: this._tableName, filter, expression });\n const response = await this.sendCommandDeep<T>(scanInput, filter?.lastKey);\n const fieldsRemoved = removeFields(response?.items, filter.fieldsInclude, filter.fieldsExclude);\n return { items: fieldsRemoved, lastKey: response?.lastKey };\n }\n\n async findOne(filter: Filter): Promise<T> {\n const queryInput = buildQueryDB(this._tableName, filter, this._indexMap);\n queryInput.Limit = 1;\n\n const result = await this.dynamoDb.send(new QueryCommand(queryInput));\n\n if (!result.Items || result.Items.length === 0) return null;\n return unmarshall(result.Items[0]) as T;\n }\n\n findByIndex(indexName: string, value: string): Promise<List<Partial<T>>> {\n return this.find(parseIndexFilter(indexName + \"=\" + value, this._indexMap));\n }\n\n async count(filter: Filter): Promise<number> {\n const queryInput = buildQueryDB(this._tableName, filter, this._indexMap);\n queryInput.Select = \"COUNT\";\n\n const result = await this.dynamoDb.send(new QueryCommand(queryInput));\n return result.Count ?? 0;\n }\n\n async exists(id: string): Promise<boolean> {\n const key = marshall({ [this._indexMap.partitionKey]: id });\n\n const result = await this.dynamoDb.send(\n new GetItemCommand({\n TableName: this._tableName,\n Key: key,\n ProjectionExpression: this._indexMap.partitionKey,\n }),\n );\n\n return !!result.Item;\n }\n\n async getRaw(filter: Filter): Promise<any> {\n const queryInput = buildQueryDB(this._tableName, filter, this._indexMap);\n return this.dynamoDb.send(new QueryCommand(queryInput));\n }\n\n async transactionRead<T>(operations: { id: string; sortKey?: string }[]): Promise<T[]> {\n throw new Error(\"Method not implemented.\");\n }\n\n async transactRead?<TResult = any>(operations: any[]): Promise<TResult[]> {\n throw new Error(\"Method not implemented.\");\n }\n\n async transactionWrite(operations: {\n create?: { tableName: string; item: Record<string, any> }[];\n update?: {\n tableName: string;\n key: { id: string };\n updateData: Record<string, any>;\n }[];\n delete?: { tableName: string; key: { id: string } }[];\n }): Promise<boolean> {\n const transactItems: any[] = [];\n\n // Create operations\n if (operations.create) {\n for (const { tableName, item } of operations.create) {\n if (!item?.id) {\n item.id = generateUUID();\n }\n transactItems.push({\n Put: {\n TableName: tableName,\n Item: marshall(item, { removeUndefinedValues: true }),\n },\n });\n }\n }\n\n // Update operations\n if (operations.update) {\n for (const { tableName, key, updateData } of operations.update) {\n const { UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues } = buildUpdateExpressions(\n updateData,\n [\"id\"],\n );\n\n transactItems.push({\n Update: {\n TableName: tableName,\n Key: marshall(key),\n UpdateExpression,\n ExpressionAttributeNames,\n ExpressionAttributeValues,\n },\n });\n }\n }\n\n // Delete operations\n if (operations.delete) {\n for (const { tableName, key } of operations.delete) {\n transactItems.push({\n Delete: {\n TableName: tableName,\n Key: marshall(key),\n },\n });\n }\n }\n\n if (transactItems.length === 0) return false;\n\n // Execute transaction\n try {\n await this.dynamoDb.send(new TransactWriteItemsCommand({ TransactItems: transactItems }));\n return true;\n } catch (error) {\n console.error(\"Transaction failed:\", error);\n throw new ErrorDynamoDB(this._tableName, transactItems, error);\n }\n }\n\n getTableName() {\n return this._tableName;\n }\n\n setIndexMap(indexMap: DynamoIndexMap): boolean {\n this._indexMap = indexMap;\n return true;\n }\n\n setTable(tableName: string): boolean {\n this._tableName = tableName;\n return true;\n }\n\n getIndexMap(): DynamoIndexMap {\n return this._indexMap;\n }\n\n private async updateManyNormal(entityList: Partial<T>[], fieldNames: string[]): Promise<boolean> {\n return this.updateManyTransactional(entityList, fieldNames); // todo implement normal updateMany\n }\n\n private async updateManyTransactional(entityList: Partial<T>[], fieldNames: string[]): Promise<boolean> {\n if (entityList.length === 0) return false;\n\n if (!fieldNames || fieldNames.length === 0) {\n await this.saveMany(entityList, true);\n return true;\n }\n\n const partitionKey = this._indexMap.partitionKey;\n fieldNames.push(partitionKey);\n const entityListCleaned = removeFields(entityList, fieldNames);\n\n const indexedItems = entityListCleaned.map((entity) => {\n return addIndexValue(entity, this._indexMap);\n });\n\n const transactItems = indexedItems\n .map((item) => {\n if (!item[partitionKey])\n throw new Error(\n `Item must have an ${partitionKey} field. Entity: ${JSON.stringify(item, null, 2)}, \\nupdateFields: ${JSON.stringify(fieldNames)}`,\n );\n\n const { UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues } = buildUpdateExpressions(item, [\n partitionKey,\n ]);\n\n return {\n Update: {\n TableName: this._tableName,\n Key: { [partitionKey]: { S: item[partitionKey] } }, // id-г шууд key болгож дамжуулах\n UpdateExpression,\n ExpressionAttributeValues,\n ExpressionAttributeNames,\n },\n };\n })\n .filter(Boolean) as any[]; // filter(Boolean) нь хоосон утгуудыг арилгана.\n\n if (transactItems.length < 1) return false;\n\n const chunkedItems = chunkArray(transactItems, 25); // 25-аас дээш бол багцлах\n\n for (const chunk of chunkedItems) await this.dynamoDb.send(new TransactWriteItemsCommand({ TransactItems: chunk }));\n\n return true;\n }\n\n private async saveManyNormal(entities: Partial<T>[]): Promise<Partial<T>[]> {\n if (entities.length === 0) throw new Error(\"Cannot save an empty array of entities.\");\n\n const allSavedEntities: Partial<T>[] = [];\n\n for (const chunk of chunkArray(entities, 25)) {\n chunk.forEach((item) => addIndexValue(item, this._indexMap));\n const putRequests = chunk.map((entity) => ({\n PutRequest: { Item: marshall(entity, { removeUndefinedValues: true }) },\n }));\n\n const params: BatchWriteItemCommandInput = { RequestItems: { [this._tableName]: putRequests } };\n\n const result = await this.dynamoDb.send(new BatchWriteItemCommand(params));\n\n if (result.UnprocessedItems && Object.keys(result.UnprocessedItems).length > 0)\n console.warn(\"⚠️ Some items were unprocessed and need to be retried.\", result.UnprocessedItems);\n\n allSavedEntities.push(...chunk);\n }\n\n return allSavedEntities;\n }\n\n private async saveManyTransactional(entities: Partial<T>[]): Promise<Partial<T>[]> {\n if (entities.length === 0) throw new Error(\"Cannot save an empty array of entities.\");\n\n const allSavedEntities: Partial<T>[] = [];\n\n // DynamoDB TransactWrite limit: 25 actions per request\n for (const chunk of chunkArray(entities, 25)) {\n chunk.forEach((item) => addIndexValue(item, this._indexMap));\n\n const transactItems = chunk.map((entity) => ({\n Put: {\n TableName: this._tableName,\n Item: marshall(entity, { removeUndefinedValues: true }),\n },\n }));\n\n const params: TransactWriteItemsCommandInput = {\n TransactItems: transactItems,\n };\n\n try {\n await this.dynamoDb.send(new TransactWriteItemsCommand(params));\n allSavedEntities.push(...chunk);\n } catch (err) {\n console.error(\"❌ Transaction failed:\", err);\n throw err; // Re-throw so the caller knows it failed\n }\n }\n\n return allSavedEntities;\n }\n\n private async incrementOrDecrementFieldValue(entityId: string, fieldPath: string[], delta: number): Promise<T> {\n const partitionKey = this._indexMap.partitionKey;\n const leafField = fieldPath[fieldPath.length - 1];\n\n if (!this?._indexMap?.numberFields?.includes(leafField)) {\n throw new Error(`${leafField} field not found in indexMap.numberFields`);\n }\n\n const expressionAttributeNames: Record<string, string> = {};\n fieldPath.forEach((segment, i) => {\n expressionAttributeNames[`#f${i}`] = segment;\n });\n\n const pathExpr = fieldPath.map((_, i) => `#f${i}`).join(\".\");\n\n const params: UpdateItemCommandInput = {\n TableName: this._tableName,\n Key: marshall({ [partitionKey]: entityId }),\n UpdateExpression: `SET ${pathExpr} = if_not_exists(${pathExpr}, :start) + :delta`,\n ExpressionAttributeNames: expressionAttributeNames,\n ExpressionAttributeValues: {\n \":delta\": marshall(delta),\n \":start\": marshall(0),\n },\n ReturnValues: ReturnValue.ALL_NEW,\n };\n\n const result = await this.dynamoDb.send(new UpdateItemCommand(params));\n\n return unmarshall(result.Attributes) as T;\n }\n\n /**\n * Executes a DynamoDB Query or Scan and returns up to the desired number of items,\n * respecting DynamoDB's 1MB limit (pagination continuation via LastEvaluatedKey).\n * @param queryInput - QueryCommandInput or ScanCommandInput\n * @param startKey - Optional start key for pagination\n */\n\n private async sendCommandDeep<T>(\n queryInput: QueryCommandInput | ScanCommandInput,\n startKey?: string | Record<string, any>,\n ): Promise<List<T>> {\n const result: List<T> = { items: [] };\n\n const size: number = (queryInput as any)?.Limit ?? 10;\n\n let lastEvaluatedKey: Record<string, AttributeValue>;\n\n if (startKey) {\n lastEvaluatedKey =\n typeof startKey === \"string\"\n ? parseLastEvaluatedKey<Record<string, AttributeValue>>(startKey) // will throw if invalid\n : startKey;\n }\n\n do {\n const response: QueryCommandOutput = await this.sendCommand({\n ...queryInput,\n ExclusiveStartKey: lastEvaluatedKey,\n });\n\n // no more items to fetch\n if (response.LastEvaluatedKey == undefined) {\n result?.items.push(...unMarshall<T>(response.Items));\n result.lastKey = undefined;\n return result;\n }\n\n if (response?.Items.length === 0 && response.LastEvaluatedKey) {\n lastEvaluatedKey = response.LastEvaluatedKey;\n continue;\n }\n\n if (result?.items.length + response?.Items.length <= size) {\n result?.items.push(...unMarshall<T>(response.Items));\n lastEvaluatedKey = response.LastEvaluatedKey;\n if (result?.items.length === size) {\n result.lastKey = toBase64(JSON.stringify(response.LastEvaluatedKey));\n return result;\n }\n continue;\n }\n\n const elementIndex = size - result?.items.length - 1;\n result?.items.push(...unMarshall<T>(response.Items.slice(0, elementIndex)));\n\n const index = this._indexMap.get(queryInput.IndexName);\n result.lastKey = generateLastEvaluatedKey(response.Items[elementIndex], index?.field, index?.sortKeyField);\n break;\n } while (lastEvaluatedKey);\n\n return result;\n }\n\n /**\n * Executes a single Query/Scan and returns the result as-is.\n * Supports pagination via ExclusiveStartKey.\n */\n private async sendCommand(\n commandInput: QueryCommandInput | ScanCommandInput,\n ): Promise<ScanCommandOutput | QueryCommandOutput> {\n commandInput.TableName = this._tableName;\n\n // if (startKey) {\n // commandInput.ExclusiveStartKey = typeof startKey === \"string\" ? parseLastEvaluatedKey(startKey) : startKey;\n // }\n\n if (!commandInput.Limit) {\n commandInput.Limit = this.DYNAMO_QUERY_LIMIT;\n }\n\n const isQuery = \"KeyConditionExpression\" in commandInput;\n const command = isQuery ? new QueryCommand(commandInput) : new ScanCommand(commandInput);\n\n log.debug(\"Sending command:\", commandInput);\n\n if (!this.dynamoDb) throw new ErrorDynamoDB(this._tableName, commandInput, \"dynamoDB client not initialized\");\n\n try {\n return await this.dynamoDb.send(command);\n } catch (error) {\n throw new ErrorDynamoDB(this._tableName, commandInput, error);\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aws-service-stack",
3
- "version": "0.18.391",
3
+ "version": "0.18.392",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "author": "chinggis.systems",