@wildo-ai/saas-backend-lib 1.1.0 → 1.1.2

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 (265) hide show
  1. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts +14 -3
  2. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts.map +1 -1
  3. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js +115 -22
  4. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js.map +1 -1
  5. package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts +3 -1
  6. package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts.map +1 -1
  7. package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js +8 -3
  8. package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js.map +1 -1
  9. package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts +11 -0
  10. package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts.map +1 -1
  11. package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.js +11 -2
  12. package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.js.map +1 -1
  13. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts +1 -0
  14. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts.map +1 -1
  15. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js +6 -1
  16. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js.map +1 -1
  17. package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.d.ts.map +1 -1
  18. package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.js +16 -0
  19. package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.js.map +1 -1
  20. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts +20 -6
  21. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts.map +1 -1
  22. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js +88 -32
  23. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js.map +1 -1
  24. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts +3 -1
  25. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts.map +1 -1
  26. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.js +32 -7
  27. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.js.map +1 -1
  28. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts +8 -5
  29. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts.map +1 -1
  30. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.js.map +1 -1
  31. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts +31 -0
  32. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts.map +1 -1
  33. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js +127 -5
  34. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js.map +1 -1
  35. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts +71 -1
  36. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts.map +1 -1
  37. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js +62 -2
  38. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js.map +1 -1
  39. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts +21 -0
  40. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts.map +1 -1
  41. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js +126 -4
  42. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js.map +1 -1
  43. package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts +3 -26
  44. package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts.map +1 -1
  45. package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.js +3 -68
  46. package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.js.map +1 -1
  47. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts.map +1 -1
  48. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js +4 -2
  49. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js.map +1 -1
  50. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js +6 -6
  51. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js.map +1 -1
  52. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts +38 -0
  53. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts.map +1 -1
  54. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js +40 -0
  55. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js.map +1 -1
  56. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts +20 -0
  57. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts.map +1 -1
  58. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js +28 -0
  59. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js.map +1 -1
  60. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts +12 -0
  61. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -0
  62. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js +118 -0
  63. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js.map +1 -0
  64. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts.map +1 -1
  65. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js +8 -5
  66. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js.map +1 -1
  67. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.d.ts.map +1 -1
  68. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js +14 -0
  69. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js.map +1 -1
  70. package/dist/esm/config/custom/application-config-controller.backend.service.d.ts.map +1 -1
  71. package/dist/esm/config/custom/application-config-controller.backend.service.js +7 -1
  72. package/dist/esm/config/custom/application-config-controller.backend.service.js.map +1 -1
  73. package/dist/esm/config/models/app-config.backend.schemas.d.ts +4 -0
  74. package/dist/esm/config/models/app-config.backend.schemas.d.ts.map +1 -1
  75. package/dist/esm/config/services/app-configuration.backend.utils.d.ts +10 -1
  76. package/dist/esm/config/services/app-configuration.backend.utils.d.ts.map +1 -1
  77. package/dist/esm/config/services/app-configuration.backend.utils.js +13 -2
  78. package/dist/esm/config/services/app-configuration.backend.utils.js.map +1 -1
  79. package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.d.ts +2 -2
  80. package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.js +2 -2
  81. package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.js.map +1 -1
  82. package/dist/esm/databases/models/filter.backend.schemas.js +2 -2
  83. package/dist/esm/databases/models/filter.backend.schemas.js.map +1 -1
  84. package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.d.ts.map +1 -1
  85. package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js +20 -1
  86. package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js.map +1 -1
  87. package/dist/esm/databases/services/redis.service.d.ts +27 -0
  88. package/dist/esm/databases/services/redis.service.d.ts.map +1 -1
  89. package/dist/esm/databases/services/redis.service.js +29 -0
  90. package/dist/esm/databases/services/redis.service.js.map +1 -1
  91. package/dist/esm/errors/services/error-handler.backend.service.d.ts.map +1 -1
  92. package/dist/esm/errors/services/error-handler.backend.service.js +5 -0
  93. package/dist/esm/errors/services/error-handler.backend.service.js.map +1 -1
  94. package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts +41 -0
  95. package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts.map +1 -0
  96. package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.js +40 -0
  97. package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.js.map +1 -0
  98. package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts +64 -0
  99. package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts.map +1 -0
  100. package/dist/esm/external-data/controllers/external-data-admin.backend.controller.js +193 -0
  101. package/dist/esm/external-data/controllers/external-data-admin.backend.controller.js.map +1 -0
  102. package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts +13 -2
  103. package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts.map +1 -1
  104. package/dist/esm/external-data/external-data-pipeline-run.backend.service.js +8 -2
  105. package/dist/esm/external-data/external-data-pipeline-run.backend.service.js.map +1 -1
  106. package/dist/esm/external-data/external-data-transform.backend.d.ts.map +1 -1
  107. package/dist/esm/external-data/external-data-transform.backend.js +7 -1
  108. package/dist/esm/external-data/external-data-transform.backend.js.map +1 -1
  109. package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts +2 -0
  110. package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts.map +1 -1
  111. package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.js +13 -0
  112. package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.js.map +1 -1
  113. package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts +14 -0
  114. package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts.map +1 -1
  115. package/dist/esm/external-providers/services/external-providers-registry.backend.service.js +6 -0
  116. package/dist/esm/external-providers/services/external-providers-registry.backend.service.js.map +1 -1
  117. package/dist/esm/files/controllers/file.controller.d.ts +24 -1
  118. package/dist/esm/files/controllers/file.controller.d.ts.map +1 -1
  119. package/dist/esm/files/controllers/file.controller.js +66 -2
  120. package/dist/esm/files/controllers/file.controller.js.map +1 -1
  121. package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts +17 -0
  122. package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts.map +1 -0
  123. package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js +1 -0
  124. package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js.map +1 -0
  125. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts +5 -1
  126. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts.map +1 -1
  127. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js +42 -3
  128. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js.map +1 -1
  129. package/dist/esm/files/services/file-operation-handler.backend.service.d.ts +18 -0
  130. package/dist/esm/files/services/file-operation-handler.backend.service.d.ts.map +1 -1
  131. package/dist/esm/files/services/file-operation-handler.backend.service.js +36 -28
  132. package/dist/esm/files/services/file-operation-handler.backend.service.js.map +1 -1
  133. package/dist/esm/files/services/file-upload-grant.backend.service.d.ts +163 -0
  134. package/dist/esm/files/services/file-upload-grant.backend.service.d.ts.map +1 -0
  135. package/dist/esm/files/services/file-upload-grant.backend.service.js +442 -0
  136. package/dist/esm/files/services/file-upload-grant.backend.service.js.map +1 -0
  137. package/dist/esm/files/services/files.backend.service.d.ts +19 -0
  138. package/dist/esm/files/services/files.backend.service.d.ts.map +1 -1
  139. package/dist/esm/files/services/files.backend.service.js +78 -15
  140. package/dist/esm/files/services/files.backend.service.js.map +1 -1
  141. package/dist/esm/files/utils/file-uploader.utils.d.ts.map +1 -1
  142. package/dist/esm/files/utils/file-uploader.utils.js +12 -0
  143. package/dist/esm/files/utils/file-uploader.utils.js.map +1 -1
  144. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js +5 -5
  145. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js.map +1 -1
  146. package/dist/esm/flows-actors/services/agents.backend.service.d.ts +79 -0
  147. package/dist/esm/flows-actors/services/agents.backend.service.d.ts.map +1 -1
  148. package/dist/esm/flows-actors/services/agents.backend.service.js +319 -42
  149. package/dist/esm/flows-actors/services/agents.backend.service.js.map +1 -1
  150. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts +151 -41
  151. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts.map +1 -1
  152. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js +300 -139
  153. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js.map +1 -1
  154. package/dist/esm/index.d.ts +4 -1
  155. package/dist/esm/index.d.ts.map +1 -1
  156. package/dist/esm/index.js +14 -1
  157. package/dist/esm/index.js.map +1 -1
  158. package/dist/esm/inject/models/container.d.ts.map +1 -1
  159. package/dist/esm/inject/models/container.js +4 -0
  160. package/dist/esm/inject/models/container.js.map +1 -1
  161. package/dist/esm/inject/models/service-types.d.ts +3 -0
  162. package/dist/esm/inject/models/service-types.d.ts.map +1 -1
  163. package/dist/esm/inject/models/service-types.js +2 -0
  164. package/dist/esm/inject/models/service-types.js.map +1 -1
  165. package/dist/esm/mcp/controllers/mcp.controller.d.ts.map +1 -1
  166. package/dist/esm/mcp/controllers/mcp.controller.js +12 -4
  167. package/dist/esm/mcp/controllers/mcp.controller.js.map +1 -1
  168. package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts +34 -0
  169. package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts.map +1 -1
  170. package/dist/esm/mcp/models/mcp-tool.backend.schemas.js +42 -0
  171. package/dist/esm/mcp/models/mcp-tool.backend.schemas.js.map +1 -1
  172. package/dist/esm/mcp/services/mcp-server.backend.service.d.ts +29 -1
  173. package/dist/esm/mcp/services/mcp-server.backend.service.d.ts.map +1 -1
  174. package/dist/esm/mcp/services/mcp-server.backend.service.js +131 -3
  175. package/dist/esm/mcp/services/mcp-server.backend.service.js.map +1 -1
  176. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts +64 -2
  177. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts.map +1 -1
  178. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js +130 -6
  179. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js.map +1 -1
  180. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts +9 -0
  181. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts.map +1 -1
  182. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js +11 -36
  183. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js.map +1 -1
  184. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts.map +1 -1
  185. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js +9 -7
  186. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js.map +1 -1
  187. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts +5 -5
  188. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts.map +1 -1
  189. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.js +14 -13
  190. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.js.map +1 -1
  191. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts +2 -1
  192. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts.map +1 -1
  193. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js +2 -2
  194. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js.map +1 -1
  195. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.d.ts.map +1 -1
  196. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js +9 -7
  197. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js.map +1 -1
  198. package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.d.ts.map +1 -1
  199. package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.js +4 -1
  200. package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.js.map +1 -1
  201. package/dist/esm/requests/service/websocket.service.d.ts.map +1 -1
  202. package/dist/esm/requests/service/websocket.service.js +56 -7
  203. package/dist/esm/requests/service/websocket.service.js.map +1 -1
  204. package/dist/esm/resources/models/custom-service-implementations.backend.definition.d.ts.map +1 -1
  205. package/dist/esm/resources/models/custom-service-implementations.backend.definition.js +2 -0
  206. package/dist/esm/resources/models/custom-service-implementations.backend.definition.js.map +1 -1
  207. package/dist/esm/resources/services/resource-id.backend.service.js +3 -3
  208. package/dist/esm/resources/services/resource-id.backend.service.js.map +1 -1
  209. package/dist/esm/resources/services/resources-registry.backend.service.js +1 -1
  210. package/dist/esm/resources/services/resources-registry.backend.service.js.map +1 -1
  211. package/dist/esm/runtime/services/execution-context-creator.backend.service.d.ts.map +1 -1
  212. package/dist/esm/runtime/services/execution-context-creator.backend.service.js +13 -7
  213. package/dist/esm/runtime/services/execution-context-creator.backend.service.js.map +1 -1
  214. package/dist/esm/runtime/services/start-application.backend.service.d.ts +28 -0
  215. package/dist/esm/runtime/services/start-application.backend.service.d.ts.map +1 -1
  216. package/dist/esm/runtime/services/start-application.backend.service.js +82 -0
  217. package/dist/esm/runtime/services/start-application.backend.service.js.map +1 -1
  218. package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts +3 -23
  219. package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts.map +1 -1
  220. package/dist/esm/security/authentications/models/jwt.backend.schemas.js +20 -45
  221. package/dist/esm/security/authentications/models/jwt.backend.schemas.js.map +1 -1
  222. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts +9 -1
  223. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts.map +1 -1
  224. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js +9 -1
  225. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js.map +1 -1
  226. package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.d.ts.map +1 -1
  227. package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.js +5 -3
  228. package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.js.map +1 -1
  229. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts +25 -1
  230. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts.map +1 -1
  231. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js +55 -4
  232. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js.map +1 -1
  233. package/dist/esm/security/authorizations/initiator-organization-confinement.backend.d.ts.map +1 -1
  234. package/dist/esm/security/authorizations/initiator-organization-confinement.backend.js +24 -1
  235. package/dist/esm/security/authorizations/initiator-organization-confinement.backend.js.map +1 -1
  236. package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts +117 -0
  237. package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts.map +1 -0
  238. package/dist/esm/security/authorizations/privileged-access-review.backend.utils.js +104 -0
  239. package/dist/esm/security/authorizations/privileged-access-review.backend.utils.js.map +1 -0
  240. package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts +101 -6
  241. package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts.map +1 -1
  242. package/dist/esm/security/authorizations/services/authorizations.backend.service.js +210 -30
  243. package/dist/esm/security/authorizations/services/authorizations.backend.service.js.map +1 -1
  244. package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts +18 -1
  245. package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts.map +1 -1
  246. package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.js +110 -74
  247. package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.js.map +1 -1
  248. package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts +22 -0
  249. package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts.map +1 -0
  250. package/dist/esm/security/consumable-tokens/consumable-token-models.exports.js +22 -0
  251. package/dist/esm/security/consumable-tokens/consumable-token-models.exports.js.map +1 -0
  252. package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts +17 -3
  253. package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts.map +1 -1
  254. package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.js +12 -0
  255. package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.js.map +1 -1
  256. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts +20 -0
  257. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts.map +1 -1
  258. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js +58 -5
  259. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js.map +1 -1
  260. package/dist/esm/security/jwt/services/jwt.backend.service.d.ts.map +1 -1
  261. package/dist/esm/security/jwt/services/jwt.backend.service.js +1 -18
  262. package/dist/esm/security/jwt/services/jwt.backend.service.js.map +1 -1
  263. package/dist/tsconfig.build.tsbuildinfo +1 -1
  264. package/package.json +15 -9
  265. package/dist/esm/.builder.pid +0 -9
@@ -14,6 +14,7 @@ import { AuthorizationsBackendService } from '../../../security/authorizations/s
14
14
  import { ExecutionContextCreatorBackendService } from '../../../runtime/services/execution-context-creator.backend.service';
15
15
  import { ResourceFileUploadHandlerBackendService } from '../../../files/handlers/resource-file-upload-handler.backend.service';
16
16
  import { FileFieldDetectionBackendService } from '../../../files/services/file-field-detection.backend.service';
17
+ import { FileUploadGrantBackendService } from '../../../files/services/file-upload-grant.backend.service';
17
18
  import { ResourcesRegistryBackendService } from '../../../resources/services/resources-registry.backend.service';
18
19
  import { ExecutionContextHandlerBackendService } from '../../../runtime/services/execution-context-handler.backend.service';
19
20
  import { ResourceOperationHelperBackendService } from '../../../base-classes/services/resource-operations-helper.backend.service';
@@ -90,7 +91,7 @@ export declare function extractCollectionFilters(rawData: Record<string, unknown
90
91
  * `{ startDate, endDate }` object the SEARCH request DTO expects.
91
92
  *
92
93
  * WHY THIS EXISTS — a date-range filter is authored as an OBJECT
93
- * (`Resouces_Filter_DateRangeSchema` → `{ startDate?: Date, endDate?: Date }`), and
94
+ * (`Resources_Filter_DateRangeSchema` → `{ startDate?: Date, endDate?: Date }`), and
94
95
  * the frontend HTTP client / any generated SDK serialise it with bracket notation
95
96
  * (OpenAPI `style: deepObject`). Express 5 defaults its query parser to `simple`
96
97
  * (`querystring.parse`), under which `createdAt[startDate]=x` arrives as the LITERAL
@@ -137,11 +138,12 @@ export declare class ControllerResourceBackendService<TCustomOperationEnum exten
137
138
  private readonly anonymousSessionService;
138
139
  private readonly appConfigService;
139
140
  private readonly rateLimitService;
141
+ private readonly fileUploadGrantService;
140
142
  private readonly resourceConfiguration;
141
143
  private readonly operationsMap;
142
144
  private readonly router;
143
145
  protected logDebug: (message: string, context?: Record<string, unknown>) => void;
144
- constructor(resourceType: ResourceType, logger: LoggerService, errorBuilder: ErrorBuilderBackendService, errorHandler: ErrorHandlerService, jwtService: JwtBackendService, authorizationsService: AuthorizationsBackendService, resourcesRegistry: ResourcesRegistryBackendService, executionContextCreator: ExecutionContextCreatorBackendService, executionContextHandler: ExecutionContextHandlerBackendService, repositoriesRegistry: RepositoriesRegistryHandlerBackendService, resourceOperationHelper: ResourceOperationHelperBackendService, servicesRegistry: ServicesRegistryHandlerBackendService, fileFieldDetection: FileFieldDetectionBackendService, fileUploadHandler: ResourceFileUploadHandlerBackendService, auditLogsService: AuditLogsBackendService, anonymousSessionService: AnonymousSessionBackendService, appConfigService: AppConfigurationService, rateLimitService: RateLimitBackendService);
146
+ constructor(resourceType: ResourceType, logger: LoggerService, errorBuilder: ErrorBuilderBackendService, errorHandler: ErrorHandlerService, jwtService: JwtBackendService, authorizationsService: AuthorizationsBackendService, resourcesRegistry: ResourcesRegistryBackendService, executionContextCreator: ExecutionContextCreatorBackendService, executionContextHandler: ExecutionContextHandlerBackendService, repositoriesRegistry: RepositoriesRegistryHandlerBackendService, resourceOperationHelper: ResourceOperationHelperBackendService, servicesRegistry: ServicesRegistryHandlerBackendService, fileFieldDetection: FileFieldDetectionBackendService, fileUploadHandler: ResourceFileUploadHandlerBackendService, auditLogsService: AuditLogsBackendService, anonymousSessionService: AnonymousSessionBackendService, appConfigService: AppConfigurationService, rateLimitService: RateLimitBackendService, fileUploadGrantService: FileUploadGrantBackendService);
145
147
  getRouter(): Router;
146
148
  private resolveContextAddressedSingletonOperationAuthorizationId;
147
149
  /**
@@ -165,7 +167,7 @@ export declare class ControllerResourceBackendService<TCustomOperationEnum exten
165
167
  private resolveAssociationParentContextResourceId;
166
168
  private stringifyPersistedValue;
167
169
  private ensureFileUploadTargetMatchesRouteContext;
168
- static createInstance<TCustomOperationEnum extends EnumLikeType | undefined = undefined, TCoreOperationEnum extends Partial<CoreResourceOperation> | undefined = undefined, TMainSchema extends z.ZodTypeAny = z.ZodTypeAny>(resourceType: ResourceType, logger: LoggerService, errorBuilder: ErrorBuilderBackendService, errorHandler: ErrorHandlerService, jwtService: JwtBackendService, authorizationsService: AuthorizationsBackendService, resourcesRegistry: ResourcesRegistryBackendService, executionContextCreator: ExecutionContextCreatorBackendService, executionContextHandler: ExecutionContextHandlerBackendService, repositoriesRegistry: RepositoriesRegistryHandlerBackendService, resourceOperationHelper: ResourceOperationHelperBackendService, servicesRegistry: ServicesRegistryHandlerBackendService, fileFieldDetection: FileFieldDetectionBackendService, fileUploadHandler: ResourceFileUploadHandlerBackendService, auditLogsService: AuditLogsBackendService, anonymousSessionService: AnonymousSessionBackendService, appConfigService: AppConfigurationService, rateLimitService: RateLimitBackendService): ControllerResourceBackendService<TCustomOperationEnum, TCoreOperationEnum, TMainSchema>;
170
+ static createInstance<TCustomOperationEnum extends EnumLikeType | undefined = undefined, TCoreOperationEnum extends Partial<CoreResourceOperation> | undefined = undefined, TMainSchema extends z.ZodTypeAny = z.ZodTypeAny>(resourceType: ResourceType, logger: LoggerService, errorBuilder: ErrorBuilderBackendService, errorHandler: ErrorHandlerService, jwtService: JwtBackendService, authorizationsService: AuthorizationsBackendService, resourcesRegistry: ResourcesRegistryBackendService, executionContextCreator: ExecutionContextCreatorBackendService, executionContextHandler: ExecutionContextHandlerBackendService, repositoriesRegistry: RepositoriesRegistryHandlerBackendService, resourceOperationHelper: ResourceOperationHelperBackendService, servicesRegistry: ServicesRegistryHandlerBackendService, fileFieldDetection: FileFieldDetectionBackendService, fileUploadHandler: ResourceFileUploadHandlerBackendService, auditLogsService: AuditLogsBackendService, anonymousSessionService: AnonymousSessionBackendService, appConfigService: AppConfigurationService, rateLimitService: RateLimitBackendService, fileUploadGrantService: FileUploadGrantBackendService): ControllerResourceBackendService<TCustomOperationEnum, TCoreOperationEnum, TMainSchema>;
169
171
  private initializeOperationsMap;
170
172
  private initializeRoutes;
171
173
  /**
@@ -231,6 +233,15 @@ export declare class ControllerResourceBackendService<TCustomOperationEnum exten
231
233
  * first avoids unauthenticated callers forcing temp-disk writes through Multer
232
234
  * while still reusing the exact same execution context for the later upload.
233
235
  */
236
+ /**
237
+ * The handler behind `POST …/files/<field>/grant` (issue #312, D3). Runs AFTER the upload route's
238
+ * own authorization middleware, so by the time it executes the caller has been authorized on the
239
+ * target write exactly as an upload would be. It computes the two absolute URLs the grant needs from
240
+ * the request itself — the upload URL is this request's URL minus `/grant`, so it cannot drift from
241
+ * the route that was just authorized — and delegates the mint to the ONE function the MCP door also
242
+ * calls. Answers 201 with the grant; the token appears in it because it is the credential.
243
+ */
244
+ private buildFileUploadGrantMintHandler;
234
245
  private createFileUploadAuthorizationMiddleware;
235
246
  /**
236
247
  * Initialize validate-field routes for resources with unique fields.
@@ -1 +1 @@
1
- {"version":3,"file":"controller-resource.backend.service.d.ts","sourceRoot":"","sources":["../../../../../../src/base-classes/services/controllers/controller-resource.backend.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"controller-resource.backend.service.d.ts","sourceRoot":"","sources":["../../../../../../src/base-classes/services/controllers/controller-resource.backend.service.ts"],"names":[],"mappings":"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"}
@@ -2,13 +2,15 @@ import 'reflect-metadata';
2
2
  import { Router } from 'express';
3
3
  import { z } from 'zod';
4
4
  import { getZodObjectShape, isExcludedFromUpdate, isZodObject } from '@wildo-ai/zod-decorators';
5
- import { HttpMethod, DataMode, OPERATION_VARIANT_KEY, ResourcesConfigOperationsDtosBuilderUtils, ResourceOperationsUtils, ResourcesConfigOperationsUrlsBuilderUtils, extractCrdtFieldNames } from '@wildo-ai/saas-models';
5
+ import { HttpMethod, DataMode, OPERATION_VARIANT_KEY, ResourcesConfigOperationsDtosBuilderUtils, ResourceOperationsUtils, ResourcesConfigOperationsUrlsBuilderUtils, extractCrdtFieldNames, COLLECTION_QUERY_PARAMETERS, BackendApiType, FileUploadGrantMintRequestSchema, MAIN_API_BASE_PATH, } from '@wildo-ai/saas-models';
6
6
  import { summarizeZodIssues } from '@wildo-ai/saas-models';
7
7
  import { buildCollectionExportFilename, COLLECTION_EXPORT_CONTENT_TYPES, COLLECTION_EXPORT_FORMAT_QUERY_PARAM, COLLECTION_EXPORT_ROW_COUNT_HEADER, COLLECTION_EXPORT_ROW_SCOPE_QUERY_PARAM, ResourceCollectionExportFormat, ResourceCollectionExportRowScope, ResourceGeneratedOperationKind, resolveCollectionExportCsvColumns, resolveRequestedCollectionExportFormat, resolveRequestedCollectionExportRowScope, toCsvHeaderRow, toCsvRow, } from '@wildo-ai/saas-models';
8
8
  import { CoreResourceOperation, ALL_COLLECTION_OPERATIONS, OPERATIONS_WITHOUT_REQUEST_BODY } from '@wildo-ai/saas-models';
9
9
  import { ResourceOperationVariantType, ResourcesConfig_OperationPathUtils, ErrorType, ErrorCustomMessageReference, WildoHeaderKeys, getContextAddressedCompositionSingletonRelationshipCandidates, isWildoBackendError, RelationshipNature, ResourceRelationshipCardinality } from '@wildo-ai/saas-models';
10
10
  import { projectWildoBackendErrorLogFields, projectCaughtErrorLogFields, describeCaughtError } from '../../../errors/utils/error-log-level-classification.backend.utils.js';
11
11
  import { createMulterUploadConfig } from '../../../files/utils/file-upload.utils.js';
12
+ import { FileUploadGrantBackendService } from '../../../files/services/file-upload-grant.backend.service.js';
13
+ import { getClientIpFromRequest } from '../../../runtime/utils/request-client-ip.utils.js';
12
14
  import { resolveConfiguredMaxFileSize } from '../../../files/utils/file-validation.utils.js';
13
15
  import { initializeValidateFieldRoutes } from './validate-field-handler.backend.service.js';
14
16
  import { serializeOperationResultForResponse } from './utils/operation-response-serializer.backend.utils.js';
@@ -324,7 +326,7 @@ export function extractCollectionFilters(rawData, filterFields) {
324
326
  * - a scalar (`string` / `number` / `boolean` / `null` / `Date`), or
325
327
  * - an array of scalars, or
326
328
  * - a range object whose keys are exactly {@link RANGE_FILTER_SUBKEYS}, the framework's OWN named
327
- * date-range vocabulary (`Resouces_Filter_DateRangeSchema`), with scalar bounds.
329
+ * date-range vocabulary (`Resources_Filter_DateRangeSchema`), with scalar bounds.
328
330
  *
329
331
  * Anything else is refused, whatever engine's syntax it happens to be written in. Adding a genuinely
330
332
  * new structured filter shape is then a deliberate edit to this predicate and its named vocabulary,
@@ -354,9 +356,9 @@ function isPermittedFilterValue(value) {
354
356
  return entries.length > 0
355
357
  && entries.every(([key, bound]) => RANGE_FILTER_SUBKEYS.has(key) && isPermittedFilterScalar(bound));
356
358
  }
357
- /** Date-range filters accepted on every collection op (mirrors `Resouces_Filter_BaseSchema`). */
359
+ /** Date-range filters accepted on every collection op (mirrors `Resources_Filter_BaseSchema`). */
358
360
  const UNIVERSAL_RANGE_FILTER_FIELDS = ['createdAt', 'updatedAt'];
359
- /** The two sub-keys of a `Resouces_Filter_DateRangeSchema` range object. */
361
+ /** The two sub-keys of a `Resources_Filter_DateRangeSchema` range object. */
360
362
  const RANGE_FILTER_SUBKEYS = new Set(['startDate', 'endDate']);
361
363
  /**
362
364
  * Reconstruct date-range filters sent as BRACKETED query keys
@@ -364,7 +366,7 @@ const RANGE_FILTER_SUBKEYS = new Set(['startDate', 'endDate']);
364
366
  * `{ startDate, endDate }` object the SEARCH request DTO expects.
365
367
  *
366
368
  * WHY THIS EXISTS — a date-range filter is authored as an OBJECT
367
- * (`Resouces_Filter_DateRangeSchema` → `{ startDate?: Date, endDate?: Date }`), and
369
+ * (`Resources_Filter_DateRangeSchema` → `{ startDate?: Date, endDate?: Date }`), and
368
370
  * the frontend HTTP client / any generated SDK serialise it with bracket notation
369
371
  * (OpenAPI `style: deepObject`). Express 5 defaults its query parser to `simple`
370
372
  * (`querystring.parse`), under which `createdAt[startDate]=x` arrives as the LITERAL
@@ -465,11 +467,12 @@ export class ControllerResourceBackendService {
465
467
  anonymousSessionService;
466
468
  appConfigService;
467
469
  rateLimitService;
470
+ fileUploadGrantService;
468
471
  resourceConfiguration;
469
472
  operationsMap;
470
473
  router;
471
474
  logDebug;
472
- constructor(resourceType, logger, errorBuilder, errorHandler, jwtService, authorizationsService, resourcesRegistry, executionContextCreator, executionContextHandler, repositoriesRegistry, resourceOperationHelper, servicesRegistry, fileFieldDetection, fileUploadHandler, auditLogsService, anonymousSessionService, appConfigService, rateLimitService) {
475
+ constructor(resourceType, logger, errorBuilder, errorHandler, jwtService, authorizationsService, resourcesRegistry, executionContextCreator, executionContextHandler, repositoriesRegistry, resourceOperationHelper, servicesRegistry, fileFieldDetection, fileUploadHandler, auditLogsService, anonymousSessionService, appConfigService, rateLimitService, fileUploadGrantService) {
473
476
  this.logger = logger;
474
477
  this.errorBuilder = errorBuilder;
475
478
  this.errorHandler = errorHandler;
@@ -487,6 +490,7 @@ export class ControllerResourceBackendService {
487
490
  this.anonymousSessionService = anonymousSessionService;
488
491
  this.appConfigService = appConfigService;
489
492
  this.rateLimitService = rateLimitService;
493
+ this.fileUploadGrantService = fileUploadGrantService;
490
494
  this.resourceConfiguration = this.resourcesRegistry.getResourceConfiguration(resourceType);
491
495
  this.router = Router();
492
496
  this.operationsMap = new Map();
@@ -951,8 +955,8 @@ export class ControllerResourceBackendService {
951
955
  // ================================
952
956
  // Initialization
953
957
  // ================================
954
- static createInstance(resourceType, logger, errorBuilder, errorHandler, jwtService, authorizationsService, resourcesRegistry, executionContextCreator, executionContextHandler, repositoriesRegistry, resourceOperationHelper, servicesRegistry, fileFieldDetection, fileUploadHandler, auditLogsService, anonymousSessionService, appConfigService, rateLimitService) {
955
- return new ControllerResourceBackendService(resourceType, logger, errorBuilder, errorHandler, jwtService, authorizationsService, resourcesRegistry, executionContextCreator, executionContextHandler, repositoriesRegistry, resourceOperationHelper, servicesRegistry, fileFieldDetection, fileUploadHandler, auditLogsService, anonymousSessionService, appConfigService, rateLimitService);
958
+ static createInstance(resourceType, logger, errorBuilder, errorHandler, jwtService, authorizationsService, resourcesRegistry, executionContextCreator, executionContextHandler, repositoriesRegistry, resourceOperationHelper, servicesRegistry, fileFieldDetection, fileUploadHandler, auditLogsService, anonymousSessionService, appConfigService, rateLimitService, fileUploadGrantService) {
959
+ return new ControllerResourceBackendService(resourceType, logger, errorBuilder, errorHandler, jwtService, authorizationsService, resourcesRegistry, executionContextCreator, executionContextHandler, repositoriesRegistry, resourceOperationHelper, servicesRegistry, fileFieldDetection, fileUploadHandler, auditLogsService, anonymousSessionService, appConfigService, rateLimitService, fileUploadGrantService);
956
960
  }
957
961
  initializeOperationsMap() {
958
962
  if (!this.resourceConfiguration.operations) {
@@ -1190,12 +1194,13 @@ export class ControllerResourceBackendService {
1190
1194
  requiresTargetResourceId: false,
1191
1195
  resourceType,
1192
1196
  fieldName,
1197
+ grantOperation: CoreResourceOperation.CREATE,
1193
1198
  });
1194
1199
  this.router.post(createPath, authorizeCreateUpload, upload.single('file'), // Multer middleware - expects 'file' field name
1195
1200
  this.asyncHandler(async (req, res, next) => {
1196
1201
  try {
1197
1202
  const executionContext = res.locals.fileUploadExecutionContext
1198
- ?? await this.executionContextCreator.createExecutionContextFromRequest(req, createOperation, {
1203
+ ?? await this.executionContextCreator.createExecutionContextFromRequest(req, FileUploadGrantBackendService.withUploadGrantAcceptance(createOperation), {
1199
1204
  url: fileUploadInitiatorInfo.url,
1200
1205
  parameters: fileUploadInitiatorInfo.parameters,
1201
1206
  });
@@ -1212,6 +1217,9 @@ export class ControllerResourceBackendService {
1212
1217
  path: createPath,
1213
1218
  parentParams: fileUploadInitiatorInfo.parameters.map(p => `${p.fieldIdentifier}:${p.resourceType}`).join(', ') || 'none',
1214
1219
  });
1220
+ // Mint door (issue #312, D3): a SIBLING of the upload route, behind the SAME authorization
1221
+ // middleware, so mint-authority ≡ upload-authority by construction.
1222
+ this.router.post(`${createPath}/grant`, authorizeCreateUpload, this.asyncHandler(this.buildFileUploadGrantMintHandler({ resourceType, fieldName, operation: CoreResourceOperation.CREATE })));
1215
1223
  }
1216
1224
  // UPDATE routes (one per parent combination)
1217
1225
  // Register more specific routes first (with parent paths) for correct Express matching
@@ -1227,6 +1235,7 @@ export class ControllerResourceBackendService {
1227
1235
  allowContextAddressedTarget: options.allowContextAddressedTarget,
1228
1236
  resourceType,
1229
1237
  fieldName,
1238
+ grantOperation: CoreResourceOperation.UPDATE,
1230
1239
  });
1231
1240
  this.router.post(updatePath, authorizeUpdateUpload, upload.single('file'), // Multer middleware
1232
1241
  this.asyncHandler(async (req, res, next) => {
@@ -1245,7 +1254,7 @@ export class ControllerResourceBackendService {
1245
1254
  });
1246
1255
  }
1247
1256
  const executionContext = locals.fileUploadExecutionContext
1248
- ?? await this.executionContextCreator.createExecutionContextFromRequest(req, updateOperation, {
1257
+ ?? await this.executionContextCreator.createExecutionContextFromRequest(req, FileUploadGrantBackendService.withUploadGrantAcceptance(updateOperation), {
1249
1258
  url: fileUploadInitiatorInfo.url,
1250
1259
  parameters: fileUploadInitiatorInfo.parameters,
1251
1260
  });
@@ -1255,6 +1264,7 @@ export class ControllerResourceBackendService {
1255
1264
  next(error);
1256
1265
  }
1257
1266
  }));
1267
+ this.router.post(`${updatePath}/grant`, authorizeUpdateUpload, this.asyncHandler(this.buildFileUploadGrantMintHandler({ resourceType, fieldName, operation: CoreResourceOperation.UPDATE })));
1258
1268
  this.logDebug('File upload UPDATE route registered', {
1259
1269
  resourceType,
1260
1270
  fieldName,
@@ -1311,10 +1321,75 @@ export class ControllerResourceBackendService {
1311
1321
  * first avoids unauthenticated callers forcing temp-disk writes through Multer
1312
1322
  * while still reusing the exact same execution context for the later upload.
1313
1323
  */
1324
+ /**
1325
+ * The handler behind `POST …/files/<field>/grant` (issue #312, D3). Runs AFTER the upload route's
1326
+ * own authorization middleware, so by the time it executes the caller has been authorized on the
1327
+ * target write exactly as an upload would be. It computes the two absolute URLs the grant needs from
1328
+ * the request itself — the upload URL is this request's URL minus `/grant`, so it cannot drift from
1329
+ * the route that was just authorized — and delegates the mint to the ONE function the MCP door also
1330
+ * calls. Answers 201 with the grant; the token appears in it because it is the credential.
1331
+ */
1332
+ buildFileUploadGrantMintHandler(target) {
1333
+ return async (req, res, next) => {
1334
+ try {
1335
+ const locals = res.locals;
1336
+ const executionContext = locals.fileUploadExecutionContext;
1337
+ if (!executionContext) {
1338
+ throw this.errorBuilder.buildError(ErrorType.INTERNAL, {}, {
1339
+ customMessageReference: ErrorCustomMessageReference.INTERNAL,
1340
+ context: { message: 'Upload grant mint reached without an authorized context' },
1341
+ });
1342
+ }
1343
+ const resourceId = target.operation === CoreResourceOperation.UPDATE
1344
+ ? (locals.fileUploadResolvedResourceId ?? req.params[this.resourceConfiguration.resourceFieldIdentifier])
1345
+ : undefined;
1346
+ const parsedBody = FileUploadGrantMintRequestSchema.safeParse(req.body ?? {});
1347
+ if (!parsedBody.success) {
1348
+ throw this.errorBuilder.buildError(ErrorType.VALIDATION, executionContext, {
1349
+ customMessageReference: ErrorCustomMessageReference.VALIDATION,
1350
+ context: { errors: parsedBody.error.issues.map((issue) => ({ path: issue.path.join('.'), message: issue.message })) },
1351
+ });
1352
+ }
1353
+ // The API's own public origin comes from configuration, never from request headers — a
1354
+ // Host header is client-controlled and a grant URL built from it would point wherever the
1355
+ // caller said.
1356
+ const apiPublicUrl = this.appConfigService.config.runtime?.endPoints?.[BackendApiType.MAIN_BACKEND_API]?.publicUrl;
1357
+ if (!apiPublicUrl) {
1358
+ throw this.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {
1359
+ customMessageReference: ErrorCustomMessageReference.CONFIGURATION,
1360
+ context: { message: `runtime.endPoints.${BackendApiType.MAIN_BACKEND_API}.publicUrl is required to mint a file upload grant` },
1361
+ });
1362
+ }
1363
+ const origin = apiPublicUrl.replace(/\/+$/, '');
1364
+ const requestPath = (req.originalUrl.split('?')[0] ?? '').replace(/\/grant\/?$/, '');
1365
+ const uploadUrl = `${origin}${requestPath}`;
1366
+ const apiBaseUrl = `${origin}${req.baseUrl || MAIN_API_BASE_PATH}`;
1367
+ const grant = await this.fileUploadGrantService.mint({
1368
+ executionContext,
1369
+ target: { ...target, resourceId },
1370
+ expiresInMinutes: parsedBody.data.expiresInMinutes,
1371
+ uploadUrl,
1372
+ apiBaseUrl,
1373
+ requestProvenance: {
1374
+ ipAddress: getClientIpFromRequest(req),
1375
+ userAgent: typeof req.headers['user-agent'] === 'string' ? req.headers['user-agent'] : undefined,
1376
+ },
1377
+ });
1378
+ res.status(201).json(grant);
1379
+ }
1380
+ catch (error) {
1381
+ next(error);
1382
+ }
1383
+ };
1384
+ }
1314
1385
  createFileUploadAuthorizationMiddleware(operation, fileUploadInitiatorInfo, options) {
1386
+ // The upload routes — and ONLY the upload routes — accept a file upload GRANT as an ALTERNATIVE
1387
+ // credential (issue #312, D4). The authored operation is left untouched, so the JSON CREATE/UPDATE
1388
+ // routes refuse the same token (GATE 1, `CONSUMABLE_TOKEN_NOT_ACCEPTED_FOR_OPERATION`).
1389
+ const acceptingOperation = FileUploadGrantBackendService.withUploadGrantAcceptance(operation);
1315
1390
  return this.asyncHandler(async (req, res, next) => {
1316
1391
  try {
1317
- let executionContext = await this.executionContextCreator.createExecutionContextFromRequest(req, operation, {
1392
+ let executionContext = await this.executionContextCreator.createExecutionContextFromRequest(req, acceptingOperation, {
1318
1393
  url: fileUploadInitiatorInfo.url,
1319
1394
  parameters: fileUploadInitiatorInfo.parameters,
1320
1395
  });
@@ -1343,6 +1418,18 @@ export class ControllerResourceBackendService {
1343
1418
  },
1344
1419
  });
1345
1420
  }
1421
+ // A grant is bound to ONE (resource, field, operation kind, row). Checked BEFORE the authorizer so
1422
+ // a grant minted for another field never even reaches a role check on this one; a non-grant
1423
+ // context passes through untouched. Mirrors `validateFileToken` on the download twin.
1424
+ const grant = await this.fileUploadGrantService.assertGrantMatchesRoute(executionContext, {
1425
+ resourceType: options.resourceType,
1426
+ fieldName: options.fieldName,
1427
+ operation: options.grantOperation,
1428
+ resourceId,
1429
+ });
1430
+ if (grant) {
1431
+ locals.fileUploadGrant = grant;
1432
+ }
1346
1433
  await this.authorizationsService.authorizeInController(resourceId, executionContext);
1347
1434
  if (resourceId) {
1348
1435
  await this.ensureFileUploadTargetMatchesRouteContext(operation, resourceId, executionContext, { requireRouteContext: options.allowContextAddressedTarget });
@@ -1571,9 +1658,10 @@ export class ControllerResourceBackendService {
1571
1658
  * encodes a remote entity's key and an `INTROSPECTION`-backed resource's id is whatever
1572
1659
  * its projection calls the row — neither can be an ObjectId or a UUID, and
1573
1660
  * `ResourceIdBackendService.getFormatForResource` exists precisely to say so. Measured on
1574
- * the introspection lane: `GET …/workbench-application-modules` answered 200 with 8 rows
1575
- * while `…/workbench-application-modules/engine` answered 400 `invalid_format`, because
1576
- * the branch that would have admitted `engine` was never entered.
1661
+ * the introspection lane, against the workbench's module projection (a resource since
1662
+ * superseded by `workbench-domain-resources`): the LIST answered 200 with 8 rows while the
1663
+ * addressed READ of the row keyed `engine` answered 400 `invalid_format`, because the
1664
+ * branch that would have admitted `engine` was never entered.
1577
1665
  *
1578
1666
  * Passing the resource type does not loosen anything for platform-backed rows: the helper
1579
1667
  * resolves their format to the application's declared ObjectId or UUID and validates
@@ -2422,19 +2510,24 @@ export function normalizeCollectionQueryRequestData(rawRequestData, operation, e
2422
2510
  ...extractCollectionFilters(reconstructedRawRequestData, effectiveFilterFields),
2423
2511
  ...extractCollectionFilters(nestedFilters, effectiveFilterFields),
2424
2512
  };
2425
- const page = parseOptionalPositiveInt(rawRequestData.page)
2513
+ // The flat wire names are the published collection vocabulary
2514
+ // (`COLLECTION_QUERY_PARAMETERS`); the nested `pagination` / `sorting` forms
2515
+ // are the structured-body aliases the frontend client sends.
2516
+ const page = parseOptionalPositiveInt(rawRequestData[COLLECTION_QUERY_PARAMETERS.page])
2426
2517
  ?? parseOptionalPositiveInt(rawRequestData.pagination?.page);
2427
- const limit = parseOptionalPositiveInt(rawRequestData.limit)
2518
+ const limit = parseOptionalPositiveInt(rawRequestData[COLLECTION_QUERY_PARAMETERS.limit])
2428
2519
  ?? parseOptionalPositiveInt(rawRequestData.pagination?.limit);
2429
2520
  if (effectiveOperation === CoreResourceOperation.SEARCH) {
2430
- const searchQuery = (typeof rawRequestData.q === 'string' && rawRequestData.q.trim() !== ''
2431
- ? rawRequestData.q
2432
- : typeof rawRequestData.searchQuery === 'string' && rawRequestData.searchQuery.trim() !== ''
2433
- ? rawRequestData.searchQuery
2521
+ const rawSearch = rawRequestData[COLLECTION_QUERY_PARAMETERS.search];
2522
+ const rawSearchAlias = rawRequestData[COLLECTION_QUERY_PARAMETERS.searchAlias];
2523
+ const searchQuery = (typeof rawSearch === 'string' && rawSearch.trim() !== ''
2524
+ ? rawSearch
2525
+ : typeof rawSearchAlias === 'string' && rawSearchAlias.trim() !== ''
2526
+ ? rawSearchAlias
2434
2527
  : typeof nestedFilters.searchRequest === 'string' && nestedFilters.searchRequest.trim() !== ''
2435
2528
  ? nestedFilters.searchRequest
2436
2529
  : undefined);
2437
- const sort = parseCollectionQuerySort(rawRequestData.sort)
2530
+ const sort = parseCollectionQuerySort(rawRequestData[COLLECTION_QUERY_PARAMETERS.sort])
2438
2531
  ?? normalizeCollectionSorting(rawRequestData.sorting);
2439
2532
  return { filter, page, limit, searchQuery, sort };
2440
2533
  }
@@ -2447,7 +2540,7 @@ export function normalizeCollectionQueryRequestData(rawRequestData, operation, e
2447
2540
  // absent `sort` falls back to the operation's sortFields default, or
2448
2541
  // createdAt-desc when none are configured — i.e. no behaviour change for
2449
2542
  // callers that don't pass `sort`.
2450
- const sort = parseCollectionQuerySort(rawRequestData.sort);
2543
+ const sort = parseCollectionQuerySort(rawRequestData[COLLECTION_QUERY_PARAMETERS.sort]);
2451
2544
  return { filter, page, limit, sort };
2452
2545
  }
2453
2546
  return { filter };