aws-service-stack 0.18.429 → 0.18.432
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/dist/_examples/controller/local-task-controller.d.ts +4 -0
- package/dist/_examples/controller/local-task-controller.d.ts.map +1 -1
- package/dist/_examples/controller/local-task-controller.js +39 -1
- package/dist/_examples/controller/local-task-controller.js.map +1 -1
- package/dist/_examples/controller/order/order-config.d.ts.map +1 -1
- package/dist/_examples/controller/order/order-config.js +6 -4
- package/dist/_examples/controller/order/order-config.js.map +1 -1
- package/dist/_examples/model-shared/order.model.d.ts +7 -7
- package/dist/_examples/model-shared/order.model.d.ts.map +1 -1
- package/dist/_examples/model-shared/order.model.js.map +1 -1
- package/dist/_examples/repositories/order/order-es.repo.d.ts +8 -0
- package/dist/_examples/repositories/order/order-es.repo.d.ts.map +1 -0
- package/dist/_examples/repositories/order/order-es.repo.interface.d.ts +5 -0
- package/dist/_examples/repositories/order/order-es.repo.interface.d.ts.map +1 -0
- package/dist/_examples/repositories/order/order-es.repo.interface.js +3 -0
- package/dist/_examples/repositories/order/order-es.repo.interface.js.map +1 -0
- package/dist/_examples/repositories/order/order-es.repo.js +20 -0
- package/dist/_examples/repositories/order/order-es.repo.js.map +1 -0
- package/dist/_examples/repositories/order/order-item-es.repo.d.ts +8 -0
- package/dist/_examples/repositories/order/order-item-es.repo.d.ts.map +1 -0
- package/dist/_examples/repositories/order/order-item-es.repo.interface.d.ts +5 -0
- package/dist/_examples/repositories/order/order-item-es.repo.interface.d.ts.map +1 -0
- package/dist/_examples/repositories/order/order-item-es.repo.interface.js +3 -0
- package/dist/_examples/repositories/order/order-item-es.repo.interface.js.map +1 -0
- package/dist/_examples/repositories/order/order-item-es.repo.js +20 -0
- package/dist/_examples/repositories/order/order-item-es.repo.js.map +1 -0
- package/dist/_examples/service/order/order-item-service-stream.d.ts.map +1 -1
- package/dist/_examples/service/order/order-item-service-stream.js +3 -2
- package/dist/_examples/service/order/order-item-service-stream.js.map +1 -1
- package/dist/_examples/service/order/order-item-service.d.ts +3 -1
- package/dist/_examples/service/order/order-item-service.d.ts.map +1 -1
- package/dist/_examples/service/order/order-item-service.js +4 -2
- package/dist/_examples/service/order/order-item-service.js.map +1 -1
- package/dist/_examples/service/order/order-service-stream.d.ts.map +1 -1
- package/dist/_examples/service/order/order-service-stream.js +3 -2
- package/dist/_examples/service/order/order-service-stream.js.map +1 -1
- package/dist/_examples/service/order/order-service.d.ts +4 -2
- package/dist/_examples/service/order/order-service.d.ts.map +1 -1
- package/dist/_examples/service/order/order-service.js +6 -4
- package/dist/_examples/service/order/order-service.js.map +1 -1
- package/dist/exception/exception-handler.d.ts.map +1 -1
- package/dist/exception/exception-handler.js.map +1 -1
- package/dist/function/cognito/cognito.function.d.ts.map +1 -1
- package/dist/function/cognito/cognito.function.js +10 -9
- package/dist/function/cognito/cognito.function.js.map +1 -1
- package/dist/model/base.model.d.ts +10 -5
- package/dist/model/base.model.d.ts.map +1 -1
- package/dist/model/base.model.js.map +1 -1
- package/dist/model/cognito-user.model.d.ts +3 -2
- package/dist/model/cognito-user.model.d.ts.map +1 -1
- package/dist/model/cognito-user.model.js.map +1 -1
- package/dist/model/date-string.model.d.ts +10 -0
- package/dist/model/date-string.model.d.ts.map +1 -0
- package/dist/model/date-string.model.js +3 -0
- package/dist/model/date-string.model.js.map +1 -0
- package/dist/model/index.d.ts +1 -0
- package/dist/model/index.d.ts.map +1 -1
- package/dist/model/index.js +1 -0
- package/dist/model/index.js.map +1 -1
- package/dist/repositories/base-es.repo.d.ts.map +1 -1
- package/dist/repositories/base-es.repo.js +1 -1
- package/dist/repositories/base-es.repo.js.map +1 -1
- package/dist/service/base.service.d.ts.map +1 -1
- package/dist/service/base.service.js +17 -7
- package/dist/service/base.service.js.map +1 -1
- package/dist/service/crud-operations.d.ts +1 -1
- package/dist/service/crud-operations.d.ts.map +1 -1
- package/dist/service/crud-operations.js +21 -13
- package/dist/service/crud-operations.js.map +1 -1
- package/dist/service/permission.repo.d.ts.map +1 -1
- package/dist/service/permission.repo.js +3 -2
- package/dist/service/permission.repo.js.map +1 -1
- package/dist/utils/date.util.d.ts +17 -4
- package/dist/utils/date.util.d.ts.map +1 -1
- package/dist/utils/date.util.js +83 -5
- package/dist/utils/date.util.js.map +1 -1
- package/dist/utils/dynamodb.utils.d.ts.map +1 -1
- package/dist/utils/dynamodb.utils.js +29 -12
- package/dist/utils/dynamodb.utils.js.map +1 -1
- package/dist/utils/http/http.util.d.ts +3 -1
- package/dist/utils/http/http.util.d.ts.map +1 -1
- package/dist/utils/http/http.util.js +15 -30
- package/dist/utils/http/http.util.js.map +1 -1
- package/dist/utils/opensearch/opensearch.parser.js +1 -1
- package/dist/utils/opensearch/opensearch.parser.js.map +1 -1
- package/dist/utils/opensearch.utils.d.ts.map +1 -1
- package/dist/utils/opensearch.utils.js +11 -8
- package/dist/utils/opensearch.utils.js.map +1 -1
- package/dist/utils/reflection.util.d.ts +1 -11
- package/dist/utils/reflection.util.d.ts.map +1 -1
- package/dist/utils/reflection.util.js +41 -26
- package/dist/utils/reflection.util.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission.repo.js","sourceRoot":"","sources":["../../src/service/permission.repo.ts"],"names":[],"mappings":";;;AAAA,+DAA8D;AAC9D,4DAAyD;AAEzD,4DAAuD;AAGvD,8DAA4D;AAE5D,SAAS,wBAAwB;IAC/B,MAAM,GAAG,GAAG,IAAI,+BAAc,EAAE,CAAC;IACjC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC;IACxB,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IACpH,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxD,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACpE,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAE3D,GAAG,CAAC,SAAS,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3B,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAa,cAAc;IACR,EAAE,CAA6B;IAEhD,YAAY,SAAiB;QAC3B,IAAI,CAAC,EAAE,GAAG,IAAI,6BAAc,EAAc,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC5B,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,aAAqB;QAC7C,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;YACrB,SAAS,EAAE,iBAAiB;YAC5B,UAAU,EAAE,aAAa;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAe;QAC/B,MAAM,YAAY,GAAG,IAAA,kCAAgB,EAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,YAAY,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAA+B;QACxC,IAAI,CAAC,UAAU,CAAC,EAAE;YAAE,UAAU,CAAC,EAAE,GAAG,IAAA,6BAAY,GAAE,CAAC;QAEnD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"permission.repo.js","sourceRoot":"","sources":["../../src/service/permission.repo.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseRepoDBImpl } from \"../repositories/base-db.repo\";\nimport { DynamoIndexMap } from \"../model/dynamodb.model\";\nimport { Permission } from \"../model/role.model\";\nimport { generateUUID } from \"../utils/dynamodb.utils\";\nimport { List } from \"../model/base.model\";\nimport { Filter } from \"@chinggis/types\";\nimport { formatDateTimeStr } from \"../utils/date.util\";\nimport { parseIndexFilter } from \"../utils/reflection.util\";\n\nfunction createPermissionIndexMap(): DynamoIndexMap {\n const map = new DynamoIndexMap();\n map.partitionKey = \"id\";\n map.set(\"byPermissionKey\", { field: \"permissionKey\", rFields: [\"role\", \"resource\", \"scope\"], fieldSeparator: \"#\" });\n map.set(\"byRole\", { field: \"role\", rFields: [\"role\"] });\n map.set(\"byResource\", { field: \"resource\", rFields: [\"resource\"] });\n map.set(\"byScope\", { field: \"scope\", rFields: [\"scope\"] });\n\n map.mapFields = [\"method\"];\n return map;\n}\n\n/**\n * Repository layer for Permission table.\n * Pure DB operations — no caching, no business logic.\n */\nexport class PermissionRepo {\n private readonly db: BaseRepoDBImpl<Permission>;\n\n constructor(tableName: string) {\n this.db = new BaseRepoDBImpl<Permission>();\n this.db.setTable(tableName);\n this.db.setIndexMap(createPermissionIndexMap());\n }\n\n async findById(id: string): Promise<Permission | null> {\n return this.db.findById(id);\n }\n\n async findByPermissionKey(permissionKey: string): Promise<Permission | null> {\n return this.db.findOne({\n indexName: \"byPermissionKey\",\n indexValue: permissionKey,\n });\n }\n\n async findByIndex(filter?: Filter): Promise<List<Partial<Permission>>> {\n const parsedFilter = parseIndexFilter(filter, this.db.getIndexMap());\n return this.db.find({ indexName: parsedFilter.indexName, indexValue: parsedFilter.indexValue });\n }\n\n async save(permission: Partial<Permission>): Promise<Permission> {\n if (!permission.id) permission.id = generateUUID();\n\n const now = formatDateTimeStr(new Date());\n if (!permission.createdAt) permission.createdAt = now;\n permission.updatedAt = now;\n\n // Build composite key: role#resource#scope\n if (permission.role && permission.resource && permission.scope) {\n permission.permissionKey = `${permission.role}#${permission.resource}#${permission.scope}`;\n }\n\n return this.db.save(permission);\n }\n\n async update(permission: Partial<Permission>): Promise<Permission> {\n permission.updatedAt = formatDateTimeStr(new Date());\n\n // Rebuild composite key if components changed\n if (permission.role && permission.resource && permission.scope) {\n permission.permissionKey = `${permission.role}#${permission.resource}#${permission.scope}`;\n }\n\n return this.db.update(permission);\n }\n\n async delete(id: string): Promise<boolean> {\n return this.db.delete(id);\n }\n\n async scan(): Promise<List<Partial<Permission>>> {\n return this.db.scan({});\n }\n}\n"]}
|
|
@@ -1,9 +1,22 @@
|
|
|
1
|
-
import { Dayjs } from "dayjs";
|
|
1
|
+
import type { Dayjs } from "dayjs";
|
|
2
|
+
import { DateInput, DateStr, DateTimeStr, LocalTimeStr, TimeStr, YearMonthStr, YearStr } from "../model/index.js";
|
|
3
|
+
export declare function isDateStr(value: string): value is DateStr;
|
|
4
|
+
export declare function isDateTimeStr(value: string): value is DateTimeStr;
|
|
5
|
+
export declare function isTimeStr(value: string): value is TimeStr;
|
|
6
|
+
export declare function isLocalTimeStr(value: string): value is LocalTimeStr;
|
|
7
|
+
export declare function isYearMonthStr(value: string): value is YearMonthStr;
|
|
8
|
+
export declare function isYearStr(value: string): value is YearStr;
|
|
9
|
+
export declare function formatDateStr(value: DateInput): DateStr;
|
|
10
|
+
export declare function formatDateTimeStr(value: DateInput): DateTimeStr;
|
|
11
|
+
export declare function formatTimeStr(value: DateInput): TimeStr;
|
|
12
|
+
export declare function formatLocalTimeStr(value: DateInput): LocalTimeStr;
|
|
13
|
+
export declare function formatYearMonthStr(value: DateInput): YearMonthStr;
|
|
14
|
+
export declare function formatYearStr(value: DateInput): YearStr;
|
|
2
15
|
export declare function isValidDate(dateStr: string): boolean;
|
|
3
|
-
export declare function isSameYearMonth(date1:
|
|
4
|
-
export declare function isCurrentMonth(date:
|
|
16
|
+
export declare function isSameYearMonth(date1: DateInput, date2: DateInput): boolean;
|
|
17
|
+
export declare function isCurrentMonth(date: DateInput): boolean;
|
|
5
18
|
export declare function isFutureMonth(date: string): boolean;
|
|
6
|
-
export declare function addSecondToDate(date:
|
|
19
|
+
export declare function addSecondToDate(date: DateInput): Dayjs;
|
|
7
20
|
/**
|
|
8
21
|
* Returns the oldest date string from a list of date strings.
|
|
9
22
|
* @param dateStrList List of date strings (ISO or other formats supported by dayjs).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.util.d.ts","sourceRoot":"","sources":["../../src/utils/date.util.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"date.util.d.ts","sourceRoot":"","sources":["../../src/utils/date.util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAInC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAwChH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,OAAO,CAEzD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,WAAW,CAEjE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,OAAO,CAEzD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAEnE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAEnE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,OAAO,CAEzD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAEvD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAE/D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAEvD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,CAEjE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,CAEjE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAEvD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGpD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAI3E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAEvD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAYnD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,KAAK,CAEtD;AACD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,MAAM,CAErD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,MAAM,CAErD"}
|
package/dist/utils/date.util.js
CHANGED
|
@@ -3,6 +3,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isDateStr = isDateStr;
|
|
7
|
+
exports.isDateTimeStr = isDateTimeStr;
|
|
8
|
+
exports.isTimeStr = isTimeStr;
|
|
9
|
+
exports.isLocalTimeStr = isLocalTimeStr;
|
|
10
|
+
exports.isYearMonthStr = isYearMonthStr;
|
|
11
|
+
exports.isYearStr = isYearStr;
|
|
12
|
+
exports.formatDateStr = formatDateStr;
|
|
13
|
+
exports.formatDateTimeStr = formatDateTimeStr;
|
|
14
|
+
exports.formatTimeStr = formatTimeStr;
|
|
15
|
+
exports.formatLocalTimeStr = formatLocalTimeStr;
|
|
16
|
+
exports.formatYearMonthStr = formatYearMonthStr;
|
|
17
|
+
exports.formatYearStr = formatYearStr;
|
|
6
18
|
exports.isValidDate = isValidDate;
|
|
7
19
|
exports.isSameYearMonth = isSameYearMonth;
|
|
8
20
|
exports.isCurrentMonth = isCurrentMonth;
|
|
@@ -11,6 +23,73 @@ exports.addSecondToDate = addSecondToDate;
|
|
|
11
23
|
exports.minDateStr = minDateStr;
|
|
12
24
|
exports.maxDateStr = maxDateStr;
|
|
13
25
|
const dayjs_1 = __importDefault(require("dayjs"));
|
|
26
|
+
const customParseFormat_1 = __importDefault(require("dayjs/plugin/customParseFormat"));
|
|
27
|
+
const utc_1 = __importDefault(require("dayjs/plugin/utc"));
|
|
28
|
+
dayjs_1.default.extend(customParseFormat_1.default);
|
|
29
|
+
dayjs_1.default.extend(utc_1.default);
|
|
30
|
+
const DATE_STRING_FORMAT = "YYYY-MM-DD";
|
|
31
|
+
const DATE_YEAR_MONTH_STRING_FORMAT = "YYYY-MM";
|
|
32
|
+
const DATE_YEAR_STRING_FORMAT = "YYYY";
|
|
33
|
+
const TIME_STRING_WITHOUT_OFFSET_FORMAT = "HH:mm:ss.SSS";
|
|
34
|
+
const TIME_STRING_WITH_OFFSET_FORMAT = "HH:mm:ss.SSSZ";
|
|
35
|
+
const DATE_TIME_STRING_FORMATS = ["YYYY-MM-DDTHH:mm:ss.SSS[Z]", "YYYY-MM-DDTHH:mm:ss.SSSZ"];
|
|
36
|
+
function isValidFormat(value, format) {
|
|
37
|
+
return (0, dayjs_1.default)(value, format, true).isValid();
|
|
38
|
+
}
|
|
39
|
+
function castDateStr(value) {
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
function castDateTimeStr(value) {
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
function castYearMonthStr(value) {
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
function castYearStr(value) {
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
function castTimeStr(value) {
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
function castLocalTimeStr(value) {
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
function isDateStr(value) {
|
|
58
|
+
return isValidFormat(value, DATE_STRING_FORMAT);
|
|
59
|
+
}
|
|
60
|
+
function isDateTimeStr(value) {
|
|
61
|
+
return isValidFormat(value, DATE_TIME_STRING_FORMATS);
|
|
62
|
+
}
|
|
63
|
+
function isTimeStr(value) {
|
|
64
|
+
return isValidFormat(value, TIME_STRING_WITH_OFFSET_FORMAT);
|
|
65
|
+
}
|
|
66
|
+
function isLocalTimeStr(value) {
|
|
67
|
+
return isValidFormat(value, TIME_STRING_WITHOUT_OFFSET_FORMAT);
|
|
68
|
+
}
|
|
69
|
+
function isYearMonthStr(value) {
|
|
70
|
+
return isValidFormat(value, DATE_YEAR_MONTH_STRING_FORMAT);
|
|
71
|
+
}
|
|
72
|
+
function isYearStr(value) {
|
|
73
|
+
return isValidFormat(value, DATE_YEAR_STRING_FORMAT);
|
|
74
|
+
}
|
|
75
|
+
function formatDateStr(value) {
|
|
76
|
+
return castDateStr((0, dayjs_1.default)(value).format(DATE_STRING_FORMAT));
|
|
77
|
+
}
|
|
78
|
+
function formatDateTimeStr(value) {
|
|
79
|
+
return castDateTimeStr((0, dayjs_1.default)(value).utc().format("YYYY-MM-DDTHH:mm:ss.SSS[Z]"));
|
|
80
|
+
}
|
|
81
|
+
function formatTimeStr(value) {
|
|
82
|
+
return castTimeStr((0, dayjs_1.default)(value).format(TIME_STRING_WITH_OFFSET_FORMAT));
|
|
83
|
+
}
|
|
84
|
+
function formatLocalTimeStr(value) {
|
|
85
|
+
return castLocalTimeStr((0, dayjs_1.default)(value).format(TIME_STRING_WITHOUT_OFFSET_FORMAT));
|
|
86
|
+
}
|
|
87
|
+
function formatYearMonthStr(value) {
|
|
88
|
+
return castYearMonthStr((0, dayjs_1.default)(value).format(DATE_YEAR_MONTH_STRING_FORMAT));
|
|
89
|
+
}
|
|
90
|
+
function formatYearStr(value) {
|
|
91
|
+
return castYearStr((0, dayjs_1.default)(value).format(DATE_YEAR_STRING_FORMAT));
|
|
92
|
+
}
|
|
14
93
|
function isValidDate(dateStr) {
|
|
15
94
|
const d = new Date(dateStr);
|
|
16
95
|
return !Number.isNaN(d.getTime());
|
|
@@ -59,11 +138,10 @@ function minMaxDateStr(dateStrList, isMax) {
|
|
|
59
138
|
const filtered = dateStrList.filter((d) => !!d);
|
|
60
139
|
if (filtered.length === 0)
|
|
61
140
|
return "";
|
|
62
|
-
return filtered.reduce((
|
|
141
|
+
return filtered.slice(1).reduce((selectedDate, current) => {
|
|
63
142
|
if (isMax)
|
|
64
|
-
return (0, dayjs_1.default)(current).isAfter((0, dayjs_1.default)(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
});
|
|
143
|
+
return (0, dayjs_1.default)(current).isAfter((0, dayjs_1.default)(selectedDate)) ? current : selectedDate;
|
|
144
|
+
return (0, dayjs_1.default)(current).isBefore((0, dayjs_1.default)(selectedDate)) ? current : selectedDate;
|
|
145
|
+
}, filtered[0]);
|
|
68
146
|
}
|
|
69
147
|
//# sourceMappingURL=date.util.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.util.js","sourceRoot":"","sources":["../../src/utils/date.util.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"date.util.js","sourceRoot":"","sources":["../../src/utils/date.util.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Dayjs } from \"dayjs\";\nimport dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport utc from \"dayjs/plugin/utc\";\nimport { DateInput, DateStr, DateTimeStr, LocalTimeStr, TimeStr, YearMonthStr, YearStr } from \"@chinggis/types\";\n\ndayjs.extend(customParseFormat);\ndayjs.extend(utc);\n\nconst DATE_STRING_FORMAT = \"YYYY-MM-DD\";\nconst DATE_YEAR_MONTH_STRING_FORMAT = \"YYYY-MM\";\nconst DATE_YEAR_STRING_FORMAT = \"YYYY\";\nconst TIME_STRING_WITHOUT_OFFSET_FORMAT = \"HH:mm:ss.SSS\";\nconst TIME_STRING_WITH_OFFSET_FORMAT = \"HH:mm:ss.SSSZ\";\nconst DATE_TIME_STRING_FORMATS = [\"YYYY-MM-DDTHH:mm:ss.SSS[Z]\", \"YYYY-MM-DDTHH:mm:ss.SSSZ\"];\n\nfunction isValidFormat(value: string, format: string | string[]): boolean {\n return dayjs(value, format, true).isValid();\n}\n\nfunction castDateStr(value: string): DateStr {\n return value as DateStr;\n}\n\nfunction castDateTimeStr(value: string): DateTimeStr {\n return value as DateTimeStr;\n}\n\nfunction castYearMonthStr(value: string): YearMonthStr {\n return value as YearMonthStr;\n}\n\nfunction castYearStr(value: string): YearStr {\n return value as YearStr;\n}\n\nfunction castTimeStr(value: string): TimeStr {\n return value as TimeStr;\n}\n\nfunction castLocalTimeStr(value: string): LocalTimeStr {\n return value as LocalTimeStr;\n}\n\nexport function isDateStr(value: string): value is DateStr {\n return isValidFormat(value, DATE_STRING_FORMAT);\n}\n\nexport function isDateTimeStr(value: string): value is DateTimeStr {\n return isValidFormat(value, DATE_TIME_STRING_FORMATS);\n}\n\nexport function isTimeStr(value: string): value is TimeStr {\n return isValidFormat(value, TIME_STRING_WITH_OFFSET_FORMAT);\n}\n\nexport function isLocalTimeStr(value: string): value is LocalTimeStr {\n return isValidFormat(value, TIME_STRING_WITHOUT_OFFSET_FORMAT);\n}\n\nexport function isYearMonthStr(value: string): value is YearMonthStr {\n return isValidFormat(value, DATE_YEAR_MONTH_STRING_FORMAT);\n}\n\nexport function isYearStr(value: string): value is YearStr {\n return isValidFormat(value, DATE_YEAR_STRING_FORMAT);\n}\n\nexport function formatDateStr(value: DateInput): DateStr {\n return castDateStr(dayjs(value).format(DATE_STRING_FORMAT));\n}\n\nexport function formatDateTimeStr(value: DateInput): DateTimeStr {\n return castDateTimeStr(dayjs(value).utc().format(\"YYYY-MM-DDTHH:mm:ss.SSS[Z]\"));\n}\n\nexport function formatTimeStr(value: DateInput): TimeStr {\n return castTimeStr(dayjs(value).format(TIME_STRING_WITH_OFFSET_FORMAT));\n}\n\nexport function formatLocalTimeStr(value: DateInput): LocalTimeStr {\n return castLocalTimeStr(dayjs(value).format(TIME_STRING_WITHOUT_OFFSET_FORMAT));\n}\n\nexport function formatYearMonthStr(value: DateInput): YearMonthStr {\n return castYearMonthStr(dayjs(value).format(DATE_YEAR_MONTH_STRING_FORMAT));\n}\n\nexport function formatYearStr(value: DateInput): YearStr {\n return castYearStr(dayjs(value).format(DATE_YEAR_STRING_FORMAT));\n}\n\nexport function isValidDate(dateStr: string): boolean {\n const d = new Date(dateStr);\n return !Number.isNaN(d.getTime());\n}\n\nexport function isSameYearMonth(date1: DateInput, date2: DateInput): boolean {\n const d1 = dayjs(date1);\n const d2 = dayjs(date2);\n return d1.isSame(d2, \"month\") && d1.isSame(d2, \"year\");\n}\n\nexport function isCurrentMonth(date: DateInput): boolean {\n return isSameYearMonth(date, new Date());\n}\n\nexport function isFutureMonth(date: string): boolean {\n const inputDate = new Date(date);\n const today = new Date();\n\n // Extract year and month\n const inputYear = inputDate.getFullYear();\n const inputMonth = inputDate.getMonth(); // 0-based (0 = Jan)\n const currentYear = today.getFullYear();\n const currentMonth = today.getMonth();\n\n // Compare year-month\n return inputYear > currentYear || (inputYear === currentYear && inputMonth > currentMonth);\n}\n\nexport function addSecondToDate(date: DateInput): Dayjs {\n return dayjs(date).add(1, \"second\");\n}\n/**\n * Returns the oldest date string from a list of date strings.\n * @param dateStrList List of date strings (ISO or other formats supported by dayjs).\n * @returns The oldest date string, or an empty string if the list is empty.\n */\nexport function minDateStr(dateStrList: any[]): string {\n return minMaxDateStr(dateStrList, false);\n}\n\n/**\n * Returns the newest date string from a list of date strings.\n * @param dateStrList List of date strings (ISO or other formats supported by dayjs).\n * @returns The newest date string, or an empty string if the list is empty.\n */\nexport function maxDateStr(dateStrList: any[]): string {\n return minMaxDateStr(dateStrList, true);\n}\n\nfunction minMaxDateStr(dateStrList: any[], isMax: boolean): string {\n if (!dateStrList || dateStrList.length === 0) return \"\";\n\n const filtered = dateStrList.filter((d) => !!d);\n if (filtered.length === 0) return \"\";\n\n return filtered.slice(1).reduce((selectedDate, current) => {\n if (isMax) return dayjs(current).isAfter(dayjs(selectedDate)) ? current : selectedDate;\n return dayjs(current).isBefore(dayjs(selectedDate)) ? current : selectedDate;\n }, filtered[0]);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamodb.utils.d.ts","sourceRoot":"","sources":["../../src/utils/dynamodb.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAI/F,OAAO,EAAE,MAAM,EAAa,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzE,eAAO,MAAM,YAAY,QAAO,MAE/B,CAAC;AAEF,eAAO,MAAM,6BAA6B,GAAI,QAAQ,MAAM,EAAE,UAAU,cAAc,KAAG,
|
|
1
|
+
{"version":3,"file":"dynamodb.utils.d.ts","sourceRoot":"","sources":["../../src/utils/dynamodb.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -58,24 +58,41 @@ const buildDynamoDBFilterConditions = (filter, indexMap) => {
|
|
|
58
58
|
value: `:${safeKey}_val_${counter++}`,
|
|
59
59
|
};
|
|
60
60
|
};
|
|
61
|
-
|
|
62
|
-
if (filter.rangeFilterBy && filter.rangeFilterBy !== sortKeyField) {
|
|
63
|
-
const key = filter.rangeFilterBy;
|
|
61
|
+
const addRangeExpression = (key, rangeFilter) => {
|
|
64
62
|
const { name, value } = genPlaceholder(key);
|
|
63
|
+
const hasMin = rangeFilter.minValue !== undefined;
|
|
64
|
+
const hasMax = rangeFilter.maxValue !== undefined;
|
|
65
|
+
if (!hasMin && !hasMax)
|
|
66
|
+
return;
|
|
65
67
|
attrNames[name] = key;
|
|
66
|
-
if (
|
|
67
|
-
attrValues[value + "_min"] =
|
|
68
|
-
attrValues[value + "_max"] =
|
|
68
|
+
if (hasMin && hasMax && !rangeFilter.minExclude && !rangeFilter.maxExclude) {
|
|
69
|
+
attrValues[value + "_min"] = rangeFilter.minValue;
|
|
70
|
+
attrValues[value + "_max"] = rangeFilter.maxValue;
|
|
69
71
|
expressions.push(`${name} BETWEEN ${value}_min AND ${value}_max`);
|
|
72
|
+
return;
|
|
70
73
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
+
if (hasMin) {
|
|
75
|
+
const minValueKey = hasMax ? value + "_min" : value;
|
|
76
|
+
attrValues[minValueKey] = rangeFilter.minValue;
|
|
77
|
+
expressions.push(`${name} ${rangeFilter.minExclude ? ">" : ">="} ${minValueKey}`);
|
|
74
78
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
79
|
+
if (hasMax) {
|
|
80
|
+
const maxValueKey = hasMin ? value + "_max" : value;
|
|
81
|
+
attrValues[maxValueKey] = rangeFilter.maxValue;
|
|
82
|
+
expressions.push(`${name} ${rangeFilter.maxExclude ? "<" : "<="} ${maxValueKey}`);
|
|
78
83
|
}
|
|
84
|
+
};
|
|
85
|
+
// Range Filter
|
|
86
|
+
if (filter.rangeFilterBy && filter.rangeFilterBy !== sortKeyField) {
|
|
87
|
+
addRangeExpression(filter.rangeFilterBy, {
|
|
88
|
+
minValue: filter.rangeFilterMin,
|
|
89
|
+
maxValue: filter.rangeFilterMax,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
for (const rangeFilter of filter.rangeFilters ?? []) {
|
|
93
|
+
if (!rangeFilter?.fieldName || rangeFilter.fieldName === sortKeyField)
|
|
94
|
+
continue;
|
|
95
|
+
addRangeExpression(rangeFilter.fieldName, rangeFilter);
|
|
79
96
|
}
|
|
80
97
|
// Search Filter
|
|
81
98
|
if (filter.searchBy && filter.searchKeyword) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamodb.utils.js","sourceRoot":"","sources":["../../src/utils/dynamodb.utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { AttributeValue, QueryCommandInput, ScanCommandInput } from \"@aws-sdk/client-dynamodb\";\nimport { marshall, unmarshall } from \"@aws-sdk/util-dynamodb\";\nimport { excludeKeys } from \"./reflection.util\";\nimport { ErrorDynamoDB, MissingParameterError } from \"../exception/errors\";\nimport { Filter, SortOrder } from \"../model\";\nimport { ActionDynamoDB, DynamoIndexMap } from \"../model/dynamodb.model\";\n\nexport const generateUUID = (): string => {\n return crypto.randomUUID();\n};\n\nexport const buildDynamoDBFilterConditions = (filter: Filter, indexMap: DynamoIndexMap): FilterExpression => {\n if (!filter) throw new MissingParameterError(\"filter\");\n\n const indexInfo = indexMap.get(filter.indexName);\n const rFields = indexInfo?.rFields ?? [];\n const sortKeyField = indexInfo?.sortKeyField;\n\n const ignoredKeys = [\n ...rFields,\n sortKeyField,\n \"page\",\n \"size\",\n \"sortBy\",\n \"sort\",\n \"searchBy\",\n \"searchKeyword\",\n \"rangeFilterBy\",\n \"rangeFilterMin\",\n \"rangeFilterMax\",\n \"queryCountLimit\",\n \"lastKey\",\n \"indexName\",\n \"indexValue\",\n \"indexSortName\",\n \"indexSortValue\",\n \"rangeFilters\",\n \"fieldsInclude\",\n \"fieldsExclude\",\n ].filter(Boolean);\n\n const dynamicFilters = excludeKeys(filter, ignoredKeys);\n\n const expressions: string[] = [];\n const attrNames: Record<string, string> = {};\n const attrValues: Record<string, any> = {};\n\n let counter = 0;\n\n const genPlaceholder = (key: string) => {\n const safeKey = key.replace(/\\W+/g, \"_\");\n return {\n name: `#${safeKey}_${counter}`,\n value: `:${safeKey}_val_${counter++}`,\n };\n };\n\n // Range Filter\n if (filter.rangeFilterBy && filter.rangeFilterBy !== sortKeyField) {\n const key = filter.rangeFilterBy;\n const { name, value } = genPlaceholder(key);\n\n attrNames[name] = key;\n\n if (filter.rangeFilterMin !== undefined && filter.rangeFilterMax !== undefined) {\n attrValues[value + \"_min\"] = filter.rangeFilterMin;\n attrValues[value + \"_max\"] = filter.rangeFilterMax;\n expressions.push(`${name} BETWEEN ${value}_min AND ${value}_max`);\n } else if (filter.rangeFilterMin !== undefined) {\n attrValues[value] = filter.rangeFilterMin;\n expressions.push(`${name} >= ${value}`);\n } else if (filter.rangeFilterMax !== undefined) {\n attrValues[value] = filter.rangeFilterMax;\n expressions.push(`${name} <= ${value}`);\n }\n }\n\n // Search Filter\n if (filter.searchBy && filter.searchKeyword) {\n const fields = Array.isArray(filter.searchBy) ? filter.searchBy : [filter.searchBy];\n\n for (const key of fields) {\n const { name, value } = genPlaceholder(key);\n\n attrNames[name] = key;\n attrValues[value] = filter.searchKeyword;\n\n expressions.push(`contains(${name}, ${value})`);\n }\n }\n\n // General filters\n for (const [key, raw] of Object.entries(dynamicFilters)) {\n if (key === \"lastKey\") continue;\n const value = String(raw);\n const { name, value: valName } = genPlaceholder(key);\n attrNames[name] = key;\n\n if (value.startsWith(\"*\") && value.endsWith(\"*\")) {\n attrValues[valName] = checkFieldType(key, value.slice(1, -1), indexMap);\n expressions.push(`contains(${name}, ${valName})`);\n } else if (!value.startsWith(\"*\") && value.endsWith(\"*\")) {\n attrValues[valName] = checkFieldType(key, value.slice(0, -1), indexMap);\n expressions.push(`begins_with(${name}, ${valName})`);\n } else if (value.startsWith(\"!\")) {\n attrValues[valName] = checkFieldType(key, value.slice(1), indexMap);\n expressions.push(`${name} <> ${valName}`);\n } else if (value.includes(\",\")) {\n const values = value.split(\",\").map((v) => v.trim());\n const placeholders: string[] = [];\n\n values.forEach((v, i) => {\n const subVal = `${valName}_${i}`;\n attrValues[subVal] = checkFieldType(key, v, indexMap);\n placeholders.push(subVal);\n });\n\n expressions.push(`${name} IN (${placeholders.join(\", \")})`);\n } else {\n attrValues[valName] = checkFieldType(key, value, indexMap);\n expressions.push(`${name} = ${valName}`);\n }\n }\n\n if (expressions.length === 0) return {};\n\n return {\n filter: expressions.join(\" AND \"),\n attributeNames: attrNames,\n attributeValues: attrValues,\n };\n};\n\nconst marshallExpressionValue = (value: any): AttributeValue =>\n marshall(\n { val: value },\n {\n convertClassInstanceToMap: true,\n removeUndefinedValues: true,\n },\n ).val;\n\nconst marshallKeyConditionValue = (value: any): AttributeValue => {\n if (value instanceof Date) {\n return marshallExpressionValue(value.toISOString().slice(0, 10));\n }\n\n return marshallExpressionValue(value);\n};\n\nexport const buildQueryDB = (\n tableName: string,\n filter: Filter,\n indexMap: DynamoIndexMap,\n): QueryCommandInput => {\n if (!tableName || !filter) throw new MissingParameterError(\"tableName or filter\");\n\n const filterCondition: any = buildDynamoDBFilterConditions(filter, indexMap);\n const indexField = indexMap.get(filter.indexName)?.field;\n\n if (!indexField) {\n throw new ErrorDynamoDB(\n tableName,\n \"buildQueryDB\",\n \"find requires indexName and indexValue; use scan() otherwise\",\n );\n }\n\n return buildDynamoDBQueryCommand({\n filterCondition,\n filter,\n tableName,\n indexMap,\n });\n};\n\nexport const buildDynamoDBScanCommand = ({\n tableName,\n filter,\n expression,\n}: {\n tableName: string;\n filter?: Filter;\n expression?: FilterExpression;\n}): ScanCommandInput => {\n const scanCommand: ScanCommandInput = { TableName: tableName };\n\n if (filter?.lastKey && filter.lastKey != \"undefined\")\n scanCommand.ExclusiveStartKey = parseLastEvaluatedKey(filter.lastKey);\n if (isEmptyExpressions(expression)) return scanCommand;\n\n scanCommand.FilterExpression = expression.filter;\n scanCommand.ExpressionAttributeNames = expression.attributeNames;\n scanCommand.ExpressionAttributeValues = marshall(expression.attributeValues, {\n convertClassInstanceToMap: true,\n removeUndefinedValues: true,\n });\n\n return scanCommand;\n};\n\nexport const buildDynamoDBQueryCommand = ({\n filter,\n tableName,\n filterCondition,\n indexMap,\n}: {\n filterCondition: FilterExpression;\n tableName: string;\n filter?: Filter;\n indexMap: DynamoIndexMap;\n}): QueryCommandInput => {\n if (!filter.indexName) throw new Error(\"Missing indexName in filter\");\n if (filter.indexValue === undefined || filter.indexValue === null) throw new Error(\"Missing indexValue in filter\");\n\n const indexInfo = indexMap.get(filter.indexName);\n if (!indexInfo) throw new Error(`Index info not found for index: ${filter.indexName}`);\n\n const attr = indexInfo.field;\n const value = filter.indexValue;\n\n const attrKey = `#${attr}`;\n const valueKey = `:${attr}`;\n\n let keyConditionExpression = `${attrKey} = ${valueKey}`;\n let expressionAttributeNames: Record<string, string> = {\n [attrKey]: attr,\n };\n let expressionAttributeValues: Record<string, AttributeValue> = {\n [valueKey]: marshallKeyConditionValue(value),\n };\n\n const sortKeyCondition = buildSortKeyCondition(filter, indexInfo.sortKeyField);\n if (sortKeyCondition) {\n keyConditionExpression += ` AND ${sortKeyCondition.expression}`;\n Object.assign(expressionAttributeNames, sortKeyCondition.attributeNames);\n Object.assign(expressionAttributeValues, sortKeyCondition.attributeValues);\n }\n\n if (filterCondition?.filter) {\n if (filterCondition.attributeNames) {\n Object.assign(expressionAttributeNames, filterCondition.attributeNames);\n }\n if (filterCondition.attributeValues) {\n const marshalled = marshall(filterCondition.attributeValues, {\n convertClassInstanceToMap: true,\n removeUndefinedValues: true,\n });\n Object.assign(expressionAttributeValues, marshalled);\n }\n }\n\n const queryCommand: QueryCommandInput = {\n TableName: tableName,\n IndexName: filter.indexName,\n KeyConditionExpression: keyConditionExpression,\n FilterExpression: filterCondition?.filter,\n ExpressionAttributeNames: expressionAttributeNames,\n ExpressionAttributeValues: expressionAttributeValues,\n Limit: filter?.size ?? 25,\n ScanIndexForward: filter.sort === SortOrder.ASC,\n };\n\n if (filter.lastKey) {\n queryCommand.ExclusiveStartKey = parseLastEvaluatedKey(filter.lastKey);\n }\n\n return queryCommand;\n};\n\nconst hasValue = (value: any): boolean => value !== undefined && value !== null && value !== \"\";\n\nconst buildSortKeyCondition = (\n filter: Filter,\n sortKeyField?: string,\n): {\n expression: string;\n attributeNames: Record<string, string>;\n attributeValues: Record<string, AttributeValue>;\n} => {\n if (!sortKeyField) return undefined;\n\n const sortAttrKey = `#${sortKeyField}`;\n const sortValueKey = `:${sortKeyField}`;\n const attributeNames = { [sortAttrKey]: sortKeyField };\n\n const rangeFilter = filter.rangeFilters?.find((item) => item.fieldName === sortKeyField);\n if (rangeFilter && (hasValue(rangeFilter.minValue) || hasValue(rangeFilter.maxValue))) {\n return buildSortKeyRangeCondition(sortAttrKey, sortValueKey, attributeNames, rangeFilter);\n }\n\n if (filter.rangeFilterBy === sortKeyField && (hasValue(filter.rangeFilterMin) || hasValue(filter.rangeFilterMax))) {\n return buildSortKeyRangeCondition(sortAttrKey, sortValueKey, attributeNames, {\n fieldName: sortKeyField,\n minValue: filter.rangeFilterMin,\n maxValue: filter.rangeFilterMax,\n });\n }\n\n const explicitSortValue =\n (!filter.indexSortName || filter.indexSortName === sortKeyField) && hasValue(filter.indexSortValue)\n ? filter.indexSortValue\n : undefined;\n const directSortValue = hasValue(filter[sortKeyField]) ? filter[sortKeyField] : undefined;\n const sortValue = explicitSortValue ?? directSortValue;\n\n if (!hasValue(sortValue)) return undefined;\n\n return {\n expression: `${sortAttrKey} = ${sortValueKey}`,\n attributeNames,\n attributeValues: {\n [sortValueKey]: marshallKeyConditionValue(sortValue),\n },\n };\n};\n\nconst buildSortKeyRangeCondition = (\n sortAttrKey: string,\n sortValueKey: string,\n attributeNames: Record<string, string>,\n rangeFilter: { fieldName?: string; minValue?: any; maxValue?: any; minExclude?: boolean; maxExclude?: boolean },\n) => {\n const attributeValues: Record<string, AttributeValue> = {};\n const hasMin = hasValue(rangeFilter.minValue);\n const hasMax = hasValue(rangeFilter.maxValue);\n\n if (hasMin && hasMax) {\n if (!rangeFilter.minExclude && !rangeFilter.maxExclude) {\n attributeValues[`${sortValueKey}_min`] = marshallKeyConditionValue(rangeFilter.minValue);\n attributeValues[`${sortValueKey}_max`] = marshallKeyConditionValue(rangeFilter.maxValue);\n return {\n expression: `${sortAttrKey} BETWEEN ${sortValueKey}_min AND ${sortValueKey}_max`,\n attributeNames,\n attributeValues,\n };\n }\n\n attributeValues[`${sortValueKey}_min`] = marshallKeyConditionValue(rangeFilter.minValue);\n attributeValues[`${sortValueKey}_max`] = marshallKeyConditionValue(rangeFilter.maxValue);\n return {\n expression: `${sortAttrKey} ${rangeFilter.minExclude ? \">\" : \">=\"} ${sortValueKey}_min AND ${sortAttrKey} ${\n rangeFilter.maxExclude ? \"<\" : \"<=\"\n } ${sortValueKey}_max`,\n attributeNames,\n attributeValues,\n };\n }\n\n if (hasMin) {\n attributeValues[sortValueKey] = marshallKeyConditionValue(rangeFilter.minValue);\n return {\n expression: `${sortAttrKey} ${rangeFilter.minExclude ? \">\" : \">=\"} ${sortValueKey}`,\n attributeNames,\n attributeValues,\n };\n }\n\n attributeValues[sortValueKey] = marshallKeyConditionValue(rangeFilter.maxValue);\n return {\n expression: `${sortAttrKey} ${rangeFilter.maxExclude ? \"<\" : \"<=\"} ${sortValueKey}`,\n attributeNames,\n attributeValues,\n };\n};\nexport const generateIndexValues = (input: Record<string, any>, indexMap: DynamoIndexMap) => {\n const result: Record<string, string> = { ...input };\n\n for (const [, { field, rFields, fieldSeparator }] of indexMap.entries()) {\n const definedValues = rFields.filter((key) => input[key] !== undefined).map((key) => input[key]);\n\n if (definedValues.length > 0) {\n result[field] = definedValues.join(fieldSeparator ?? \"\");\n }\n }\n\n return result;\n};\n\nexport const addIndexValue = (entity: Record<string, any>, indexMap: DynamoIndexMap) => {\n if (!indexMap) return entity;\n\n const relatedIndexFields = Array.from(indexMap.values())\n .flatMap((v) => v.rFields)\n .filter((x) => !!x);\n\n if (!relatedIndexFields || relatedIndexFields.length <= 1) return entity;\n\n const indexedValues = generateIndexValues(entity, indexMap);\n return Object.assign(entity, indexedValues);\n};\nexport const validateEntityForUpdateFields = (\n entity: Record<string, any>,\n fieldNames: string[],\n tableName?: string,\n): boolean => {\n for (const field of fieldNames) {\n if (!(field in entity) || entity[field] === undefined || entity[field] === null) {\n throw new ErrorDynamoDB(tableName || \"UnknownTable\", `Entity must have value in field ${field}`);\n }\n }\n return false;\n};\n\nexport const addIndexField = (fieldNames: string[], indexMap: DynamoIndexMap): string[] => {\n // snapshot of original fields to avoid cascading through newly added fields\n const originalFields = new Set(fieldNames);\n\n // Ensure audit fields exist and are at the front in fixed order\n // Remove existing occurrences to avoid duplicates then unshift in the desired order\n for (const auditField of [\"updatedAt\", \"updatedBy\"]) {\n const idx = fieldNames.indexOf(auditField);\n if (idx !== -1) fieldNames.splice(idx, 1);\n }\n fieldNames.unshift(\"updatedBy\");\n fieldNames.unshift(\"updatedAt\");\n\n if (!indexMap) return fieldNames;\n\n // Consider only groups with more than one field\n const groups: string[][] = Array.from(indexMap.values())\n .map((v) => v.rFields?.filter(Boolean) ?? [])\n .filter((r) => r.length > 1);\n\n if (groups.length === 0) return fieldNames;\n\n // For each group, if any member existed in the ORIGINAL set, insert the missing members\n for (const rFields of groups) {\n const hasSeed = rFields.some((f) => originalFields.has(f));\n if (!hasSeed) continue;\n\n // Anchor insertion before the earliest occurrence of any ORIGINAL member of this group\n const anchorIndex = (() => {\n let minIdx = Number.POSITIVE_INFINITY;\n for (const f of rFields) {\n if (!originalFields.has(f)) continue;\n const idx = fieldNames.indexOf(f);\n if (idx !== -1 && idx < minIdx) minIdx = idx;\n }\n return isFinite(minIdx) ? minIdx : -1;\n })();\n\n // If no anchor found in the current array, skip\n if (anchorIndex === -1) continue;\n\n // Insert missing fields in the order defined by rFields before the anchor\n let insertAt = anchorIndex;\n for (const f of rFields) {\n if (originalFields.has(f)) continue; // only add fields that weren't originally present\n if (fieldNames.includes(f)) continue; // avoid duplicates anyway\n fieldNames.splice(insertAt, 0, f);\n insertAt += 1;\n }\n }\n\n return fieldNames;\n};\n\nexport function unMarshall<T>(dataRecords: Record<string, AttributeValue>[]): Array<T> {\n return dataRecords.map((data) => unmarshall(data) as T);\n}\n\nexport const isEmptyExpression = ({\n expression,\n}: {\n expression?: {\n FilterExpression?: string;\n ExpressionAttributeNames?: Record<string, string>;\n ExpressionAttributeValues?: Record<string, any>;\n };\n}): boolean => {\n if (!expression) return true;\n\n const { FilterExpression, ExpressionAttributeNames, ExpressionAttributeValues } = expression;\n\n const isEmptyObject = (obj?: object) => !obj || Object.keys(obj).length === 0;\n\n return !FilterExpression || isEmptyObject(ExpressionAttributeNames) || isEmptyObject(ExpressionAttributeValues);\n};\n\nexport function isEmptyExpressions(exp: FilterExpression) {\n const isEmptyObject = (obj?: object) => !obj || Object.keys(obj).length === 0;\n\n return !exp.filter || isEmptyObject(exp.attributeNames) || isEmptyObject(exp.attributeValues);\n}\n\nexport interface FilterExpression {\n filter?: string;\n attributeNames?: Record<string, string>;\n attributeValues?: Record<string, any>;\n}\n\nexport const checkFieldType = (key: string, value: string, indexMap: DynamoIndexMap): number | string => {\n if (indexMap?.numberFields && indexMap?.numberFields?.length > 0) {\n for (const field of indexMap.numberFields) {\n if (!field.includes(key)) continue;\n const numValue = Number(value);\n return isNaN(numValue) ? value : numValue;\n }\n }\n\n return value;\n};\n\nexport interface UpdateExpression {\n UpdateExpression: string;\n ExpressionAttributeNames: Record<string, string>;\n ExpressionAttributeValues: Record<string, any>;\n}\n\nfunction getValueByPath(data: Record<string, any>, path: string): any {\n return path.split(\".\").reduce((value, key) => value?.[key], data);\n}\n\nfunction isPathAncestor(parent: string, child: string): boolean {\n return child.startsWith(`${parent}.`);\n}\n\nfunction isExcludedUpdatePath(path: string, excludeKeys: string[]): boolean {\n return excludeKeys.some((excludedPath) => path === excludedPath || isPathAncestor(excludedPath, path));\n}\n\nfunction uniquePaths(paths: string[]): string[] {\n return Array.from(new Set(paths.filter((path) => path && path.trim() !== \"\")));\n}\n\nfunction removeOverlappingChildPaths(paths: string[]): string[] {\n const pathSet = new Set(paths);\n\n return paths.filter((path) => {\n for (const candidateParent of pathSet) {\n if (candidateParent !== path && isPathAncestor(candidateParent, path)) {\n return false;\n }\n }\n\n return true;\n });\n}\n\nexport function buildUpdateExpressions(\n data: Record<string, any>,\n excludeKeys: string[] = [],\n fieldsToUpdate?: string[],\n): UpdateExpression {\n const updateParts: string[] = [];\n const names: Record<string, string> = {};\n const values: Record<string, any> = {};\n\n const candidatePaths = fieldsToUpdate?.length ? fieldsToUpdate : Object.keys(data);\n const updatePaths = removeOverlappingChildPaths(uniquePaths(candidatePaths)).filter((path) => {\n if (isExcludedUpdatePath(path, excludeKeys)) return false;\n return getValueByPath(data, path) !== undefined;\n });\n\n updatePaths.forEach((path, idx) => {\n const attributePath = path\n .split(\".\")\n .map((part, partIndex) => {\n const attrKey = `#field${idx}_${partIndex}`;\n names[attrKey] = part;\n return attrKey;\n })\n .join(\".\");\n\n const valueKey = `:value${idx}`;\n const value = getValueByPath(data, path);\n\n if (value !== undefined) {\n updateParts.push(`${attributePath} = ${valueKey}`);\n values[valueKey] = value;\n }\n });\n\n if (updateParts.length === 0) {\n throw new Error(\"Шинэчлэх талбар алга байна\");\n }\n\n return {\n UpdateExpression: `SET ${updateParts.join(\", \")}`,\n ExpressionAttributeNames: names,\n ExpressionAttributeValues: marshall(values, { removeUndefinedValues: true }),\n };\n}\n\nexport const parseLastEvaluatedKey = <T>(lastKey: string): T | undefined => {\n if (!lastKey) {\n return undefined;\n }\n const decodeToken = Buffer.from(lastKey, \"base64\").toString();\n if (decodeToken.match(/^\\{.+\\}$/)) {\n return JSON.parse(decodeToken) as T;\n } else {\n return decodeToken as T;\n }\n};\n\nexport function generateLastEvaluatedKey<T>(item: any, indexField?: string, sortField?: string): string {\n if (!item?.id && (!indexField || !item?.[indexField])) throw new Error(\"id or indexField not found\");\n\n const result: Record<string, any> = {};\n\n if (item?.id) result.id = item.id;\n if (indexField && item[indexField]) result[indexField] = item[indexField];\n if (sortField && item[sortField]) result[sortField] = item[sortField];\n\n return toBase64(JSON.stringify(result));\n}\n\nexport function toBase64(inputStr: any): string {\n return Buffer.from(inputStr).toString(\"base64\");\n}\n\nexport function getTableName(eventSourceARN: any): string {\n if (!eventSourceARN) {\n console.error(\"cannot fetch table name from undefined DynamoDB record\");\n return;\n }\n return eventSourceARN.split(\":\")[5].split(\"/\")[1];\n}\n\nexport function parseImage(image: any) {\n if (!image) return undefined;\n try {\n const img = image as Record<string, AttributeValue>;\n return unmarshall(img);\n } catch (error) {\n log.error(\"cannot parse stream image to dynamoDB item\");\n throw new Error(error);\n }\n}\n\nexport function parseEventToAction(action: \"INSERT\" | \"MODIFY\" | \"REMOVE\"): ActionDynamoDB {\n switch (action) {\n case \"INSERT\":\n return ActionDynamoDB.INSERT;\n case \"MODIFY\":\n return ActionDynamoDB.MODIFY;\n case \"REMOVE\":\n return ActionDynamoDB.REMOVE;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dynamodb.utils.js","sourceRoot":"","sources":["../../src/utils/dynamodb.utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { AttributeValue, QueryCommandInput, ScanCommandInput } from \"@aws-sdk/client-dynamodb\";\nimport { marshall, unmarshall } from \"@aws-sdk/util-dynamodb\";\nimport { excludeKeys } from \"./reflection.util\";\nimport { ErrorDynamoDB, MissingParameterError } from \"../exception/errors\";\nimport { Filter, SortOrder } from \"../model\";\nimport { ActionDynamoDB, DynamoIndexMap } from \"../model/dynamodb.model\";\n\nexport const generateUUID = (): string => {\n return crypto.randomUUID();\n};\n\nexport const buildDynamoDBFilterConditions = (filter: Filter, indexMap: DynamoIndexMap): FilterExpression => {\n if (!filter) throw new MissingParameterError(\"filter\");\n\n const indexInfo = indexMap.get(filter.indexName);\n const rFields = indexInfo?.rFields ?? [];\n const sortKeyField = indexInfo?.sortKeyField;\n\n const ignoredKeys = [\n ...rFields,\n sortKeyField,\n \"page\",\n \"size\",\n \"sortBy\",\n \"sort\",\n \"searchBy\",\n \"searchKeyword\",\n \"rangeFilterBy\",\n \"rangeFilterMin\",\n \"rangeFilterMax\",\n \"queryCountLimit\",\n \"lastKey\",\n \"indexName\",\n \"indexValue\",\n \"indexSortName\",\n \"indexSortValue\",\n \"rangeFilters\",\n \"fieldsInclude\",\n \"fieldsExclude\",\n ].filter(Boolean);\n\n const dynamicFilters = excludeKeys(filter, ignoredKeys);\n\n const expressions: string[] = [];\n const attrNames: Record<string, string> = {};\n const attrValues: Record<string, any> = {};\n\n let counter = 0;\n\n const genPlaceholder = (key: string) => {\n const safeKey = key.replace(/\\W+/g, \"_\");\n return {\n name: `#${safeKey}_${counter}`,\n value: `:${safeKey}_val_${counter++}`,\n };\n };\n\n const addRangeExpression = (\n key: string,\n rangeFilter: { minValue?: any; maxValue?: any; minExclude?: boolean; maxExclude?: boolean },\n ) => {\n const { name, value } = genPlaceholder(key);\n const hasMin = rangeFilter.minValue !== undefined;\n const hasMax = rangeFilter.maxValue !== undefined;\n\n if (!hasMin && !hasMax) return;\n\n attrNames[name] = key;\n\n if (hasMin && hasMax && !rangeFilter.minExclude && !rangeFilter.maxExclude) {\n attrValues[value + \"_min\"] = rangeFilter.minValue;\n attrValues[value + \"_max\"] = rangeFilter.maxValue;\n expressions.push(`${name} BETWEEN ${value}_min AND ${value}_max`);\n return;\n }\n\n if (hasMin) {\n const minValueKey = hasMax ? value + \"_min\" : value;\n attrValues[minValueKey] = rangeFilter.minValue;\n expressions.push(`${name} ${rangeFilter.minExclude ? \">\" : \">=\"} ${minValueKey}`);\n }\n\n if (hasMax) {\n const maxValueKey = hasMin ? value + \"_max\" : value;\n attrValues[maxValueKey] = rangeFilter.maxValue;\n expressions.push(`${name} ${rangeFilter.maxExclude ? \"<\" : \"<=\"} ${maxValueKey}`);\n }\n };\n\n // Range Filter\n if (filter.rangeFilterBy && filter.rangeFilterBy !== sortKeyField) {\n addRangeExpression(filter.rangeFilterBy, {\n minValue: filter.rangeFilterMin,\n maxValue: filter.rangeFilterMax,\n });\n }\n\n for (const rangeFilter of filter.rangeFilters ?? []) {\n if (!rangeFilter?.fieldName || rangeFilter.fieldName === sortKeyField) continue;\n addRangeExpression(rangeFilter.fieldName, rangeFilter);\n }\n\n // Search Filter\n if (filter.searchBy && filter.searchKeyword) {\n const fields = Array.isArray(filter.searchBy) ? filter.searchBy : [filter.searchBy];\n\n for (const key of fields) {\n const { name, value } = genPlaceholder(key);\n\n attrNames[name] = key;\n attrValues[value] = filter.searchKeyword;\n\n expressions.push(`contains(${name}, ${value})`);\n }\n }\n\n // General filters\n for (const [key, raw] of Object.entries(dynamicFilters)) {\n if (key === \"lastKey\") continue;\n const value = String(raw);\n const { name, value: valName } = genPlaceholder(key);\n attrNames[name] = key;\n\n if (value.startsWith(\"*\") && value.endsWith(\"*\")) {\n attrValues[valName] = checkFieldType(key, value.slice(1, -1), indexMap);\n expressions.push(`contains(${name}, ${valName})`);\n } else if (!value.startsWith(\"*\") && value.endsWith(\"*\")) {\n attrValues[valName] = checkFieldType(key, value.slice(0, -1), indexMap);\n expressions.push(`begins_with(${name}, ${valName})`);\n } else if (value.startsWith(\"!\")) {\n attrValues[valName] = checkFieldType(key, value.slice(1), indexMap);\n expressions.push(`${name} <> ${valName}`);\n } else if (value.includes(\",\")) {\n const values = value.split(\",\").map((v) => v.trim());\n const placeholders: string[] = [];\n\n values.forEach((v, i) => {\n const subVal = `${valName}_${i}`;\n attrValues[subVal] = checkFieldType(key, v, indexMap);\n placeholders.push(subVal);\n });\n\n expressions.push(`${name} IN (${placeholders.join(\", \")})`);\n } else {\n attrValues[valName] = checkFieldType(key, value, indexMap);\n expressions.push(`${name} = ${valName}`);\n }\n }\n\n if (expressions.length === 0) return {};\n\n return {\n filter: expressions.join(\" AND \"),\n attributeNames: attrNames,\n attributeValues: attrValues,\n };\n};\n\nconst marshallExpressionValue = (value: any): AttributeValue =>\n marshall(\n { val: value },\n {\n convertClassInstanceToMap: true,\n removeUndefinedValues: true,\n },\n ).val;\n\nconst marshallKeyConditionValue = (value: any): AttributeValue => {\n if (value instanceof Date) {\n return marshallExpressionValue(value.toISOString().slice(0, 10));\n }\n\n return marshallExpressionValue(value);\n};\n\nexport const buildQueryDB = (\n tableName: string,\n filter: Filter,\n indexMap: DynamoIndexMap,\n): QueryCommandInput => {\n if (!tableName || !filter) throw new MissingParameterError(\"tableName or filter\");\n\n const filterCondition: any = buildDynamoDBFilterConditions(filter, indexMap);\n const indexField = indexMap.get(filter.indexName)?.field;\n\n if (!indexField) {\n throw new ErrorDynamoDB(\n tableName,\n \"buildQueryDB\",\n \"find requires indexName and indexValue; use scan() otherwise\",\n );\n }\n\n return buildDynamoDBQueryCommand({\n filterCondition,\n filter,\n tableName,\n indexMap,\n });\n};\n\nexport const buildDynamoDBScanCommand = ({\n tableName,\n filter,\n expression,\n}: {\n tableName: string;\n filter?: Filter;\n expression?: FilterExpression;\n}): ScanCommandInput => {\n const scanCommand: ScanCommandInput = { TableName: tableName };\n\n if (filter?.lastKey && filter.lastKey != \"undefined\")\n scanCommand.ExclusiveStartKey = parseLastEvaluatedKey(filter.lastKey);\n if (isEmptyExpressions(expression)) return scanCommand;\n\n scanCommand.FilterExpression = expression.filter;\n scanCommand.ExpressionAttributeNames = expression.attributeNames;\n scanCommand.ExpressionAttributeValues = marshall(expression.attributeValues, {\n convertClassInstanceToMap: true,\n removeUndefinedValues: true,\n });\n\n return scanCommand;\n};\n\nexport const buildDynamoDBQueryCommand = ({\n filter,\n tableName,\n filterCondition,\n indexMap,\n}: {\n filterCondition: FilterExpression;\n tableName: string;\n filter?: Filter;\n indexMap: DynamoIndexMap;\n}): QueryCommandInput => {\n if (!filter.indexName) throw new Error(\"Missing indexName in filter\");\n if (filter.indexValue === undefined || filter.indexValue === null) throw new Error(\"Missing indexValue in filter\");\n\n const indexInfo = indexMap.get(filter.indexName);\n if (!indexInfo) throw new Error(`Index info not found for index: ${filter.indexName}`);\n\n const attr = indexInfo.field;\n const value = filter.indexValue;\n\n const attrKey = `#${attr}`;\n const valueKey = `:${attr}`;\n\n let keyConditionExpression = `${attrKey} = ${valueKey}`;\n let expressionAttributeNames: Record<string, string> = {\n [attrKey]: attr,\n };\n let expressionAttributeValues: Record<string, AttributeValue> = {\n [valueKey]: marshallKeyConditionValue(value),\n };\n\n const sortKeyCondition = buildSortKeyCondition(filter, indexInfo.sortKeyField);\n if (sortKeyCondition) {\n keyConditionExpression += ` AND ${sortKeyCondition.expression}`;\n Object.assign(expressionAttributeNames, sortKeyCondition.attributeNames);\n Object.assign(expressionAttributeValues, sortKeyCondition.attributeValues);\n }\n\n if (filterCondition?.filter) {\n if (filterCondition.attributeNames) {\n Object.assign(expressionAttributeNames, filterCondition.attributeNames);\n }\n if (filterCondition.attributeValues) {\n const marshalled = marshall(filterCondition.attributeValues, {\n convertClassInstanceToMap: true,\n removeUndefinedValues: true,\n });\n Object.assign(expressionAttributeValues, marshalled);\n }\n }\n\n const queryCommand: QueryCommandInput = {\n TableName: tableName,\n IndexName: filter.indexName,\n KeyConditionExpression: keyConditionExpression,\n FilterExpression: filterCondition?.filter,\n ExpressionAttributeNames: expressionAttributeNames,\n ExpressionAttributeValues: expressionAttributeValues,\n Limit: filter?.size ?? 25,\n ScanIndexForward: filter.sort === SortOrder.ASC,\n };\n\n if (filter.lastKey) {\n queryCommand.ExclusiveStartKey = parseLastEvaluatedKey(filter.lastKey);\n }\n\n return queryCommand;\n};\n\nconst hasValue = (value: any): boolean => value !== undefined && value !== null && value !== \"\";\n\nconst buildSortKeyCondition = (\n filter: Filter,\n sortKeyField?: string,\n): {\n expression: string;\n attributeNames: Record<string, string>;\n attributeValues: Record<string, AttributeValue>;\n} => {\n if (!sortKeyField) return undefined;\n\n const sortAttrKey = `#${sortKeyField}`;\n const sortValueKey = `:${sortKeyField}`;\n const attributeNames = { [sortAttrKey]: sortKeyField };\n\n const rangeFilter = filter.rangeFilters?.find((item) => item.fieldName === sortKeyField);\n if (rangeFilter && (hasValue(rangeFilter.minValue) || hasValue(rangeFilter.maxValue))) {\n return buildSortKeyRangeCondition(sortAttrKey, sortValueKey, attributeNames, rangeFilter);\n }\n\n if (filter.rangeFilterBy === sortKeyField && (hasValue(filter.rangeFilterMin) || hasValue(filter.rangeFilterMax))) {\n return buildSortKeyRangeCondition(sortAttrKey, sortValueKey, attributeNames, {\n fieldName: sortKeyField,\n minValue: filter.rangeFilterMin,\n maxValue: filter.rangeFilterMax,\n });\n }\n\n const explicitSortValue =\n (!filter.indexSortName || filter.indexSortName === sortKeyField) && hasValue(filter.indexSortValue)\n ? filter.indexSortValue\n : undefined;\n const directSortValue = hasValue(filter[sortKeyField]) ? filter[sortKeyField] : undefined;\n const sortValue = explicitSortValue ?? directSortValue;\n\n if (!hasValue(sortValue)) return undefined;\n\n return {\n expression: `${sortAttrKey} = ${sortValueKey}`,\n attributeNames,\n attributeValues: {\n [sortValueKey]: marshallKeyConditionValue(sortValue),\n },\n };\n};\n\nconst buildSortKeyRangeCondition = (\n sortAttrKey: string,\n sortValueKey: string,\n attributeNames: Record<string, string>,\n rangeFilter: { fieldName?: string; minValue?: any; maxValue?: any; minExclude?: boolean; maxExclude?: boolean },\n) => {\n const attributeValues: Record<string, AttributeValue> = {};\n const hasMin = hasValue(rangeFilter.minValue);\n const hasMax = hasValue(rangeFilter.maxValue);\n\n if (hasMin && hasMax) {\n if (!rangeFilter.minExclude && !rangeFilter.maxExclude) {\n attributeValues[`${sortValueKey}_min`] = marshallKeyConditionValue(rangeFilter.minValue);\n attributeValues[`${sortValueKey}_max`] = marshallKeyConditionValue(rangeFilter.maxValue);\n return {\n expression: `${sortAttrKey} BETWEEN ${sortValueKey}_min AND ${sortValueKey}_max`,\n attributeNames,\n attributeValues,\n };\n }\n\n attributeValues[`${sortValueKey}_min`] = marshallKeyConditionValue(rangeFilter.minValue);\n attributeValues[`${sortValueKey}_max`] = marshallKeyConditionValue(rangeFilter.maxValue);\n return {\n expression: `${sortAttrKey} ${rangeFilter.minExclude ? \">\" : \">=\"} ${sortValueKey}_min AND ${sortAttrKey} ${\n rangeFilter.maxExclude ? \"<\" : \"<=\"\n } ${sortValueKey}_max`,\n attributeNames,\n attributeValues,\n };\n }\n\n if (hasMin) {\n attributeValues[sortValueKey] = marshallKeyConditionValue(rangeFilter.minValue);\n return {\n expression: `${sortAttrKey} ${rangeFilter.minExclude ? \">\" : \">=\"} ${sortValueKey}`,\n attributeNames,\n attributeValues,\n };\n }\n\n attributeValues[sortValueKey] = marshallKeyConditionValue(rangeFilter.maxValue);\n return {\n expression: `${sortAttrKey} ${rangeFilter.maxExclude ? \"<\" : \"<=\"} ${sortValueKey}`,\n attributeNames,\n attributeValues,\n };\n};\nexport const generateIndexValues = (input: Record<string, any>, indexMap: DynamoIndexMap) => {\n const result: Record<string, string> = { ...input };\n\n for (const [, { field, rFields, fieldSeparator }] of indexMap.entries()) {\n const definedValues = rFields.filter((key) => input[key] !== undefined).map((key) => input[key]);\n\n if (definedValues.length > 0) {\n result[field] = definedValues.join(fieldSeparator ?? \"\");\n }\n }\n\n return result;\n};\n\nexport const addIndexValue = (entity: Record<string, any>, indexMap: DynamoIndexMap) => {\n if (!indexMap) return entity;\n\n const relatedIndexFields = Array.from(indexMap.values())\n .flatMap((v) => v.rFields)\n .filter((x) => !!x);\n\n if (!relatedIndexFields || relatedIndexFields.length <= 1) return entity;\n\n const indexedValues = generateIndexValues(entity, indexMap);\n return Object.assign(entity, indexedValues);\n};\nexport const validateEntityForUpdateFields = (\n entity: Record<string, any>,\n fieldNames: string[],\n tableName?: string,\n): boolean => {\n for (const field of fieldNames) {\n if (!(field in entity) || entity[field] === undefined || entity[field] === null) {\n throw new ErrorDynamoDB(tableName || \"UnknownTable\", `Entity must have value in field ${field}`);\n }\n }\n return false;\n};\n\nexport const addIndexField = (fieldNames: string[], indexMap: DynamoIndexMap): string[] => {\n // snapshot of original fields to avoid cascading through newly added fields\n const originalFields = new Set(fieldNames);\n\n // Ensure audit fields exist and are at the front in fixed order\n // Remove existing occurrences to avoid duplicates then unshift in the desired order\n for (const auditField of [\"updatedAt\", \"updatedBy\"]) {\n const idx = fieldNames.indexOf(auditField);\n if (idx !== -1) fieldNames.splice(idx, 1);\n }\n fieldNames.unshift(\"updatedBy\");\n fieldNames.unshift(\"updatedAt\");\n\n if (!indexMap) return fieldNames;\n\n // Consider only groups with more than one field\n const groups: string[][] = Array.from(indexMap.values())\n .map((v) => v.rFields?.filter(Boolean) ?? [])\n .filter((r) => r.length > 1);\n\n if (groups.length === 0) return fieldNames;\n\n // For each group, if any member existed in the ORIGINAL set, insert the missing members\n for (const rFields of groups) {\n const hasSeed = rFields.some((f) => originalFields.has(f));\n if (!hasSeed) continue;\n\n // Anchor insertion before the earliest occurrence of any ORIGINAL member of this group\n const anchorIndex = (() => {\n let minIdx = Number.POSITIVE_INFINITY;\n for (const f of rFields) {\n if (!originalFields.has(f)) continue;\n const idx = fieldNames.indexOf(f);\n if (idx !== -1 && idx < minIdx) minIdx = idx;\n }\n return isFinite(minIdx) ? minIdx : -1;\n })();\n\n // If no anchor found in the current array, skip\n if (anchorIndex === -1) continue;\n\n // Insert missing fields in the order defined by rFields before the anchor\n let insertAt = anchorIndex;\n for (const f of rFields) {\n if (originalFields.has(f)) continue; // only add fields that weren't originally present\n if (fieldNames.includes(f)) continue; // avoid duplicates anyway\n fieldNames.splice(insertAt, 0, f);\n insertAt += 1;\n }\n }\n\n return fieldNames;\n};\n\nexport function unMarshall<T>(dataRecords: Record<string, AttributeValue>[]): Array<T> {\n return dataRecords.map((data) => unmarshall(data) as T);\n}\n\nexport const isEmptyExpression = ({\n expression,\n}: {\n expression?: {\n FilterExpression?: string;\n ExpressionAttributeNames?: Record<string, string>;\n ExpressionAttributeValues?: Record<string, any>;\n };\n}): boolean => {\n if (!expression) return true;\n\n const { FilterExpression, ExpressionAttributeNames, ExpressionAttributeValues } = expression;\n\n const isEmptyObject = (obj?: object) => !obj || Object.keys(obj).length === 0;\n\n return !FilterExpression || isEmptyObject(ExpressionAttributeNames) || isEmptyObject(ExpressionAttributeValues);\n};\n\nexport function isEmptyExpressions(exp: FilterExpression) {\n const isEmptyObject = (obj?: object) => !obj || Object.keys(obj).length === 0;\n\n return !exp.filter || isEmptyObject(exp.attributeNames) || isEmptyObject(exp.attributeValues);\n}\n\nexport interface FilterExpression {\n filter?: string;\n attributeNames?: Record<string, string>;\n attributeValues?: Record<string, any>;\n}\n\nexport const checkFieldType = (key: string, value: string, indexMap: DynamoIndexMap): number | string => {\n if (indexMap?.numberFields && indexMap?.numberFields?.length > 0) {\n for (const field of indexMap.numberFields) {\n if (!field.includes(key)) continue;\n const numValue = Number(value);\n return isNaN(numValue) ? value : numValue;\n }\n }\n\n return value;\n};\n\nexport interface UpdateExpression {\n UpdateExpression: string;\n ExpressionAttributeNames: Record<string, string>;\n ExpressionAttributeValues: Record<string, any>;\n}\n\nfunction getValueByPath(data: Record<string, any>, path: string): any {\n return path.split(\".\").reduce((value, key) => value?.[key], data);\n}\n\nfunction isPathAncestor(parent: string, child: string): boolean {\n return child.startsWith(`${parent}.`);\n}\n\nfunction isExcludedUpdatePath(path: string, excludeKeys: string[]): boolean {\n return excludeKeys.some((excludedPath) => path === excludedPath || isPathAncestor(excludedPath, path));\n}\n\nfunction uniquePaths(paths: string[]): string[] {\n return Array.from(new Set(paths.filter((path) => path && path.trim() !== \"\")));\n}\n\nfunction removeOverlappingChildPaths(paths: string[]): string[] {\n const pathSet = new Set(paths);\n\n return paths.filter((path) => {\n for (const candidateParent of pathSet) {\n if (candidateParent !== path && isPathAncestor(candidateParent, path)) {\n return false;\n }\n }\n\n return true;\n });\n}\n\nexport function buildUpdateExpressions(\n data: Record<string, any>,\n excludeKeys: string[] = [],\n fieldsToUpdate?: string[],\n): UpdateExpression {\n const updateParts: string[] = [];\n const names: Record<string, string> = {};\n const values: Record<string, any> = {};\n\n const candidatePaths = fieldsToUpdate?.length ? fieldsToUpdate : Object.keys(data);\n const updatePaths = removeOverlappingChildPaths(uniquePaths(candidatePaths)).filter((path) => {\n if (isExcludedUpdatePath(path, excludeKeys)) return false;\n return getValueByPath(data, path) !== undefined;\n });\n\n updatePaths.forEach((path, idx) => {\n const attributePath = path\n .split(\".\")\n .map((part, partIndex) => {\n const attrKey = `#field${idx}_${partIndex}`;\n names[attrKey] = part;\n return attrKey;\n })\n .join(\".\");\n\n const valueKey = `:value${idx}`;\n const value = getValueByPath(data, path);\n\n if (value !== undefined) {\n updateParts.push(`${attributePath} = ${valueKey}`);\n values[valueKey] = value;\n }\n });\n\n if (updateParts.length === 0) {\n throw new Error(\"Шинэчлэх талбар алга байна\");\n }\n\n return {\n UpdateExpression: `SET ${updateParts.join(\", \")}`,\n ExpressionAttributeNames: names,\n ExpressionAttributeValues: marshall(values, { removeUndefinedValues: true }),\n };\n}\n\nexport const parseLastEvaluatedKey = <T>(lastKey: string): T | undefined => {\n if (!lastKey) {\n return undefined;\n }\n const decodeToken = Buffer.from(lastKey, \"base64\").toString();\n if (decodeToken.match(/^\\{.+\\}$/)) {\n return JSON.parse(decodeToken) as T;\n } else {\n return decodeToken as T;\n }\n};\n\nexport function generateLastEvaluatedKey<T>(item: any, indexField?: string, sortField?: string): string {\n if (!item?.id && (!indexField || !item?.[indexField])) throw new Error(\"id or indexField not found\");\n\n const result: Record<string, any> = {};\n\n if (item?.id) result.id = item.id;\n if (indexField && item[indexField]) result[indexField] = item[indexField];\n if (sortField && item[sortField]) result[sortField] = item[sortField];\n\n return toBase64(JSON.stringify(result));\n}\n\nexport function toBase64(inputStr: any): string {\n return Buffer.from(inputStr).toString(\"base64\");\n}\n\nexport function getTableName(eventSourceARN: any): string {\n if (!eventSourceARN) {\n console.error(\"cannot fetch table name from undefined DynamoDB record\");\n return;\n }\n return eventSourceARN.split(\":\")[5].split(\"/\")[1];\n}\n\nexport function parseImage(image: any) {\n if (!image) return undefined;\n try {\n const img = image as Record<string, AttributeValue>;\n return unmarshall(img);\n } catch (error) {\n log.error(\"cannot parse stream image to dynamoDB item\");\n throw new Error(error);\n }\n}\n\nexport function parseEventToAction(action: \"INSERT\" | \"MODIFY\" | \"REMOVE\"): ActionDynamoDB {\n switch (action) {\n case \"INSERT\":\n return ActionDynamoDB.INSERT;\n case \"MODIFY\":\n return ActionDynamoDB.MODIFY;\n case \"REMOVE\":\n return ActionDynamoDB.REMOVE;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n}\n"]}
|
|
@@ -32,6 +32,8 @@ export interface HttpRequest<B = any, Q = any, P = any> {
|
|
|
32
32
|
}
|
|
33
33
|
export declare const parseHttpRequest: (event: APIGatewayProxyEvent, config: EntityConfig) => HttpRequest;
|
|
34
34
|
export declare function parseFilter(params: Record<string, any> | string, searchBy?: string[]): Filter;
|
|
35
|
-
export declare function toRecord(queryString: string
|
|
35
|
+
export declare function toRecord(queryString: string, options?: {
|
|
36
|
+
parseDates?: boolean;
|
|
37
|
+
}): Record<string, any>;
|
|
36
38
|
export declare function findMatchedPolicy(methode: HttpMethod, path: string, policies: EndpointPolicy[]): EndpointPolicy;
|
|
37
39
|
//# sourceMappingURL=http.util.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.util.d.ts","sourceRoot":"","sources":["../../../src/utils/http/http.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,cAAc,EACd,YAAY,EACZ,MAAM,EACN,UAAU,EACV,WAAW,EACX,cAAc,EAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,kBAG1C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,YAAY,MAAM,EAClB,MAAM,GAAG,EACT,UAAU,kBAAkB,EAC5B,kBAAkB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KACvC,WAaF,CAAC;AAEF,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG;IACpD,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,EAAE,UAAU,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,+BAA+B,CAAC,EAAE,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,gBAAgB,GAAI,OAAO,oBAAoB,EAAE,QAAQ,YAAY,KAAG,WAiFpF,CAAC;AAEF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"http.util.d.ts","sourceRoot":"","sources":["../../../src/utils/http/http.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,cAAc,EACd,YAAY,EACZ,MAAM,EACN,UAAU,EACV,WAAW,EACX,cAAc,EAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,kBAG1C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,YAAY,MAAM,EAClB,MAAM,GAAG,EACT,UAAU,kBAAkB,EAC5B,kBAAkB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KACvC,WAaF,CAAC;AAEF,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG;IACpD,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,EAAE,UAAU,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,+BAA+B,CAAC,EAAE,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,gBAAgB,GAAI,OAAO,oBAAoB,EAAE,QAAQ,YAAY,KAAG,WAiFpF,CAAC;AAEF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAwG7F;AAiCD,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAiBrG;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,cAAc,CAM/G"}
|
|
@@ -105,7 +105,7 @@ function parseFilter(params, searchBy) {
|
|
|
105
105
|
// If the params is a string (URL query string), parse it first
|
|
106
106
|
let parsedParams;
|
|
107
107
|
if (typeof params === "string") {
|
|
108
|
-
parsedParams = toRecord(params);
|
|
108
|
+
parsedParams = toRecord(params, { parseDates: false });
|
|
109
109
|
}
|
|
110
110
|
else {
|
|
111
111
|
parsedParams = params;
|
|
@@ -131,24 +131,11 @@ function parseFilter(params, searchBy) {
|
|
|
131
131
|
if (typeof value === "number") {
|
|
132
132
|
return value;
|
|
133
133
|
}
|
|
134
|
-
|
|
135
|
-
if (value instanceof Date) {
|
|
134
|
+
if (typeof value === "string" && /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?)?$/.test(value)) {
|
|
136
135
|
return value;
|
|
137
136
|
}
|
|
138
137
|
// Convert to string for parsing
|
|
139
138
|
const stringValue = String(value);
|
|
140
|
-
// Check if it's a valid date first (before number parsing)
|
|
141
|
-
if (/^\d{4}-\d{2}-\d{2}/.test(stringValue) || /^\d{4}\.\d{2}\.\d{2}/.test(stringValue)) {
|
|
142
|
-
const date = new Date(stringValue);
|
|
143
|
-
if (!Number.isNaN(date.getTime()))
|
|
144
|
-
return date;
|
|
145
|
-
}
|
|
146
|
-
// Check for another date format that might be used in range filters
|
|
147
|
-
if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(stringValue)) {
|
|
148
|
-
const date = new Date(stringValue);
|
|
149
|
-
if (!Number.isNaN(date.getTime()))
|
|
150
|
-
return date;
|
|
151
|
-
}
|
|
152
139
|
// Check if it's a valid number (including decimals)
|
|
153
140
|
const numberValue = Number.parseFloat(stringValue);
|
|
154
141
|
if (!Number.isNaN(numberValue)) {
|
|
@@ -207,6 +194,12 @@ function parseFilter(params, searchBy) {
|
|
|
207
194
|
function smartParse(value) {
|
|
208
195
|
if (value.includes("*"))
|
|
209
196
|
return value;
|
|
197
|
+
if (/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?)?$/.test(value)) {
|
|
198
|
+
const parsedDate = new Date(value);
|
|
199
|
+
if (!Number.isNaN(parsedDate.getTime())) {
|
|
200
|
+
return parsedDate;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
210
203
|
// Boolean
|
|
211
204
|
if (value === "true")
|
|
212
205
|
return true;
|
|
@@ -218,19 +211,6 @@ function smartParse(value) {
|
|
|
218
211
|
// Float / Double
|
|
219
212
|
if (/^-?\d*\.\d+$/.test(value))
|
|
220
213
|
return parseFloat(value);
|
|
221
|
-
// ISO Date (YYYY-MM-DD) or Dot Date (YYYY.MM.DD)
|
|
222
|
-
if (/^\d{4}-\d{2}-\d{2}/.test(value)) {
|
|
223
|
-
const date = new Date(value);
|
|
224
|
-
if (!isNaN(date.getTime()))
|
|
225
|
-
return date;
|
|
226
|
-
}
|
|
227
|
-
if (/^\d{4}\.\d{2}\.\d{2}/.test(value)) {
|
|
228
|
-
// Convert to ISO format for Date constructor
|
|
229
|
-
const isoValue = value.replace(/\./g, "-");
|
|
230
|
-
const date = new Date(isoValue);
|
|
231
|
-
if (!isNaN(date.getTime()))
|
|
232
|
-
return date;
|
|
233
|
-
}
|
|
234
214
|
if (typeof value === "string" && value.includes(",")) {
|
|
235
215
|
const valueList = value.split(",");
|
|
236
216
|
for (let i = 1; i < valueList.length; i++) {
|
|
@@ -241,13 +221,18 @@ function smartParse(value) {
|
|
|
241
221
|
// Default: string
|
|
242
222
|
return value;
|
|
243
223
|
}
|
|
244
|
-
function toRecord(queryString) {
|
|
224
|
+
function toRecord(queryString, options) {
|
|
245
225
|
const result = {};
|
|
246
226
|
const pairs = queryString.split("&");
|
|
227
|
+
const parseDates = options?.parseDates ?? true;
|
|
247
228
|
for (const pair of pairs) {
|
|
248
229
|
const [key, value] = pair.split("=");
|
|
249
230
|
if (key && value !== undefined) {
|
|
250
|
-
|
|
231
|
+
const decodedValue = decodeURIComponent(value);
|
|
232
|
+
result[key] =
|
|
233
|
+
!parseDates && /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?)?$/.test(decodedValue)
|
|
234
|
+
? decodedValue
|
|
235
|
+
: smartParse(decodedValue);
|
|
251
236
|
}
|
|
252
237
|
}
|
|
253
238
|
return result;
|