aws-service-stack 0.18.447 → 0.18.450

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.
Files changed (76) hide show
  1. package/README.md +79 -7
  2. package/dist/controller/base-controller.d.ts +2 -1
  3. package/dist/controller/base-controller.d.ts.map +1 -1
  4. package/dist/controller/base-controller.js +64 -15
  5. package/dist/controller/base-controller.js.map +1 -1
  6. package/dist/controller/controller-api.d.ts +13 -2
  7. package/dist/controller/controller-api.d.ts.map +1 -1
  8. package/dist/controller/controller-api.js +77 -10
  9. package/dist/controller/controller-api.js.map +1 -1
  10. package/dist/controller/controller-request.d.ts +3 -0
  11. package/dist/controller/controller-request.d.ts.map +1 -1
  12. package/dist/controller/controller-request.js +5 -0
  13. package/dist/controller/controller-request.js.map +1 -1
  14. package/dist/controller/controller-role.d.ts +2 -1
  15. package/dist/controller/controller-role.d.ts.map +1 -1
  16. package/dist/controller/controller-role.js +12 -3
  17. package/dist/controller/controller-role.js.map +1 -1
  18. package/dist/exception/exception-handler.d.ts.map +1 -1
  19. package/dist/exception/exception-handler.js +17 -2
  20. package/dist/exception/exception-handler.js.map +1 -1
  21. package/dist/model/base.config.d.ts +4 -1
  22. package/dist/model/base.config.d.ts.map +1 -1
  23. package/dist/model/base.config.js +1 -0
  24. package/dist/model/base.config.js.map +1 -1
  25. package/dist/model/base.model.d.ts +3 -0
  26. package/dist/model/base.model.d.ts.map +1 -1
  27. package/dist/model/base.model.js.map +1 -1
  28. package/dist/model/caller.model.d.ts +22 -0
  29. package/dist/model/caller.model.d.ts.map +1 -0
  30. package/dist/model/caller.model.js +12 -0
  31. package/dist/model/caller.model.js.map +1 -0
  32. package/dist/model/index.d.ts +1 -0
  33. package/dist/model/index.d.ts.map +1 -1
  34. package/dist/model/index.js +1 -0
  35. package/dist/model/index.js.map +1 -1
  36. package/dist/model/validation.model.d.ts +15 -1
  37. package/dist/model/validation.model.d.ts.map +1 -1
  38. package/dist/model/validation.model.js +3 -1
  39. package/dist/model/validation.model.js.map +1 -1
  40. package/dist/repositories/base-es.repo.d.ts.map +1 -1
  41. package/dist/repositories/base-es.repo.js +4 -0
  42. package/dist/repositories/base-es.repo.js.map +1 -1
  43. package/dist/utils/auth/caller.d.ts +9 -0
  44. package/dist/utils/auth/caller.d.ts.map +1 -0
  45. package/dist/utils/auth/caller.js +108 -0
  46. package/dist/utils/auth/caller.js.map +1 -0
  47. package/dist/utils/auth/policy-view.d.ts +42 -0
  48. package/dist/utils/auth/policy-view.d.ts.map +1 -0
  49. package/dist/utils/auth/policy-view.js +170 -0
  50. package/dist/utils/auth/policy-view.js.map +1 -0
  51. package/dist/utils/http/api-event.d.ts +23 -0
  52. package/dist/utils/http/api-event.d.ts.map +1 -0
  53. package/dist/utils/http/api-event.js +84 -0
  54. package/dist/utils/http/api-event.js.map +1 -0
  55. package/dist/utils/http/http.util.d.ts +12 -2
  56. package/dist/utils/http/http.util.d.ts.map +1 -1
  57. package/dist/utils/http/http.util.js +50 -24
  58. package/dist/utils/http/http.util.js.map +1 -1
  59. package/dist/utils/index.d.ts +4 -0
  60. package/dist/utils/index.d.ts.map +1 -1
  61. package/dist/utils/index.js +4 -0
  62. package/dist/utils/index.js.map +1 -1
  63. package/dist/utils/opensearch/opensearch.mapping.d.ts +35 -0
  64. package/dist/utils/opensearch/opensearch.mapping.d.ts.map +1 -0
  65. package/dist/utils/opensearch/opensearch.mapping.js +95 -0
  66. package/dist/utils/opensearch/opensearch.mapping.js.map +1 -0
  67. package/dist/utils/opensearch/opensearch.parser.aggs.d.ts +2 -1
  68. package/dist/utils/opensearch/opensearch.parser.aggs.d.ts.map +1 -1
  69. package/dist/utils/opensearch/opensearch.parser.aggs.js +38 -4
  70. package/dist/utils/opensearch/opensearch.parser.aggs.js.map +1 -1
  71. package/dist/utils/opensearch/opensearch.parser.d.ts +1 -1
  72. package/dist/utils/reflection.util.d.ts +4 -0
  73. package/dist/utils/reflection.util.d.ts.map +1 -1
  74. package/dist/utils/reflection.util.js +17 -0
  75. package/dist/utils/reflection.util.js.map +1 -1
  76. package/package.json +76 -19
@@ -1 +1 @@
1
- {"version":3,"file":"base.config.js","sourceRoot":"","sources":["../../src/model/base.config.ts"],"names":[],"mappings":";;;AAEA,qCAAqC;AACrC;IACE,IAAI,CAAS,CAAC,sBAAsB;IACpC,uBAAuB,CAAU;IACjC,gBAAgB,CAAS,CAAC,iCAAiC;IAC3D,GAAG,CAAiB;IAEpB,YAAY,SAAiB,EAAE,cAAsB,EAAE,QAAwB,EAAE,eAAwB;QACvG,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,eAAe;YAAE,IAAI,CAAC,uBAAuB,GAAG,eAAe,CAAC;QACpE,IAAI,cAAc;YAAE,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC;QAC3D,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;IACtB,CAAC;CACF;;AAED,uCAAuC;AACvC;IACE,MAAM,CAAS;IACf,KAAK,CAAS;IAEd,YAAY,MAAc,EAAE,SAAiB;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACzB,CAAC;CACF;;AAeD,0CAA0C;AAC1C;IACE,SAAS,CAAS,CAAC,uCAAuC;IAC1D,SAAS,CAAiB,CAAC,yBAAyB;IACpD,WAAW,CAAmB,CAAC,2BAA2B;IAC1D,eAAe,CAAmB,CAAC,sCAAsC;IACzE,gBAAgB,CAAW,CAAC,+BAA+B;IAE3D,YAAY,CAAe;IAC3B,cAAc,CAAiB;IAE/B,0BAA0B,CAAU;IACpC,mBAAmB,CAAS;IAE5B,YAAY,QAAgB,EAAE,cAAyB;QACrD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,gBAAgB,GAAG,cAAc,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED,cAAc,CAAC,WAAwB;QACrC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IAED,iCAAiC;IACjC,WAAW,CACT,SAAiB,EACjB,cAAsB,EACtB,QAAwB,EACxB,oBAA6B;QAE7B,IAAI,CAAC,SAAS,GAAG,IAAI,cAAc,CAAC,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QAC/F,IAAI,oBAAoB;YAAE,IAAI,CAAC,0BAA0B,GAAG,oBAAoB,CAAC;QACjF,IAAI,cAAc;YAAE,IAAI,CAAC,mBAAmB,GAAG,cAAc,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mCAAmC;IACnC,aAAa,CAAC,MAAc,EAAE,KAAa;QACzC,IAAI,CAAC,WAAW,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8EAA8E;IAC9E,gBAAgB,CAAC,aAA4B;QAC3C,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,WAAW,CAAC,QAA0B;QACpC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAC7E,QAAQ;QACN,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,0BAA0B,EAAE,IAAI,CAAC,0BAA0B;YAC3D,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC;IACJ,CAAC;CACF","sourcesContent":["import { DynamoIndexMap, EndpointPolicy, PermissionMap, TraceChange } from \"@chinggis/core\";\n\n/** Generic DynamoDB Configuration */\nexport class DynamoDBConfig {\n NAME: string; // DynamoDB table name\n OWNER_PARENT_FIELD_NAME?: string;\n OWNER_FIELD_NAME: string; // DynamoDB index map for queries\n MAP: DynamoIndexMap;\n\n constructor(tableName: string, ownerFieldName: string, indexMap: DynamoIndexMap, parentFieldName?: string) {\n this.NAME = tableName;\n if (parentFieldName) this.OWNER_PARENT_FIELD_NAME = parentFieldName;\n if (ownerFieldName) this.OWNER_FIELD_NAME = ownerFieldName;\n this.MAP = indexMap;\n }\n}\n\n/** Generic OpenSearch Configuration */\nexport class OpenSearchConfig {\n DOMAIN: string;\n INDEX: string;\n\n constructor(domain: string, indexName: string) {\n this.DOMAIN = domain;\n this.INDEX = indexName;\n }\n}\n\n/** Configuration interface for type safety */\nexport interface EntityConfig {\n BASE_PATH: string;\n DYNAMO_DB: DynamoDBConfig;\n OPEN_SEARCH: OpenSearchConfig;\n ENDPOINT_POLICY: EndpointPolicy[];\n ADMIN_GROUP_NAME: string[];\n OWNER_PARENT_ID_FIELD_NAME?: string;\n OWNER_ID_FIELD_NAME?: string;\n TRACE_CHANGE?: TraceChange;\n PERMISSION_MAP?: PermissionMap;\n}\n\n/** Generic Entity Configuration Class **/\nexport class EntityConfigImpl implements EntityConfig {\n BASE_PATH: string; //Entity name for logging and debugging\n DYNAMO_DB: DynamoDBConfig; // DynamoDB configuration\n OPEN_SEARCH: OpenSearchConfig; // OpenSearch configuration\n ENDPOINT_POLICY: EndpointPolicy[]; // Path-based permission configuration\n ADMIN_GROUP_NAME: string[]; // Admin group name for Cognito\n\n TRACE_CHANGE?: TraceChange;\n PERMISSION_MAP?: PermissionMap;\n\n OWNER_PARENT_ID_FIELD_NAME?: string;\n OWNER_ID_FIELD_NAME: string;\n\n constructor(basePath: string, adminGroupName?: string[]) {\n this.BASE_PATH = basePath;\n this.ADMIN_GROUP_NAME = adminGroupName || [\"admin\"];\n this.ENDPOINT_POLICY = [];\n }\n\n setTraceChange(traceChange: TraceChange): void {\n this.TRACE_CHANGE = traceChange;\n }\n\n /** Set DynamoDB configuration */\n setDynamoDB(\n tableName: string,\n ownerFieldName: string,\n indexMap: DynamoIndexMap,\n ownerParentFieldName?: string,\n ): this {\n this.DYNAMO_DB = new DynamoDBConfig(tableName, ownerFieldName, indexMap, ownerParentFieldName);\n if (ownerParentFieldName) this.OWNER_PARENT_ID_FIELD_NAME = ownerParentFieldName;\n if (ownerFieldName) this.OWNER_ID_FIELD_NAME = ownerFieldName;\n return this;\n }\n\n /** Set OpenSearch configuration */\n setOpenSearch(domain: string, index: string): this {\n this.OPEN_SEARCH = new OpenSearchConfig(domain, index);\n return this;\n }\n\n /** Set permission map for RBAC: scope filtering, role table, and role path */\n setPermissionMap(permissionMap: PermissionMap): this {\n this.PERMISSION_MAP = permissionMap;\n return this;\n }\n\n /** Set path-based policies */\n setPolicies(policies: EndpointPolicy[]): this {\n this.ENDPOINT_POLICY = policies;\n return this;\n }\n\n /** Get configuration as a plain object (for BaseController compatibility) */\n toObject(): EntityConfig {\n return {\n BASE_PATH: this.BASE_PATH,\n DYNAMO_DB: this.DYNAMO_DB,\n OPEN_SEARCH: this.OPEN_SEARCH,\n ENDPOINT_POLICY: this.ENDPOINT_POLICY,\n TRACE_CHANGE: this.TRACE_CHANGE,\n ADMIN_GROUP_NAME: this.ADMIN_GROUP_NAME,\n OWNER_PARENT_ID_FIELD_NAME: this.OWNER_PARENT_ID_FIELD_NAME,\n OWNER_ID_FIELD_NAME: this.OWNER_ID_FIELD_NAME,\n PERMISSION_MAP: this.PERMISSION_MAP,\n };\n }\n}\n"]}
1
+ {"version":3,"file":"base.config.js","sourceRoot":"","sources":["../../src/model/base.config.ts"],"names":[],"mappings":"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","sourcesContent":["import { CallerPoolConfig, DynamoIndexMap, EndpointPolicy, PermissionMap, TraceChange } from \"@chinggis/core\";\n\n/** Generic DynamoDB Configuration */\nexport class DynamoDBConfig {\n NAME: string; // DynamoDB table name\n OWNER_PARENT_FIELD_NAME?: string;\n OWNER_FIELD_NAME: string; // DynamoDB index map for queries\n MAP: DynamoIndexMap;\n\n constructor(tableName: string, ownerFieldName: string, indexMap: DynamoIndexMap, parentFieldName?: string) {\n this.NAME = tableName;\n if (parentFieldName) this.OWNER_PARENT_FIELD_NAME = parentFieldName;\n if (ownerFieldName) this.OWNER_FIELD_NAME = ownerFieldName;\n this.MAP = indexMap;\n }\n}\n\n/** Generic OpenSearch Configuration */\nexport class OpenSearchConfig {\n DOMAIN: string;\n INDEX: string;\n\n constructor(domain: string, indexName: string) {\n this.DOMAIN = domain;\n this.INDEX = indexName;\n }\n}\n\n/** Configuration interface for type safety */\nexport interface EntityConfig {\n BASE_PATH: string;\n DYNAMO_DB: DynamoDBConfig;\n OPEN_SEARCH: OpenSearchConfig;\n ENDPOINT_POLICY: EndpointPolicy[];\n ADMIN_GROUP_NAME: string[];\n OWNER_PARENT_ID_FIELD_NAME?: string;\n OWNER_ID_FIELD_NAME?: string;\n TRACE_CHANGE?: TraceChange;\n PERMISSION_MAP?: PermissionMap;\n /** Cognito pools for verified caller kinds; absent = env CALLER_POOLS, else legacy REST authorizer claims */\n CALLER_POOLS?: CallerPoolConfig[];\n}\n\n/** Generic Entity Configuration Class **/\nexport class EntityConfigImpl implements EntityConfig {\n BASE_PATH: string; //Entity name for logging and debugging\n DYNAMO_DB: DynamoDBConfig; // DynamoDB configuration\n OPEN_SEARCH: OpenSearchConfig; // OpenSearch configuration\n ENDPOINT_POLICY: EndpointPolicy[]; // Path-based permission configuration\n ADMIN_GROUP_NAME: string[]; // Admin group name for Cognito\n\n TRACE_CHANGE?: TraceChange;\n PERMISSION_MAP?: PermissionMap;\n CALLER_POOLS?: CallerPoolConfig[];\n\n OWNER_PARENT_ID_FIELD_NAME?: string;\n OWNER_ID_FIELD_NAME: string;\n\n constructor(basePath: string, adminGroupName?: string[]) {\n this.BASE_PATH = basePath;\n this.ADMIN_GROUP_NAME = adminGroupName || [\"admin\"];\n this.ENDPOINT_POLICY = [];\n }\n\n setTraceChange(traceChange: TraceChange): void {\n this.TRACE_CHANGE = traceChange;\n }\n\n /** Set DynamoDB configuration */\n setDynamoDB(\n tableName: string,\n ownerFieldName: string,\n indexMap: DynamoIndexMap,\n ownerParentFieldName?: string,\n ): this {\n this.DYNAMO_DB = new DynamoDBConfig(tableName, ownerFieldName, indexMap, ownerParentFieldName);\n if (ownerParentFieldName) this.OWNER_PARENT_ID_FIELD_NAME = ownerParentFieldName;\n if (ownerFieldName) this.OWNER_ID_FIELD_NAME = ownerFieldName;\n return this;\n }\n\n /** Set OpenSearch configuration */\n setOpenSearch(domain: string, index: string): this {\n this.OPEN_SEARCH = new OpenSearchConfig(domain, index);\n return this;\n }\n\n /** Set permission map for RBAC: scope filtering, role table, and role path */\n setPermissionMap(permissionMap: PermissionMap): this {\n this.PERMISSION_MAP = permissionMap;\n return this;\n }\n\n /** Set path-based policies */\n setPolicies(policies: EndpointPolicy[]): this {\n this.ENDPOINT_POLICY = policies;\n return this;\n }\n\n /** Get configuration as a plain object (for BaseController compatibility) */\n toObject(): EntityConfig {\n return {\n BASE_PATH: this.BASE_PATH,\n DYNAMO_DB: this.DYNAMO_DB,\n OPEN_SEARCH: this.OPEN_SEARCH,\n ENDPOINT_POLICY: this.ENDPOINT_POLICY,\n TRACE_CHANGE: this.TRACE_CHANGE,\n ADMIN_GROUP_NAME: this.ADMIN_GROUP_NAME,\n OWNER_PARENT_ID_FIELD_NAME: this.OWNER_PARENT_ID_FIELD_NAME,\n OWNER_ID_FIELD_NAME: this.OWNER_ID_FIELD_NAME,\n PERMISSION_MAP: this.PERMISSION_MAP,\n };\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { RequestType } from "./validation.model";
2
+ import type { CallerKind } from "./caller.model";
2
3
  import { Action } from "./http.model";
3
4
  import { DateStr, DateTimeStr, YearMonthStr, YearStr } from "./date-string.model";
4
5
  import { Dayjs } from "dayjs";
@@ -65,5 +66,7 @@ export interface PermissionMap {
65
66
  roleTable: string;
66
67
  userPoolId?: string;
67
68
  rolePath?: string;
69
+ /** Verified caller kinds allowed to use role-table access; default [CallerKind.ADMIN]. Ignored without a caller (legacy) */
70
+ kinds?: CallerKind[];
68
71
  }
69
72
  //# sourceMappingURL=base.model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.model.d.ts","sourceRoot":"","sources":["../../src/model/base.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9G,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;AAE9C,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,SAAS,CAAC,EAAE,WAAW,CAAC;IAExB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,SAAS,CAAC,EAAE,GAAG,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAEvC,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAE1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,IAAI,CAAC,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,QAAS,SAAQ,GAAG,CAAC,MAAM,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;CAAG;AAExG,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"base.model.d.ts","sourceRoot":"","sources":["../../src/model/base.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9G,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;AAE9C,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,SAAS,CAAC,EAAE,WAAW,CAAC;IAExB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,SAAS,CAAC,EAAE,GAAG,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAEvC,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAE1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,IAAI,CAAC,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,QAAS,SAAQ,GAAG,CAAC,MAAM,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;CAAG;AAExG,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4HAA4H;IAC5H,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"base.model.js","sourceRoot":"","sources":["../../src/model/base.model.ts"],"names":[],"mappings":";;;AA+DA,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;AACrB,CAAC,EAHW,aAAa,aAAb,aAAa,GAAb,aAAa,QAGxB;AAOD,cAAsB,SAAQ,GAAuE;CAAG","sourcesContent":["import { RequestType } from \"./validation.model\";\nimport { Action } from \"./http.model\";\nimport { DateStr, DateTimeStr, YearMonthStr, YearStr } from \"./date-string.model\";\nimport { Dayjs } from \"dayjs\";\n\nexport type { DateStr, DateTimeStr, TimeStr, LocalTimeStr, YearMonthStr, YearStr } from \"./date-string.model\";\n\nexport type DateInput = string | Date | Dayjs;\n\nexport interface BaseEntity {\n id?: string;\n createdAt?: DateTimeStr;\n updatedAt?: DateTimeStr;\n\n createdBy?: any;\n updatedBy?: any;\n\n ownerId?: string;\n ownerParentId?: string;\n\n permission?: Map<string, Permission[]>;\n\n history?: ChangeHistory[];\n\n year?: YearStr;\n yearMonth?: YearMonthStr;\n yearMonthDay?: DateStr;\n}\n\nexport interface ChangedField {\n fieldName: string;\n oldValue: string;\n newValue: string;\n}\n\nexport interface ChangeHistory {\n action: string;\n user: string;\n date: DateTimeStr;\n changes?: ChangedField[];\n}\n\nexport interface Permission {\n role: RequestType;\n actions: Action[];\n}\n\nexport interface Attachment {\n thumbnail: string;\n original: string;\n}\n\nexport interface List<T> {\n items: Array<T>;\n total?: number;\n lastKey?: string;\n}\n\nexport interface TraceChange {\n fields: string[];\n mode: InclusionMode;\n}\n\nexport enum InclusionMode {\n INCLUDE = \"include\",\n EXCLUDE = \"exclude\",\n}\n\nexport interface RolePermission {\n role: string;\n permissions: string[];\n}\n\nexport class ScopeMap extends Map<string, { filterField: string; level?: number; claimKey?: string }> {}\n\nexport interface PermissionMap {\n scopeMap: ScopeMap;\n roleTable: string;\n userPoolId?: string;\n rolePath?: string;\n}\n"]}
1
+ {"version":3,"file":"base.model.js","sourceRoot":"","sources":["../../src/model/base.model.ts"],"names":[],"mappings":";;;AAgEA,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;AACrB,CAAC,EAHW,aAAa,aAAb,aAAa,GAAb,aAAa,QAGxB;AAOD,cAAsB,SAAQ,GAAuE;CAAG","sourcesContent":["import { RequestType } from \"./validation.model\";\nimport type { CallerKind } from \"./caller.model\";\nimport { Action } from \"./http.model\";\nimport { DateStr, DateTimeStr, YearMonthStr, YearStr } from \"./date-string.model\";\nimport { Dayjs } from \"dayjs\";\n\nexport type { DateStr, DateTimeStr, TimeStr, LocalTimeStr, YearMonthStr, YearStr } from \"./date-string.model\";\n\nexport type DateInput = string | Date | Dayjs;\n\nexport interface BaseEntity {\n id?: string;\n createdAt?: DateTimeStr;\n updatedAt?: DateTimeStr;\n\n createdBy?: any;\n updatedBy?: any;\n\n ownerId?: string;\n ownerParentId?: string;\n\n permission?: Map<string, Permission[]>;\n\n history?: ChangeHistory[];\n\n year?: YearStr;\n yearMonth?: YearMonthStr;\n yearMonthDay?: DateStr;\n}\n\nexport interface ChangedField {\n fieldName: string;\n oldValue: string;\n newValue: string;\n}\n\nexport interface ChangeHistory {\n action: string;\n user: string;\n date: DateTimeStr;\n changes?: ChangedField[];\n}\n\nexport interface Permission {\n role: RequestType;\n actions: Action[];\n}\n\nexport interface Attachment {\n thumbnail: string;\n original: string;\n}\n\nexport interface List<T> {\n items: Array<T>;\n total?: number;\n lastKey?: string;\n}\n\nexport interface TraceChange {\n fields: string[];\n mode: InclusionMode;\n}\n\nexport enum InclusionMode {\n INCLUDE = \"include\",\n EXCLUDE = \"exclude\",\n}\n\nexport interface RolePermission {\n role: string;\n permissions: string[];\n}\n\nexport class ScopeMap extends Map<string, { filterField: string; level?: number; claimKey?: string }> {}\n\nexport interface PermissionMap {\n scopeMap: ScopeMap;\n roleTable: string;\n userPoolId?: string;\n rolePath?: string;\n /** Verified caller kinds allowed to use role-table access; default [CallerKind.ADMIN]. Ignored without a caller (legacy) */\n kinds?: CallerKind[];\n}\n"]}
@@ -0,0 +1,22 @@
1
+ export declare enum CallerKind {
2
+ GUEST = "guest",
3
+ USER = "user",
4
+ RETAILER = "retailer",
5
+ SUPPLIER = "supplier",
6
+ ADMIN = "admin"
7
+ }
8
+ export interface CallerPoolConfig {
9
+ userPoolId: string;
10
+ kind: CallerKind.USER | CallerKind.RETAILER | CallerKind.SUPPLIER | CallerKind.ADMIN;
11
+ /** null/undefined = any client of the pool */
12
+ clientIds?: string[] | null;
13
+ }
14
+ export interface Caller {
15
+ kind: CallerKind;
16
+ claims?: Record<string, any>;
17
+ }
18
+ export interface CallerVerifier {
19
+ /** Returns the verified JWT payload (incl. iss). Throws when invalid. */
20
+ verify(token: string): Promise<Record<string, any>>;
21
+ }
22
+ //# sourceMappingURL=caller.model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caller.model.d.ts","sourceRoot":"","sources":["../../src/model/caller.model.ts"],"names":[],"mappings":"AAAA,oBAAY,UAAU;IACpB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,QAAQ,aAAa;IACrB,QAAQ,aAAa;IACrB,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC;IACrF,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;CACrD"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CallerKind = void 0;
4
+ var CallerKind;
5
+ (function (CallerKind) {
6
+ CallerKind["GUEST"] = "guest";
7
+ CallerKind["USER"] = "user";
8
+ CallerKind["RETAILER"] = "retailer";
9
+ CallerKind["SUPPLIER"] = "supplier";
10
+ CallerKind["ADMIN"] = "admin";
11
+ })(CallerKind || (exports.CallerKind = CallerKind = {}));
12
+ //# sourceMappingURL=caller.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caller.model.js","sourceRoot":"","sources":["../../src/model/caller.model.ts"],"names":[],"mappings":";;;AAAA,IAAY,UAMX;AAND,WAAY,UAAU;IACpB,6BAAe,CAAA;IACf,2BAAa,CAAA;IACb,mCAAqB,CAAA;IACrB,mCAAqB,CAAA;IACrB,6BAAe,CAAA;AACjB,CAAC,EANW,UAAU,aAAV,UAAU,GAAV,UAAU,QAMrB","sourcesContent":["export enum CallerKind {\n GUEST = \"guest\",\n USER = \"user\",\n RETAILER = \"retailer\",\n SUPPLIER = \"supplier\",\n ADMIN = \"admin\",\n}\n\nexport interface CallerPoolConfig {\n userPoolId: string;\n kind: CallerKind.USER | CallerKind.RETAILER | CallerKind.SUPPLIER | CallerKind.ADMIN;\n /** null/undefined = any client of the pool */\n clientIds?: string[] | null;\n}\n\nexport interface Caller {\n kind: CallerKind;\n claims?: Record<string, any>;\n}\n\nexport interface CallerVerifier {\n /** Returns the verified JWT payload (incl. iss). Throws when invalid. */\n verify(token: string): Promise<Record<string, any>>;\n}\n"]}
@@ -7,4 +7,5 @@ export * from "./validation.model";
7
7
  export * from "./dynamodb.model";
8
8
  export * from "./base.config";
9
9
  export { Permission as RolePermission } from "./role.model";
10
+ export * from "./caller.model";
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,cAAc,gBAAgB,CAAC"}
@@ -22,4 +22,5 @@ __exportStar(require("./filter.model"), exports);
22
22
  __exportStar(require("./validation.model"), exports);
23
23
  __exportStar(require("./dynamodb.model"), exports);
24
24
  __exportStar(require("./base.config"), exports);
25
+ __exportStar(require("./caller.model"), exports);
25
26
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,+CAA6B;AAC7B,+CAA6B;AAC7B,sDAAoC;AACpC,iDAA+B;AAC/B,qDAAmC;AACnC,mDAAiC;AACjC,gDAA8B","sourcesContent":["export * from \"./cognito-user.model\";\nexport * from \"./http.model\";\nexport * from \"./base.model\";\nexport * from \"./date-string.model\";\nexport * from \"./filter.model\";\nexport * from \"./validation.model\";\nexport * from \"./dynamodb.model\";\nexport * from \"./base.config\";\nexport { Permission as RolePermission } from \"./role.model\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,+CAA6B;AAC7B,+CAA6B;AAC7B,sDAAoC;AACpC,iDAA+B;AAC/B,qDAAmC;AACnC,mDAAiC;AACjC,gDAA8B;AAE9B,iDAA+B","sourcesContent":["export * from \"./cognito-user.model\";\nexport * from \"./http.model\";\nexport * from \"./base.model\";\nexport * from \"./date-string.model\";\nexport * from \"./filter.model\";\nexport * from \"./validation.model\";\nexport * from \"./dynamodb.model\";\nexport * from \"./base.config\";\nexport { Permission as RolePermission } from \"./role.model\";\nexport * from \"./caller.model\";\n"]}
@@ -1,8 +1,18 @@
1
- import { HttpMethod } from "../index.js";
1
+ import type { HttpMethod } from "../index.js";
2
+ import type { CallerKind } from "./caller.model";
2
3
  export interface ResponseFields {
3
4
  include?: string[];
4
5
  exclude?: string[];
5
6
  }
7
+ export interface ClaimRef {
8
+ claim: string;
9
+ }
10
+ export declare const claim: (name: string) => ClaimRef;
11
+ export type ViewFilterValue = string | number | boolean | string[] | ClaimRef;
12
+ export interface PolicyView {
13
+ filter?: Record<string, ViewFilterValue>;
14
+ response?: ResponseFields;
15
+ }
6
16
  /** Path-based permission definition */
7
17
  export interface EndpointPolicy {
8
18
  method: HttpMethod;
@@ -10,6 +20,10 @@ export interface EndpointPolicy {
10
20
  access?: Access[];
11
21
  validator?: any;
12
22
  response?: ResponseFields;
23
+ /** Who may call; absent = legacy `access` rules */
24
+ kinds?: CallerKind[];
25
+ /** Per-caller-kind forced filter and response fields */
26
+ view?: Partial<Record<CallerKind, PolicyView>>;
13
27
  }
14
28
  export declare enum RequestType {
15
29
  GUEST = "guest",
@@ -1 +1 @@
1
- {"version":3,"file":"validation.model.d.ts","sourceRoot":"","sources":["../../src/model/validation.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,oBAAY,WAAW;IACrB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,KAAK,UAAU;IACf,MAAM,WAAW;CAClB;AAED,oBAAY,MAAM;IAChB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;IACf,MAAM,WAAW;CAClB"}
1
+ {"version":3,"file":"validation.model.d.ts","sourceRoot":"","sources":["../../src/model/validation.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,KAAK,SAAU,MAAM,KAAG,QAA6B,CAAC;AAEnE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,QAAQ,CAAC;AAE9E,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,mDAAmD;IACnD,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,wDAAwD;IACxD,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;CAChD;AAED,oBAAY,WAAW;IACrB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,KAAK,UAAU;IACf,MAAM,WAAW;CAClB;AAED,oBAAY,MAAM;IAChB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;IACf,MAAM,WAAW;CAClB"}
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Access = exports.RequestType = void 0;
3
+ exports.Access = exports.RequestType = exports.claim = void 0;
4
+ const claim = (name) => ({ claim: name });
5
+ exports.claim = claim;
4
6
  var RequestType;
5
7
  (function (RequestType) {
6
8
  RequestType["GUEST"] = "guest";
@@ -1 +1 @@
1
- {"version":3,"file":"validation.model.js","sourceRoot":"","sources":["../../src/model/validation.model.ts"],"names":[],"mappings":";;;AAgBA,IAAY,WAKX;AALD,WAAY,WAAW;IACrB,8BAAe,CAAA;IACf,4BAAa,CAAA;IACb,8BAAe,CAAA;IACf,gCAAiB,CAAA;AACnB,CAAC,EALW,WAAW,aAAX,WAAW,GAAX,WAAW,QAKtB;AAED,IAAY,MAMX;AAND,WAAY,MAAM;IAChB,2BAAiB,CAAA;IACjB,uBAAa,CAAA;IACb,yBAAe,CAAA;IACf,yBAAe,CAAA;IACf,2BAAiB,CAAA;AACnB,CAAC,EANW,MAAM,aAAN,MAAM,GAAN,MAAM,QAMjB","sourcesContent":["import { HttpMethod } from \"@chinggis/core\";\n\nexport interface ResponseFields {\n include?: string[];\n exclude?: string[];\n}\n\n/** Path-based permission definition */\nexport interface EndpointPolicy {\n method: HttpMethod;\n path: string;\n access?: Access[];\n validator?: any;\n response?: ResponseFields;\n}\n\nexport enum RequestType {\n GUEST = \"guest\",\n USER = \"user\",\n ADMIN = \"admin\",\n SYSTEM = \"system\",\n}\n\nexport enum Access {\n PUBLIC = \"public\",\n USER = \"user\",\n OWNER = \"owner\",\n ADMIN = \"admin\",\n SYSTEM = \"system\",\n}\n"]}
1
+ {"version":3,"file":"validation.model.js","sourceRoot":"","sources":["../../src/model/validation.model.ts"],"names":[],"mappings":";;;AAYO,MAAM,KAAK,GAAG,CAAC,IAAY,EAAY,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAAtD,QAAA,KAAK,GAAL,KAAK,CAAiD;AAsBnE,IAAY,WAKX;AALD,WAAY,WAAW;IACrB,8BAAe,CAAA;IACf,4BAAa,CAAA;IACb,8BAAe,CAAA;IACf,gCAAiB,CAAA;AACnB,CAAC,EALW,WAAW,aAAX,WAAW,GAAX,WAAW,QAKtB;AAED,IAAY,MAMX;AAND,WAAY,MAAM;IAChB,2BAAiB,CAAA;IACjB,uBAAa,CAAA;IACb,yBAAe,CAAA;IACf,yBAAe,CAAA;IACf,2BAAiB,CAAA;AACnB,CAAC,EANW,MAAM,aAAN,MAAM,GAAN,MAAM,QAMjB","sourcesContent":["import type { HttpMethod } from \"@chinggis/core\";\nimport type { CallerKind } from \"./caller.model\";\n\nexport interface ResponseFields {\n include?: string[];\n exclude?: string[];\n}\n\nexport interface ClaimRef {\n claim: string;\n}\n\nexport const claim = (name: string): ClaimRef => ({ claim: name });\n\nexport type ViewFilterValue = string | number | boolean | string[] | ClaimRef;\n\nexport interface PolicyView {\n filter?: Record<string, ViewFilterValue>;\n response?: ResponseFields;\n}\n\n/** Path-based permission definition */\nexport interface EndpointPolicy {\n method: HttpMethod;\n path: string;\n access?: Access[];\n validator?: any;\n response?: ResponseFields;\n /** Who may call; absent = legacy `access` rules */\n kinds?: CallerKind[];\n /** Per-caller-kind forced filter and response fields */\n view?: Partial<Record<CallerKind, PolicyView>>;\n}\n\nexport enum RequestType {\n GUEST = \"guest\",\n USER = \"user\",\n ADMIN = \"admin\",\n SYSTEM = \"system\",\n}\n\nexport enum Access {\n PUBLIC = \"public\",\n USER = \"user\",\n OWNER = \"owner\",\n ADMIN = \"admin\",\n SYSTEM = \"system\",\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"base-es.repo.d.ts","sourceRoot":"","sources":["../../src/repositories/base-es.repo.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAEV,IAAI,EAIL,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAErD,8BACsB,cAAc,CAAC,CAAC,SAAS,UAAU,CAAE,YAAW,UAAU,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAO;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAO;IAE1B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAI3C;IAEK,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAM5D;IAEK,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,EAAE,EACxB,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,CAAC,EAAE,CAAC,CAiBd;IAEK,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAGxC;IAEK,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAQ9D;IAEK,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBvC;IAED,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAEpC;IAED,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAGvC;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjC;IAED,WAAW,IAAI,MAAM,CAEpB;IAED,YAAY,IAAI,MAAM,CAErB;IAEK,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAMjD;IAEK,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAalH;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzC;IAED,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAEjG;IAEK,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CA4B3G;IAED,OAAO,CAAC,YAAY;CAerB"}
1
+ {"version":3,"file":"base-es.repo.d.ts","sourceRoot":"","sources":["../../src/repositories/base-es.repo.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAEV,IAAI,EAIL,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAGrD,8BACsB,cAAc,CAAC,CAAC,SAAS,UAAU,CAAE,YAAW,UAAU,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAO;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAO;IAE1B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAI3C;IAEK,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAM5D;IAEK,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,EAAE,EACxB,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,CAAC,EAAE,CAAC,CAiBd;IAEK,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAGxC;IAEK,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAQ9D;IAEK,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBvC;IAED,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAEpC;IAED,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAGvC;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjC;IAED,WAAW,IAAI,MAAM,CAEpB;IAED,YAAY,IAAI,MAAM,CAErB;IAEK,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAMjD;IAEK,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAalH;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzC;IAED,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAEjG;IAEK,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAgC3G;IAED,OAAO,CAAC,YAAY;CAerB"}
@@ -13,6 +13,7 @@ exports.BaseRepoESImpl = void 0;
13
13
  const index_1 = require("../index");
14
14
  const typedi_1 = require("typedi");
15
15
  const elastic_builder_1 = __importDefault(require("elastic-builder"));
16
+ const opensearch_mapping_1 = require("../utils/opensearch/opensearch.mapping");
16
17
  let BaseRepoESImpl = class BaseRepoESImpl {
17
18
  searchClient;
18
19
  indexName;
@@ -124,6 +125,9 @@ let BaseRepoESImpl = class BaseRepoESImpl {
124
125
  if (debug) {
125
126
  log.info("searchQuery: ", JSON.stringify(finalQuery, null, 2));
126
127
  }
128
+ if (finalQuery?.body?.sort?.length) {
129
+ finalQuery.body.sort = await (0, opensearch_mapping_1.resolveSortFields)(this.searchClient, finalQuery.index, finalQuery.body.sort);
130
+ }
127
131
  try {
128
132
  const { body } = await this.searchClient.search(finalQuery);
129
133
  const totalRaw = body.hits.total;
@@ -1 +1 @@
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\";\nimport { API } from \"@opensearch-project/opensearch\";\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 = 100;\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, debug?: boolean): Promise<List<T>> {\n const query = buildQueryOS(filter);\n\n const res = await this.search(query, debug);\n\n return { items: res?.items, total: res?.total };\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 async nativeQuery(query: any): Promise<API.Search_ResponseBody> {\n try {\n const res = await this.searchClient.search(query);\n return res?.body;\n } catch (err) {\n console.error(JSON.stringify(err, null, 2));\n return undefined;\n }\n }\n\n async count(query: any): Promise<number> {\n const finalQuery = this.prepareQuery(query);\n\n try {\n const res = await this.searchClient.count({\n index: finalQuery.index,\n body: {\n query: finalQuery?.body?.query?.bool\n ? finalQuery.body.query\n : {\n match_all: {},\n },\n },\n });\n\n return Number(res.body.count ?? 0);\n } catch (err) {\n console.error(JSON.stringify(err, null, 2));\n return 0;\n }\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>; total: number }> {\n debug = debug || process.env.ENV?.toLowerCase()?.trim() === \"dev\";\n const finalQuery = this.prepareQuery(query);\n\n if (debug) {\n log.info(\"searchQuery: \", JSON.stringify(finalQuery, null, 2));\n }\n\n try {\n const { body } = await this.searchClient.search(finalQuery);\n const totalRaw = body.hits.total;\n const totalCount = typeof totalRaw === \"number\" ? totalRaw : totalRaw.value;\n\n return {\n items: body?.hits?.hits?.map((item) => item._source as T) || [],\n aggs: body?.aggregations ? transformAggregationsResponse(body?.aggregations) : undefined,\n total: totalCount,\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"]}
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\";\nimport { API } from \"@opensearch-project/opensearch\";\nimport { resolveSortFields } from \"../utils/opensearch/opensearch.mapping\";\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 = 100;\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, debug?: boolean): Promise<List<T>> {\n const query = buildQueryOS(filter);\n\n const res = await this.search(query, debug);\n\n return { items: res?.items, total: res?.total };\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 async nativeQuery(query: any): Promise<API.Search_ResponseBody> {\n try {\n const res = await this.searchClient.search(query);\n return res?.body;\n } catch (err) {\n console.error(JSON.stringify(err, null, 2));\n return undefined;\n }\n }\n\n async count(query: any): Promise<number> {\n const finalQuery = this.prepareQuery(query);\n\n try {\n const res = await this.searchClient.count({\n index: finalQuery.index,\n body: {\n query: finalQuery?.body?.query?.bool\n ? finalQuery.body.query\n : {\n match_all: {},\n },\n },\n });\n\n return Number(res.body.count ?? 0);\n } catch (err) {\n console.error(JSON.stringify(err, null, 2));\n return 0;\n }\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>; total: number }> {\n debug = debug || process.env.ENV?.toLowerCase()?.trim() === \"dev\";\n const finalQuery = this.prepareQuery(query);\n\n if (debug) {\n log.info(\"searchQuery: \", JSON.stringify(finalQuery, null, 2));\n }\n\n if (finalQuery?.body?.sort?.length) {\n finalQuery.body.sort = await resolveSortFields(this.searchClient, finalQuery.index, finalQuery.body.sort);\n }\n\n try {\n const { body } = await this.searchClient.search(finalQuery);\n const totalRaw = body.hits.total;\n const totalCount = typeof totalRaw === \"number\" ? totalRaw : totalRaw.value;\n\n return {\n items: body?.hits?.hits?.map((item) => item._source as T) || [],\n aggs: body?.aggregations ? transformAggregationsResponse(body?.aggregations) : undefined,\n total: totalCount,\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"]}
@@ -0,0 +1,9 @@
1
+ import { type Caller, type CallerPoolConfig, type CallerVerifier } from "../../model/caller.model";
2
+ /** Throws a 500 config error unless `pools` is an array of `{ userPoolId: string, kind: user|retailer|supplier|admin }` */
3
+ export declare function validateCallerPools(pools: unknown): CallerPoolConfig[];
4
+ /** Verifier for the pools (cached per pool config); an invalid pool config is a 500 config error */
5
+ export declare function createCallerVerifier(pools: CallerPoolConfig[]): CallerVerifier;
6
+ /** Parses and validates the CALLER_POOLS env value (memoized per string); invalid -> 500 config error */
7
+ export declare function parseCallerPoolsEnv(value: string | undefined): CallerPoolConfig[] | undefined;
8
+ export declare function resolveCaller(authorization: string | undefined, pools: CallerPoolConfig[], adminGroups: string[], verifier?: CallerVerifier): Promise<Caller>;
9
+ //# sourceMappingURL=caller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caller.d.ts","sourceRoot":"","sources":["../../../src/utils/auth/caller.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,MAAM,EAAc,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAQ/G,2HAA2H;AAC3H,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,EAAE,CAQtE;AAED,oGAAoG;AACpG,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,cAAc,CAiB9E;AAED,yGAAyG;AACzG,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,gBAAgB,EAAE,GAAG,SAAS,CAa7F;AAmBD,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,KAAK,EAAE,gBAAgB,EAAE,EACzB,WAAW,EAAE,MAAM,EAAE,EACrB,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,MAAM,CAAC,CA2BjB"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateCallerPools = validateCallerPools;
4
+ exports.createCallerVerifier = createCallerVerifier;
5
+ exports.parseCallerPoolsEnv = parseCallerPoolsEnv;
6
+ exports.resolveCaller = resolveCaller;
7
+ const aws_jwt_verify_1 = require("aws-jwt-verify");
8
+ const error_1 = require("aws-jwt-verify/error");
9
+ const errors_1 = require("../../exception/errors");
10
+ const exception_handler_1 = require("../../exception/exception-handler");
11
+ const caller_model_1 = require("../../model/caller.model");
12
+ const verifierCache = new Map();
13
+ const poolsEnvCache = new Map();
14
+ const POOL_KINDS = [caller_model_1.CallerKind.USER, caller_model_1.CallerKind.RETAILER, caller_model_1.CallerKind.SUPPLIER, caller_model_1.CallerKind.ADMIN];
15
+ const configError = (message) => new errors_1.ErrorHttp(exception_handler_1.HTTP.INTERNAL_SERVER_ERROR, `Invalid CALLER_POOLS: ${message}`);
16
+ /** Throws a 500 config error unless `pools` is an array of `{ userPoolId: string, kind: user|retailer|supplier|admin }` */
17
+ function validateCallerPools(pools) {
18
+ if (!Array.isArray(pools))
19
+ throw configError("expected an array");
20
+ pools.forEach((pool, i) => {
21
+ if (!pool || typeof pool !== "object")
22
+ throw configError(`entry ${i} is not an object`);
23
+ if (typeof pool.userPoolId !== "string" || !pool.userPoolId)
24
+ throw configError(`entry ${i} needs userPoolId`);
25
+ if (!POOL_KINDS.includes(pool.kind))
26
+ throw configError(`entry ${i} has kind ${pool.kind}`);
27
+ });
28
+ return pools;
29
+ }
30
+ /** Verifier for the pools (cached per pool config); an invalid pool config is a 500 config error */
31
+ function createCallerVerifier(pools) {
32
+ const key = JSON.stringify(pools);
33
+ let verifier = verifierCache.get(key);
34
+ if (!verifier) {
35
+ validateCallerPools(pools);
36
+ let jwtVerifier;
37
+ try {
38
+ jwtVerifier = aws_jwt_verify_1.CognitoJwtVerifier.create(pools.map((p) => ({ userPoolId: p.userPoolId, tokenUse: null, clientId: p.clientIds ?? null })));
39
+ }
40
+ catch (err) {
41
+ throw configError(err?.message ?? String(err));
42
+ }
43
+ verifier = { verify: async (token) => (await jwtVerifier.verify(token)) };
44
+ verifierCache.set(key, verifier);
45
+ }
46
+ return verifier;
47
+ }
48
+ /** Parses and validates the CALLER_POOLS env value (memoized per string); invalid -> 500 config error */
49
+ function parseCallerPoolsEnv(value) {
50
+ if (!value?.trim())
51
+ return undefined;
52
+ const cached = poolsEnvCache.get(value);
53
+ if (cached)
54
+ return cached;
55
+ let parsed;
56
+ try {
57
+ parsed = JSON.parse(value);
58
+ }
59
+ catch {
60
+ throw configError("not valid JSON");
61
+ }
62
+ const pools = validateCallerPools(parsed);
63
+ poolsEnvCache.set(value, pools);
64
+ return pools;
65
+ }
66
+ /**
67
+ * JWKS/network trouble is 503, anything else an invalid token (401). That includes ParameterValidationError:
68
+ * at verify time the multi-issuer verifier throws it for a foreign or missing `iss` (client input).
69
+ * Config errors surface earlier, from createCallerVerifier, outside the verify try (500).
70
+ */
71
+ function verifyFailure(err) {
72
+ if (err instanceof error_1.FetchError ||
73
+ err instanceof error_1.NonRetryableFetchError ||
74
+ err instanceof error_1.JwksNotAvailableInCacheError ||
75
+ err instanceof error_1.JwksValidationError) {
76
+ return new errors_1.ErrorHttp(exception_handler_1.HTTP.SERVICE_UNAVAILABLE, "Token keys are not available");
77
+ }
78
+ return new errors_1.ErrorHttp(exception_handler_1.HTTP.UNAUTHORIZED, "Invalid token");
79
+ }
80
+ async function resolveCaller(authorization, pools, adminGroups, verifier) {
81
+ if (!authorization)
82
+ return { kind: caller_model_1.CallerKind.GUEST };
83
+ const token = authorization.replace(/^Bearer\s+/i, "").trim();
84
+ // Built outside the try: a config error must surface as 500, not as an invalid token
85
+ const tokenVerifier = verifier ?? createCallerVerifier(pools);
86
+ let claims;
87
+ try {
88
+ claims = await tokenVerifier.verify(token);
89
+ }
90
+ catch (err) {
91
+ throw verifyFailure(err);
92
+ }
93
+ const poolId = String(claims.iss ?? "")
94
+ .split("/")
95
+ .pop();
96
+ const pool = pools.find((p) => p.userPoolId === poolId);
97
+ if (!pool)
98
+ throw new errors_1.ErrorHttp(exception_handler_1.HTTP.UNAUTHORIZED, "Unknown token issuer");
99
+ if (pool.kind === caller_model_1.CallerKind.ADMIN) {
100
+ const raw = claims["cognito:groups"];
101
+ const groups = Array.isArray(raw) ? raw : typeof raw === "string" ? [raw] : [];
102
+ const allowed = adminGroups.map((g) => g.toLowerCase());
103
+ const isAdmin = groups.some((g) => allowed.includes(String(g).toLowerCase()));
104
+ return { kind: isAdmin ? caller_model_1.CallerKind.ADMIN : caller_model_1.CallerKind.USER, claims };
105
+ }
106
+ return { kind: pool.kind, claims };
107
+ }
108
+ //# sourceMappingURL=caller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caller.js","sourceRoot":"","sources":["../../../src/utils/auth/caller.ts"],"names":[],"mappings":"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","sourcesContent":["import { CognitoJwtVerifier } from \"aws-jwt-verify\";\nimport {\n FetchError,\n JwksNotAvailableInCacheError,\n JwksValidationError,\n NonRetryableFetchError,\n} from \"aws-jwt-verify/error\";\nimport { ErrorHttp } from \"../../exception/errors\";\nimport { HTTP } from \"../../exception/exception-handler\";\nimport { type Caller, CallerKind, type CallerPoolConfig, type CallerVerifier } from \"../../model/caller.model\";\n\nconst verifierCache = new Map<string, CallerVerifier>();\nconst poolsEnvCache = new Map<string, CallerPoolConfig[]>();\nconst POOL_KINDS: string[] = [CallerKind.USER, CallerKind.RETAILER, CallerKind.SUPPLIER, CallerKind.ADMIN];\n\nconst configError = (message: string) => new ErrorHttp(HTTP.INTERNAL_SERVER_ERROR, `Invalid CALLER_POOLS: ${message}`);\n\n/** Throws a 500 config error unless `pools` is an array of `{ userPoolId: string, kind: user|retailer|supplier|admin }` */\nexport function validateCallerPools(pools: unknown): CallerPoolConfig[] {\n if (!Array.isArray(pools)) throw configError(\"expected an array\");\n pools.forEach((pool, i) => {\n if (!pool || typeof pool !== \"object\") throw configError(`entry ${i} is not an object`);\n if (typeof pool.userPoolId !== \"string\" || !pool.userPoolId) throw configError(`entry ${i} needs userPoolId`);\n if (!POOL_KINDS.includes(pool.kind)) throw configError(`entry ${i} has kind ${pool.kind}`);\n });\n return pools as CallerPoolConfig[];\n}\n\n/** Verifier for the pools (cached per pool config); an invalid pool config is a 500 config error */\nexport function createCallerVerifier(pools: CallerPoolConfig[]): CallerVerifier {\n const key = JSON.stringify(pools);\n let verifier = verifierCache.get(key);\n if (!verifier) {\n validateCallerPools(pools);\n let jwtVerifier: { verify: (token: string) => Promise<unknown> };\n try {\n jwtVerifier = CognitoJwtVerifier.create(\n pools.map((p) => ({ userPoolId: p.userPoolId, tokenUse: null, clientId: p.clientIds ?? null })),\n );\n } catch (err) {\n throw configError(err?.message ?? String(err));\n }\n verifier = { verify: async (token) => (await jwtVerifier.verify(token)) as Record<string, any> };\n verifierCache.set(key, verifier);\n }\n return verifier;\n}\n\n/** Parses and validates the CALLER_POOLS env value (memoized per string); invalid -> 500 config error */\nexport function parseCallerPoolsEnv(value: string | undefined): CallerPoolConfig[] | undefined {\n if (!value?.trim()) return undefined;\n const cached = poolsEnvCache.get(value);\n if (cached) return cached;\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n throw configError(\"not valid JSON\");\n }\n const pools = validateCallerPools(parsed);\n poolsEnvCache.set(value, pools);\n return pools;\n}\n\n/**\n * JWKS/network trouble is 503, anything else an invalid token (401). That includes ParameterValidationError:\n * at verify time the multi-issuer verifier throws it for a foreign or missing `iss` (client input).\n * Config errors surface earlier, from createCallerVerifier, outside the verify try (500).\n */\nfunction verifyFailure(err: unknown): ErrorHttp {\n if (\n err instanceof FetchError ||\n err instanceof NonRetryableFetchError ||\n err instanceof JwksNotAvailableInCacheError ||\n err instanceof JwksValidationError\n ) {\n return new ErrorHttp(HTTP.SERVICE_UNAVAILABLE, \"Token keys are not available\");\n }\n return new ErrorHttp(HTTP.UNAUTHORIZED, \"Invalid token\");\n}\n\nexport async function resolveCaller(\n authorization: string | undefined,\n pools: CallerPoolConfig[],\n adminGroups: string[],\n verifier?: CallerVerifier,\n): Promise<Caller> {\n if (!authorization) return { kind: CallerKind.GUEST };\n const token = authorization.replace(/^Bearer\\s+/i, \"\").trim();\n\n // Built outside the try: a config error must surface as 500, not as an invalid token\n const tokenVerifier = verifier ?? createCallerVerifier(pools);\n let claims: Record<string, any>;\n try {\n claims = await tokenVerifier.verify(token);\n } catch (err) {\n throw verifyFailure(err);\n }\n\n const poolId = String(claims.iss ?? \"\")\n .split(\"/\")\n .pop();\n const pool = pools.find((p) => p.userPoolId === poolId);\n if (!pool) throw new ErrorHttp(HTTP.UNAUTHORIZED, \"Unknown token issuer\");\n\n if (pool.kind === CallerKind.ADMIN) {\n const raw = claims[\"cognito:groups\"];\n const groups: string[] = Array.isArray(raw) ? raw : typeof raw === \"string\" ? [raw] : [];\n const allowed = adminGroups.map((g) => g.toLowerCase());\n const isAdmin = groups.some((g) => allowed.includes(String(g).toLowerCase()));\n return { kind: isAdmin ? CallerKind.ADMIN : CallerKind.USER, claims };\n }\n return { kind: pool.kind, claims };\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import type { Caller } from "../../model/caller.model";
2
+ import type { Filter } from "../../model/filter.model";
3
+ import type { EndpointPolicy, ResponseFields } from "../../model/validation.model";
4
+ /** Caller-mode config check: a policy `view` only takes effect together with `kinds` (500 otherwise) */
5
+ export declare function assertViewHasKinds(policy: EndpointPolicy | undefined): void;
6
+ /** Applies the caller kind check and the per-kind view (forced filters, response fields). Pure. */
7
+ export declare function applyPolicyView(policy: EndpointPolicy, caller: Caller, filter: Filter): {
8
+ filter: Filter;
9
+ response?: ResponseFields;
10
+ };
11
+ /** Entity owner field names (subset of EntityConfig) that the service maps the owner aliases onto */
12
+ export interface OwnerFieldNames {
13
+ OWNER_ID_FIELD_NAME?: string;
14
+ OWNER_PARENT_ID_FIELD_NAME?: string;
15
+ }
16
+ /**
17
+ * When the caller's view forces filter keys, drops client selectors that could bypass or replace them:
18
+ * `indexName`/`indexValue`/`indexSortName`/`indexSortValue` (index choice), range filters on a forced key,
19
+ * `rangeFilterBy/Min/Max` on a forced key, and every key whose base field is a forced key
20
+ * (`min_K`, `max_K`, `K__<op>`, `K.keyword*`, `K` + Min|Max|From|To|Start|End).
21
+ * When a forced key is an owner field (`profileId`, `ownerParentId`, `ownerId`, `owner.OWNER_ID_FIELD_NAME`,
22
+ * `owner.OWNER_PARENT_ID_FIELD_NAME`), all other owner aliases/fields are dropped from the client filter too,
23
+ * because the service maps them onto the owner field after the view and would overwrite the forced value. Pure.
24
+ */
25
+ export declare function stripForcedSelectors(policy: EndpointPolicy, caller: Caller, filter: Filter, owner?: OwnerFieldNames): Filter;
26
+ /**
27
+ * OpenSearch `search/query*` routes only read `field__op` keys, so a plain forced key would be ignored.
28
+ * Moves every forced key onto `K.keyword__eq` (scalar) or `K.keyword__in` (array, comma-joined) and removes
29
+ * every other client key for that field (`K`, `K__*`, `K.*`). Pure.
30
+ */
31
+ export declare function applyForcedSearchQuery(filter: Filter, forced: Record<string, any>): Filter;
32
+ /** Resolved forced filter of the caller's view; empty when the view forces nothing. Throws like applyPolicyView. */
33
+ export declare function resolveForcedFilter(policy: EndpointPolicy, caller: Caller): Record<string, any>;
34
+ /** Item matches a forced filter: an array value means membership, anything else equality on the item's field */
35
+ export declare function matchesForcedFilter(item: Record<string, any> | null | undefined, forced: Record<string, any>): boolean;
36
+ /**
37
+ * Guards a POST/PUT/PATCH body under a forced view: a body value for a forced key must match it (403 otherwise);
38
+ * on POST a missing scalar forced key is set from the forced value (array-valued keys are not injected).
39
+ * Returns the (possibly created) body; other methods and non-object bodies are returned unchanged.
40
+ */
41
+ export declare function guardForcedBody(method: string, body: unknown, forced: Record<string, any>): unknown;
42
+ //# sourceMappingURL=policy-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-view.d.ts","sourceRoot":"","sources":["../../../src/utils/auth/policy-view.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAY,cAAc,EAAE,cAAc,EAAmB,MAAM,8BAA8B,CAAC;AAa9G,wGAAwG;AACxG,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CAI3E;AAED,mGAAmG;AACnG,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,cAAc,CAAA;CAAE,CAyB/C;AAaD,qGAAqG;AACrG,MAAM,WAAW,eAAe;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACrC;AAYD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,eAAe,GACtB,MAAM,CA2BR;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAU1F;AAED,oHAAoH;AACpH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAK/F;AAED,gHAAgH;AAChH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,EAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B,OAAO,CAKT;AAID;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAgBnG"}