@c15t/backend 1.2.0-canary.9 → 1.2.0

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 (167) hide show
  1. package/.turbo/turbo-build.log +53 -52
  2. package/CHANGELOG.md +7 -0
  3. package/dist/__tests__/server.test.d.ts +2 -0
  4. package/dist/__tests__/server.test.d.ts.map +1 -0
  5. package/dist/contracts/index.d.ts +1 -1
  6. package/dist/contracts/index.d.ts.map +1 -1
  7. package/dist/contracts.cjs +708 -0
  8. package/dist/contracts.js +661 -0
  9. package/dist/core.cjs +94 -47
  10. package/dist/core.d.ts.map +1 -1
  11. package/dist/core.js +94 -47
  12. package/dist/middleware/openapi/config.d.ts +1 -1
  13. package/dist/middleware/openapi/config.d.ts.map +1 -1
  14. package/dist/pkgs/data-model/index.cjs +57 -39
  15. package/dist/pkgs/data-model/index.js +57 -39
  16. package/dist/pkgs/data-model/schema/index.cjs +57 -39
  17. package/dist/pkgs/data-model/schema/index.js +57 -39
  18. package/dist/router.cjs +3 -1
  19. package/dist/router.js +3 -1
  20. package/dist/schema/consent-policy/registry.d.ts.map +1 -1
  21. package/dist/schema/create-registry.d.ts.map +1 -1
  22. package/dist/schema/index.cjs +57 -39
  23. package/dist/schema/index.js +57 -39
  24. package/package.json +7 -2
  25. package/rslib.config.ts +1 -0
  26. package/src/__tests__/server.test.ts +96 -0
  27. package/src/contracts/index.ts +2 -0
  28. package/src/core.ts +29 -1
  29. package/src/middleware/cors/cors.test.ts +0 -1
  30. package/src/middleware/openapi/config.ts +10 -7
  31. package/src/schema/consent-policy/registry.ts +74 -51
  32. package/.turbo/turbo-fmt.log +0 -7
  33. package/.turbo/turbo-test.log +0 -426
  34. package/coverage/coverage-final.json +0 -88
  35. package/coverage/coverage-summary.json +0 -89
  36. package/coverage/html/backend/index.html +0 -116
  37. package/coverage/html/backend/rslib.config.ts.html +0 -415
  38. package/coverage/html/backend/src/contracts/consent/index.html +0 -161
  39. package/coverage/html/backend/src/contracts/consent/index.ts.html +0 -112
  40. package/coverage/html/backend/src/contracts/consent/post.contract.ts.html +0 -550
  41. package/coverage/html/backend/src/contracts/consent/show-banner.contract.ts.html +0 -220
  42. package/coverage/html/backend/src/contracts/consent/verify.contract.ts.html +0 -463
  43. package/coverage/html/backend/src/contracts/index.html +0 -116
  44. package/coverage/html/backend/src/contracts/index.ts.html +0 -139
  45. package/coverage/html/backend/src/contracts/meta/index.html +0 -131
  46. package/coverage/html/backend/src/contracts/meta/index.ts.html +0 -100
  47. package/coverage/html/backend/src/contracts/meta/status.contract.ts.html +0 -196
  48. package/coverage/html/backend/src/contracts/shared/index.html +0 -116
  49. package/coverage/html/backend/src/contracts/shared/jurisdiction.schema.ts.html +0 -175
  50. package/coverage/html/backend/src/core.ts.html +0 -1342
  51. package/coverage/html/backend/src/handlers/consent/index.html +0 -161
  52. package/coverage/html/backend/src/handlers/consent/index.ts.html +0 -112
  53. package/coverage/html/backend/src/handlers/consent/post.handler.ts.html +0 -904
  54. package/coverage/html/backend/src/handlers/consent/show-banner.handler.ts.html +0 -532
  55. package/coverage/html/backend/src/handlers/consent/verify.handler.ts.html +0 -1000
  56. package/coverage/html/backend/src/handlers/meta/index.html +0 -131
  57. package/coverage/html/backend/src/handlers/meta/index.ts.html +0 -100
  58. package/coverage/html/backend/src/handlers/meta/status.handler.ts.html +0 -226
  59. package/coverage/html/backend/src/index.html +0 -161
  60. package/coverage/html/backend/src/init.ts.html +0 -1018
  61. package/coverage/html/backend/src/middleware/cors/cors.ts.html +0 -661
  62. package/coverage/html/backend/src/middleware/cors/index.html +0 -146
  63. package/coverage/html/backend/src/middleware/cors/is-origin-trusted.ts.html +0 -463
  64. package/coverage/html/backend/src/middleware/cors/process-cors.ts.html +0 -358
  65. package/coverage/html/backend/src/middleware/openapi/config.ts.html +0 -160
  66. package/coverage/html/backend/src/middleware/openapi/handlers.ts.html +0 -481
  67. package/coverage/html/backend/src/middleware/openapi/index.html +0 -131
  68. package/coverage/html/backend/src/pkgs/api-router/hooks/index.html +0 -116
  69. package/coverage/html/backend/src/pkgs/api-router/hooks/processor.ts.html +0 -544
  70. package/coverage/html/backend/src/pkgs/api-router/index.html +0 -116
  71. package/coverage/html/backend/src/pkgs/api-router/telemetry.ts.html +0 -334
  72. package/coverage/html/backend/src/pkgs/api-router/utils/index.html +0 -116
  73. package/coverage/html/backend/src/pkgs/api-router/utils/ip.ts.html +0 -361
  74. package/coverage/html/backend/src/pkgs/data-model/fields/field-factory.ts.html +0 -709
  75. package/coverage/html/backend/src/pkgs/data-model/fields/id-generator.ts.html +0 -256
  76. package/coverage/html/backend/src/pkgs/data-model/fields/index.html +0 -161
  77. package/coverage/html/backend/src/pkgs/data-model/fields/superjson-utils.ts.html +0 -136
  78. package/coverage/html/backend/src/pkgs/data-model/fields/zod-fields.ts.html +0 -496
  79. package/coverage/html/backend/src/pkgs/data-model/hooks/create-hooks.ts.html +0 -349
  80. package/coverage/html/backend/src/pkgs/data-model/hooks/index.html +0 -176
  81. package/coverage/html/backend/src/pkgs/data-model/hooks/update-hooks.ts.html +0 -358
  82. package/coverage/html/backend/src/pkgs/data-model/hooks/update-many-hooks.ts.html +0 -613
  83. package/coverage/html/backend/src/pkgs/data-model/hooks/utils.ts.html +0 -538
  84. package/coverage/html/backend/src/pkgs/data-model/hooks/with-hooks-factory.ts.html +0 -289
  85. package/coverage/html/backend/src/pkgs/db-adapters/adapter-factory.ts.html +0 -289
  86. package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts.html +0 -2203
  87. package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/index.html +0 -116
  88. package/coverage/html/backend/src/pkgs/db-adapters/adapters/index.html +0 -116
  89. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/dialect.ts.html +0 -670
  90. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/index.html +0 -131
  91. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.ts.html +0 -3634
  92. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/index.html +0 -116
  93. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts.html +0 -1417
  94. package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/index.html +0 -116
  95. package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.ts.html +0 -2071
  96. package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/index.html +0 -116
  97. package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.ts.html +0 -1834
  98. package/coverage/html/backend/src/pkgs/db-adapters/adapters/test.ts.html +0 -316
  99. package/coverage/html/backend/src/pkgs/db-adapters/index.html +0 -131
  100. package/coverage/html/backend/src/pkgs/db-adapters/utils.ts.html +0 -238
  101. package/coverage/html/backend/src/pkgs/migrations/get-migration.ts.html +0 -343
  102. package/coverage/html/backend/src/pkgs/migrations/get-schema/get-schema.ts.html +0 -217
  103. package/coverage/html/backend/src/pkgs/migrations/get-schema/index.html +0 -146
  104. package/coverage/html/backend/src/pkgs/migrations/get-schema/process-fields.ts.html +0 -280
  105. package/coverage/html/backend/src/pkgs/migrations/get-schema/process-tables.ts.html +0 -289
  106. package/coverage/html/backend/src/pkgs/migrations/index.html +0 -176
  107. package/coverage/html/backend/src/pkgs/migrations/migration-builders.ts.html +0 -595
  108. package/coverage/html/backend/src/pkgs/migrations/migration-execution.ts.html +0 -301
  109. package/coverage/html/backend/src/pkgs/migrations/schema-comparison.ts.html +0 -694
  110. package/coverage/html/backend/src/pkgs/migrations/type-mapping.ts.html +0 -817
  111. package/coverage/html/backend/src/pkgs/results/core/error-class.ts.html +0 -976
  112. package/coverage/html/backend/src/pkgs/results/core/error-codes.ts.html +0 -703
  113. package/coverage/html/backend/src/pkgs/results/core/index.html +0 -146
  114. package/coverage/html/backend/src/pkgs/results/core/tracing.ts.html +0 -280
  115. package/coverage/html/backend/src/pkgs/results/create-telemetry-options.ts.html +0 -271
  116. package/coverage/html/backend/src/pkgs/results/index.html +0 -131
  117. package/coverage/html/backend/src/pkgs/results/orpc-error-handler.ts.html +0 -496
  118. package/coverage/html/backend/src/pkgs/results/results/index.html +0 -131
  119. package/coverage/html/backend/src/pkgs/results/results/recovery-utils.ts.html +0 -628
  120. package/coverage/html/backend/src/pkgs/results/results/result-helpers.ts.html +0 -1234
  121. package/coverage/html/backend/src/pkgs/utils/env.ts.html +0 -337
  122. package/coverage/html/backend/src/pkgs/utils/index.html +0 -146
  123. package/coverage/html/backend/src/pkgs/utils/logger.ts.html +0 -199
  124. package/coverage/html/backend/src/pkgs/utils/url.ts.html +0 -400
  125. package/coverage/html/backend/src/router.ts.html +0 -109
  126. package/coverage/html/backend/src/schema/audit-log/index.html +0 -146
  127. package/coverage/html/backend/src/schema/audit-log/registry.ts.html +0 -436
  128. package/coverage/html/backend/src/schema/audit-log/schema.ts.html +0 -223
  129. package/coverage/html/backend/src/schema/audit-log/table.ts.html +0 -640
  130. package/coverage/html/backend/src/schema/consent/index.html +0 -146
  131. package/coverage/html/backend/src/schema/consent/registry.ts.html +0 -616
  132. package/coverage/html/backend/src/schema/consent/schema.ts.html +0 -238
  133. package/coverage/html/backend/src/schema/consent/table.ts.html +0 -748
  134. package/coverage/html/backend/src/schema/consent-policy/index.html +0 -146
  135. package/coverage/html/backend/src/schema/consent-policy/registry.ts.html +0 -1063
  136. package/coverage/html/backend/src/schema/consent-policy/schema.ts.html +0 -265
  137. package/coverage/html/backend/src/schema/consent-policy/table.ts.html +0 -535
  138. package/coverage/html/backend/src/schema/consent-purpose/index.html +0 -146
  139. package/coverage/html/backend/src/schema/consent-purpose/registry.ts.html +0 -589
  140. package/coverage/html/backend/src/schema/consent-purpose/schema.ts.html +0 -259
  141. package/coverage/html/backend/src/schema/consent-purpose/table.ts.html +0 -547
  142. package/coverage/html/backend/src/schema/consent-record/index.html +0 -131
  143. package/coverage/html/backend/src/schema/consent-record/schema.ts.html +0 -211
  144. package/coverage/html/backend/src/schema/consent-record/table.ts.html +0 -457
  145. package/coverage/html/backend/src/schema/create-registry.ts.html +0 -148
  146. package/coverage/html/backend/src/schema/definition.ts.html +0 -685
  147. package/coverage/html/backend/src/schema/domain/index.html +0 -146
  148. package/coverage/html/backend/src/schema/domain/registry.ts.html +0 -973
  149. package/coverage/html/backend/src/schema/domain/schema.ts.html +0 -214
  150. package/coverage/html/backend/src/schema/domain/table.ts.html +0 -496
  151. package/coverage/html/backend/src/schema/index.html +0 -146
  152. package/coverage/html/backend/src/schema/schemas.ts.html +0 -166
  153. package/coverage/html/backend/src/schema/subject/index.html +0 -146
  154. package/coverage/html/backend/src/schema/subject/registry.ts.html +0 -973
  155. package/coverage/html/backend/src/schema/subject/schema.ts.html +0 -208
  156. package/coverage/html/backend/src/schema/subject/table.ts.html +0 -499
  157. package/coverage/html/backend/src/server.ts.html +0 -463
  158. package/coverage/html/backend/src/testing/contract-testing.ts.html +0 -1396
  159. package/coverage/html/backend/src/testing/index.html +0 -116
  160. package/coverage/html/base.css +0 -224
  161. package/coverage/html/block-navigation.js +0 -87
  162. package/coverage/html/favicon.png +0 -0
  163. package/coverage/html/index.html +0 -656
  164. package/coverage/html/prettify.css +0 -1
  165. package/coverage/html/prettify.js +0 -2
  166. package/coverage/html/sort-arrow-sprite.png +0 -0
  167. package/coverage/html/sorter.js +0 -196
package/dist/core.cjs CHANGED
@@ -1212,10 +1212,19 @@ function consentRegistry({ adapter, ...ctx }) {
1212
1212
  }
1213
1213
  async function generatePolicyPlaceholder(name, date) {
1214
1214
  const content = `[PLACEHOLDER] This is an automatically generated version of the ${name} policy.\n\nThis placeholder content should be replaced with actual policy terms before being presented to users.\n\nGenerated on: ${date.toISOString()}`;
1215
- const encoder = new TextEncoder();
1216
- const data = encoder.encode(content);
1217
- const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1218
- const contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1215
+ let contentHash;
1216
+ try {
1217
+ const encoder = new TextEncoder();
1218
+ const data = encoder.encode(content);
1219
+ const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1220
+ contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1221
+ } catch (error) {
1222
+ throw new error_class_DoubleTieError('Failed to generate policy content hash', {
1223
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1224
+ status: 500,
1225
+ cause: error instanceof Error ? error : new Error(String(error))
1226
+ });
1227
+ }
1219
1228
  return {
1220
1229
  content,
1221
1230
  contentHash
@@ -1277,42 +1286,51 @@ function policyRegistry({ adapter, ...ctx }) {
1277
1286
  },
1278
1287
  findOrCreatePolicy: async (type)=>await adapter.transaction({
1279
1288
  callback: async (txAdapter)=>{
1280
- const now = new Date();
1281
- const txRegistry = policyRegistry({
1282
- adapter: txAdapter,
1283
- ...ctx
1284
- });
1285
- const rawLatestPolicy = await txAdapter.findOne({
1286
- model: 'consentPolicy',
1287
- where: [
1288
- {
1289
- field: 'isActive',
1290
- value: true
1291
- },
1292
- {
1293
- field: 'type',
1294
- value: type
1289
+ try {
1290
+ const now = new Date();
1291
+ const txRegistry = policyRegistry({
1292
+ adapter: txAdapter,
1293
+ ...ctx
1294
+ });
1295
+ const rawLatestPolicy = await txAdapter.findOne({
1296
+ model: 'consentPolicy',
1297
+ where: [
1298
+ {
1299
+ field: 'isActive',
1300
+ value: true
1301
+ },
1302
+ {
1303
+ field: 'type',
1304
+ value: type
1305
+ }
1306
+ ],
1307
+ sortBy: {
1308
+ field: 'effectiveDate',
1309
+ direction: 'desc'
1295
1310
  }
1296
- ],
1297
- sortBy: {
1298
- field: 'effectiveDate',
1299
- direction: 'desc'
1300
- }
1301
- });
1302
- const latestPolicy = rawLatestPolicy ? validateEntityOutput('consentPolicy', rawLatestPolicy, ctx.options) : null;
1303
- if (latestPolicy) return latestPolicy;
1304
- const { content: defaultContent, contentHash } = await generatePolicyPlaceholder(type, now);
1305
- return txRegistry.createConsentPolicy({
1306
- version: '1.0.0',
1307
- type,
1308
- name: type,
1309
- effectiveDate: now,
1310
- content: defaultContent,
1311
- contentHash,
1312
- isActive: true,
1313
- updatedAt: now,
1314
- expirationDate: null
1315
- });
1311
+ });
1312
+ const latestPolicy = rawLatestPolicy ? validateEntityOutput('consentPolicy', rawLatestPolicy, ctx.options) : null;
1313
+ if (latestPolicy) return latestPolicy;
1314
+ const { content: defaultContent, contentHash } = await generatePolicyPlaceholder(type, now);
1315
+ return txRegistry.createConsentPolicy({
1316
+ version: '1.0.0',
1317
+ type,
1318
+ name: type,
1319
+ effectiveDate: now,
1320
+ content: defaultContent,
1321
+ contentHash,
1322
+ isActive: true,
1323
+ updatedAt: now,
1324
+ expirationDate: null
1325
+ });
1326
+ } catch (error) {
1327
+ ctx.logger.error('Error in findOrCreatePolicy transaction:', error);
1328
+ throw new error_class_DoubleTieError('Failed to find or create policy', {
1329
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1330
+ status: 500,
1331
+ cause: error instanceof Error ? error : new Error(String(error))
1332
+ });
1333
+ }
1316
1334
  }
1317
1335
  })
1318
1336
  };
@@ -2215,7 +2233,9 @@ function getBaseURL(url, path) {
2215
2233
  const fromEnv = env.C15T_URL || env.NEXT_PUBLIC_C15T_URL || env.PUBLIC_C15T_URL || env.NUXT_PUBLIC_C15T_URL || env.NUXT_PUBLIC_AUTH_URL || ('/' !== env.BASE_URL ? env.BASE_URL : void 0);
2216
2234
  if (fromEnv) return withPath(fromEnv, path);
2217
2235
  }
2218
- var package_namespaceObject = JSON.parse('{"i8":"1.2.0-canary.9"}');
2236
+ var package_namespaceObject = {
2237
+ i8: "1.2.0"
2238
+ };
2219
2239
  const createRegistry = (ctx)=>({
2220
2240
  ...auditLogRegistry(ctx),
2221
2241
  ...consentRegistry(ctx),
@@ -2494,12 +2514,15 @@ const processCors = (request, context, trustedOrigins)=>{
2494
2514
  }
2495
2515
  return context;
2496
2516
  };
2497
- const createOpenAPIConfig = (options)=>({
2517
+ const createOpenAPIConfig = (options)=>{
2518
+ const basePath = options.basePath || '';
2519
+ return {
2498
2520
  enabled: true,
2499
- specPath: '/spec.json',
2500
- docsPath: '/docs',
2521
+ specPath: `${basePath}/spec.json`,
2522
+ docsPath: `${basePath}/docs`,
2501
2523
  ...options.openapi || {}
2502
- });
2524
+ };
2525
+ };
2503
2526
  const createDefaultOpenAPIOptions = (options)=>({
2504
2527
  info: {
2505
2528
  title: options.appName || 'c15t API',
@@ -2508,7 +2531,7 @@ const createDefaultOpenAPIOptions = (options)=>({
2508
2531
  },
2509
2532
  servers: [
2510
2533
  {
2511
- url: '/'
2534
+ url: options.basePath || '/'
2512
2535
  }
2513
2536
  ],
2514
2537
  security: [
@@ -3614,11 +3637,26 @@ const c15tInstance = (options)=>{
3614
3637
  processCors(request, orpcContext, options.trustedOrigins);
3615
3638
  processTelemetry(request, orpcContext);
3616
3639
  const handlerContext = orpcContext;
3640
+ orpcContext.logger.debug?.('Handling prefix', {
3641
+ prefix: options.basePath || '/'
3642
+ });
3617
3643
  const { matched, response } = await rpcHandler.handle(request, {
3618
- prefix: options.baseURL || '/',
3644
+ prefix: options.basePath || '/',
3619
3645
  context: handlerContext
3620
3646
  });
3621
- if (matched && response) return response;
3647
+ if (matched && response) {
3648
+ orpcContext.logger.debug('Handler matched', {
3649
+ request,
3650
+ matched,
3651
+ response
3652
+ });
3653
+ return response;
3654
+ }
3655
+ orpcContext.logger.debug('No handler matched', {
3656
+ request,
3657
+ matched,
3658
+ response
3659
+ });
3622
3660
  return new Response('Not Found', {
3623
3661
  status: 404
3624
3662
  });
@@ -3637,6 +3675,15 @@ const c15tInstance = (options)=>{
3637
3675
  const ctxResult = await contextPromise;
3638
3676
  if (!ctxResult.isOk()) throw ctxResult.error;
3639
3677
  const ctx = ctxResult.value;
3678
+ const basePath = options.basePath || options.baseURL || '/';
3679
+ (0, logger_namespaceObject.createLogger)(options.logger)?.debug?.('[c15t] Using basePath/baseURL', {
3680
+ basePath
3681
+ });
3682
+ (0, logger_namespaceObject.createLogger)(options.logger)?.debug?.('[c15t] Routing request', {
3683
+ method: request.method,
3684
+ url: request.url,
3685
+ prefix: basePath
3686
+ });
3640
3687
  return await handleApiRequest(request, ctx);
3641
3688
  } catch (error) {
3642
3689
  const logger = options.logger ? (0, logger_namespaceObject.createLogger)(options.logger) : console;
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAUpE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,YAAY,CAAC,WAAW,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE;IAC5E;;;;;;;;;;;;;;;OAeG;IACH,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEjD;;OAEG;IACH,OAAO,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAElC;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE/B;;OAEG;IACH,MAAM,EAAE,OAAO,MAAM,CAAC;IAEtB;;;;OAIG;IACH,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEvD;;;;OAIG;IACH,SAAS,EAAE,MAAM,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,WAAW,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,EAC3E,SAAS,WAAW,CAAC,WAAW,CAAC;;;mBAiQI,OAAO;oBAAP,OAAO;mBAAP,OAAO;qBAAP,OAAO;sBAAP,OAAO;uBAAP,OAAO;oBAAP,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBA7CZ,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;CAyG3D,CAAC;AAEF,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAUpE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,YAAY,CAAC,WAAW,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE;IAC5E;;;;;;;;;;;;;;;OAeG;IACH,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEjD;;OAEG;IACH,OAAO,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAElC;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE/B;;OAEG;IACH,MAAM,EAAE,OAAO,MAAM,CAAC;IAEtB;;;;OAIG;IACH,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEvD;;;;OAIG;IACH,SAAS,EAAE,MAAM,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,WAAW,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,EAC3E,SAAS,WAAW,CAAC,WAAW,CAAC;;;mBA6RI,OAAO;oBAAP,OAAO;mBAAP,OAAO;qBAAP,OAAO;sBAAP,OAAO;uBAAP,OAAO;oBAAP,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBA1DZ,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;CAsH3D,CAAC;AAEF,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
package/dist/core.js CHANGED
@@ -1178,10 +1178,19 @@ function consentRegistry({ adapter, ...ctx }) {
1178
1178
  }
1179
1179
  async function generatePolicyPlaceholder(name, date) {
1180
1180
  const content = `[PLACEHOLDER] This is an automatically generated version of the ${name} policy.\n\nThis placeholder content should be replaced with actual policy terms before being presented to users.\n\nGenerated on: ${date.toISOString()}`;
1181
- const encoder = new TextEncoder();
1182
- const data = encoder.encode(content);
1183
- const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1184
- const contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1181
+ let contentHash;
1182
+ try {
1183
+ const encoder = new TextEncoder();
1184
+ const data = encoder.encode(content);
1185
+ const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1186
+ contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1187
+ } catch (error) {
1188
+ throw new error_class_DoubleTieError('Failed to generate policy content hash', {
1189
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1190
+ status: 500,
1191
+ cause: error instanceof Error ? error : new Error(String(error))
1192
+ });
1193
+ }
1185
1194
  return {
1186
1195
  content,
1187
1196
  contentHash
@@ -1243,42 +1252,51 @@ function policyRegistry({ adapter, ...ctx }) {
1243
1252
  },
1244
1253
  findOrCreatePolicy: async (type)=>await adapter.transaction({
1245
1254
  callback: async (txAdapter)=>{
1246
- const now = new Date();
1247
- const txRegistry = policyRegistry({
1248
- adapter: txAdapter,
1249
- ...ctx
1250
- });
1251
- const rawLatestPolicy = await txAdapter.findOne({
1252
- model: 'consentPolicy',
1253
- where: [
1254
- {
1255
- field: 'isActive',
1256
- value: true
1257
- },
1258
- {
1259
- field: 'type',
1260
- value: type
1255
+ try {
1256
+ const now = new Date();
1257
+ const txRegistry = policyRegistry({
1258
+ adapter: txAdapter,
1259
+ ...ctx
1260
+ });
1261
+ const rawLatestPolicy = await txAdapter.findOne({
1262
+ model: 'consentPolicy',
1263
+ where: [
1264
+ {
1265
+ field: 'isActive',
1266
+ value: true
1267
+ },
1268
+ {
1269
+ field: 'type',
1270
+ value: type
1271
+ }
1272
+ ],
1273
+ sortBy: {
1274
+ field: 'effectiveDate',
1275
+ direction: 'desc'
1261
1276
  }
1262
- ],
1263
- sortBy: {
1264
- field: 'effectiveDate',
1265
- direction: 'desc'
1266
- }
1267
- });
1268
- const latestPolicy = rawLatestPolicy ? validateEntityOutput('consentPolicy', rawLatestPolicy, ctx.options) : null;
1269
- if (latestPolicy) return latestPolicy;
1270
- const { content: defaultContent, contentHash } = await generatePolicyPlaceholder(type, now);
1271
- return txRegistry.createConsentPolicy({
1272
- version: '1.0.0',
1273
- type,
1274
- name: type,
1275
- effectiveDate: now,
1276
- content: defaultContent,
1277
- contentHash,
1278
- isActive: true,
1279
- updatedAt: now,
1280
- expirationDate: null
1281
- });
1277
+ });
1278
+ const latestPolicy = rawLatestPolicy ? validateEntityOutput('consentPolicy', rawLatestPolicy, ctx.options) : null;
1279
+ if (latestPolicy) return latestPolicy;
1280
+ const { content: defaultContent, contentHash } = await generatePolicyPlaceholder(type, now);
1281
+ return txRegistry.createConsentPolicy({
1282
+ version: '1.0.0',
1283
+ type,
1284
+ name: type,
1285
+ effectiveDate: now,
1286
+ content: defaultContent,
1287
+ contentHash,
1288
+ isActive: true,
1289
+ updatedAt: now,
1290
+ expirationDate: null
1291
+ });
1292
+ } catch (error) {
1293
+ ctx.logger.error('Error in findOrCreatePolicy transaction:', error);
1294
+ throw new error_class_DoubleTieError('Failed to find or create policy', {
1295
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1296
+ status: 500,
1297
+ cause: error instanceof Error ? error : new Error(String(error))
1298
+ });
1299
+ }
1282
1300
  }
1283
1301
  })
1284
1302
  };
@@ -2179,7 +2197,9 @@ function getBaseURL(url, path) {
2179
2197
  const fromEnv = env.C15T_URL || env.NEXT_PUBLIC_C15T_URL || env.PUBLIC_C15T_URL || env.NUXT_PUBLIC_C15T_URL || env.NUXT_PUBLIC_AUTH_URL || ('/' !== env.BASE_URL ? env.BASE_URL : void 0);
2180
2198
  if (fromEnv) return withPath(fromEnv, path);
2181
2199
  }
2182
- var package_namespaceObject = JSON.parse('{"i8":"1.2.0-canary.9"}');
2200
+ var package_namespaceObject = {
2201
+ i8: "1.2.0"
2202
+ };
2183
2203
  const createRegistry = (ctx)=>({
2184
2204
  ...auditLogRegistry(ctx),
2185
2205
  ...consentRegistry(ctx),
@@ -2458,12 +2478,15 @@ const processCors = (request, context, trustedOrigins)=>{
2458
2478
  }
2459
2479
  return context;
2460
2480
  };
2461
- const createOpenAPIConfig = (options)=>({
2481
+ const createOpenAPIConfig = (options)=>{
2482
+ const basePath = options.basePath || '';
2483
+ return {
2462
2484
  enabled: true,
2463
- specPath: '/spec.json',
2464
- docsPath: '/docs',
2485
+ specPath: `${basePath}/spec.json`,
2486
+ docsPath: `${basePath}/docs`,
2465
2487
  ...options.openapi || {}
2466
- });
2488
+ };
2489
+ };
2467
2490
  const createDefaultOpenAPIOptions = (options)=>({
2468
2491
  info: {
2469
2492
  title: options.appName || 'c15t API',
@@ -2472,7 +2495,7 @@ const createDefaultOpenAPIOptions = (options)=>({
2472
2495
  },
2473
2496
  servers: [
2474
2497
  {
2475
- url: '/'
2498
+ url: options.basePath || '/'
2476
2499
  }
2477
2500
  ],
2478
2501
  security: [
@@ -3575,11 +3598,26 @@ const c15tInstance = (options)=>{
3575
3598
  processCors(request, orpcContext, options.trustedOrigins);
3576
3599
  processTelemetry(request, orpcContext);
3577
3600
  const handlerContext = orpcContext;
3601
+ orpcContext.logger.debug?.('Handling prefix', {
3602
+ prefix: options.basePath || '/'
3603
+ });
3578
3604
  const { matched, response } = await rpcHandler.handle(request, {
3579
- prefix: options.baseURL || '/',
3605
+ prefix: options.basePath || '/',
3580
3606
  context: handlerContext
3581
3607
  });
3582
- if (matched && response) return response;
3608
+ if (matched && response) {
3609
+ orpcContext.logger.debug('Handler matched', {
3610
+ request,
3611
+ matched,
3612
+ response
3613
+ });
3614
+ return response;
3615
+ }
3616
+ orpcContext.logger.debug('No handler matched', {
3617
+ request,
3618
+ matched,
3619
+ response
3620
+ });
3583
3621
  return new Response('Not Found', {
3584
3622
  status: 404
3585
3623
  });
@@ -3598,6 +3636,15 @@ const c15tInstance = (options)=>{
3598
3636
  const ctxResult = await contextPromise;
3599
3637
  if (!ctxResult.isOk()) throw ctxResult.error;
3600
3638
  const ctx = ctxResult.value;
3639
+ const basePath = options.basePath || options.baseURL || '/';
3640
+ (0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options.logger)?.debug?.('[c15t] Using basePath/baseURL', {
3641
+ basePath
3642
+ });
3643
+ (0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options.logger)?.debug?.('[c15t] Routing request', {
3644
+ method: request.method,
3645
+ url: request.url,
3646
+ prefix: basePath
3647
+ });
3601
3648
  return await handleApiRequest(request, ctx);
3602
3649
  } catch (error) {
3603
3650
  const logger = options.logger ? (0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options.logger) : console;
@@ -19,7 +19,7 @@ export declare const createDefaultOpenAPIOptions: (options: C15TOptions) => {
19
19
  description: string;
20
20
  };
21
21
  servers: {
22
- url: string;
22
+ url: {};
23
23
  }[];
24
24
  security: {
25
25
  bearerAuth: never[];
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/middleware/openapi/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,WAAW;;;;;;CAKtD,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,2BAA2B,GAAI,SAAS,WAAW;;;;;;;;;;;;CAQ9D,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/middleware/openapi/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,WAAW;;;;;;CAQvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B,GAAI,SAAS,WAAW;;;;;;;;;;;;CAQ9D,CAAC"}
@@ -1289,10 +1289,19 @@ function consentRegistry({ adapter, ...ctx }) {
1289
1289
  }
1290
1290
  async function generatePolicyPlaceholder(name, date) {
1291
1291
  const content = `[PLACEHOLDER] This is an automatically generated version of the ${name} policy.\n\nThis placeholder content should be replaced with actual policy terms before being presented to users.\n\nGenerated on: ${date.toISOString()}`;
1292
- const encoder = new TextEncoder();
1293
- const data = encoder.encode(content);
1294
- const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1295
- const contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1292
+ let contentHash;
1293
+ try {
1294
+ const encoder = new TextEncoder();
1295
+ const data = encoder.encode(content);
1296
+ const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1297
+ contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1298
+ } catch (error) {
1299
+ throw new error_class_DoubleTieError('Failed to generate policy content hash', {
1300
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1301
+ status: 500,
1302
+ cause: error instanceof Error ? error : new Error(String(error))
1303
+ });
1304
+ }
1296
1305
  return {
1297
1306
  content,
1298
1307
  contentHash
@@ -1354,42 +1363,51 @@ function policyRegistry({ adapter, ...ctx }) {
1354
1363
  },
1355
1364
  findOrCreatePolicy: async (type)=>await adapter.transaction({
1356
1365
  callback: async (txAdapter)=>{
1357
- const now = new Date();
1358
- const txRegistry = policyRegistry({
1359
- adapter: txAdapter,
1360
- ...ctx
1361
- });
1362
- const rawLatestPolicy = await txAdapter.findOne({
1363
- model: 'consentPolicy',
1364
- where: [
1365
- {
1366
- field: 'isActive',
1367
- value: true
1368
- },
1369
- {
1370
- field: 'type',
1371
- value: type
1366
+ try {
1367
+ const now = new Date();
1368
+ const txRegistry = policyRegistry({
1369
+ adapter: txAdapter,
1370
+ ...ctx
1371
+ });
1372
+ const rawLatestPolicy = await txAdapter.findOne({
1373
+ model: 'consentPolicy',
1374
+ where: [
1375
+ {
1376
+ field: 'isActive',
1377
+ value: true
1378
+ },
1379
+ {
1380
+ field: 'type',
1381
+ value: type
1382
+ }
1383
+ ],
1384
+ sortBy: {
1385
+ field: 'effectiveDate',
1386
+ direction: 'desc'
1372
1387
  }
1373
- ],
1374
- sortBy: {
1375
- field: 'effectiveDate',
1376
- direction: 'desc'
1377
- }
1378
- });
1379
- const latestPolicy = rawLatestPolicy ? validateEntityOutput('consentPolicy', rawLatestPolicy, ctx.options) : null;
1380
- if (latestPolicy) return latestPolicy;
1381
- const { content: defaultContent, contentHash } = await generatePolicyPlaceholder(type, now);
1382
- return txRegistry.createConsentPolicy({
1383
- version: '1.0.0',
1384
- type,
1385
- name: type,
1386
- effectiveDate: now,
1387
- content: defaultContent,
1388
- contentHash,
1389
- isActive: true,
1390
- updatedAt: now,
1391
- expirationDate: null
1392
- });
1388
+ });
1389
+ const latestPolicy = rawLatestPolicy ? validateEntityOutput('consentPolicy', rawLatestPolicy, ctx.options) : null;
1390
+ if (latestPolicy) return latestPolicy;
1391
+ const { content: defaultContent, contentHash } = await generatePolicyPlaceholder(type, now);
1392
+ return txRegistry.createConsentPolicy({
1393
+ version: '1.0.0',
1394
+ type,
1395
+ name: type,
1396
+ effectiveDate: now,
1397
+ content: defaultContent,
1398
+ contentHash,
1399
+ isActive: true,
1400
+ updatedAt: now,
1401
+ expirationDate: null
1402
+ });
1403
+ } catch (error) {
1404
+ ctx.logger.error('Error in findOrCreatePolicy transaction:', error);
1405
+ throw new error_class_DoubleTieError('Failed to find or create policy', {
1406
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1407
+ status: 500,
1408
+ cause: error instanceof Error ? error : new Error(String(error))
1409
+ });
1410
+ }
1393
1411
  }
1394
1412
  })
1395
1413
  };
@@ -1221,10 +1221,19 @@ function consentRegistry({ adapter, ...ctx }) {
1221
1221
  }
1222
1222
  async function generatePolicyPlaceholder(name, date) {
1223
1223
  const content = `[PLACEHOLDER] This is an automatically generated version of the ${name} policy.\n\nThis placeholder content should be replaced with actual policy terms before being presented to users.\n\nGenerated on: ${date.toISOString()}`;
1224
- const encoder = new TextEncoder();
1225
- const data = encoder.encode(content);
1226
- const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1227
- const contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1224
+ let contentHash;
1225
+ try {
1226
+ const encoder = new TextEncoder();
1227
+ const data = encoder.encode(content);
1228
+ const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1229
+ contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1230
+ } catch (error) {
1231
+ throw new error_class_DoubleTieError('Failed to generate policy content hash', {
1232
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1233
+ status: 500,
1234
+ cause: error instanceof Error ? error : new Error(String(error))
1235
+ });
1236
+ }
1228
1237
  return {
1229
1238
  content,
1230
1239
  contentHash
@@ -1286,42 +1295,51 @@ function policyRegistry({ adapter, ...ctx }) {
1286
1295
  },
1287
1296
  findOrCreatePolicy: async (type)=>await adapter.transaction({
1288
1297
  callback: async (txAdapter)=>{
1289
- const now = new Date();
1290
- const txRegistry = policyRegistry({
1291
- adapter: txAdapter,
1292
- ...ctx
1293
- });
1294
- const rawLatestPolicy = await txAdapter.findOne({
1295
- model: 'consentPolicy',
1296
- where: [
1297
- {
1298
- field: 'isActive',
1299
- value: true
1300
- },
1301
- {
1302
- field: 'type',
1303
- value: type
1298
+ try {
1299
+ const now = new Date();
1300
+ const txRegistry = policyRegistry({
1301
+ adapter: txAdapter,
1302
+ ...ctx
1303
+ });
1304
+ const rawLatestPolicy = await txAdapter.findOne({
1305
+ model: 'consentPolicy',
1306
+ where: [
1307
+ {
1308
+ field: 'isActive',
1309
+ value: true
1310
+ },
1311
+ {
1312
+ field: 'type',
1313
+ value: type
1314
+ }
1315
+ ],
1316
+ sortBy: {
1317
+ field: 'effectiveDate',
1318
+ direction: 'desc'
1304
1319
  }
1305
- ],
1306
- sortBy: {
1307
- field: 'effectiveDate',
1308
- direction: 'desc'
1309
- }
1310
- });
1311
- const latestPolicy = rawLatestPolicy ? validateEntityOutput('consentPolicy', rawLatestPolicy, ctx.options) : null;
1312
- if (latestPolicy) return latestPolicy;
1313
- const { content: defaultContent, contentHash } = await generatePolicyPlaceholder(type, now);
1314
- return txRegistry.createConsentPolicy({
1315
- version: '1.0.0',
1316
- type,
1317
- name: type,
1318
- effectiveDate: now,
1319
- content: defaultContent,
1320
- contentHash,
1321
- isActive: true,
1322
- updatedAt: now,
1323
- expirationDate: null
1324
- });
1320
+ });
1321
+ const latestPolicy = rawLatestPolicy ? validateEntityOutput('consentPolicy', rawLatestPolicy, ctx.options) : null;
1322
+ if (latestPolicy) return latestPolicy;
1323
+ const { content: defaultContent, contentHash } = await generatePolicyPlaceholder(type, now);
1324
+ return txRegistry.createConsentPolicy({
1325
+ version: '1.0.0',
1326
+ type,
1327
+ name: type,
1328
+ effectiveDate: now,
1329
+ content: defaultContent,
1330
+ contentHash,
1331
+ isActive: true,
1332
+ updatedAt: now,
1333
+ expirationDate: null
1334
+ });
1335
+ } catch (error) {
1336
+ ctx.logger.error('Error in findOrCreatePolicy transaction:', error);
1337
+ throw new error_class_DoubleTieError('Failed to find or create policy', {
1338
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1339
+ status: 500,
1340
+ cause: error instanceof Error ? error : new Error(String(error))
1341
+ });
1342
+ }
1325
1343
  }
1326
1344
  })
1327
1345
  };