aws-service-stack 0.18.324 → 0.18.326
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.
package/README.md
CHANGED
|
@@ -49,7 +49,7 @@ npm install aws-service-stack
|
|
|
49
49
|
This package requires the following AWS SDK v3 packages as peer dependencies:
|
|
50
50
|
|
|
51
51
|
```bash
|
|
52
|
-
npm install
|
|
52
|
+
npm install
|
|
53
53
|
@aws-sdk/client-dynamodb
|
|
54
54
|
@aws-sdk/client-cognito-identity-provider
|
|
55
55
|
@aws-sdk/client-secrets-manager
|
|
@@ -84,7 +84,6 @@ export class ProductControllerApi extends ControllerApi<Product, ProductService>
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
|
-
|
|
88
87
|
```
|
|
89
88
|
|
|
90
89
|
### 2. Entity Configuration
|
|
@@ -138,7 +137,6 @@ export class ProductConfig extends EntityConfigImpl {
|
|
|
138
137
|
|
|
139
138
|
// Export default Product configuration
|
|
140
139
|
export const CONFIG_PRODUCT = new ProductConfig();
|
|
141
|
-
|
|
142
140
|
```
|
|
143
141
|
|
|
144
142
|
### 3. Repository Definition - DynamoDB
|
|
@@ -151,8 +149,7 @@ import { ProductRepoDB } from "./product-repo-db.interface";
|
|
|
151
149
|
import "./product-repo-db";
|
|
152
150
|
|
|
153
151
|
@Service("ProductRepoDB")
|
|
154
|
-
export class ProductRepoDBImpl extends BaseRepoDBImpl<Product> implements ProductRepoDB {
|
|
155
|
-
}
|
|
152
|
+
export class ProductRepoDBImpl extends BaseRepoDBImpl<Product> implements ProductRepoDB {}
|
|
156
153
|
|
|
157
154
|
/** additional custom repo methode for dynamodb integration**/
|
|
158
155
|
//...
|
|
@@ -168,8 +165,7 @@ import { ProductRepoES } from "./product-repo-es.interface";
|
|
|
168
165
|
import "./product-repo-es";
|
|
169
166
|
|
|
170
167
|
@Service("ProductRepoES")
|
|
171
|
-
export class ProductRepoESImpl extends BaseRepoESImpl<Product> implements ProductRepoES {
|
|
172
|
-
}
|
|
168
|
+
export class ProductRepoESImpl extends BaseRepoESImpl<Product> implements ProductRepoES {}
|
|
173
169
|
|
|
174
170
|
/** additional custom repo methode for openSearch integration**/
|
|
175
171
|
//...
|
|
@@ -189,14 +185,16 @@ import { CrudServiceImpl } from "@chinggis/core";
|
|
|
189
185
|
import { Product } from "../model-shared/example.model";
|
|
190
186
|
|
|
191
187
|
@Service("ProfileService")
|
|
192
|
-
export class ProductServiceImpl
|
|
188
|
+
export class ProductServiceImpl
|
|
189
|
+
extends CrudServiceImpl<Product, ProductRepoDB, ProductRepoES>
|
|
190
|
+
implements ProductService
|
|
191
|
+
{
|
|
193
192
|
constructor() {
|
|
194
193
|
super(Container.get("ProductRepoDB"), Container.get("ProductRepoES"));
|
|
195
194
|
}
|
|
196
195
|
|
|
197
196
|
/** Custom service methode **/
|
|
198
197
|
//...
|
|
199
|
-
|
|
200
198
|
}
|
|
201
199
|
```
|
|
202
200
|
|
|
@@ -211,6 +209,7 @@ POST /products # Insert new product (create)
|
|
|
211
209
|
GET /products/{id} # Get single product by ID
|
|
212
210
|
GET /products # List products via DynamoDB Query (by categoryId, ProductId, status, …)
|
|
213
211
|
GET /products/search # Search products via OpenSearch (full-text, sort, pagination)
|
|
212
|
+
GET /products/search/query # Search Query products via OpenSearch (aggregations, multi-filters, full-text, sort, pagination)
|
|
214
213
|
GET /products/scan # Scan all products (Admin only, expensive in DynamoDB)
|
|
215
214
|
PUT /products/{id} # Update full product (replace all fields)
|
|
216
215
|
PATCH /products/{id} # Update partial product (only specific fields)
|
|
@@ -233,10 +232,50 @@ dynamoDB: .../products/?category=Toys&color=red&age_from=5&age_to=8&size=50&la
|
|
|
233
232
|
- **[customFieldName]**=[matchValue]
|
|
234
233
|
- **size**=20
|
|
235
234
|
- **page**=3 or **lastKey**=...
|
|
236
|
-
- **[dateOrNumberFieldName]_from**=[Value]
|
|
237
|
-
- **[dateOrNumberFieldName]_to**=[Value]
|
|
238
|
-
- **
|
|
239
|
-
- **
|
|
235
|
+
- **[dateOrNumberFieldName]\_from**=[Value]
|
|
236
|
+
- **[dateOrNumberFieldName]\_to**=[Value]
|
|
237
|
+
- **begin\_[dateOrNumberFieldName]**=[Value]
|
|
238
|
+
- **end\_[dateOrNumberFieldName]**=[Value]
|
|
239
|
+
|
|
240
|
+
### **OpenSearch V2 List Operation - URL Filter**
|
|
241
|
+
|
|
242
|
+
multi-filter, aggregations, search keyword, multi-sort
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
openSearch v2: .../products/search/query?category__eq=Toys&color__in=red,yellow&age__gte=5&age__lte=8&page=5&size=50&agg__terms=status&agg__terms__sub=customerId
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
- **field\_\_in**=red,yellow
|
|
249
|
+
- **field\_\_eq**=Toys
|
|
250
|
+
- **field\_\_gte**=5
|
|
251
|
+
- **field\_\_lte**=8
|
|
252
|
+
- **field\_\_ne**=Book
|
|
253
|
+
- **field\_\_exists**=true
|
|
254
|
+
- **field\_\_exists**=false
|
|
255
|
+
- **field\_\_regex**=^Foo.\*
|
|
256
|
+
|
|
257
|
+
- **agg\_\_terms**=status
|
|
258
|
+
- **agg\_\_terms\_\_sub**=customerId
|
|
259
|
+
- **agg\_\_sum**=price
|
|
260
|
+
- **agg\_\_avg**=price
|
|
261
|
+
- **agg\_\_min**=price
|
|
262
|
+
- **agg\_\_max**=price
|
|
263
|
+
|
|
264
|
+
- **search**=marvel
|
|
265
|
+
- **searchFields**=name,manufacture,description
|
|
266
|
+
- **searchOperator**=or
|
|
267
|
+
- **searchOperator**=and
|
|
268
|
+
|
|
269
|
+
- **sort**=desc,asc
|
|
270
|
+
- **sortField**=price,category
|
|
271
|
+
|
|
272
|
+
- **color\_\_in**=red,yellow
|
|
273
|
+
- **category\_\_eq**=Toys
|
|
274
|
+
- **status\_\_exists**=true
|
|
275
|
+
- **age\_\_gte**=5
|
|
276
|
+
- **age\_\_lte**=8
|
|
277
|
+
- **size**=20
|
|
278
|
+
- **page**=3
|
|
240
279
|
|
|
241
280
|
### **Advanced Features**
|
|
242
281
|
|
|
@@ -372,12 +411,12 @@ functions:
|
|
|
372
411
|
### AWS CDK
|
|
373
412
|
|
|
374
413
|
```typescript
|
|
375
|
-
import { Function, Runtime } from
|
|
414
|
+
import { Function, Runtime } from "aws-cdk-lib/aws-lambda";
|
|
376
415
|
|
|
377
|
-
new Function(this,
|
|
416
|
+
new Function(this, "MyFunction", {
|
|
378
417
|
runtime: Runtime.NODEJS_18_X,
|
|
379
|
-
handler:
|
|
380
|
-
code: Code.fromAsset(
|
|
418
|
+
handler: "dist/handler.handler",
|
|
419
|
+
code: Code.fromAsset("dist"),
|
|
381
420
|
});
|
|
382
421
|
```
|
|
383
422
|
|
|
@@ -422,4 +461,4 @@ Built by [Chinggis Systems](https://chinggis.systems) - Enterprise software solu
|
|
|
422
461
|
|
|
423
462
|
---
|
|
424
463
|
|
|
425
|
-
**Made with ❤️ for the AWS community**
|
|
464
|
+
**Made with ❤️ for the AWS community**
|
|
@@ -94,9 +94,8 @@ let BaseRepoESImpl = class BaseRepoESImpl {
|
|
|
94
94
|
async search(query, debug) {
|
|
95
95
|
debug = debug ? true : process.env.ENV?.toLowerCase()?.trim() === "dev";
|
|
96
96
|
const finalQuery = this.prepareQuery(query);
|
|
97
|
-
console.log("searchQuery: ", JSON.stringify(finalQuery, null, 2));
|
|
98
97
|
if (debug) {
|
|
99
|
-
|
|
98
|
+
log.debug("searchQuery: ", JSON.stringify(finalQuery, null, 2));
|
|
100
99
|
}
|
|
101
100
|
try {
|
|
102
101
|
const { body } = await this.searchClient.search(finalQuery);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-es.repo.js","sourceRoot":"","sources":["../../src/repositories/base-es.repo.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"base-es.repo.js","sourceRoot":"","sources":["../../src/repositories/base-es.repo.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseRepoES,\n buildQueryOS,\n List,\n OpenSearchClient,\n removeEmptyFields,\n transformAggregationsResponse,\n} from \"../index\";\nimport { Service } from \"typedi\";\nimport esb from \"elastic-builder\";\nimport { BaseEntity, Filter } from \"@chinggis/types\";\n\n@Service(\"BaseRepoES\")\nexport abstract class BaseRepoESImpl<T extends BaseEntity> implements BaseRepoES<T> {\n private searchClient: OpenSearchClient;\n private indexName: string;\n private readonly DEFAULT_SIZE = 25;\n private readonly MAX_SIZE = 250;\n\n async findByIds(ids: string[]): Promise<T[]> {\n const filter: Filter = { id: ids.join(\",\") };\n const result = await this.find(filter);\n return result.items;\n }\n\n async find(filter: Filter): Promise<List<T>> {\n const query = buildQueryOS(filter);\n\n const res = await this.search(query);\n\n return { items: res?.items };\n }\n\n async fieldNotExists(\n fieldName: string,\n from: number,\n size: number,\n includeFields?: string[],\n excludeFields?: string[],\n ): Promise<T[]> {\n const filter: Filter = {\n size,\n from,\n fieldsInclude: includeFields,\n fieldsExclude: excludeFields,\n };\n const query = buildQueryOS(filter);\n query.index = this.indexName;\n\n // Add field not exists filter using elastic-builder\n const boolQuery = esb.boolQuery().mustNot(esb.existsQuery(fieldName));\n query.body.query = boolQuery.toJSON();\n\n const res = await this.search(query);\n\n return res?.items;\n }\n\n async findOne(filter: Filter): Promise<T> {\n filter.size = 1;\n return this.find(filter).then((result) => result.items[0]);\n }\n\n count(filter: Filter): Promise<number> {\n throw new Error(\"Method not implemented.\");\n }\n\n getRaw?(filter: Filter): Promise<any> {\n throw new Error(\"Method not implemented.\");\n }\n\n setIndexName(indexName: string): boolean {\n this.indexName = indexName;\n return true;\n }\n\n setEndpoint(node: string): boolean {\n this.searchClient = new OpenSearchClient(node);\n return true;\n }\n\n getEndpoint(): string {\n throw new Error(\"Method not implemented.\");\n }\n\n getIndexName(): string {\n return this.indexName;\n }\n\n async findById(id: string): Promise<T | undefined> {\n const result = await this.findByIds([id]);\n\n if (result.length > 1) console.warn(\"More than one entity found by id\", id);\n\n return result.length > 0 ? result.at(0) : undefined;\n }\n\n async findByIdFieldSelected(id: string, includeFields?: string[], excludeFields?: string[]): Promise<T | undefined> {\n const filter: Filter = {\n id,\n size: 10,\n from: 0,\n fieldsInclude: includeFields,\n fieldsExclude: excludeFields,\n };\n const query = buildQueryOS(filter);\n\n const result = await this.search(query);\n\n return result?.items?.length > 0 ? result.items.at(0) : undefined;\n }\n\n async exists(id: string): Promise<boolean> {\n return !!(await this.findById(id));\n }\n\n findBetween<K>(fieldName: string, fromValue: K, toValue: K, includeFields: string[]): Promise<T[]> {\n throw new Error(\"Method not implemented.\");\n }\n\n async search(query: any, debug?: boolean): Promise<{ items: T[]; aggs: Record<string, any> }> {\n debug = debug ? true : process.env.ENV?.toLowerCase()?.trim() === \"dev\";\n const finalQuery = this.prepareQuery(query);\n\n if (debug) {\n log.debug(\"searchQuery: \", JSON.stringify(finalQuery, null, 2));\n }\n\n try {\n const { body } = await this.searchClient.search(finalQuery);\n return {\n items: body?.hits?.hits?.map((item) => item._source as T) || [],\n aggs: body?.aggregations ? transformAggregationsResponse(body?.aggregations) : undefined,\n };\n } catch (err) {\n console.error(\"searchES ERROR: \", err);\n\n let message: string;\n if (err instanceof Error) message = err.message;\n else if (typeof err === \"string\") message = err;\n else message = \"Unknown searchES error\";\n\n throw new Error(message);\n }\n }\n\n private prepareQuery(query: any): any {\n if (!query.index && this.indexName) {\n query.index = this.indexName;\n }\n\n query.body = query.body ?? {};\n query.body.size = !query.body.size || query.body.size > this.MAX_SIZE ? this.DEFAULT_SIZE : query.body.size;\n\n if (query.body.size > this.MAX_SIZE)\n log.warn(`Query size is too large: ${query.body.size}. Using default size: ${this.DEFAULT_SIZE}`);\n\n query.body.from = query.body.from ?? 0;\n\n return removeEmptyFields(query);\n }\n}\n"]}
|
|
@@ -45,7 +45,6 @@ function buildSearchQueryOS(queryParams, opensearchIndex) {
|
|
|
45
45
|
(0, opensearch_parser_keyword_1.buildSearchKeyword)(queryParams, boolQuery);
|
|
46
46
|
const { size, from } = (0, opensearch_utils_1.calculatePagination)(queryParams);
|
|
47
47
|
const aggs = (0, opensearch_parser_aggs_1.buildAggregations)(queryParams);
|
|
48
|
-
console.log("aggs", aggs);
|
|
49
48
|
return {
|
|
50
49
|
index: opensearchIndex,
|
|
51
50
|
body: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opensearch.parser.js","sourceRoot":"","sources":["../../../src/utils/opensearch/opensearch.parser.ts"],"names":[],"mappings":";;AASA,
|
|
1
|
+
{"version":3,"file":"opensearch.parser.js","sourceRoot":"","sources":["../../../src/utils/opensearch/opensearch.parser.ts"],"names":[],"mappings":";;AASA,gDAuDC;AAhED,2CAA4E;AAC5E,2EAAiE;AACjE,qEAAuD;AACvD,+EAA6D;AAC7D,uEAA6D;AAC7D,0DAA0D;AAC1D,qEAA6D;AAE7D,kDAAkD;AAClD,SAAgB,kBAAkB,CAAC,WAAgB,EAAE,eAAuB;IAC1E,MAAM,OAAO,GAAG,IAAA,0CAAgB,EAAC,WAAW,CAAC,CAAC;IAE9C,MAAM,SAAS,GAAwB,EAAE,CAAC,CAAC,wBAAwB;IAEnE,MAAM,SAAS,GAAgB;QAC7B,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,EAAE;QACV,oBAAoB,EAAE,SAAS;KAChC,CAAC;IAEF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,uBAAe,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,EAAE,GAAG,0CAAY,CAAC,aAAa,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE;YAAE,SAAS;QAElB,gBAAgB;QAChB,IAAI,aAAa,KAAK,mBAAW,CAAC,GAAG,IAAI,aAAa,KAAK,mBAAW,CAAC,GAAG,EAAE,CAAC;YAC3E,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;YACzC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC9C,SAAS;QACX,CAAC;QAED,gBAAgB;QAChB,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,UAAU,CAAC,QAAQ;YAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;;YAC9D,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAExC,IAAI,MAAM,CAAC,MAAM;QAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;IAE7C,IAAA,8CAAkB,EAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAE3C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAA,sCAAmB,EAAC,WAAW,CAAC,CAAC;IAExD,MAAM,IAAI,GAAG,IAAA,0CAAiB,EAAC,WAAW,CAAC,CAAC;IAE5C,OAAO;QACL,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE;YACJ,KAAK,EAAE;gBACL,IAAI,EAAE,SAAS;aAChB;YACD,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,IAAI,EAAE,IAAI,IAAI,CAAC;YACf,IAAI,EAAE,IAAA,oCAAW,EAAC,WAAW,CAAC;SAC/B;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { BoolQueryOS, BoolQueryTypeOS, RangeTypeOS } from \"@chinggis/types\";\nimport { buildSearchKeyword } from \"./opensearch.parser.keyword\";\nimport { buildSortOS } from \"./opensearch.parser.sort\";\nimport { boolQueryMap } from \"./opensearch.parser.query.map\";\nimport { parseQueryString } from \"./opensearch.parser.utils\";\nimport { calculatePagination } from \"../opensearch.utils\";\nimport { buildAggregations } from \"./opensearch.parser.aggs\";\n\n// ---------------- Main Function ----------------\nexport function buildSearchQueryOS(queryParams: any, opensearchIndex: string) {\n const filters = parseQueryString(queryParams);\n\n const filterMap: Record<string, any> = {}; // merge range per field\n\n const boolQuery: BoolQueryOS = {\n must: [],\n must_not: [],\n filter: [],\n should: [],\n minimum_should_match: undefined,\n };\n\n for (const [key, value] of Object.entries(filters)) {\n if (!value) continue;\n\n const [field, boolQueryType = BoolQueryTypeOS.eq] = key.split(\"__\");\n const fn = boolQueryMap[boolQueryType];\n if (!fn) continue;\n\n // Range filters\n if (boolQueryType === RangeTypeOS.gte || boolQueryType === RangeTypeOS.lte) {\n const existing = filterMap[field]?.range;\n filterMap[field] = fn(field, value, existing);\n continue;\n }\n\n // Other filters\n const builtQuery = fn(field, value);\n if (builtQuery.negation) boolQuery.must_not.push(builtQuery.query);\n else boolQuery.must.push(builtQuery?.query ? builtQuery.query : builtQuery);\n }\n\n const filter = Object.values(filterMap);\n\n if (filter.length) boolQuery.filter = filter;\n\n buildSearchKeyword(queryParams, boolQuery);\n\n const { size, from } = calculatePagination(queryParams);\n\n const aggs = buildAggregations(queryParams);\n\n return {\n index: opensearchIndex,\n body: {\n query: {\n bool: boolQuery,\n },\n aggs: aggs,\n size: size ?? 25,\n from: from ?? 0,\n sort: buildSortOS(queryParams),\n },\n };\n}\n"]}
|