@c15t/backend 1.5.0 → 1.6.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.
- package/.turbo/turbo-build.log +63 -37
- package/CHANGELOG.md +4 -209
- package/README.md +86 -164
- package/dist/contracts/consent/index.d.ts +103 -615
- package/dist/contracts/consent/index.d.ts.map +1 -1
- package/dist/contracts/consent/post.contract.d.ts +42 -140
- package/dist/contracts/consent/post.contract.d.ts.map +1 -1
- package/dist/contracts/consent/show-banner.contract.d.ts +28 -376
- package/dist/contracts/consent/show-banner.contract.d.ts.map +1 -1
- package/dist/contracts/consent/verify.contract.d.ts +33 -99
- package/dist/contracts/consent/verify.contract.d.ts.map +1 -1
- package/dist/contracts/index.d.ts +222 -1356
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/meta/index.d.ts +8 -63
- package/dist/contracts/meta/index.d.ts.map +1 -1
- package/dist/contracts/meta/status.contract.d.ts +8 -63
- package/dist/contracts/meta/status.contract.d.ts.map +1 -1
- package/dist/contracts/shared/jurisdiction.schema.d.ts +21 -9
- package/dist/contracts/shared/jurisdiction.schema.d.ts.map +1 -1
- package/dist/contracts.cjs +100 -106
- package/dist/contracts.js +100 -106
- package/dist/core.cjs +681 -681
- package/dist/core.d.ts +118 -678
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +634 -637
- package/dist/handlers/consent/index.d.ts +103 -615
- package/dist/handlers/consent/index.d.ts.map +1 -1
- package/dist/handlers/consent/post.handler.d.ts +42 -140
- package/dist/handlers/consent/post.handler.d.ts.map +1 -1
- package/dist/handlers/consent/show-banner/handler.d.ts +28 -376
- package/dist/handlers/consent/show-banner/handler.d.ts.map +1 -1
- package/dist/handlers/consent/show-banner/translations.d.ts.map +1 -1
- package/dist/handlers/consent/verify.handler.d.ts +33 -99
- package/dist/handlers/consent/verify.handler.d.ts.map +1 -1
- package/dist/handlers/meta/index.d.ts +8 -63
- package/dist/handlers/meta/index.d.ts.map +1 -1
- package/dist/handlers/meta/status.handler.d.ts +8 -63
- package/dist/handlers/meta/status.handler.d.ts.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/middleware/openapi/index.d.ts +2 -2
- package/dist/middleware/openapi/index.d.ts.map +1 -1
- package/dist/pkgs/data-model/fields/index.cjs +14 -26
- package/dist/pkgs/data-model/fields/index.d.ts +4 -4
- package/dist/pkgs/data-model/fields/index.d.ts.map +1 -1
- package/dist/pkgs/data-model/fields/index.js +14 -26
- package/dist/pkgs/data-model/fields/zod-fields.d.ts +195 -871
- package/dist/pkgs/data-model/fields/zod-fields.d.ts.map +1 -1
- package/dist/pkgs/data-model/hooks/index.d.ts +2 -2
- package/dist/pkgs/data-model/hooks/index.d.ts.map +1 -1
- package/dist/pkgs/data-model/index.cjs +346 -358
- package/dist/pkgs/data-model/index.d.ts +1 -1
- package/dist/pkgs/data-model/index.d.ts.map +1 -1
- package/dist/pkgs/data-model/index.js +345 -357
- package/dist/pkgs/data-model/schema/index.cjs +346 -358
- package/dist/pkgs/data-model/schema/index.d.ts +1 -1
- package/dist/pkgs/data-model/schema/index.d.ts.map +1 -1
- package/dist/pkgs/data-model/schema/index.js +345 -357
- package/dist/pkgs/data-model/schema/schemas.d.ts +2 -2
- package/dist/pkgs/data-model/schema/schemas.d.ts.map +1 -1
- package/dist/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.d.ts +3 -0
- package/dist/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.d.ts.map +1 -1
- package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.cjs +158 -170
- package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.js +157 -169
- package/dist/pkgs/db-adapters/adapters/index.d.ts +2 -2
- package/dist/pkgs/db-adapters/adapters/index.d.ts.map +1 -1
- package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.cjs +215 -227
- package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.d.ts +2 -2
- package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.d.ts.map +1 -1
- package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.js +213 -225
- package/dist/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.d.ts +2 -0
- package/dist/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.d.ts.map +1 -1
- package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts +1 -1
- package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts.map +1 -1
- package/dist/pkgs/db-adapters/adapters/memory-adapter/index.cjs +158 -170
- package/dist/pkgs/db-adapters/adapters/memory-adapter/index.js +157 -169
- package/dist/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.d.ts +3 -0
- package/dist/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.d.ts.map +1 -1
- package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.cjs +243 -255
- package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.d.ts +1 -1
- package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.d.ts.map +1 -1
- package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.js +241 -253
- package/dist/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.d.ts +3 -0
- package/dist/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.d.ts.map +1 -1
- package/dist/pkgs/db-adapters/index.cjs +714 -726
- package/dist/pkgs/db-adapters/index.d.ts +6 -6
- package/dist/pkgs/db-adapters/index.d.ts.map +1 -1
- package/dist/pkgs/db-adapters/index.js +708 -720
- package/dist/pkgs/migrations/get-migration.d.ts.map +1 -1
- package/dist/pkgs/migrations/get-schema/get-schema.d.ts.map +1 -1
- package/dist/pkgs/migrations/get-schema/process-tables.d.ts.map +1 -1
- package/dist/pkgs/migrations/index.cjs +236 -248
- package/dist/pkgs/migrations/index.d.ts +4 -4
- package/dist/pkgs/migrations/index.d.ts.map +1 -1
- package/dist/pkgs/migrations/index.js +235 -247
- package/dist/pkgs/results/index.cjs +67 -67
- package/dist/pkgs/results/index.d.ts +5 -5
- package/dist/pkgs/results/index.d.ts.map +1 -1
- package/dist/pkgs/results/index.js +67 -67
- package/dist/pkgs/results/orpc-error-handler.d.ts +1 -1
- package/dist/pkgs/results/orpc-error-handler.d.ts.map +1 -1
- package/dist/pkgs/types/index.d.ts +1 -2
- package/dist/pkgs/types/index.d.ts.map +1 -1
- package/dist/pkgs/types/options.d.ts +9 -2
- package/dist/pkgs/types/options.d.ts.map +1 -1
- package/dist/pkgs/utils/index.d.ts +1 -1
- package/dist/pkgs/utils/index.d.ts.map +1 -1
- package/dist/pkgs/utils/logger.d.ts +1 -1
- package/dist/pkgs/utils/logger.d.ts.map +1 -1
- package/dist/router.cjs +114 -117
- package/dist/router.d.ts +111 -678
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +114 -117
- package/dist/schema/audit-log/schema.d.ts +2 -24
- package/dist/schema/audit-log/schema.d.ts.map +1 -1
- package/dist/schema/audit-log/table.d.ts +2 -24
- package/dist/schema/audit-log/table.d.ts.map +1 -1
- package/dist/schema/consent/registry.d.ts +8 -8
- package/dist/schema/consent/schema.d.ts +9 -33
- package/dist/schema/consent/schema.d.ts.map +1 -1
- package/dist/schema/consent/table.d.ts +9 -33
- package/dist/schema/consent/table.d.ts.map +1 -1
- package/dist/schema/consent-policy/registry.d.ts +20 -20
- package/dist/schema/consent-policy/schema.d.ts +22 -30
- package/dist/schema/consent-policy/schema.d.ts.map +1 -1
- package/dist/schema/consent-policy/table.d.ts +13 -29
- package/dist/schema/consent-policy/table.d.ts.map +1 -1
- package/dist/schema/consent-purpose/registry.d.ts +6 -6
- package/dist/schema/consent-purpose/schema.d.ts +5 -27
- package/dist/schema/consent-purpose/schema.d.ts.map +1 -1
- package/dist/schema/consent-purpose/table.d.ts +5 -27
- package/dist/schema/consent-purpose/table.d.ts.map +1 -1
- package/dist/schema/consent-record/schema.d.ts +3 -19
- package/dist/schema/consent-record/schema.d.ts.map +1 -1
- package/dist/schema/consent-record/table.d.ts +3 -19
- package/dist/schema/consent-record/table.d.ts.map +1 -1
- package/dist/schema/create-registry.d.ts +58 -58
- package/dist/schema/definition.d.ts +42 -176
- package/dist/schema/definition.d.ts.map +1 -1
- package/dist/schema/domain/registry.d.ts +20 -20
- package/dist/schema/domain/schema.d.ts +6 -24
- package/dist/schema/domain/schema.d.ts.map +1 -1
- package/dist/schema/domain/table.d.ts +6 -24
- package/dist/schema/domain/table.d.ts.map +1 -1
- package/dist/schema/index.cjs +426 -438
- package/dist/schema/index.d.ts +12 -12
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +426 -438
- package/dist/schema/schemas.d.ts +42 -176
- package/dist/schema/schemas.d.ts.map +1 -1
- package/dist/schema/subject/registry.d.ts +4 -4
- package/dist/schema/subject/schema.d.ts +4 -20
- package/dist/schema/subject/schema.d.ts.map +1 -1
- package/dist/schema/subject/table.d.ts +4 -20
- package/dist/schema/subject/table.d.ts.map +1 -1
- package/dist/schema/types.d.ts +1 -1
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/testing/contract-testing.d.ts +3 -2
- package/dist/testing/contract-testing.d.ts.map +1 -1
- package/dist/types/index.d.ts +5 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/options.d.ts +2 -2
- package/dist/types/options.d.ts.map +1 -1
- package/dist/v2/contracts/consent/index.d.ts +260 -0
- package/dist/v2/contracts/consent/index.d.ts.map +1 -0
- package/dist/v2/contracts/consent/index.test.d.ts +2 -0
- package/dist/v2/contracts/consent/index.test.d.ts.map +1 -0
- package/dist/v2/contracts/consent/post.contract.d.ts +114 -0
- package/dist/v2/contracts/consent/post.contract.d.ts.map +1 -0
- package/dist/v2/contracts/consent/post.contract.test.d.ts +2 -0
- package/dist/v2/contracts/consent/post.contract.test.d.ts.map +1 -0
- package/dist/v2/contracts/consent/show-banner.contract.d.ts +68 -0
- package/dist/v2/contracts/consent/show-banner.contract.d.ts.map +1 -0
- package/dist/v2/contracts/consent/show-banner.contract.test.d.ts +2 -0
- package/dist/v2/contracts/consent/show-banner.contract.test.d.ts.map +1 -0
- package/dist/v2/contracts/consent/verify.contract.d.ts +81 -0
- package/dist/v2/contracts/consent/verify.contract.d.ts.map +1 -0
- package/dist/v2/contracts/consent/verify.contract.test.d.ts +2 -0
- package/dist/v2/contracts/consent/verify.contract.test.d.ts.map +1 -0
- package/dist/v2/contracts/index.cjs +644 -0
- package/dist/v2/contracts/index.d.ts +563 -0
- package/dist/v2/contracts/index.d.ts.map +1 -0
- package/dist/v2/contracts/index.js +607 -0
- package/dist/v2/contracts/meta/index.d.ts +19 -0
- package/dist/v2/contracts/meta/index.d.ts.map +1 -0
- package/dist/v2/contracts/meta/index.test.d.ts +2 -0
- package/dist/v2/contracts/meta/index.test.d.ts.map +1 -0
- package/dist/v2/contracts/meta/status.contract.d.ts +18 -0
- package/dist/v2/contracts/meta/status.contract.d.ts.map +1 -0
- package/dist/v2/contracts/meta/status.contract.test.d.ts +2 -0
- package/dist/v2/contracts/meta/status.contract.test.d.ts.map +1 -0
- package/dist/v2/contracts/shared/jurisdiction.schema.d.ts +36 -0
- package/dist/v2/contracts/shared/jurisdiction.schema.d.ts.map +1 -0
- package/dist/v2/contracts/test.utils.d.ts +38 -0
- package/dist/v2/contracts/test.utils.d.ts.map +1 -0
- package/dist/v2/core.cjs +2181 -0
- package/dist/v2/core.d.ts +364 -0
- package/dist/v2/core.d.ts.map +1 -0
- package/dist/v2/core.js +2130 -0
- package/dist/v2/db/adapters/drizzle.cjs +36 -0
- package/dist/v2/db/adapters/drizzle.d.ts +2 -0
- package/dist/v2/db/adapters/drizzle.d.ts.map +1 -0
- package/dist/v2/db/adapters/drizzle.js +3 -0
- package/dist/v2/db/adapters/index.cjs +18 -0
- package/dist/v2/db/adapters/index.d.ts +2 -0
- package/dist/v2/db/adapters/index.d.ts.map +1 -0
- package/dist/v2/db/adapters/index.js +0 -0
- package/dist/v2/db/adapters/kysely.cjs +36 -0
- package/dist/v2/db/adapters/kysely.d.ts +2 -0
- package/dist/v2/db/adapters/kysely.d.ts.map +1 -0
- package/dist/v2/db/adapters/kysely.js +3 -0
- package/dist/v2/db/adapters/mongo.cjs +36 -0
- package/dist/v2/db/adapters/mongo.d.ts +2 -0
- package/dist/v2/db/adapters/mongo.d.ts.map +1 -0
- package/dist/v2/db/adapters/mongo.js +3 -0
- package/dist/v2/db/adapters/prisma.cjs +36 -0
- package/dist/v2/db/adapters/prisma.d.ts +2 -0
- package/dist/v2/db/adapters/prisma.d.ts.map +1 -0
- package/dist/v2/db/adapters/prisma.js +3 -0
- package/dist/v2/db/adapters/typeorm.cjs +36 -0
- package/dist/v2/db/adapters/typeorm.d.ts +2 -0
- package/dist/v2/db/adapters/typeorm.d.ts.map +1 -0
- package/dist/v2/db/adapters/typeorm.js +3 -0
- package/dist/v2/db/migrator/index.cjs +61 -0
- package/dist/v2/db/migrator/index.d.ts +29 -0
- package/dist/v2/db/migrator/index.d.ts.map +1 -0
- package/dist/v2/db/migrator/index.js +27 -0
- package/dist/v2/db/registry/audit-log.d.ts +21 -0
- package/dist/v2/db/registry/audit-log.d.ts.map +1 -0
- package/dist/v2/db/registry/audit-log.test.d.ts +2 -0
- package/dist/v2/db/registry/audit-log.test.d.ts.map +1 -0
- package/dist/v2/db/registry/consent-policy.d.ts +29 -0
- package/dist/v2/db/registry/consent-policy.d.ts.map +1 -0
- package/dist/v2/db/registry/consent-policy.test.d.ts +2 -0
- package/dist/v2/db/registry/consent-policy.test.d.ts.map +1 -0
- package/dist/v2/db/registry/consent-purpose.d.ts +16 -0
- package/dist/v2/db/registry/consent-purpose.d.ts.map +1 -0
- package/dist/v2/db/registry/consent-purpose.test.d.ts +2 -0
- package/dist/v2/db/registry/consent-purpose.test.d.ts.map +1 -0
- package/dist/v2/db/registry/consent.d.ts +20 -0
- package/dist/v2/db/registry/consent.d.ts.map +1 -0
- package/dist/v2/db/registry/consent.test.d.ts +2 -0
- package/dist/v2/db/registry/consent.test.d.ts.map +1 -0
- package/dist/v2/db/registry/domain.d.ts +24 -0
- package/dist/v2/db/registry/domain.d.ts.map +1 -0
- package/dist/v2/db/registry/domain.test.d.ts +2 -0
- package/dist/v2/db/registry/domain.test.d.ts.map +1 -0
- package/dist/v2/db/registry/index.d.ts +102 -0
- package/dist/v2/db/registry/index.d.ts.map +1 -0
- package/dist/v2/db/registry/subject.d.ts +18 -0
- package/dist/v2/db/registry/subject.d.ts.map +1 -0
- package/dist/v2/db/registry/subject.test.d.ts +2 -0
- package/dist/v2/db/registry/subject.test.d.ts.map +1 -0
- package/dist/v2/db/registry/types.d.ts +10 -0
- package/dist/v2/db/registry/types.d.ts.map +1 -0
- package/dist/v2/db/registry/utils/generate-id.d.ts +25 -0
- package/dist/v2/db/registry/utils/generate-id.d.ts.map +1 -0
- package/dist/v2/db/registry/utils/generate-id.test.d.ts +2 -0
- package/dist/v2/db/registry/utils/generate-id.test.d.ts.map +1 -0
- package/dist/v2/db/registry/utils.d.ts +25 -0
- package/dist/v2/db/registry/utils.d.ts.map +1 -0
- package/dist/v2/db/schema/1.0.0/audit-log.d.ts +29 -0
- package/dist/v2/db/schema/1.0.0/audit-log.d.ts.map +1 -0
- package/dist/v2/db/schema/1.0.0/consent-policy.d.ts +45 -0
- package/dist/v2/db/schema/1.0.0/consent-policy.d.ts.map +1 -0
- package/dist/v2/db/schema/1.0.0/consent-purpose.d.ts +27 -0
- package/dist/v2/db/schema/1.0.0/consent-purpose.d.ts.map +1 -0
- package/dist/v2/db/schema/1.0.0/consent-record.d.ts +19 -0
- package/dist/v2/db/schema/1.0.0/consent-record.d.ts.map +1 -0
- package/dist/v2/db/schema/1.0.0/consent.d.ts +42 -0
- package/dist/v2/db/schema/1.0.0/consent.d.ts.map +1 -0
- package/dist/v2/db/schema/1.0.0/domain.d.ts +23 -0
- package/dist/v2/db/schema/1.0.0/domain.d.ts.map +1 -0
- package/dist/v2/db/schema/1.0.0/index.d.ts +1513 -0
- package/dist/v2/db/schema/1.0.0/index.d.ts.map +1 -0
- package/dist/v2/db/schema/1.0.0/subject.d.ts +23 -0
- package/dist/v2/db/schema/1.0.0/subject.d.ts.map +1 -0
- package/dist/v2/db/schema/index.cjs +326 -0
- package/dist/v2/db/schema/index.d.ts +1507 -0
- package/dist/v2/db/schema/index.d.ts.map +1 -0
- package/dist/v2/db/schema/index.js +241 -0
- package/dist/v2/define-config.cjs +36 -0
- package/dist/v2/define-config.d.ts +5 -0
- package/dist/v2/define-config.d.ts.map +1 -0
- package/dist/v2/define-config.js +2 -0
- package/dist/v2/handlers/consent/index.d.ts +260 -0
- package/dist/v2/handlers/consent/index.d.ts.map +1 -0
- package/dist/v2/handlers/consent/post.handler.d.ts +136 -0
- package/dist/v2/handlers/consent/post.handler.d.ts.map +1 -0
- package/dist/v2/handlers/consent/show-banner/geo.d.ts +10 -0
- package/dist/v2/handlers/consent/show-banner/geo.d.ts.map +1 -0
- package/dist/v2/handlers/consent/show-banner/geo.test.d.ts +2 -0
- package/dist/v2/handlers/consent/show-banner/geo.test.d.ts.map +1 -0
- package/dist/v2/handlers/consent/show-banner/handler.d.ts +71 -0
- package/dist/v2/handlers/consent/show-banner/handler.d.ts.map +1 -0
- package/dist/v2/handlers/consent/show-banner/handler.test.d.ts +2 -0
- package/dist/v2/handlers/consent/show-banner/handler.test.d.ts.map +1 -0
- package/dist/v2/handlers/consent/show-banner/translations.d.ts +13 -0
- package/dist/v2/handlers/consent/show-banner/translations.d.ts.map +1 -0
- package/dist/v2/handlers/consent/show-banner/translations.test.d.ts +2 -0
- package/dist/v2/handlers/consent/show-banner/translations.test.d.ts.map +1 -0
- package/dist/v2/handlers/consent/verify.handler.d.ts +103 -0
- package/dist/v2/handlers/consent/verify.handler.d.ts.map +1 -0
- package/dist/v2/handlers/meta/index.d.ts +19 -0
- package/dist/v2/handlers/meta/index.d.ts.map +1 -0
- package/dist/v2/handlers/meta/status.handler.d.ts +17 -0
- package/dist/v2/handlers/meta/status.handler.d.ts.map +1 -0
- package/dist/v2/init.d.ts +3 -0
- package/dist/v2/init.d.ts.map +1 -0
- package/dist/v2/init.test.d.ts +2 -0
- package/dist/v2/init.test.d.ts.map +1 -0
- package/dist/v2/middleware/cors/cors.d.ts +37 -0
- package/dist/v2/middleware/cors/cors.d.ts.map +1 -0
- package/dist/v2/middleware/cors/cors.test.d.ts +2 -0
- package/dist/v2/middleware/cors/cors.test.d.ts.map +1 -0
- package/dist/v2/middleware/cors/index.d.ts +30 -0
- package/dist/v2/middleware/cors/index.d.ts.map +1 -0
- package/dist/v2/middleware/cors/is-origin-trusted.d.ts +49 -0
- package/dist/v2/middleware/cors/is-origin-trusted.d.ts.map +1 -0
- package/dist/v2/middleware/cors/is-origin-trusted.test.d.ts +2 -0
- package/dist/v2/middleware/cors/is-origin-trusted.test.d.ts.map +1 -0
- package/dist/v2/middleware/cors/process-cors.d.ts +31 -0
- package/dist/v2/middleware/cors/process-cors.d.ts.map +1 -0
- package/dist/v2/middleware/openapi/config.d.ts +28 -0
- package/dist/v2/middleware/openapi/config.d.ts.map +1 -0
- package/dist/v2/middleware/openapi/handlers.d.ts +29 -0
- package/dist/v2/middleware/openapi/handlers.d.ts.map +1 -0
- package/dist/v2/middleware/openapi/index.d.ts +11 -0
- package/dist/v2/middleware/openapi/index.d.ts.map +1 -0
- package/dist/v2/middleware/process-ip/index.d.ts +3 -0
- package/dist/v2/middleware/process-ip/index.d.ts.map +1 -0
- package/dist/v2/router.cjs +1275 -0
- package/dist/v2/router.d.ts +280 -0
- package/dist/v2/router.d.ts.map +1 -0
- package/dist/v2/router.js +1231 -0
- package/dist/v2/types/api.d.ts +27 -0
- package/dist/v2/types/api.d.ts.map +1 -0
- package/dist/v2/types/index.cjs +40 -0
- package/dist/v2/types/index.d.ts +104 -0
- package/dist/v2/types/index.d.ts.map +1 -0
- package/dist/v2/types/index.js +6 -0
- package/dist/v2/utils/create-telemetry-options.d.ts +28 -0
- package/dist/v2/utils/create-telemetry-options.d.ts.map +1 -0
- package/dist/v2/utils/env.d.ts +60 -0
- package/dist/v2/utils/env.d.ts.map +1 -0
- package/dist/v2/utils/index.d.ts +3 -0
- package/dist/v2/utils/index.d.ts.map +1 -0
- package/dist/v2/utils/logger.d.ts +16 -0
- package/dist/v2/utils/logger.d.ts.map +1 -0
- package/dist/version.d.ts +1 -1
- package/package.json +106 -15
- package/readme.json +30 -0
- package/rslib.config.ts +13 -14
- package/src/__tests__/server.test.ts +1 -1
- package/src/contracts/consent/post.contract.test.ts +3 -8
- package/src/contracts/consent/post.contract.ts +13 -13
- package/src/contracts/consent/show-banner.contract.test.ts +9 -0
- package/src/contracts/consent/show-banner.contract.ts +2 -0
- package/src/contracts/consent/verify.contract.ts +19 -23
- package/src/core.ts +7 -0
- package/src/handlers/consent/show-banner/handler.ts +12 -9
- package/src/handlers/consent/show-banner/translations.ts +2 -2
- package/src/init.ts +9 -6
- package/src/middleware/openapi/index.ts +2 -2
- package/src/pkgs/api-router/hooks/__tests__/processor.test.ts +1 -1
- package/src/pkgs/data-model/fields/index.ts +17 -22
- package/src/pkgs/data-model/fields/zod-fields.ts +14 -26
- package/src/pkgs/data-model/hooks/index.ts +3 -2
- package/src/pkgs/data-model/index.ts +2 -4
- package/src/pkgs/data-model/schema/index.ts +6 -7
- package/src/pkgs/data-model/schema/schemas.ts +3 -3
- package/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts +4 -1
- package/src/pkgs/db-adapters/adapters/index.ts +2 -2
- package/src/pkgs/db-adapters/adapters/kysely-adapter/index.ts +4 -4
- package/src/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.ts +4 -5
- package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/postgres.test.ts +2 -4
- package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/sqlite.test.ts +2 -3
- package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts +1 -6
- package/src/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.ts +4 -1
- package/src/pkgs/db-adapters/adapters/prisma-adapter/index.ts +1 -1
- package/src/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.ts +5 -2
- package/src/pkgs/db-adapters/index.ts +12 -13
- package/src/pkgs/migrations/get-migration.ts +4 -2
- package/src/pkgs/migrations/get-schema/get-schema.ts +0 -1
- package/src/pkgs/migrations/get-schema/process-fields.ts +1 -1
- package/src/pkgs/migrations/get-schema/process-tables.ts +0 -2
- package/src/pkgs/migrations/index.ts +7 -8
- package/src/pkgs/results/__tests__/error-codes.test.ts +2 -2
- package/src/pkgs/results/index.ts +22 -27
- package/src/pkgs/results/orpc-error-handler.ts +1 -1
- package/src/pkgs/results/results/result-helpers.ts +1 -1
- package/src/pkgs/types/index.ts +4 -4
- package/src/pkgs/types/options.ts +10 -3
- package/src/pkgs/utils/index.ts +1 -1
- package/src/pkgs/utils/logger.ts +1 -1
- package/src/schema/audit-log/schema.ts +3 -3
- package/src/schema/consent/schema.ts +4 -4
- package/src/schema/consent-policy/schema.ts +3 -3
- package/src/schema/consent-purpose/schema.ts +4 -4
- package/src/schema/consent-record/schema.ts +3 -3
- package/src/schema/definition.ts +1 -1
- package/src/schema/domain/schema.ts +5 -5
- package/src/schema/index.ts +14 -17
- package/src/schema/subject/schema.ts +3 -3
- package/src/schema/types.ts +1 -1
- package/src/testing/contract-testing.ts +15 -52
- package/src/types/index.ts +8 -8
- package/src/types/options.ts +2 -3
- package/src/v2/contracts/consent/index.test.ts +5 -0
- package/src/v2/contracts/consent/index.ts +9 -0
- package/src/v2/contracts/consent/post.contract.test.ts +521 -0
- package/src/v2/contracts/consent/post.contract.ts +155 -0
- package/src/v2/contracts/consent/show-banner.contract.test.ts +252 -0
- package/src/v2/contracts/consent/show-banner.contract.ts +73 -0
- package/src/v2/contracts/consent/verify.contract.test.ts +185 -0
- package/src/v2/contracts/consent/verify.contract.ts +122 -0
- package/src/v2/contracts/index.ts +20 -0
- package/src/v2/contracts/meta/index.test.ts +5 -0
- package/src/v2/contracts/meta/index.ts +5 -0
- package/src/v2/contracts/meta/status.contract.test.ts +226 -0
- package/src/v2/contracts/meta/status.contract.ts +34 -0
- package/src/v2/contracts/shared/jurisdiction.schema.ts +30 -0
- package/src/v2/contracts/test.utils.ts +400 -0
- package/src/v2/core.ts +379 -0
- package/src/v2/db/adapters/drizzle.ts +1 -0
- package/src/v2/db/adapters/index.ts +1 -0
- package/src/v2/db/adapters/kysely.ts +1 -0
- package/src/v2/db/adapters/mongo.ts +1 -0
- package/src/v2/db/adapters/prisma.ts +1 -0
- package/src/v2/db/adapters/typeorm.ts +1 -0
- package/src/v2/db/migrator/index.ts +80 -0
- package/src/v2/db/registry/audit-log.test.ts +77 -0
- package/src/v2/db/registry/audit-log.ts +46 -0
- package/src/v2/db/registry/consent-policy.test.ts +778 -0
- package/src/v2/db/registry/consent-policy.ts +74 -0
- package/src/v2/db/registry/consent-purpose.test.ts +485 -0
- package/src/v2/db/registry/consent-purpose.ts +41 -0
- package/src/v2/db/registry/consent.test.ts +843 -0
- package/src/v2/db/registry/consent.ts +42 -0
- package/src/v2/db/registry/domain.test.ts +463 -0
- package/src/v2/db/registry/domain.ts +51 -0
- package/src/v2/db/registry/index.ts +18 -0
- package/src/v2/db/registry/subject.test.ts +497 -0
- package/src/v2/db/registry/subject.ts +101 -0
- package/src/v2/db/registry/types.ts +10 -0
- package/src/v2/db/registry/utils/generate-id.test.ts +217 -0
- package/src/v2/db/registry/utils/generate-id.ts +134 -0
- package/src/v2/db/registry/utils.ts +134 -0
- package/src/v2/db/schema/1.0.0/audit-log.ts +32 -0
- package/src/v2/db/schema/1.0.0/consent-policy.ts +41 -0
- package/src/v2/db/schema/1.0.0/consent-purpose.ts +30 -0
- package/src/v2/db/schema/1.0.0/consent-record.ts +22 -0
- package/src/v2/db/schema/1.0.0/consent.ts +38 -0
- package/src/v2/db/schema/1.0.0/domain.ts +26 -0
- package/src/v2/db/schema/1.0.0/index.ts +56 -0
- package/src/v2/db/schema/1.0.0/subject.ts +26 -0
- package/src/v2/db/schema/index.ts +9 -0
- package/src/v2/define-config.ts +5 -0
- package/src/v2/handlers/consent/index.ts +9 -0
- package/src/v2/handlers/consent/post.handler.ts +254 -0
- package/src/v2/handlers/consent/show-banner/geo.test.ts +281 -0
- package/src/v2/handlers/consent/show-banner/geo.ts +96 -0
- package/src/v2/handlers/consent/show-banner/handler.test.ts +374 -0
- package/src/v2/handlers/consent/show-banner/handler.ts +123 -0
- package/src/v2/handlers/consent/show-banner/translations.test.ts +121 -0
- package/src/v2/handlers/consent/show-banner/translations.ts +79 -0
- package/src/v2/handlers/consent/verify.handler.ts +288 -0
- package/src/v2/handlers/meta/index.ts +5 -0
- package/src/v2/handlers/meta/status.handler.ts +43 -0
- package/src/v2/init.test.ts +114 -0
- package/src/v2/init.ts +126 -0
- package/src/v2/middleware/cors/cors.test.ts +111 -0
- package/src/v2/middleware/cors/cors.ts +192 -0
- package/src/v2/middleware/cors/index.ts +30 -0
- package/src/v2/middleware/cors/is-origin-trusted.test.ts +104 -0
- package/src/v2/middleware/cors/is-origin-trusted.ts +126 -0
- package/src/v2/middleware/cors/process-cors.ts +91 -0
- package/src/v2/middleware/openapi/config.ts +27 -0
- package/src/v2/middleware/openapi/handlers.ts +132 -0
- package/src/v2/middleware/openapi/index.ts +11 -0
- package/src/v2/middleware/process-ip/index.ts +39 -0
- package/src/v2/router.ts +8 -0
- package/src/v2/types/api.ts +32 -0
- package/src/v2/types/index.ts +121 -0
- package/src/v2/utils/create-telemetry-options.ts +115 -0
- package/src/v2/utils/env.ts +84 -0
- package/src/v2/utils/index.ts +2 -0
- package/src/v2/utils/logger.ts +38 -0
- package/src/version.ts +1 -1
- package/vitest.config.ts +11 -2
package/dist/v2/core.js
ADDED
|
@@ -0,0 +1,2130 @@
|
|
|
1
|
+
import * as __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__ from "@doubletie/logger";
|
|
2
|
+
import * as __WEBPACK_EXTERNAL_MODULE__orpc_openapi_fetch_89b49e61__ from "@orpc/openapi/fetch";
|
|
3
|
+
import * as __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__ from "@orpc/server";
|
|
4
|
+
import * as __WEBPACK_EXTERNAL_MODULE__orpc_server_plugins_e445fd4f__ from "@orpc/server/plugins";
|
|
5
|
+
import * as __WEBPACK_EXTERNAL_MODULE_defu__ from "defu";
|
|
6
|
+
import * as __WEBPACK_EXTERNAL_MODULE__orpc_openapi_a95cc8e7__ from "@orpc/openapi";
|
|
7
|
+
import * as __WEBPACK_EXTERNAL_MODULE__orpc_zod_716a28d4__ from "@orpc/zod";
|
|
8
|
+
import * as __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__ from "@orpc/contract";
|
|
9
|
+
import * as __WEBPACK_EXTERNAL_MODULE_zod__ from "zod";
|
|
10
|
+
import * as __WEBPACK_EXTERNAL_MODULE_fumadb__ from "fumadb";
|
|
11
|
+
import * as __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__ from "fumadb/schema";
|
|
12
|
+
import * as __WEBPACK_EXTERNAL_MODULE_base_x_aeb88370__ from "base-x";
|
|
13
|
+
import * as __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__ from "@c15t/translations";
|
|
14
|
+
import * as __WEBPACK_EXTERNAL_MODULE__opentelemetry_resources_c7ac8648__ from "@opentelemetry/resources";
|
|
15
|
+
import * as __WEBPACK_EXTERNAL_MODULE__opentelemetry_sdk_node_50b75088__ from "@opentelemetry/sdk-node";
|
|
16
|
+
import * as __WEBPACK_EXTERNAL_MODULE__opentelemetry_sdk_trace_base_5031a705__ from "@opentelemetry/sdk-trace-base";
|
|
17
|
+
import * as __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__ from "@opentelemetry/api";
|
|
18
|
+
const WWW_REGEX = /^www\./;
|
|
19
|
+
const PROTOCOL_WWW_REGEX = /^https?:\/\/(www\.)?/;
|
|
20
|
+
const SUPPORTED_METHODS = [
|
|
21
|
+
'GET',
|
|
22
|
+
'POST',
|
|
23
|
+
'PUT',
|
|
24
|
+
'DELETE',
|
|
25
|
+
'PATCH',
|
|
26
|
+
'OPTIONS'
|
|
27
|
+
];
|
|
28
|
+
const SUPPORTED_HEADERS = [
|
|
29
|
+
'Content-Type',
|
|
30
|
+
'Authorization',
|
|
31
|
+
'x-request-id'
|
|
32
|
+
];
|
|
33
|
+
const DEFAULT_CORS_CONFIG = {
|
|
34
|
+
origin: async (origin)=>await Promise.resolve(origin || '*'),
|
|
35
|
+
credentials: true,
|
|
36
|
+
allowHeaders: SUPPORTED_HEADERS,
|
|
37
|
+
maxAge: 600,
|
|
38
|
+
methods: SUPPORTED_METHODS
|
|
39
|
+
};
|
|
40
|
+
function createCORSOptions(trustedOrigins) {
|
|
41
|
+
if (!trustedOrigins) return DEFAULT_CORS_CONFIG;
|
|
42
|
+
const origins = Array.isArray(trustedOrigins) ? trustedOrigins : [
|
|
43
|
+
trustedOrigins
|
|
44
|
+
];
|
|
45
|
+
if (0 === origins.length) return DEFAULT_CORS_CONFIG;
|
|
46
|
+
function normalizeOrigin(origin) {
|
|
47
|
+
try {
|
|
48
|
+
if (!origin.includes('://') && !origin.includes(':') && !origin.includes('/')) return origin.toLowerCase();
|
|
49
|
+
const originWithProtocol = origin.startsWith('http://') || origin.startsWith('https://') || origin.startsWith('ws://') || origin.startsWith('wss://') ? origin : `http://${origin}`;
|
|
50
|
+
const url = new URL(originWithProtocol);
|
|
51
|
+
const hostname = url.hostname.replace(WWW_REGEX, '');
|
|
52
|
+
return `${hostname}${url.port ? `:${url.port}` : ''}`;
|
|
53
|
+
} catch {
|
|
54
|
+
return origin.replace(PROTOCOL_WWW_REGEX, '').replace(WWW_REGEX, '');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function expandWithWWW(origins) {
|
|
58
|
+
const expanded = new Set();
|
|
59
|
+
for (const origin of origins){
|
|
60
|
+
if ('*' === origin) {
|
|
61
|
+
expanded.add('*');
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const normalized = normalizeOrigin(origin);
|
|
65
|
+
expanded.add(normalized);
|
|
66
|
+
if (!normalized.includes('www.')) expanded.add(`www.${normalized}`);
|
|
67
|
+
}
|
|
68
|
+
return Array.from(expanded);
|
|
69
|
+
}
|
|
70
|
+
const expandedTrusted = expandWithWWW(origins);
|
|
71
|
+
const returnConfig = {
|
|
72
|
+
origin: async (origin)=>{
|
|
73
|
+
if (!origin) return '*';
|
|
74
|
+
const normalizedOrigin = normalizeOrigin(origin);
|
|
75
|
+
if (expandedTrusted.includes('*')) return origin;
|
|
76
|
+
const isTrusted = expandedTrusted.some((trusted)=>{
|
|
77
|
+
const normalizedTrusted = normalizeOrigin(trusted);
|
|
78
|
+
if ('localhost' === normalizedTrusted) return 'localhost' === normalizedOrigin || normalizedOrigin.startsWith('localhost:') || '127.0.0.1' === normalizedOrigin || normalizedOrigin.startsWith('127.0.0.1:') || '[::1]' === normalizedOrigin || normalizedOrigin.startsWith('[::1]:');
|
|
79
|
+
return normalizedTrusted === normalizedOrigin;
|
|
80
|
+
});
|
|
81
|
+
return isTrusted ? origin : null;
|
|
82
|
+
},
|
|
83
|
+
credentials: true,
|
|
84
|
+
allowHeaders: SUPPORTED_HEADERS,
|
|
85
|
+
maxAge: 600,
|
|
86
|
+
methods: SUPPORTED_METHODS
|
|
87
|
+
};
|
|
88
|
+
return returnConfig;
|
|
89
|
+
}
|
|
90
|
+
const STRIP_REGEX = /^(https?:\/\/)|(wss?:\/\/)|(\/+$)|:\d+/g;
|
|
91
|
+
function matchesWildcard(hostname, wildcardPattern, logger) {
|
|
92
|
+
const wildcardDomain = wildcardPattern.slice(2);
|
|
93
|
+
const parts = hostname.split('.');
|
|
94
|
+
const isValid = parts.length > 2 && hostname.endsWith(wildcardDomain);
|
|
95
|
+
logger?.debug(`Wildcard match result: ${isValid} ${hostname} ends with ${wildcardDomain} ${parts.length > 2} ${hostname.endsWith(wildcardDomain)}`);
|
|
96
|
+
return isValid;
|
|
97
|
+
}
|
|
98
|
+
function isOriginTrusted(origin, trustedDomains, logger) {
|
|
99
|
+
try {
|
|
100
|
+
if (0 === trustedDomains.length) throw new Error('No trusted domains');
|
|
101
|
+
logger?.debug(`Checking if origin ${origin} is trusted in ${trustedDomains}`);
|
|
102
|
+
if (trustedDomains.includes('*')) {
|
|
103
|
+
logger?.debug('Allowing all origins');
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
const url = new URL(origin);
|
|
107
|
+
const originHostname = url.hostname.toLowerCase();
|
|
108
|
+
logger?.debug(`Parsed origin hostname: ${originHostname}`);
|
|
109
|
+
return trustedDomains.some((domain)=>{
|
|
110
|
+
if (!domain || '' === domain.trim()) {
|
|
111
|
+
logger?.debug('Skipping empty domain');
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
const strippedDomain = domain.replace(STRIP_REGEX, '').toLowerCase();
|
|
115
|
+
logger?.debug(`Checking against stripped domain: ${strippedDomain}`);
|
|
116
|
+
if (strippedDomain.startsWith('*.')) return matchesWildcard(originHostname, strippedDomain, logger);
|
|
117
|
+
const isMatch = originHostname === strippedDomain;
|
|
118
|
+
logger?.debug(`Exact match result: ${isMatch} ${originHostname} === ${strippedDomain}`);
|
|
119
|
+
return isMatch;
|
|
120
|
+
});
|
|
121
|
+
} catch (error) {
|
|
122
|
+
logger?.error('Error validating origin:', error);
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function extractCORSInfo(request, trustedOrigins, logger) {
|
|
127
|
+
const origin = request.headers.get('origin');
|
|
128
|
+
if (!origin || !trustedOrigins) return {
|
|
129
|
+
origin: origin,
|
|
130
|
+
isTrusted: false
|
|
131
|
+
};
|
|
132
|
+
return {
|
|
133
|
+
origin,
|
|
134
|
+
isTrusted: isOriginTrusted(origin, trustedOrigins, logger)
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
const processCors = (request, context, trustedOrigins)=>{
|
|
138
|
+
const { origin, isTrusted } = extractCORSInfo(request, trustedOrigins, context.logger);
|
|
139
|
+
if (origin) {
|
|
140
|
+
context.origin = origin;
|
|
141
|
+
context.trustedOrigin = isTrusted;
|
|
142
|
+
}
|
|
143
|
+
return context;
|
|
144
|
+
};
|
|
145
|
+
const version = '1.6.0';
|
|
146
|
+
const createOpenAPIConfig = (options)=>{
|
|
147
|
+
const basePath = options.basePath || '';
|
|
148
|
+
return {
|
|
149
|
+
enabled: true,
|
|
150
|
+
specPath: `${basePath}/spec.json`,
|
|
151
|
+
docsPath: `${basePath}/docs`,
|
|
152
|
+
...options.advanced?.openapi || {}
|
|
153
|
+
};
|
|
154
|
+
};
|
|
155
|
+
const createDefaultOpenAPIOptions = (options)=>({
|
|
156
|
+
info: {
|
|
157
|
+
title: options.appName || 'c15t API',
|
|
158
|
+
version: version,
|
|
159
|
+
description: 'API for consent management'
|
|
160
|
+
},
|
|
161
|
+
servers: [
|
|
162
|
+
{
|
|
163
|
+
url: options.basePath || '/'
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
security: [
|
|
167
|
+
{
|
|
168
|
+
bearerAuth: []
|
|
169
|
+
}
|
|
170
|
+
]
|
|
171
|
+
});
|
|
172
|
+
const auditLogTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('auditLog', {
|
|
173
|
+
id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
|
|
174
|
+
entityType: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('entityType', 'string'),
|
|
175
|
+
entityId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('entityId', 'string'),
|
|
176
|
+
actionType: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('actionType', 'string'),
|
|
177
|
+
subjectId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectId', 'string').nullable(),
|
|
178
|
+
ipAddress: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('ipAddress', 'string').nullable(),
|
|
179
|
+
userAgent: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('userAgent', 'string').nullable(),
|
|
180
|
+
changes: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('changes', 'json').nullable(),
|
|
181
|
+
metadata: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('metadata', 'json').nullable(),
|
|
182
|
+
createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
|
|
183
|
+
eventTimezone: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('eventTimezone', 'string').defaultTo$(()=>'UTC')
|
|
184
|
+
});
|
|
185
|
+
__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
186
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
187
|
+
entityType: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
188
|
+
entityId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
189
|
+
actionType: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
190
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
191
|
+
ipAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
192
|
+
userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
193
|
+
changes: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
|
|
194
|
+
metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
|
|
195
|
+
createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
|
|
196
|
+
eventTimezone: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().prefault('UTC')
|
|
197
|
+
});
|
|
198
|
+
const consentTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consent', {
|
|
199
|
+
id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
|
|
200
|
+
subjectId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectId', 'string'),
|
|
201
|
+
domainId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('domainId', 'string'),
|
|
202
|
+
policyId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('policyId', 'string').nullable(),
|
|
203
|
+
purposeIds: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('purposeIds', 'json'),
|
|
204
|
+
metadata: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('metadata', 'json').nullable(),
|
|
205
|
+
ipAddress: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('ipAddress', 'string').nullable(),
|
|
206
|
+
userAgent: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('userAgent', 'string').nullable(),
|
|
207
|
+
status: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('status', 'string').defaultTo$(()=>'active'),
|
|
208
|
+
withdrawalReason: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('withdrawalReason', 'string').nullable(),
|
|
209
|
+
givenAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('givenAt', 'timestamp').defaultTo$('now'),
|
|
210
|
+
validUntil: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('validUntil', 'timestamp').nullable(),
|
|
211
|
+
isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true)
|
|
212
|
+
});
|
|
213
|
+
const consentStatusSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
|
|
214
|
+
'active',
|
|
215
|
+
'withdrawn',
|
|
216
|
+
'expired'
|
|
217
|
+
]);
|
|
218
|
+
__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
219
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
220
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
221
|
+
domainId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
222
|
+
purposeIds: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
|
|
223
|
+
metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).nullish(),
|
|
224
|
+
policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
225
|
+
ipAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
226
|
+
userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
227
|
+
status: consentStatusSchema.prefault('active'),
|
|
228
|
+
withdrawalReason: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
229
|
+
givenAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
|
|
230
|
+
validUntil: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().nullish(),
|
|
231
|
+
isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true)
|
|
232
|
+
});
|
|
233
|
+
const consentPolicyTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consentPolicy', {
|
|
234
|
+
id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
|
|
235
|
+
version: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('version', 'string'),
|
|
236
|
+
type: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('type', 'string'),
|
|
237
|
+
name: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('name', 'string'),
|
|
238
|
+
effectiveDate: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('effectiveDate', 'timestamp'),
|
|
239
|
+
expirationDate: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('expirationDate', 'timestamp').nullable(),
|
|
240
|
+
content: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('content', 'string'),
|
|
241
|
+
contentHash: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('contentHash', 'string'),
|
|
242
|
+
isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true),
|
|
243
|
+
createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now')
|
|
244
|
+
});
|
|
245
|
+
const PolicyTypeSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
|
|
246
|
+
'cookie_banner',
|
|
247
|
+
'privacy_policy',
|
|
248
|
+
'dpa',
|
|
249
|
+
'terms_and_conditions',
|
|
250
|
+
'marketing_communications',
|
|
251
|
+
'age_verification',
|
|
252
|
+
'other'
|
|
253
|
+
]);
|
|
254
|
+
__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
255
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
256
|
+
version: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
257
|
+
type: PolicyTypeSchema,
|
|
258
|
+
name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
259
|
+
effectiveDate: __WEBPACK_EXTERNAL_MODULE_zod__.z.date(),
|
|
260
|
+
expirationDate: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().nullish(),
|
|
261
|
+
content: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
262
|
+
contentHash: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
263
|
+
isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
|
|
264
|
+
createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
|
|
265
|
+
});
|
|
266
|
+
const consentPurposeTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consentPurpose', {
|
|
267
|
+
id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
|
|
268
|
+
code: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('code', 'string'),
|
|
269
|
+
name: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('name', 'string'),
|
|
270
|
+
description: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)("description", 'string'),
|
|
271
|
+
isEssential: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isEssential', 'bool'),
|
|
272
|
+
dataCategory: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('dataCategory', 'string').nullable(),
|
|
273
|
+
legalBasis: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('legalBasis', 'string').nullable(),
|
|
274
|
+
isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true),
|
|
275
|
+
createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
|
|
276
|
+
updatedAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('updatedAt', 'timestamp').defaultTo$('now')
|
|
277
|
+
});
|
|
278
|
+
__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
279
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
280
|
+
code: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
281
|
+
name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
282
|
+
description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
283
|
+
isEssential: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean(),
|
|
284
|
+
dataCategory: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
285
|
+
legalBasis: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
286
|
+
isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
|
|
287
|
+
createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
|
|
288
|
+
updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
|
|
289
|
+
});
|
|
290
|
+
const consentRecordTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consentRecord', {
|
|
291
|
+
id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
|
|
292
|
+
subjectId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectId', 'string'),
|
|
293
|
+
consentId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('consentId', 'string').nullable(),
|
|
294
|
+
actionType: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('actionType', 'string'),
|
|
295
|
+
details: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('details', 'json').nullable(),
|
|
296
|
+
createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now')
|
|
297
|
+
});
|
|
298
|
+
__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
299
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
300
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
301
|
+
consentId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
302
|
+
actionType: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
303
|
+
details: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).nullish(),
|
|
304
|
+
createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
|
|
305
|
+
});
|
|
306
|
+
const domainTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('domain', {
|
|
307
|
+
id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
|
|
308
|
+
name: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('name', 'string').unique(),
|
|
309
|
+
description: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)("description", 'string').nullable(),
|
|
310
|
+
allowedOrigins: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('allowedOrigins', 'json').nullable(),
|
|
311
|
+
isVerified: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isVerified', 'bool').defaultTo$(()=>true),
|
|
312
|
+
isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true),
|
|
313
|
+
createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
|
|
314
|
+
updatedAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('updatedAt', 'timestamp').defaultTo$('now')
|
|
315
|
+
});
|
|
316
|
+
__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
317
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
318
|
+
name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
319
|
+
description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
320
|
+
allowedOrigins: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).nullish(),
|
|
321
|
+
isVerified: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
|
|
322
|
+
isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
|
|
323
|
+
createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
|
|
324
|
+
updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
|
|
325
|
+
});
|
|
326
|
+
const subjectTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('subject', {
|
|
327
|
+
id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
|
|
328
|
+
isIdentified: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isIdentified', 'bool').defaultTo$(()=>false),
|
|
329
|
+
externalId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('externalId', 'string').nullable(),
|
|
330
|
+
identityProvider: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('identityProvider', 'string').nullable(),
|
|
331
|
+
lastIpAddress: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('lastIpAddress', 'string').nullable(),
|
|
332
|
+
subjectTimezone: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectTimezone', 'string').nullable(),
|
|
333
|
+
createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
|
|
334
|
+
updatedAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('updatedAt', 'timestamp').defaultTo$('now')
|
|
335
|
+
});
|
|
336
|
+
__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
337
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
338
|
+
isIdentified: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(false),
|
|
339
|
+
externalId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
340
|
+
identityProvider: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
341
|
+
lastIpAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
342
|
+
subjectTimezone: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
343
|
+
createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
|
|
344
|
+
updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
|
|
345
|
+
});
|
|
346
|
+
const v1 = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.schema)({
|
|
347
|
+
version: '1.0.0',
|
|
348
|
+
tables: {
|
|
349
|
+
subject: subjectTable,
|
|
350
|
+
domain: domainTable,
|
|
351
|
+
consentPolicy: consentPolicyTable,
|
|
352
|
+
consentPurpose: consentPurposeTable,
|
|
353
|
+
consent: consentTable,
|
|
354
|
+
auditLog: auditLogTable,
|
|
355
|
+
consentRecord: consentRecordTable
|
|
356
|
+
},
|
|
357
|
+
relations: {
|
|
358
|
+
subject: ({ many })=>({
|
|
359
|
+
consents: many('consent'),
|
|
360
|
+
consentRecords: many('consentRecord'),
|
|
361
|
+
auditLogs: many('auditLog')
|
|
362
|
+
}),
|
|
363
|
+
domain: ({ many })=>({
|
|
364
|
+
consents: many('consent')
|
|
365
|
+
}),
|
|
366
|
+
consentPolicy: ({ many })=>({
|
|
367
|
+
consents: many('consent')
|
|
368
|
+
}),
|
|
369
|
+
consentPurpose: ()=>({}),
|
|
370
|
+
consent: ({ one, many })=>({
|
|
371
|
+
subject: one('subject', [
|
|
372
|
+
'subjectId',
|
|
373
|
+
'id'
|
|
374
|
+
]).foreignKey(),
|
|
375
|
+
domain: one('domain', [
|
|
376
|
+
'domainId',
|
|
377
|
+
'id'
|
|
378
|
+
]).foreignKey(),
|
|
379
|
+
policy: one('consentPolicy', [
|
|
380
|
+
'policyId',
|
|
381
|
+
'id'
|
|
382
|
+
]).foreignKey(),
|
|
383
|
+
consentRecords: many('consentRecord')
|
|
384
|
+
}),
|
|
385
|
+
consentRecord: ({ one })=>({
|
|
386
|
+
subject: one('subject', [
|
|
387
|
+
'subjectId',
|
|
388
|
+
'id'
|
|
389
|
+
]).foreignKey(),
|
|
390
|
+
consent: one('consent', [
|
|
391
|
+
'consentId',
|
|
392
|
+
'id'
|
|
393
|
+
]).foreignKey()
|
|
394
|
+
}),
|
|
395
|
+
auditLog: ({ one })=>({
|
|
396
|
+
subject: one('subject', [
|
|
397
|
+
'subjectId',
|
|
398
|
+
'id'
|
|
399
|
+
]).foreignKey()
|
|
400
|
+
})
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
const DB = (0, __WEBPACK_EXTERNAL_MODULE_fumadb__.fumadb)({
|
|
404
|
+
namespace: 'c15t',
|
|
405
|
+
schemas: [
|
|
406
|
+
v1
|
|
407
|
+
]
|
|
408
|
+
});
|
|
409
|
+
const baseConsentSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
410
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
411
|
+
externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
412
|
+
domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
413
|
+
type: PolicyTypeSchema,
|
|
414
|
+
metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional()
|
|
415
|
+
});
|
|
416
|
+
const cookieBannerSchema = baseConsentSchema.extend({
|
|
417
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z.literal('cookie_banner'),
|
|
418
|
+
preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean())
|
|
419
|
+
});
|
|
420
|
+
const policyBasedSchema = baseConsentSchema.extend({
|
|
421
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
|
|
422
|
+
'privacy_policy',
|
|
423
|
+
'dpa',
|
|
424
|
+
'terms_and_conditions'
|
|
425
|
+
]),
|
|
426
|
+
policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
427
|
+
preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean()).optional()
|
|
428
|
+
});
|
|
429
|
+
const otherConsentSchema = baseConsentSchema.extend({
|
|
430
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
|
|
431
|
+
'marketing_communications',
|
|
432
|
+
'age_verification',
|
|
433
|
+
'other'
|
|
434
|
+
]),
|
|
435
|
+
preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean()).optional()
|
|
436
|
+
});
|
|
437
|
+
const postConsentContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
|
|
438
|
+
method: 'POST',
|
|
439
|
+
path: '/consent/set',
|
|
440
|
+
description: `Records a user's consent preferences and creates necessary consent records.
|
|
441
|
+
This endpoint handles various types of consent submissions:
|
|
442
|
+
|
|
443
|
+
1. Cookie Banner Consent:
|
|
444
|
+
- Records granular cookie preferences
|
|
445
|
+
- Supports multiple consent purposes
|
|
446
|
+
- Creates audit trail for compliance
|
|
447
|
+
|
|
448
|
+
2. Policy-Based Consent:
|
|
449
|
+
- Privacy Policy acceptance
|
|
450
|
+
- Data Processing Agreement (DPA) consent
|
|
451
|
+
- Terms and Conditions acceptance
|
|
452
|
+
- Links consent to specific policy versions
|
|
453
|
+
|
|
454
|
+
3. Other Consent Types:
|
|
455
|
+
- Marketing communications preferences
|
|
456
|
+
- Age verification consent
|
|
457
|
+
- Custom consent types
|
|
458
|
+
|
|
459
|
+
The endpoint performs the following operations:
|
|
460
|
+
- Creates or retrieves subject records
|
|
461
|
+
- Validates domain and policy information
|
|
462
|
+
- Creates consent records with audit trails
|
|
463
|
+
- Records consent purposes and preferences
|
|
464
|
+
- Generates audit logs for compliance
|
|
465
|
+
|
|
466
|
+
Use this endpoint to record user consent and maintain a compliant consent management system.`,
|
|
467
|
+
tags: [
|
|
468
|
+
'consent',
|
|
469
|
+
'cookie-banner'
|
|
470
|
+
]
|
|
471
|
+
}).errors({
|
|
472
|
+
INPUT_VALIDATION_FAILED: {
|
|
473
|
+
status: 422,
|
|
474
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
475
|
+
formErrors: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
|
|
476
|
+
fieldErrors: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()))
|
|
477
|
+
}),
|
|
478
|
+
error: 'Invalid input parameters'
|
|
479
|
+
},
|
|
480
|
+
SUBJECT_CREATION_FAILED: {
|
|
481
|
+
status: 400,
|
|
482
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
483
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
484
|
+
externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional()
|
|
485
|
+
}),
|
|
486
|
+
error: 'Failed to create or find subject'
|
|
487
|
+
},
|
|
488
|
+
DOMAIN_CREATION_FAILED: {
|
|
489
|
+
status: 500,
|
|
490
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
491
|
+
domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
492
|
+
}),
|
|
493
|
+
error: 'Failed to create or find domain'
|
|
494
|
+
},
|
|
495
|
+
POLICY_NOT_FOUND: {
|
|
496
|
+
status: 404,
|
|
497
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
498
|
+
policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
499
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
500
|
+
}),
|
|
501
|
+
error: 'Policy not found'
|
|
502
|
+
},
|
|
503
|
+
POLICY_INACTIVE: {
|
|
504
|
+
status: 409,
|
|
505
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
506
|
+
policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
507
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
508
|
+
}),
|
|
509
|
+
error: 'Policy is not active'
|
|
510
|
+
},
|
|
511
|
+
POLICY_CREATION_FAILED: {
|
|
512
|
+
status: 500,
|
|
513
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
514
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
515
|
+
}),
|
|
516
|
+
error: 'Failed to create or find policy'
|
|
517
|
+
},
|
|
518
|
+
PURPOSE_CREATION_FAILED: {
|
|
519
|
+
status: 500,
|
|
520
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
521
|
+
purposeCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
522
|
+
}),
|
|
523
|
+
error: 'Failed to create consent purpose'
|
|
524
|
+
},
|
|
525
|
+
CONSENT_CREATION_FAILED: {
|
|
526
|
+
status: 500,
|
|
527
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
528
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
529
|
+
domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
530
|
+
}),
|
|
531
|
+
error: 'Failed to create consent record'
|
|
532
|
+
}
|
|
533
|
+
}).input(__WEBPACK_EXTERNAL_MODULE_zod__.z.discriminatedUnion('type', [
|
|
534
|
+
cookieBannerSchema,
|
|
535
|
+
policyBasedSchema,
|
|
536
|
+
otherConsentSchema
|
|
537
|
+
])).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
538
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
539
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
540
|
+
externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
541
|
+
domainId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
542
|
+
domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
543
|
+
type: PolicyTypeSchema,
|
|
544
|
+
status: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
545
|
+
recordId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
546
|
+
metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
|
|
547
|
+
givenAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date()
|
|
548
|
+
}));
|
|
549
|
+
const types_branding = [
|
|
550
|
+
'c15t',
|
|
551
|
+
'consent',
|
|
552
|
+
'none'
|
|
553
|
+
];
|
|
554
|
+
const JurisdictionMessages = {
|
|
555
|
+
GDPR: 'GDPR or equivalent regulations require a cookie banner.',
|
|
556
|
+
CH: 'Switzerland requires similar data protection measures.',
|
|
557
|
+
BR: "Brazil's LGPD requires consent for cookies.",
|
|
558
|
+
PIPEDA: 'PIPEDA requires consent for data collection.',
|
|
559
|
+
AU: "Australia's Privacy Act mandates transparency about data collection.",
|
|
560
|
+
APPI: "Japan's APPI requires consent for data collection.",
|
|
561
|
+
PIPA: "South Korea's PIPA requires consent for data collection.",
|
|
562
|
+
NONE: 'No specific requirements'
|
|
563
|
+
};
|
|
564
|
+
const JurisdictionCodeSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
|
|
565
|
+
'GDPR',
|
|
566
|
+
'CH',
|
|
567
|
+
'BR',
|
|
568
|
+
'PIPEDA',
|
|
569
|
+
'AU',
|
|
570
|
+
'APPI',
|
|
571
|
+
'PIPA',
|
|
572
|
+
'NONE'
|
|
573
|
+
]);
|
|
574
|
+
const JurisdictionInfoSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
575
|
+
code: JurisdictionCodeSchema,
|
|
576
|
+
message: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
577
|
+
});
|
|
578
|
+
const TitleDescriptionSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
579
|
+
title: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
580
|
+
description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
581
|
+
});
|
|
582
|
+
const TranslationsSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
583
|
+
common: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
584
|
+
acceptAll: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
585
|
+
rejectAll: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
586
|
+
customize: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
587
|
+
save: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
588
|
+
}),
|
|
589
|
+
cookieBanner: TitleDescriptionSchema,
|
|
590
|
+
consentManagerDialog: TitleDescriptionSchema,
|
|
591
|
+
consentTypes: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
592
|
+
experience: TitleDescriptionSchema,
|
|
593
|
+
functionality: TitleDescriptionSchema,
|
|
594
|
+
marketing: TitleDescriptionSchema,
|
|
595
|
+
measurement: TitleDescriptionSchema,
|
|
596
|
+
necessary: TitleDescriptionSchema
|
|
597
|
+
})
|
|
598
|
+
});
|
|
599
|
+
const showConsentBannerContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
|
|
600
|
+
method: 'GET',
|
|
601
|
+
path: '/show-consent-banner',
|
|
602
|
+
description: `Determines if a user should see a consent banner based on their location and applicable privacy regulations.
|
|
603
|
+
This endpoint performs the following checks:
|
|
604
|
+
|
|
605
|
+
1. Detects the user's location using various header information:
|
|
606
|
+
- Cloudflare country headers
|
|
607
|
+
- Vercel IP country headers
|
|
608
|
+
- AWS CloudFront headers
|
|
609
|
+
- Custom country code headers
|
|
610
|
+
|
|
611
|
+
2. Determines the applicable jurisdiction based on the location:
|
|
612
|
+
- GDPR (EU/EEA/UK)
|
|
613
|
+
- Swiss Data Protection Act
|
|
614
|
+
- LGPD (Brazil)
|
|
615
|
+
- PIPEDA (Canada)
|
|
616
|
+
- Australian Privacy Principles
|
|
617
|
+
- APPI (Japan)
|
|
618
|
+
- PIPA (South Korea)
|
|
619
|
+
|
|
620
|
+
3. Returns detailed information about:
|
|
621
|
+
- Whether to show the consent banner
|
|
622
|
+
- The applicable jurisdiction and its requirements
|
|
623
|
+
- The user's detected location (country and region)
|
|
624
|
+
|
|
625
|
+
Use this endpoint to implement geo-targeted consent banners and ensure compliance with regional privacy regulations.`,
|
|
626
|
+
tags: [
|
|
627
|
+
'cookie-banner'
|
|
628
|
+
]
|
|
629
|
+
}).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
630
|
+
showConsentBanner: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean(),
|
|
631
|
+
jurisdiction: JurisdictionInfoSchema,
|
|
632
|
+
location: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
633
|
+
countryCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
|
|
634
|
+
regionCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable()
|
|
635
|
+
}),
|
|
636
|
+
translations: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
637
|
+
language: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
638
|
+
translations: TranslationsSchema
|
|
639
|
+
}),
|
|
640
|
+
branding: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"](types_branding)
|
|
641
|
+
}));
|
|
642
|
+
const verifyConsentInputSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.strictObject({
|
|
643
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
644
|
+
externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
645
|
+
domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
646
|
+
type: PolicyTypeSchema,
|
|
647
|
+
policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
648
|
+
preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).optional()
|
|
649
|
+
});
|
|
650
|
+
const verify_contract_consentSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.looseObject({
|
|
651
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
652
|
+
purposeIds: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string())
|
|
653
|
+
});
|
|
654
|
+
const verifyConsentContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
|
|
655
|
+
method: 'POST',
|
|
656
|
+
path: '/consent/verify',
|
|
657
|
+
description: `Verifies if a user has given valid consent for a specific policy and domain.
|
|
658
|
+
This endpoint performs comprehensive consent verification by:
|
|
659
|
+
|
|
660
|
+
1. Validating the subject's identity (using subjectId or externalSubjectId)
|
|
661
|
+
2. Verifying the domain's existence and validity
|
|
662
|
+
3. Checking if the specified policy exists and is active
|
|
663
|
+
4. Validating that all required purposes have been consented to
|
|
664
|
+
5. Ensuring the consent record is current and valid
|
|
665
|
+
|
|
666
|
+
The endpoint supports different types of consent verification:
|
|
667
|
+
- Cookie banner consent verification
|
|
668
|
+
- Privacy policy consent verification
|
|
669
|
+
- Terms and conditions verification
|
|
670
|
+
- Marketing communications consent verification
|
|
671
|
+
- Age verification
|
|
672
|
+
- Custom consent types
|
|
673
|
+
|
|
674
|
+
Use this endpoint to ensure compliance with privacy regulations and to verify user consent before processing personal data.`,
|
|
675
|
+
tags: [
|
|
676
|
+
'consent'
|
|
677
|
+
]
|
|
678
|
+
}).errors({
|
|
679
|
+
INPUT_VALIDATION_FAILED: {
|
|
680
|
+
status: 422,
|
|
681
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
682
|
+
formErrors: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
|
|
683
|
+
fieldErrors: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).optional())
|
|
684
|
+
}),
|
|
685
|
+
error: 'Invalid input parameters'
|
|
686
|
+
},
|
|
687
|
+
SUBJECT_NOT_FOUND: {
|
|
688
|
+
status: 404,
|
|
689
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
690
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
691
|
+
externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional()
|
|
692
|
+
}),
|
|
693
|
+
error: 'Subject not found'
|
|
694
|
+
},
|
|
695
|
+
DOMAIN_NOT_FOUND: {
|
|
696
|
+
status: 404,
|
|
697
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
698
|
+
domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
699
|
+
}),
|
|
700
|
+
error: 'Domain not found'
|
|
701
|
+
},
|
|
702
|
+
POLICY_NOT_FOUND: {
|
|
703
|
+
status: 404,
|
|
704
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
705
|
+
policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
706
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
707
|
+
}),
|
|
708
|
+
error: 'Policy not found or invalid'
|
|
709
|
+
},
|
|
710
|
+
PURPOSES_NOT_FOUND: {
|
|
711
|
+
status: 404,
|
|
712
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
713
|
+
preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
|
|
714
|
+
foundPurposes: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string())
|
|
715
|
+
}),
|
|
716
|
+
error: 'Could not find all specified purposes'
|
|
717
|
+
},
|
|
718
|
+
COOKIE_BANNER_PREFERENCES_REQUIRED: {
|
|
719
|
+
status: 400,
|
|
720
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
721
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z.literal('cookie_banner')
|
|
722
|
+
}),
|
|
723
|
+
error: 'Preferences are required for cookie banner consent'
|
|
724
|
+
},
|
|
725
|
+
NO_CONSENT_FOUND: {
|
|
726
|
+
status: 404,
|
|
727
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
728
|
+
policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
729
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
730
|
+
domainId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
731
|
+
}),
|
|
732
|
+
error: 'No consent found for the given policy'
|
|
733
|
+
}
|
|
734
|
+
}).input(verifyConsentInputSchema).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
735
|
+
isValid: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean(),
|
|
736
|
+
reasons: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).optional(),
|
|
737
|
+
consent: verify_contract_consentSchema.optional()
|
|
738
|
+
}));
|
|
739
|
+
const consentContracts = {
|
|
740
|
+
post: postConsentContract,
|
|
741
|
+
showBanner: showConsentBannerContract,
|
|
742
|
+
verify: verifyConsentContract
|
|
743
|
+
};
|
|
744
|
+
const statusContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
|
|
745
|
+
method: 'GET',
|
|
746
|
+
path: '/status',
|
|
747
|
+
description: `Returns the current operational status and health metrics of the service.
|
|
748
|
+
This endpoint provides real-time information about:
|
|
749
|
+
- Overall service status (ok/error)
|
|
750
|
+
- Current API version
|
|
751
|
+
- Server timestamp
|
|
752
|
+
- Storage system status and availability
|
|
753
|
+
- Client information (IP, User Agent, Region)
|
|
754
|
+
|
|
755
|
+
Use this endpoint for health checks, monitoring, and service status verification.`,
|
|
756
|
+
tags: [
|
|
757
|
+
'meta'
|
|
758
|
+
]
|
|
759
|
+
}).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
760
|
+
status: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
|
|
761
|
+
'ok',
|
|
762
|
+
'error'
|
|
763
|
+
]),
|
|
764
|
+
version: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
765
|
+
timestamp: __WEBPACK_EXTERNAL_MODULE_zod__.z.date(),
|
|
766
|
+
client: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
767
|
+
ip: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
|
|
768
|
+
userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
|
|
769
|
+
region: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
770
|
+
countryCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
|
|
771
|
+
regionCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable()
|
|
772
|
+
})
|
|
773
|
+
})
|
|
774
|
+
}));
|
|
775
|
+
const metaContracts = {
|
|
776
|
+
status: statusContract
|
|
777
|
+
};
|
|
778
|
+
const contracts_config = {
|
|
779
|
+
consent: consentContracts,
|
|
780
|
+
meta: metaContracts
|
|
781
|
+
};
|
|
782
|
+
const os = (0, __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.implement)(contracts_config);
|
|
783
|
+
const prefixes = {
|
|
784
|
+
auditLog: 'log',
|
|
785
|
+
consent: 'cns',
|
|
786
|
+
consentPolicy: 'pol',
|
|
787
|
+
consentPurpose: 'pur',
|
|
788
|
+
consentRecord: 'rec',
|
|
789
|
+
domain: 'dom',
|
|
790
|
+
subject: 'sub'
|
|
791
|
+
};
|
|
792
|
+
const b58 = (0, __WEBPACK_EXTERNAL_MODULE_base_x_aeb88370__["default"])('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
|
|
793
|
+
function generateId(model) {
|
|
794
|
+
const buf = crypto.getRandomValues(new Uint8Array(20));
|
|
795
|
+
const prefix = prefixes[model];
|
|
796
|
+
const EPOCH_TIMESTAMP = 1700000000000;
|
|
797
|
+
const t = Date.now() - EPOCH_TIMESTAMP;
|
|
798
|
+
const high = Math.floor(t / 0x100000000);
|
|
799
|
+
const low = t >>> 0;
|
|
800
|
+
buf[0] = high >>> 24 & 255;
|
|
801
|
+
buf[1] = high >>> 16 & 255;
|
|
802
|
+
buf[2] = high >>> 8 & 255;
|
|
803
|
+
buf[3] = 255 & high;
|
|
804
|
+
buf[4] = low >>> 24 & 255;
|
|
805
|
+
buf[5] = low >>> 16 & 255;
|
|
806
|
+
buf[6] = low >>> 8 & 255;
|
|
807
|
+
buf[7] = 255 & low;
|
|
808
|
+
return `${prefix}_${b58.encode(buf)}`;
|
|
809
|
+
}
|
|
810
|
+
async function generateUniqueId(db, model, ctx, options = {}) {
|
|
811
|
+
const { maxRetries = 10, attempt = 0, baseDelay = 5 } = options;
|
|
812
|
+
if (attempt >= maxRetries) {
|
|
813
|
+
const error = new Error(`Failed to generate unique ID for ${model} after ${maxRetries} attempts`);
|
|
814
|
+
ctx?.logger?.error?.('ID generation failed', {
|
|
815
|
+
model,
|
|
816
|
+
maxRetries
|
|
817
|
+
});
|
|
818
|
+
throw error;
|
|
819
|
+
}
|
|
820
|
+
const id = generateId(model);
|
|
821
|
+
try {
|
|
822
|
+
const existing = await db.findFirst(model, {
|
|
823
|
+
where: (b)=>b('id', '=', id)
|
|
824
|
+
});
|
|
825
|
+
if (existing) {
|
|
826
|
+
ctx?.logger?.debug?.('ID conflict detected', {
|
|
827
|
+
id,
|
|
828
|
+
model,
|
|
829
|
+
attempt: attempt + 1,
|
|
830
|
+
maxRetries
|
|
831
|
+
});
|
|
832
|
+
const delay = Math.min(baseDelay * 2 ** attempt, 1000);
|
|
833
|
+
await new Promise((resolve)=>setTimeout(resolve, delay));
|
|
834
|
+
return generateUniqueId(db, model, ctx, {
|
|
835
|
+
maxRetries,
|
|
836
|
+
attempt: attempt + 1,
|
|
837
|
+
baseDelay
|
|
838
|
+
});
|
|
839
|
+
}
|
|
840
|
+
return id;
|
|
841
|
+
} catch (error) {
|
|
842
|
+
ctx?.logger?.error?.('Error checking ID uniqueness', {
|
|
843
|
+
error: error.message,
|
|
844
|
+
model,
|
|
845
|
+
attempt
|
|
846
|
+
});
|
|
847
|
+
if (attempt < maxRetries - 1) {
|
|
848
|
+
const delay = Math.min(baseDelay * 2 ** attempt, 2000);
|
|
849
|
+
await new Promise((resolve)=>setTimeout(resolve, delay));
|
|
850
|
+
return generateUniqueId(db, model, ctx, {
|
|
851
|
+
maxRetries,
|
|
852
|
+
attempt: attempt + 1,
|
|
853
|
+
baseDelay
|
|
854
|
+
});
|
|
855
|
+
}
|
|
856
|
+
throw error;
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
const postConsent = os.consent.post.handler(async ({ input, context })=>{
|
|
860
|
+
const typedContext = context;
|
|
861
|
+
const logger = typedContext.logger;
|
|
862
|
+
logger.info('Handling post-consent request');
|
|
863
|
+
const { db, registry } = typedContext;
|
|
864
|
+
const { type, subjectId, externalSubjectId, domain, metadata, preferences } = input;
|
|
865
|
+
logger.debug('Request parameters', {
|
|
866
|
+
type,
|
|
867
|
+
subjectId,
|
|
868
|
+
externalSubjectId,
|
|
869
|
+
domain
|
|
870
|
+
});
|
|
871
|
+
try {
|
|
872
|
+
const subject = await registry.findOrCreateSubject({
|
|
873
|
+
subjectId,
|
|
874
|
+
externalSubjectId,
|
|
875
|
+
ipAddress: typedContext.ipAddress
|
|
876
|
+
});
|
|
877
|
+
if (!subject) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('SUBJECT_CREATION_FAILED', {
|
|
878
|
+
data: {
|
|
879
|
+
subjectId,
|
|
880
|
+
externalSubjectId
|
|
881
|
+
}
|
|
882
|
+
});
|
|
883
|
+
logger.debug('Subject found/created', {
|
|
884
|
+
subjectId: subject.id
|
|
885
|
+
});
|
|
886
|
+
const domainRecord = await typedContext.registry.findOrCreateDomain(domain);
|
|
887
|
+
if (!domainRecord) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('DOMAIN_CREATION_FAILED', {
|
|
888
|
+
data: {
|
|
889
|
+
domain
|
|
890
|
+
}
|
|
891
|
+
});
|
|
892
|
+
let policyId;
|
|
893
|
+
let purposeIds = [];
|
|
894
|
+
if ('policyId' in input && input.policyId) {
|
|
895
|
+
policyId = input.policyId;
|
|
896
|
+
const policy = await typedContext.registry.findConsentPolicyById(policyId);
|
|
897
|
+
if (!policy) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_NOT_FOUND', {
|
|
898
|
+
data: {
|
|
899
|
+
policyId,
|
|
900
|
+
type
|
|
901
|
+
}
|
|
902
|
+
});
|
|
903
|
+
if (!policy.isActive) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_INACTIVE', {
|
|
904
|
+
data: {
|
|
905
|
+
policyId,
|
|
906
|
+
type
|
|
907
|
+
}
|
|
908
|
+
});
|
|
909
|
+
} else {
|
|
910
|
+
const policy = await typedContext.registry.findOrCreatePolicy(type);
|
|
911
|
+
if (!policy) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_CREATION_FAILED', {
|
|
912
|
+
data: {
|
|
913
|
+
type
|
|
914
|
+
}
|
|
915
|
+
});
|
|
916
|
+
policyId = policy.id;
|
|
917
|
+
}
|
|
918
|
+
if (preferences) {
|
|
919
|
+
const consentedPurposes = Object.entries(preferences).filter(([_, isConsented])=>isConsented).map(([purposeCode])=>purposeCode);
|
|
920
|
+
logger.debug('Consented purposes', {
|
|
921
|
+
consentedPurposes
|
|
922
|
+
});
|
|
923
|
+
const purposesRaw = await Promise.all(consentedPurposes.map((purposeCode)=>typedContext.registry.findOrCreateConsentPurposeByCode(purposeCode)));
|
|
924
|
+
const purposes = purposesRaw.map((purpose)=>purpose?.id);
|
|
925
|
+
logger.debug('Purposes: ', {
|
|
926
|
+
purposes
|
|
927
|
+
});
|
|
928
|
+
purposeIds = purposes;
|
|
929
|
+
}
|
|
930
|
+
const result = await db.transaction(async (tx)=>{
|
|
931
|
+
logger.debug('Creating consent record', {
|
|
932
|
+
subjectId: subject.id,
|
|
933
|
+
domainId: domainRecord.id,
|
|
934
|
+
policyId,
|
|
935
|
+
purposeIds
|
|
936
|
+
});
|
|
937
|
+
const consentRecord = await tx.create('consent', {
|
|
938
|
+
id: await generateUniqueId(tx, 'consent', typedContext),
|
|
939
|
+
subjectId: subject.id,
|
|
940
|
+
domainId: domainRecord.id,
|
|
941
|
+
policyId,
|
|
942
|
+
purposeIds: {
|
|
943
|
+
json: purposeIds
|
|
944
|
+
},
|
|
945
|
+
status: 'active',
|
|
946
|
+
isActive: true,
|
|
947
|
+
ipAddress: typedContext.ipAddress || null,
|
|
948
|
+
userAgent: typedContext.userAgent || null
|
|
949
|
+
});
|
|
950
|
+
logger.debug('Created consent', {
|
|
951
|
+
consentRecord: consentRecord.id
|
|
952
|
+
});
|
|
953
|
+
logger.debug('Creating consentRecord entry', {
|
|
954
|
+
subjectId: subject.id,
|
|
955
|
+
consentId: consentRecord.id,
|
|
956
|
+
actionType: 'consent_given',
|
|
957
|
+
details: metadata
|
|
958
|
+
});
|
|
959
|
+
const record = await tx.create('consentRecord', {
|
|
960
|
+
id: await generateUniqueId(tx, 'consentRecord', typedContext),
|
|
961
|
+
subjectId: subject.id,
|
|
962
|
+
consentId: consentRecord.id,
|
|
963
|
+
actionType: 'consent_given',
|
|
964
|
+
details: metadata
|
|
965
|
+
});
|
|
966
|
+
logger.debug('Created record entry', {
|
|
967
|
+
record: record.id
|
|
968
|
+
});
|
|
969
|
+
logger.debug('Creating audit log', {
|
|
970
|
+
subjectId: subject.id,
|
|
971
|
+
entityType: 'consent',
|
|
972
|
+
entityId: consentRecord.id,
|
|
973
|
+
actionType: 'consent_given',
|
|
974
|
+
metadata: metadata
|
|
975
|
+
});
|
|
976
|
+
await tx.create('auditLog', {
|
|
977
|
+
id: await generateUniqueId(tx, 'auditLog', typedContext),
|
|
978
|
+
subjectId: subject.id,
|
|
979
|
+
entityType: 'consent',
|
|
980
|
+
entityId: consentRecord.id,
|
|
981
|
+
actionType: 'consent_given',
|
|
982
|
+
metadata: {
|
|
983
|
+
consentId: consentRecord.id,
|
|
984
|
+
type
|
|
985
|
+
},
|
|
986
|
+
ipAddress: typedContext.ipAddress || null,
|
|
987
|
+
userAgent: typedContext.userAgent || null,
|
|
988
|
+
eventTimezone: 'UTC'
|
|
989
|
+
});
|
|
990
|
+
logger.debug('Created audit log');
|
|
991
|
+
if (!consentRecord || !record) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('CONSENT_CREATION_FAILED', {
|
|
992
|
+
data: {
|
|
993
|
+
subjectId: subject.id,
|
|
994
|
+
domain
|
|
995
|
+
}
|
|
996
|
+
});
|
|
997
|
+
return {
|
|
998
|
+
consent: consentRecord,
|
|
999
|
+
record
|
|
1000
|
+
};
|
|
1001
|
+
});
|
|
1002
|
+
return {
|
|
1003
|
+
id: result.consent.id,
|
|
1004
|
+
subjectId: subject.id,
|
|
1005
|
+
externalSubjectId: subject.externalId ?? void 0,
|
|
1006
|
+
domainId: domainRecord.id,
|
|
1007
|
+
domain: domainRecord.name,
|
|
1008
|
+
type,
|
|
1009
|
+
status: result.consent.status,
|
|
1010
|
+
recordId: result.record.id,
|
|
1011
|
+
metadata,
|
|
1012
|
+
givenAt: result.consent.givenAt
|
|
1013
|
+
};
|
|
1014
|
+
} catch (error) {
|
|
1015
|
+
logger.error('Error in post-consent handler', {
|
|
1016
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1017
|
+
errorType: error instanceof Error ? error.constructor.name : typeof error
|
|
1018
|
+
});
|
|
1019
|
+
if (error instanceof __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError) throw error;
|
|
1020
|
+
throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('INTERNAL_SERVER_ERROR', {
|
|
1021
|
+
message: error instanceof Error ? error.message : String(error)
|
|
1022
|
+
});
|
|
1023
|
+
}
|
|
1024
|
+
});
|
|
1025
|
+
function checkJurisdiction(countryCode) {
|
|
1026
|
+
const jurisdictions = {
|
|
1027
|
+
EU: new Set([
|
|
1028
|
+
'AT',
|
|
1029
|
+
'BE',
|
|
1030
|
+
'BG',
|
|
1031
|
+
'HR',
|
|
1032
|
+
'CY',
|
|
1033
|
+
'CZ',
|
|
1034
|
+
'DK',
|
|
1035
|
+
'EE',
|
|
1036
|
+
'FI',
|
|
1037
|
+
'FR',
|
|
1038
|
+
'DE',
|
|
1039
|
+
'GR',
|
|
1040
|
+
'HU',
|
|
1041
|
+
'IE',
|
|
1042
|
+
'IT',
|
|
1043
|
+
'LV',
|
|
1044
|
+
'LT',
|
|
1045
|
+
'LU',
|
|
1046
|
+
'MT',
|
|
1047
|
+
'NL',
|
|
1048
|
+
'PL',
|
|
1049
|
+
'PT',
|
|
1050
|
+
'RO',
|
|
1051
|
+
'SK',
|
|
1052
|
+
'SI',
|
|
1053
|
+
'ES',
|
|
1054
|
+
'SE'
|
|
1055
|
+
]),
|
|
1056
|
+
EEA: new Set([
|
|
1057
|
+
'IS',
|
|
1058
|
+
'NO',
|
|
1059
|
+
'LI'
|
|
1060
|
+
]),
|
|
1061
|
+
UK: new Set([
|
|
1062
|
+
'GB'
|
|
1063
|
+
]),
|
|
1064
|
+
CH: new Set([
|
|
1065
|
+
'CH'
|
|
1066
|
+
]),
|
|
1067
|
+
BR: new Set([
|
|
1068
|
+
'BR'
|
|
1069
|
+
]),
|
|
1070
|
+
CA: new Set([
|
|
1071
|
+
'CA'
|
|
1072
|
+
]),
|
|
1073
|
+
AU: new Set([
|
|
1074
|
+
'AU'
|
|
1075
|
+
]),
|
|
1076
|
+
JP: new Set([
|
|
1077
|
+
'JP'
|
|
1078
|
+
]),
|
|
1079
|
+
KR: new Set([
|
|
1080
|
+
'KR'
|
|
1081
|
+
])
|
|
1082
|
+
};
|
|
1083
|
+
let showConsentBanner = true;
|
|
1084
|
+
let jurisdictionCode = 'NONE';
|
|
1085
|
+
if (countryCode) {
|
|
1086
|
+
const normalizedCountryCode = countryCode.toUpperCase();
|
|
1087
|
+
showConsentBanner = false;
|
|
1088
|
+
const jurisdictionMap = [
|
|
1089
|
+
{
|
|
1090
|
+
sets: [
|
|
1091
|
+
jurisdictions.EU,
|
|
1092
|
+
jurisdictions.EEA,
|
|
1093
|
+
jurisdictions.UK
|
|
1094
|
+
],
|
|
1095
|
+
code: 'GDPR'
|
|
1096
|
+
},
|
|
1097
|
+
{
|
|
1098
|
+
sets: [
|
|
1099
|
+
jurisdictions.CH
|
|
1100
|
+
],
|
|
1101
|
+
code: 'CH'
|
|
1102
|
+
},
|
|
1103
|
+
{
|
|
1104
|
+
sets: [
|
|
1105
|
+
jurisdictions.BR
|
|
1106
|
+
],
|
|
1107
|
+
code: 'BR'
|
|
1108
|
+
},
|
|
1109
|
+
{
|
|
1110
|
+
sets: [
|
|
1111
|
+
jurisdictions.CA
|
|
1112
|
+
],
|
|
1113
|
+
code: 'PIPEDA'
|
|
1114
|
+
},
|
|
1115
|
+
{
|
|
1116
|
+
sets: [
|
|
1117
|
+
jurisdictions.AU
|
|
1118
|
+
],
|
|
1119
|
+
code: 'AU'
|
|
1120
|
+
},
|
|
1121
|
+
{
|
|
1122
|
+
sets: [
|
|
1123
|
+
jurisdictions.JP
|
|
1124
|
+
],
|
|
1125
|
+
code: 'APPI'
|
|
1126
|
+
},
|
|
1127
|
+
{
|
|
1128
|
+
sets: [
|
|
1129
|
+
jurisdictions.KR
|
|
1130
|
+
],
|
|
1131
|
+
code: 'PIPA'
|
|
1132
|
+
}
|
|
1133
|
+
];
|
|
1134
|
+
for (const { sets, code } of jurisdictionMap)if (sets.some((set)=>set.has(normalizedCountryCode))) {
|
|
1135
|
+
jurisdictionCode = code;
|
|
1136
|
+
showConsentBanner = true;
|
|
1137
|
+
break;
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
const message = JurisdictionMessages[jurisdictionCode];
|
|
1141
|
+
return {
|
|
1142
|
+
showConsentBanner,
|
|
1143
|
+
jurisdictionCode,
|
|
1144
|
+
message
|
|
1145
|
+
};
|
|
1146
|
+
}
|
|
1147
|
+
function isSupportedBaseLanguage(lang) {
|
|
1148
|
+
return lang in __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations;
|
|
1149
|
+
}
|
|
1150
|
+
function getPreferredLanguage(acceptLanguage, supportedLanguages) {
|
|
1151
|
+
if (!acceptLanguage) return 'en';
|
|
1152
|
+
const primaryLang = acceptLanguage.split(',')[0]?.split(';')[0]?.split('-')[0]?.toLowerCase();
|
|
1153
|
+
if (primaryLang && supportedLanguages.includes(primaryLang)) return primaryLang;
|
|
1154
|
+
return 'en';
|
|
1155
|
+
}
|
|
1156
|
+
function getTranslations(acceptLanguage, customTranslations) {
|
|
1157
|
+
const supportedDefaultLanguages = Object.keys(__WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations);
|
|
1158
|
+
const supportedCustomLanguages = Object.keys(customTranslations || {});
|
|
1159
|
+
const supportedLanguages = [
|
|
1160
|
+
...supportedDefaultLanguages,
|
|
1161
|
+
...supportedCustomLanguages
|
|
1162
|
+
];
|
|
1163
|
+
const preferredLanguage = getPreferredLanguage(acceptLanguage, supportedLanguages);
|
|
1164
|
+
const base = isSupportedBaseLanguage(preferredLanguage) ? __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations[preferredLanguage] : __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations.en;
|
|
1165
|
+
const custom = supportedCustomLanguages.includes(preferredLanguage) ? customTranslations?.[preferredLanguage] : {};
|
|
1166
|
+
const translations = custom ? (0, __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.deepMergeTranslations)(base, custom) : base;
|
|
1167
|
+
return {
|
|
1168
|
+
translations: translations,
|
|
1169
|
+
language: preferredLanguage
|
|
1170
|
+
};
|
|
1171
|
+
}
|
|
1172
|
+
function getHeaders(headers) {
|
|
1173
|
+
if (!headers) return {
|
|
1174
|
+
countryCode: null,
|
|
1175
|
+
regionCode: null,
|
|
1176
|
+
acceptLanguage: null
|
|
1177
|
+
};
|
|
1178
|
+
const normalizeHeader = (value)=>{
|
|
1179
|
+
if (!value) return null;
|
|
1180
|
+
return Array.isArray(value) ? value[0] ?? null : value;
|
|
1181
|
+
};
|
|
1182
|
+
const countryCode = normalizeHeader(headers.get('x-c15t-country')) ?? normalizeHeader(headers.get('cf-ipcountry')) ?? normalizeHeader(headers.get('x-vercel-ip-country')) ?? normalizeHeader(headers.get('x-amz-cf-ipcountry')) ?? normalizeHeader(headers.get('x-country-code'));
|
|
1183
|
+
const regionCode = normalizeHeader(headers.get('x-c15t-region')) ?? normalizeHeader(headers.get('x-vercel-ip-country-region')) ?? normalizeHeader(headers.get('x-region-code'));
|
|
1184
|
+
const acceptLanguage = normalizeHeader(headers.get('accept-language'));
|
|
1185
|
+
return {
|
|
1186
|
+
countryCode,
|
|
1187
|
+
regionCode,
|
|
1188
|
+
acceptLanguage
|
|
1189
|
+
};
|
|
1190
|
+
}
|
|
1191
|
+
function buildResponse({ shouldShowBanner, jurisdiction, location, acceptLanguage, customTranslations, branding = 'c15t' }) {
|
|
1192
|
+
return {
|
|
1193
|
+
showConsentBanner: shouldShowBanner,
|
|
1194
|
+
jurisdiction,
|
|
1195
|
+
location,
|
|
1196
|
+
translations: getTranslations(acceptLanguage, customTranslations),
|
|
1197
|
+
branding: branding
|
|
1198
|
+
};
|
|
1199
|
+
}
|
|
1200
|
+
const handler_showConsentBanner = os.consent.showBanner.handler(({ context })=>{
|
|
1201
|
+
const typedContext = context;
|
|
1202
|
+
const { customTranslations, disableGeoLocation, branding } = typedContext.advanced ?? {};
|
|
1203
|
+
const { countryCode, regionCode, acceptLanguage } = getHeaders(typedContext.headers);
|
|
1204
|
+
if (disableGeoLocation) return buildResponse({
|
|
1205
|
+
shouldShowBanner: true,
|
|
1206
|
+
jurisdiction: {
|
|
1207
|
+
code: 'NONE',
|
|
1208
|
+
message: JurisdictionMessages.NONE
|
|
1209
|
+
},
|
|
1210
|
+
location: {
|
|
1211
|
+
countryCode: null,
|
|
1212
|
+
regionCode: null
|
|
1213
|
+
},
|
|
1214
|
+
acceptLanguage,
|
|
1215
|
+
customTranslations,
|
|
1216
|
+
branding
|
|
1217
|
+
});
|
|
1218
|
+
const { showConsentBanner, jurisdictionCode, message } = checkJurisdiction(countryCode);
|
|
1219
|
+
return buildResponse({
|
|
1220
|
+
shouldShowBanner: showConsentBanner,
|
|
1221
|
+
jurisdiction: {
|
|
1222
|
+
code: jurisdictionCode,
|
|
1223
|
+
message
|
|
1224
|
+
},
|
|
1225
|
+
location: {
|
|
1226
|
+
countryCode,
|
|
1227
|
+
regionCode
|
|
1228
|
+
},
|
|
1229
|
+
acceptLanguage,
|
|
1230
|
+
customTranslations,
|
|
1231
|
+
branding
|
|
1232
|
+
});
|
|
1233
|
+
});
|
|
1234
|
+
const verifyConsent = os.consent.verify.handler(async ({ input, context })=>{
|
|
1235
|
+
const typedContext = context;
|
|
1236
|
+
const logger = typedContext.logger;
|
|
1237
|
+
logger.info('Handling verify-consent request');
|
|
1238
|
+
const { type, subjectId, externalSubjectId, domain, policyId, preferences } = input;
|
|
1239
|
+
logger.debug('Request parameters', {
|
|
1240
|
+
type,
|
|
1241
|
+
subjectId,
|
|
1242
|
+
externalSubjectId,
|
|
1243
|
+
domain,
|
|
1244
|
+
policyId,
|
|
1245
|
+
preferences
|
|
1246
|
+
});
|
|
1247
|
+
try {
|
|
1248
|
+
const domainRecord = await typedContext.registry.findDomainByName(domain);
|
|
1249
|
+
if (!domainRecord) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('DOMAIN_NOT_FOUND', {
|
|
1250
|
+
data: {
|
|
1251
|
+
domain
|
|
1252
|
+
}
|
|
1253
|
+
});
|
|
1254
|
+
const subject = await typedContext.registry.findOrCreateSubject({
|
|
1255
|
+
subjectId,
|
|
1256
|
+
externalSubjectId,
|
|
1257
|
+
ipAddress: typedContext.ipAddress ?? 'unknown'
|
|
1258
|
+
});
|
|
1259
|
+
if (!subject) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('SUBJECT_NOT_FOUND', {
|
|
1260
|
+
data: {
|
|
1261
|
+
subjectId,
|
|
1262
|
+
externalSubjectId
|
|
1263
|
+
}
|
|
1264
|
+
});
|
|
1265
|
+
if ('cookie_banner' === type && (!preferences || 0 === preferences.length)) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('COOKIE_BANNER_PREFERENCES_REQUIRED', {
|
|
1266
|
+
data: {
|
|
1267
|
+
type: 'cookie_banner'
|
|
1268
|
+
}
|
|
1269
|
+
});
|
|
1270
|
+
const purposePromises = preferences?.map((purpose)=>typedContext.registry.findOrCreateConsentPurposeByCode(purpose));
|
|
1271
|
+
const rawPurposes = await Promise.all(purposePromises ?? []);
|
|
1272
|
+
const purposeIds = rawPurposes.filter((purpose)=>null !== purpose).map((purpose)=>purpose.id);
|
|
1273
|
+
if (purposeIds.length !== (preferences?.length ?? 0)) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('PURPOSES_NOT_FOUND', {
|
|
1274
|
+
data: {
|
|
1275
|
+
preferences: preferences ?? [],
|
|
1276
|
+
foundPurposes: rawPurposes.filter((p)=>null !== p).map((p)=>p.code)
|
|
1277
|
+
}
|
|
1278
|
+
});
|
|
1279
|
+
if (policyId) {
|
|
1280
|
+
const policy = await typedContext.registry.findConsentPolicyById(policyId);
|
|
1281
|
+
if (!policy || policy.type !== type) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_NOT_FOUND', {
|
|
1282
|
+
data: {
|
|
1283
|
+
policyId,
|
|
1284
|
+
type
|
|
1285
|
+
}
|
|
1286
|
+
});
|
|
1287
|
+
return await checkPolicyConsent({
|
|
1288
|
+
policyId: policy.id,
|
|
1289
|
+
subjectId: subject.id,
|
|
1290
|
+
domainId: domainRecord.id,
|
|
1291
|
+
purposeIds,
|
|
1292
|
+
type,
|
|
1293
|
+
context: typedContext
|
|
1294
|
+
});
|
|
1295
|
+
}
|
|
1296
|
+
const latestPolicy = await typedContext.registry.findOrCreatePolicy(type);
|
|
1297
|
+
if (!latestPolicy) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_NOT_FOUND', {
|
|
1298
|
+
data: {
|
|
1299
|
+
policyId: 'latest',
|
|
1300
|
+
type
|
|
1301
|
+
}
|
|
1302
|
+
});
|
|
1303
|
+
return await checkPolicyConsent({
|
|
1304
|
+
policyId: latestPolicy.id,
|
|
1305
|
+
subjectId: subject.id,
|
|
1306
|
+
domainId: domainRecord.id,
|
|
1307
|
+
purposeIds,
|
|
1308
|
+
type,
|
|
1309
|
+
context: typedContext
|
|
1310
|
+
});
|
|
1311
|
+
} catch (error) {
|
|
1312
|
+
logger.error('Error in verify-consent handler', {
|
|
1313
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1314
|
+
errorType: error instanceof Error ? error.constructor.name : typeof error
|
|
1315
|
+
});
|
|
1316
|
+
if (error instanceof __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError) throw error;
|
|
1317
|
+
throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('INTERNAL_SERVER_ERROR', {
|
|
1318
|
+
message: error instanceof Error ? error.message : String(error)
|
|
1319
|
+
});
|
|
1320
|
+
}
|
|
1321
|
+
});
|
|
1322
|
+
async function checkPolicyConsent({ policyId, subjectId, domainId, purposeIds, type, context }) {
|
|
1323
|
+
const { registry, db } = context;
|
|
1324
|
+
const rawConsents = await db.findMany('consent', {
|
|
1325
|
+
where: (b)=>b.and(b('subjectId', '=', subjectId), b('policyId', '=', policyId), b('domainId', '=', domainId)),
|
|
1326
|
+
orderBy: [
|
|
1327
|
+
'givenAt',
|
|
1328
|
+
'desc'
|
|
1329
|
+
]
|
|
1330
|
+
});
|
|
1331
|
+
const filteredConsents = rawConsents.filter((consent)=>{
|
|
1332
|
+
if (!purposeIds) return true;
|
|
1333
|
+
return purposeIds.every((id)=>consent.purposeIds.some((purposeId)=>purposeId === id));
|
|
1334
|
+
});
|
|
1335
|
+
await registry.createAuditLog({
|
|
1336
|
+
subjectId,
|
|
1337
|
+
entityType: 'consent_policy',
|
|
1338
|
+
entityId: policyId,
|
|
1339
|
+
actionType: 'verify_consent',
|
|
1340
|
+
metadata: {
|
|
1341
|
+
type,
|
|
1342
|
+
policyId,
|
|
1343
|
+
purposeIds,
|
|
1344
|
+
success: 0 !== filteredConsents.length,
|
|
1345
|
+
...filteredConsents.length > 0 ? {
|
|
1346
|
+
consentId: filteredConsents[0]?.id
|
|
1347
|
+
} : {}
|
|
1348
|
+
},
|
|
1349
|
+
eventTimezone: 'UTC'
|
|
1350
|
+
});
|
|
1351
|
+
if (0 === rawConsents.length || 0 === filteredConsents.length) return {
|
|
1352
|
+
isValid: false
|
|
1353
|
+
};
|
|
1354
|
+
return {
|
|
1355
|
+
isValid: true,
|
|
1356
|
+
consent: filteredConsents[0]
|
|
1357
|
+
};
|
|
1358
|
+
}
|
|
1359
|
+
const consentHandlers = {
|
|
1360
|
+
post: postConsent,
|
|
1361
|
+
showBanner: handler_showConsentBanner,
|
|
1362
|
+
verify: verifyConsent
|
|
1363
|
+
};
|
|
1364
|
+
const statusHandler = os.meta.status.handler(({ context })=>{
|
|
1365
|
+
const typedContext = context;
|
|
1366
|
+
const headers = typedContext.headers;
|
|
1367
|
+
const normalizeHeader = (value)=>{
|
|
1368
|
+
if (!value) return null;
|
|
1369
|
+
return Array.isArray(value) ? value[0] ?? null : value;
|
|
1370
|
+
};
|
|
1371
|
+
const countryCode = normalizeHeader(headers?.get('cf-ipcountry')) ?? normalizeHeader(headers?.get('x-vercel-ip-country')) ?? normalizeHeader(headers?.get('x-amz-cf-ipcountry')) ?? normalizeHeader(headers?.get('x-country-code'));
|
|
1372
|
+
const regionCode = normalizeHeader(headers?.get('x-vercel-ip-country-region')) ?? normalizeHeader(headers?.get('x-region-code'));
|
|
1373
|
+
return {
|
|
1374
|
+
status: 'ok',
|
|
1375
|
+
version: version,
|
|
1376
|
+
timestamp: new Date(),
|
|
1377
|
+
client: {
|
|
1378
|
+
ip: typedContext.ipAddress ?? null,
|
|
1379
|
+
userAgent: typedContext.userAgent ?? null,
|
|
1380
|
+
region: {
|
|
1381
|
+
countryCode,
|
|
1382
|
+
regionCode
|
|
1383
|
+
}
|
|
1384
|
+
}
|
|
1385
|
+
};
|
|
1386
|
+
});
|
|
1387
|
+
const metaHandlers = {
|
|
1388
|
+
status: statusHandler
|
|
1389
|
+
};
|
|
1390
|
+
const router = os.router({
|
|
1391
|
+
consent: consentHandlers,
|
|
1392
|
+
meta: metaHandlers
|
|
1393
|
+
});
|
|
1394
|
+
const mergeOpenAPIOptions = (defaultOptions, userOptions)=>{
|
|
1395
|
+
const merged = {
|
|
1396
|
+
...defaultOptions
|
|
1397
|
+
};
|
|
1398
|
+
if (userOptions.info && 'object' == typeof userOptions.info) merged.info = {
|
|
1399
|
+
...merged.info,
|
|
1400
|
+
...userOptions.info
|
|
1401
|
+
};
|
|
1402
|
+
for (const [key, value] of Object.entries(userOptions))if ('info' !== key) merged[key] = value;
|
|
1403
|
+
return merged;
|
|
1404
|
+
};
|
|
1405
|
+
const createOpenAPISpec = (context, options)=>{
|
|
1406
|
+
const openAPIGenerator = new __WEBPACK_EXTERNAL_MODULE__orpc_openapi_a95cc8e7__.OpenAPIGenerator({
|
|
1407
|
+
schemaConverters: [
|
|
1408
|
+
new __WEBPACK_EXTERNAL_MODULE__orpc_zod_716a28d4__.ZodToJsonSchemaConverter()
|
|
1409
|
+
]
|
|
1410
|
+
});
|
|
1411
|
+
const getOpenAPISpec = async ()=>{
|
|
1412
|
+
if (getOpenAPISpec.cached) return getOpenAPISpec.cached;
|
|
1413
|
+
const defaultOptions = createDefaultOpenAPIOptions(options);
|
|
1414
|
+
const mergedOptions = options.advanced?.openapi?.options ? mergeOpenAPIOptions(defaultOptions, options.advanced.openapi.options) : defaultOptions;
|
|
1415
|
+
try {
|
|
1416
|
+
const spec = await openAPIGenerator.generate(router, mergedOptions);
|
|
1417
|
+
getOpenAPISpec.cached = spec;
|
|
1418
|
+
return spec;
|
|
1419
|
+
} catch (error) {
|
|
1420
|
+
context.logger?.error('Failed to generate OpenAPI spec:', error);
|
|
1421
|
+
return {
|
|
1422
|
+
openapi: '3.0.0',
|
|
1423
|
+
info: {
|
|
1424
|
+
title: options.appName || 'c15t API',
|
|
1425
|
+
version: '0.0.0'
|
|
1426
|
+
},
|
|
1427
|
+
paths: {}
|
|
1428
|
+
};
|
|
1429
|
+
}
|
|
1430
|
+
};
|
|
1431
|
+
return getOpenAPISpec;
|
|
1432
|
+
};
|
|
1433
|
+
const createDocsUI = (options)=>{
|
|
1434
|
+
const config = createOpenAPIConfig(options);
|
|
1435
|
+
if (config.customUiTemplate) return config.customUiTemplate;
|
|
1436
|
+
return `
|
|
1437
|
+
<!doctype html>
|
|
1438
|
+
<html>
|
|
1439
|
+
<head>
|
|
1440
|
+
<title>${options.appName || 'c15t API'} Documentation</title>
|
|
1441
|
+
<meta charset="utf-8" />
|
|
1442
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
1443
|
+
<link rel="icon" type="image/svg+xml" href="https://c15t.com/icon.svg" />
|
|
1444
|
+
</head>
|
|
1445
|
+
<body>
|
|
1446
|
+
<script
|
|
1447
|
+
id="api-reference"
|
|
1448
|
+
data-url="${encodeURI(config.specPath)}">
|
|
1449
|
+
</script>
|
|
1450
|
+
<script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>
|
|
1451
|
+
</body>
|
|
1452
|
+
</html>
|
|
1453
|
+
`;
|
|
1454
|
+
};
|
|
1455
|
+
const DEFAULT_IP_HEADERS = [
|
|
1456
|
+
'x-client-ip',
|
|
1457
|
+
'x-forwarded-for',
|
|
1458
|
+
'cf-connecting-ip',
|
|
1459
|
+
'fastly-client-ip',
|
|
1460
|
+
'x-real-ip',
|
|
1461
|
+
'x-cluster-client-ip',
|
|
1462
|
+
'x-forwarded',
|
|
1463
|
+
'forwarded-for',
|
|
1464
|
+
'forwarded'
|
|
1465
|
+
];
|
|
1466
|
+
function getIpAddress(req, options) {
|
|
1467
|
+
const ipAddress = options.advanced?.ipAddress;
|
|
1468
|
+
if (ipAddress?.disableIpTracking) return 'unknown';
|
|
1469
|
+
const ipHeaders = ipAddress?.ipAddressHeaders || DEFAULT_IP_HEADERS;
|
|
1470
|
+
const headers = req instanceof Request ? req.headers : req;
|
|
1471
|
+
for (const key of ipHeaders){
|
|
1472
|
+
const value = headers.get(key);
|
|
1473
|
+
if (value) {
|
|
1474
|
+
const ip = value.split(',')[0]?.trim();
|
|
1475
|
+
if (ip) return ip;
|
|
1476
|
+
}
|
|
1477
|
+
}
|
|
1478
|
+
return 'unknown';
|
|
1479
|
+
}
|
|
1480
|
+
const generate_id_prefixes = {
|
|
1481
|
+
auditLog: 'log',
|
|
1482
|
+
consent: 'cns',
|
|
1483
|
+
consentPolicy: 'pol',
|
|
1484
|
+
consentPurpose: 'pur',
|
|
1485
|
+
consentRecord: 'rec',
|
|
1486
|
+
domain: 'dom',
|
|
1487
|
+
subject: 'sub'
|
|
1488
|
+
};
|
|
1489
|
+
const generate_id_b58 = (0, __WEBPACK_EXTERNAL_MODULE_base_x_aeb88370__["default"])('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
|
|
1490
|
+
function generate_id_generateId(model) {
|
|
1491
|
+
const buf = crypto.getRandomValues(new Uint8Array(20));
|
|
1492
|
+
const prefix = generate_id_prefixes[model];
|
|
1493
|
+
const EPOCH_TIMESTAMP = 1700000000000;
|
|
1494
|
+
const t = Date.now() - EPOCH_TIMESTAMP;
|
|
1495
|
+
const high = Math.floor(t / 0x100000000);
|
|
1496
|
+
const low = t >>> 0;
|
|
1497
|
+
buf[0] = high >>> 24 & 255;
|
|
1498
|
+
buf[1] = high >>> 16 & 255;
|
|
1499
|
+
buf[2] = high >>> 8 & 255;
|
|
1500
|
+
buf[3] = 255 & high;
|
|
1501
|
+
buf[4] = low >>> 24 & 255;
|
|
1502
|
+
buf[5] = low >>> 16 & 255;
|
|
1503
|
+
buf[6] = low >>> 8 & 255;
|
|
1504
|
+
buf[7] = 255 & low;
|
|
1505
|
+
return `${prefix}_${generate_id_b58.encode(buf)}`;
|
|
1506
|
+
}
|
|
1507
|
+
async function generate_id_generateUniqueId(db, model, ctx, options = {}) {
|
|
1508
|
+
const { maxRetries = 10, attempt = 0, baseDelay = 5 } = options;
|
|
1509
|
+
if (attempt >= maxRetries) {
|
|
1510
|
+
const error = new Error(`Failed to generate unique ID for ${model} after ${maxRetries} attempts`);
|
|
1511
|
+
ctx?.logger?.error?.('ID generation failed', {
|
|
1512
|
+
model,
|
|
1513
|
+
maxRetries
|
|
1514
|
+
});
|
|
1515
|
+
throw error;
|
|
1516
|
+
}
|
|
1517
|
+
const id = generate_id_generateId(model);
|
|
1518
|
+
try {
|
|
1519
|
+
const existing = await db.findFirst(model, {
|
|
1520
|
+
where: (b)=>b('id', '=', id)
|
|
1521
|
+
});
|
|
1522
|
+
if (existing) {
|
|
1523
|
+
ctx?.logger?.debug?.('ID conflict detected', {
|
|
1524
|
+
id,
|
|
1525
|
+
model,
|
|
1526
|
+
attempt: attempt + 1,
|
|
1527
|
+
maxRetries
|
|
1528
|
+
});
|
|
1529
|
+
const delay = Math.min(baseDelay * 2 ** attempt, 1000);
|
|
1530
|
+
await new Promise((resolve)=>setTimeout(resolve, delay));
|
|
1531
|
+
return generate_id_generateUniqueId(db, model, ctx, {
|
|
1532
|
+
maxRetries,
|
|
1533
|
+
attempt: attempt + 1,
|
|
1534
|
+
baseDelay
|
|
1535
|
+
});
|
|
1536
|
+
}
|
|
1537
|
+
return id;
|
|
1538
|
+
} catch (error) {
|
|
1539
|
+
ctx?.logger?.error?.('Error checking ID uniqueness', {
|
|
1540
|
+
error: error.message,
|
|
1541
|
+
model,
|
|
1542
|
+
attempt
|
|
1543
|
+
});
|
|
1544
|
+
if (attempt < maxRetries - 1) {
|
|
1545
|
+
const delay = Math.min(baseDelay * 2 ** attempt, 2000);
|
|
1546
|
+
await new Promise((resolve)=>setTimeout(resolve, delay));
|
|
1547
|
+
return generate_id_generateUniqueId(db, model, ctx, {
|
|
1548
|
+
maxRetries,
|
|
1549
|
+
attempt: attempt + 1,
|
|
1550
|
+
baseDelay
|
|
1551
|
+
});
|
|
1552
|
+
}
|
|
1553
|
+
throw error;
|
|
1554
|
+
}
|
|
1555
|
+
}
|
|
1556
|
+
function auditLogRegistry({ db, ctx }) {
|
|
1557
|
+
const logger = ctx?.logger ?? {
|
|
1558
|
+
debug: ()=>void 0,
|
|
1559
|
+
error: ()=>void 0
|
|
1560
|
+
};
|
|
1561
|
+
return {
|
|
1562
|
+
createAuditLog: async (auditLog)=>{
|
|
1563
|
+
logger.debug('Creating audit log', {
|
|
1564
|
+
auditLog
|
|
1565
|
+
});
|
|
1566
|
+
const createdLog = await db.create('auditLog', {
|
|
1567
|
+
id: await generate_id_generateUniqueId(db, 'auditLog', ctx),
|
|
1568
|
+
createdAt: new Date(),
|
|
1569
|
+
...auditLog
|
|
1570
|
+
});
|
|
1571
|
+
if (!createdLog) {
|
|
1572
|
+
logger.error('Failed to create audit log', {
|
|
1573
|
+
auditLog
|
|
1574
|
+
});
|
|
1575
|
+
throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('INTERNAL_SERVER_ERROR', {
|
|
1576
|
+
message: 'Failed to create audit log',
|
|
1577
|
+
status: 500
|
|
1578
|
+
});
|
|
1579
|
+
}
|
|
1580
|
+
return createdLog;
|
|
1581
|
+
}
|
|
1582
|
+
};
|
|
1583
|
+
}
|
|
1584
|
+
function consentRegistry({ db, ctx }) {
|
|
1585
|
+
const { logger } = ctx;
|
|
1586
|
+
return {
|
|
1587
|
+
createConsent: async (consent)=>{
|
|
1588
|
+
logger.debug('Creating consent', {
|
|
1589
|
+
consent
|
|
1590
|
+
});
|
|
1591
|
+
const createdConsent = await db.create('consent', {
|
|
1592
|
+
id: await generate_id_generateUniqueId(db, 'consent', ctx),
|
|
1593
|
+
subjectId: consent.subjectId,
|
|
1594
|
+
domainId: consent.domainId,
|
|
1595
|
+
policyId: consent.policyId,
|
|
1596
|
+
purposeIds: consent.purposeIds,
|
|
1597
|
+
metadata: consent.metadata,
|
|
1598
|
+
ipAddress: consent.ipAddress,
|
|
1599
|
+
userAgent: consent.userAgent,
|
|
1600
|
+
status: consent.status,
|
|
1601
|
+
givenAt: consent.givenAt,
|
|
1602
|
+
isActive: consent.isActive
|
|
1603
|
+
});
|
|
1604
|
+
if (!createdConsent) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('CONSENT_CREATION_FAILED', {
|
|
1605
|
+
message: 'Failed to create consent - operation returned null',
|
|
1606
|
+
status: 500,
|
|
1607
|
+
data: {
|
|
1608
|
+
subjectId: consent.subjectId,
|
|
1609
|
+
domainId: consent.domainId
|
|
1610
|
+
}
|
|
1611
|
+
});
|
|
1612
|
+
return createdConsent;
|
|
1613
|
+
}
|
|
1614
|
+
};
|
|
1615
|
+
}
|
|
1616
|
+
function policyRegistry({ db, ctx }) {
|
|
1617
|
+
const { logger } = ctx;
|
|
1618
|
+
async function generatePolicyPlaceholder(name, date) {
|
|
1619
|
+
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()}`;
|
|
1620
|
+
let contentHash;
|
|
1621
|
+
try {
|
|
1622
|
+
const encoder = new TextEncoder();
|
|
1623
|
+
const data = encoder.encode(content);
|
|
1624
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
|
|
1625
|
+
contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
|
|
1626
|
+
} catch {
|
|
1627
|
+
throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_CREATION_FAILED', {
|
|
1628
|
+
message: 'Failed to generate policy content hash',
|
|
1629
|
+
status: 500,
|
|
1630
|
+
data: {
|
|
1631
|
+
name
|
|
1632
|
+
}
|
|
1633
|
+
});
|
|
1634
|
+
}
|
|
1635
|
+
return {
|
|
1636
|
+
content,
|
|
1637
|
+
contentHash
|
|
1638
|
+
};
|
|
1639
|
+
}
|
|
1640
|
+
return {
|
|
1641
|
+
findConsentPolicyById: async (policyId)=>{
|
|
1642
|
+
const policy = await db.findFirst('consentPolicy', {
|
|
1643
|
+
where: (b)=>b('id', '=', policyId)
|
|
1644
|
+
});
|
|
1645
|
+
return policy;
|
|
1646
|
+
},
|
|
1647
|
+
findOrCreatePolicy: async (type)=>{
|
|
1648
|
+
const existingPolicy = await db.findFirst('consentPolicy', {
|
|
1649
|
+
where: (b)=>b.and(b('isActive', '=', true), b('type', '=', type)),
|
|
1650
|
+
orderBy: [
|
|
1651
|
+
'effectiveDate',
|
|
1652
|
+
'desc'
|
|
1653
|
+
]
|
|
1654
|
+
});
|
|
1655
|
+
if (existingPolicy) {
|
|
1656
|
+
logger.debug('Found existing policy', {
|
|
1657
|
+
type,
|
|
1658
|
+
policyId: existingPolicy.id
|
|
1659
|
+
});
|
|
1660
|
+
return existingPolicy;
|
|
1661
|
+
}
|
|
1662
|
+
const { content, contentHash } = await generatePolicyPlaceholder(type, new Date());
|
|
1663
|
+
const policy = await db.create('consentPolicy', {
|
|
1664
|
+
id: await generate_id_generateUniqueId(db, 'consentPolicy', ctx),
|
|
1665
|
+
version: '1.0.0',
|
|
1666
|
+
type,
|
|
1667
|
+
name: type,
|
|
1668
|
+
effectiveDate: new Date(),
|
|
1669
|
+
content,
|
|
1670
|
+
contentHash,
|
|
1671
|
+
isActive: true,
|
|
1672
|
+
expirationDate: null
|
|
1673
|
+
});
|
|
1674
|
+
return policy;
|
|
1675
|
+
}
|
|
1676
|
+
};
|
|
1677
|
+
}
|
|
1678
|
+
function consentPurposeRegistry({ db, ctx }) {
|
|
1679
|
+
const { logger } = ctx;
|
|
1680
|
+
return {
|
|
1681
|
+
findOrCreateConsentPurposeByCode: async (code)=>{
|
|
1682
|
+
const existingPurpose = await db.findFirst('consentPurpose', {
|
|
1683
|
+
where: (b)=>b('code', '=', code)
|
|
1684
|
+
});
|
|
1685
|
+
if (existingPurpose) {
|
|
1686
|
+
logger.debug('Found existing consent purpose', {
|
|
1687
|
+
code
|
|
1688
|
+
});
|
|
1689
|
+
return existingPurpose;
|
|
1690
|
+
}
|
|
1691
|
+
logger.debug('Creating consent purpose', {
|
|
1692
|
+
code
|
|
1693
|
+
});
|
|
1694
|
+
const createdPurpose = await db.create('consentPurpose', {
|
|
1695
|
+
id: await generate_id_generateUniqueId(db, 'consentPurpose', ctx),
|
|
1696
|
+
code,
|
|
1697
|
+
name: code,
|
|
1698
|
+
description: `Auto-created consentPurpose for ${code}`,
|
|
1699
|
+
isActive: true,
|
|
1700
|
+
isEssential: false,
|
|
1701
|
+
legalBasis: 'consent'
|
|
1702
|
+
});
|
|
1703
|
+
if (!createdPurpose) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('PURPOSE_CREATION_FAILED', {
|
|
1704
|
+
message: 'Failed to create consent purpose',
|
|
1705
|
+
status: 500,
|
|
1706
|
+
data: {
|
|
1707
|
+
purposeCode: code
|
|
1708
|
+
}
|
|
1709
|
+
});
|
|
1710
|
+
return createdPurpose;
|
|
1711
|
+
}
|
|
1712
|
+
};
|
|
1713
|
+
}
|
|
1714
|
+
function domainRegistry({ db, ctx }) {
|
|
1715
|
+
const { logger } = ctx;
|
|
1716
|
+
const findDomainByName = async (name)=>{
|
|
1717
|
+
const domain = await db.findFirst('domain', {
|
|
1718
|
+
where: (b)=>b('name', '=', name)
|
|
1719
|
+
});
|
|
1720
|
+
if (!domain) logger.debug('No domain found', {
|
|
1721
|
+
name
|
|
1722
|
+
});
|
|
1723
|
+
return domain;
|
|
1724
|
+
};
|
|
1725
|
+
return {
|
|
1726
|
+
findDomainByName,
|
|
1727
|
+
findOrCreateDomain: async (name)=>{
|
|
1728
|
+
const existingDomain = await findDomainByName(name);
|
|
1729
|
+
if (existingDomain) {
|
|
1730
|
+
logger.debug('Found existing domain', {
|
|
1731
|
+
name
|
|
1732
|
+
});
|
|
1733
|
+
return existingDomain;
|
|
1734
|
+
}
|
|
1735
|
+
logger.debug('Creating new domain', {
|
|
1736
|
+
name
|
|
1737
|
+
});
|
|
1738
|
+
const domain = await db.create('domain', {
|
|
1739
|
+
id: await generate_id_generateUniqueId(db, 'domain', ctx),
|
|
1740
|
+
name,
|
|
1741
|
+
description: `Auto-created domain for ${name}`,
|
|
1742
|
+
isActive: true,
|
|
1743
|
+
isVerified: true,
|
|
1744
|
+
allowedOrigins: []
|
|
1745
|
+
});
|
|
1746
|
+
if (!domain) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('DOMAIN_CREATION_FAILED', {
|
|
1747
|
+
message: 'Failed to create domain',
|
|
1748
|
+
status: 503,
|
|
1749
|
+
data: {
|
|
1750
|
+
name
|
|
1751
|
+
}
|
|
1752
|
+
});
|
|
1753
|
+
return domain;
|
|
1754
|
+
}
|
|
1755
|
+
};
|
|
1756
|
+
}
|
|
1757
|
+
function subjectRegistry({ db, ctx }) {
|
|
1758
|
+
const { logger } = ctx;
|
|
1759
|
+
return {
|
|
1760
|
+
findOrCreateSubject: async ({ subjectId, externalSubjectId, ipAddress = 'unknown' })=>{
|
|
1761
|
+
if (subjectId && externalSubjectId) {
|
|
1762
|
+
const subject = await db.findFirst('subject', {
|
|
1763
|
+
where: (b)=>b.and(b('id', '=', subjectId), b('externalId', '=', externalSubjectId))
|
|
1764
|
+
});
|
|
1765
|
+
if (!subject) {
|
|
1766
|
+
logger?.error('Subject not found', {
|
|
1767
|
+
providedSubjectId: subjectId,
|
|
1768
|
+
providedExternalId: externalSubjectId
|
|
1769
|
+
});
|
|
1770
|
+
throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('SUBJECT_NOT_FOUND', {
|
|
1771
|
+
message: 'The specified subject could not be found. Please verify the subject identifiers and try again.',
|
|
1772
|
+
status: 404,
|
|
1773
|
+
data: {
|
|
1774
|
+
providedSubjectId: subjectId,
|
|
1775
|
+
providedExternalId: externalSubjectId
|
|
1776
|
+
}
|
|
1777
|
+
});
|
|
1778
|
+
}
|
|
1779
|
+
return subject;
|
|
1780
|
+
}
|
|
1781
|
+
if (subjectId) {
|
|
1782
|
+
const subject = await db.findFirst('subject', {
|
|
1783
|
+
where: (b)=>b('id', '=', subjectId)
|
|
1784
|
+
});
|
|
1785
|
+
if (!subject) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('SUBJECT_NOT_FOUND', {
|
|
1786
|
+
message: 'Subject not found by subjectId',
|
|
1787
|
+
status: 404,
|
|
1788
|
+
data: {
|
|
1789
|
+
subjectId
|
|
1790
|
+
}
|
|
1791
|
+
});
|
|
1792
|
+
return subject;
|
|
1793
|
+
}
|
|
1794
|
+
if (externalSubjectId) {
|
|
1795
|
+
logger.debug('Finding/Creating subject with external id');
|
|
1796
|
+
await db.upsert('subject', {
|
|
1797
|
+
where: (b)=>b('externalId', '=', externalSubjectId),
|
|
1798
|
+
create: {
|
|
1799
|
+
id: await generate_id_generateUniqueId(db, 'subject', ctx),
|
|
1800
|
+
externalId: externalSubjectId,
|
|
1801
|
+
identityProvider: 'anonymous',
|
|
1802
|
+
lastIpAddress: ipAddress,
|
|
1803
|
+
isIdentified: !!externalSubjectId
|
|
1804
|
+
},
|
|
1805
|
+
update: {
|
|
1806
|
+
lastIpAddress: ipAddress
|
|
1807
|
+
}
|
|
1808
|
+
});
|
|
1809
|
+
const subject = await db.findFirst('subject', {
|
|
1810
|
+
where: (b)=>b('externalId', '=', externalSubjectId)
|
|
1811
|
+
});
|
|
1812
|
+
return subject;
|
|
1813
|
+
}
|
|
1814
|
+
logger?.debug('Creating new anonymous subject');
|
|
1815
|
+
const subject = await db.create('subject', {
|
|
1816
|
+
id: await generate_id_generateUniqueId(db, 'subject', ctx),
|
|
1817
|
+
externalId: null,
|
|
1818
|
+
identityProvider: 'anonymous',
|
|
1819
|
+
lastIpAddress: ipAddress,
|
|
1820
|
+
isIdentified: false
|
|
1821
|
+
});
|
|
1822
|
+
logger.debug('Created new anonymous subject', {
|
|
1823
|
+
subject
|
|
1824
|
+
});
|
|
1825
|
+
return subject;
|
|
1826
|
+
}
|
|
1827
|
+
};
|
|
1828
|
+
}
|
|
1829
|
+
const createRegistry = (ctx)=>({
|
|
1830
|
+
...auditLogRegistry(ctx),
|
|
1831
|
+
...subjectRegistry(ctx),
|
|
1832
|
+
...consentRegistry(ctx),
|
|
1833
|
+
...consentPurposeRegistry(ctx),
|
|
1834
|
+
...policyRegistry(ctx),
|
|
1835
|
+
...domainRegistry(ctx)
|
|
1836
|
+
});
|
|
1837
|
+
function createTelemetryOptions(appName = 'c15t', telemetryConfig) {
|
|
1838
|
+
const config = {
|
|
1839
|
+
disabled: telemetryConfig?.disabled ?? false,
|
|
1840
|
+
tracer: telemetryConfig?.tracer,
|
|
1841
|
+
defaultAttributes: {
|
|
1842
|
+
...telemetryConfig?.defaultAttributes || {},
|
|
1843
|
+
'service.name': String(appName),
|
|
1844
|
+
'service.version': version
|
|
1845
|
+
}
|
|
1846
|
+
};
|
|
1847
|
+
return config;
|
|
1848
|
+
}
|
|
1849
|
+
const getTracer = (options)=>{
|
|
1850
|
+
if (options?.advanced?.telemetry?.tracer) return options.advanced.telemetry.tracer;
|
|
1851
|
+
return __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__.trace.getTracer(options?.appName ?? 'c15t');
|
|
1852
|
+
};
|
|
1853
|
+
const createRequestSpan = (method, path, options)=>{
|
|
1854
|
+
if (options?.advanced?.telemetry?.disabled) return null;
|
|
1855
|
+
const tracer = getTracer(options);
|
|
1856
|
+
const span = tracer.startSpan(`${method} ${path}`, {
|
|
1857
|
+
attributes: {
|
|
1858
|
+
'http.method': method,
|
|
1859
|
+
'http.path': path,
|
|
1860
|
+
...options?.advanced?.telemetry?.defaultAttributes || {}
|
|
1861
|
+
}
|
|
1862
|
+
});
|
|
1863
|
+
return span;
|
|
1864
|
+
};
|
|
1865
|
+
const withRequestSpan = async (method, path, operation, options)=>{
|
|
1866
|
+
const span = createRequestSpan(method, path, options);
|
|
1867
|
+
if (!span) return operation();
|
|
1868
|
+
try {
|
|
1869
|
+
const result = await operation();
|
|
1870
|
+
span.setStatus({
|
|
1871
|
+
code: __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__.SpanStatusCode.OK
|
|
1872
|
+
});
|
|
1873
|
+
return result;
|
|
1874
|
+
} catch (error) {
|
|
1875
|
+
handleSpanError(span, error);
|
|
1876
|
+
throw error;
|
|
1877
|
+
} finally{
|
|
1878
|
+
span.end();
|
|
1879
|
+
}
|
|
1880
|
+
};
|
|
1881
|
+
const handleSpanError = (span, error)=>{
|
|
1882
|
+
span.setStatus({
|
|
1883
|
+
code: __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__.SpanStatusCode.ERROR,
|
|
1884
|
+
message: error instanceof Error ? error.message : String(error)
|
|
1885
|
+
});
|
|
1886
|
+
if (error instanceof Error) {
|
|
1887
|
+
span.setAttribute('error.type', error.name);
|
|
1888
|
+
span.setAttribute('error.message', error.message);
|
|
1889
|
+
if (error.stack) span.setAttribute('error.stack', error.stack);
|
|
1890
|
+
}
|
|
1891
|
+
};
|
|
1892
|
+
let globalLogger;
|
|
1893
|
+
function initLogger(options) {
|
|
1894
|
+
globalLogger = (0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options);
|
|
1895
|
+
return globalLogger;
|
|
1896
|
+
}
|
|
1897
|
+
let telemetrySdk;
|
|
1898
|
+
const initializeTelemetry = (appName, telemetryOptions, logger)=>{
|
|
1899
|
+
if (telemetrySdk) {
|
|
1900
|
+
logger.debug('Telemetry SDK already initialized, skipping');
|
|
1901
|
+
return true;
|
|
1902
|
+
}
|
|
1903
|
+
if (telemetryOptions?.disabled) {
|
|
1904
|
+
logger.info('Telemetry is disabled by configuration');
|
|
1905
|
+
return false;
|
|
1906
|
+
}
|
|
1907
|
+
try {
|
|
1908
|
+
const resource = (0, __WEBPACK_EXTERNAL_MODULE__opentelemetry_resources_c7ac8648__.resourceFromAttributes)({
|
|
1909
|
+
'service.name': appName,
|
|
1910
|
+
'service.version': version,
|
|
1911
|
+
...telemetryOptions?.defaultAttributes || {}
|
|
1912
|
+
});
|
|
1913
|
+
logger.debug('Initializing telemetry with resource attributes', {
|
|
1914
|
+
attributes: resource.attributes
|
|
1915
|
+
});
|
|
1916
|
+
const traceExporter = telemetryOptions?.tracer ? void 0 : new __WEBPACK_EXTERNAL_MODULE__opentelemetry_sdk_trace_base_5031a705__.ConsoleSpanExporter();
|
|
1917
|
+
telemetrySdk = new __WEBPACK_EXTERNAL_MODULE__opentelemetry_sdk_node_50b75088__.NodeSDK({
|
|
1918
|
+
resource,
|
|
1919
|
+
traceExporter
|
|
1920
|
+
});
|
|
1921
|
+
telemetrySdk.start();
|
|
1922
|
+
logger.info('Telemetry successfully initialized');
|
|
1923
|
+
return true;
|
|
1924
|
+
} catch (error) {
|
|
1925
|
+
logger.error('Telemetry initialization failed', {
|
|
1926
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1927
|
+
stack: error instanceof Error ? error.stack : void 0
|
|
1928
|
+
});
|
|
1929
|
+
logger.warn('Continuing without telemetry');
|
|
1930
|
+
return false;
|
|
1931
|
+
}
|
|
1932
|
+
};
|
|
1933
|
+
const init = (options)=>{
|
|
1934
|
+
const appName = options.appName || 'c15t';
|
|
1935
|
+
const logger = initLogger({
|
|
1936
|
+
...options.logger,
|
|
1937
|
+
appName: String(appName)
|
|
1938
|
+
});
|
|
1939
|
+
const telemetryOptions = createTelemetryOptions(String(appName), options.advanced?.telemetry);
|
|
1940
|
+
const telemetryInitialized = initializeTelemetry(String(appName), telemetryOptions, logger);
|
|
1941
|
+
if (telemetryOptions?.disabled) logger.info('Telemetry is disabled by configuration');
|
|
1942
|
+
else if (telemetryInitialized) logger.info('Telemetry initialized successfully');
|
|
1943
|
+
else logger.warn('Telemetry initialization failed, continuing without telemetry');
|
|
1944
|
+
const client = DB.client(options.adapter);
|
|
1945
|
+
const orm = client.orm('1.0.0');
|
|
1946
|
+
const context = {
|
|
1947
|
+
...options,
|
|
1948
|
+
appName,
|
|
1949
|
+
logger,
|
|
1950
|
+
db: orm,
|
|
1951
|
+
registry: createRegistry({
|
|
1952
|
+
db: orm,
|
|
1953
|
+
ctx: {
|
|
1954
|
+
logger
|
|
1955
|
+
}
|
|
1956
|
+
})
|
|
1957
|
+
};
|
|
1958
|
+
return context;
|
|
1959
|
+
};
|
|
1960
|
+
const defineConfig = (config)=>config;
|
|
1961
|
+
const c15tInstance = (options)=>{
|
|
1962
|
+
const context = init(options);
|
|
1963
|
+
const corsOptions = createCORSOptions(options.trustedOrigins);
|
|
1964
|
+
const rpcHandler = new __WEBPACK_EXTERNAL_MODULE__orpc_openapi_fetch_89b49e61__.OpenAPIHandler(router, {
|
|
1965
|
+
plugins: [
|
|
1966
|
+
new __WEBPACK_EXTERNAL_MODULE__orpc_server_plugins_e445fd4f__.CORSPlugin(corsOptions)
|
|
1967
|
+
]
|
|
1968
|
+
});
|
|
1969
|
+
const openApiConfig = createOpenAPIConfig(options);
|
|
1970
|
+
const getDocsUI = ()=>createDocsUI(options);
|
|
1971
|
+
const processTelemetry = (request, context)=>{
|
|
1972
|
+
const url = new URL(request.url);
|
|
1973
|
+
const path = url.pathname;
|
|
1974
|
+
const method = request.method;
|
|
1975
|
+
withRequestSpan(method, path, async ()=>{}, options);
|
|
1976
|
+
context.path = path;
|
|
1977
|
+
context.method = method;
|
|
1978
|
+
context.headers = request.headers;
|
|
1979
|
+
context.userAgent = request.headers.get('user-agent') || void 0;
|
|
1980
|
+
return context;
|
|
1981
|
+
};
|
|
1982
|
+
const handleOpenApiSpecRequest = async (url)=>{
|
|
1983
|
+
if (openApiConfig.enabled && url.pathname === openApiConfig.specPath) {
|
|
1984
|
+
const getOpenAPISpec = createOpenAPISpec(context, options);
|
|
1985
|
+
const spec = await getOpenAPISpec();
|
|
1986
|
+
return new Response(JSON.stringify(spec), {
|
|
1987
|
+
status: 200,
|
|
1988
|
+
headers: {
|
|
1989
|
+
'Content-Type': 'application/json'
|
|
1990
|
+
}
|
|
1991
|
+
});
|
|
1992
|
+
}
|
|
1993
|
+
return null;
|
|
1994
|
+
};
|
|
1995
|
+
const handleDocsUiRequest = (url)=>{
|
|
1996
|
+
if (openApiConfig.enabled && url.pathname === openApiConfig.docsPath) {
|
|
1997
|
+
const html = getDocsUI();
|
|
1998
|
+
return new Response(html, {
|
|
1999
|
+
status: 200,
|
|
2000
|
+
headers: {
|
|
2001
|
+
'Content-Type': 'text/html',
|
|
2002
|
+
'Content-Security-Policy': "default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net;"
|
|
2003
|
+
}
|
|
2004
|
+
});
|
|
2005
|
+
}
|
|
2006
|
+
return null;
|
|
2007
|
+
};
|
|
2008
|
+
const createORPCErrorResponse = (error)=>{
|
|
2009
|
+
const sanitizedMessage = error.message.replace(/[^\w\s.,;:!?()[\]{}'"+-]/g, '');
|
|
2010
|
+
return new Response(JSON.stringify({
|
|
2011
|
+
code: error.code,
|
|
2012
|
+
message: sanitizedMessage,
|
|
2013
|
+
data: error.data ?? {},
|
|
2014
|
+
status: error.status,
|
|
2015
|
+
defined: true
|
|
2016
|
+
}), {
|
|
2017
|
+
status: error.status,
|
|
2018
|
+
headers: {
|
|
2019
|
+
'Content-Type': 'application/json'
|
|
2020
|
+
}
|
|
2021
|
+
});
|
|
2022
|
+
};
|
|
2023
|
+
const createUnknownErrorResponse = (error)=>{
|
|
2024
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
2025
|
+
let status = 500;
|
|
2026
|
+
if (error instanceof Error && 'status' in error) {
|
|
2027
|
+
const statusValue = error.status;
|
|
2028
|
+
if ('number' == typeof statusValue && statusValue >= 100 && statusValue < 600) status = statusValue;
|
|
2029
|
+
}
|
|
2030
|
+
return new Response(JSON.stringify({
|
|
2031
|
+
code: 'INTERNAL_SERVER_ERROR',
|
|
2032
|
+
message,
|
|
2033
|
+
status,
|
|
2034
|
+
defined: true,
|
|
2035
|
+
data: {}
|
|
2036
|
+
}), {
|
|
2037
|
+
status,
|
|
2038
|
+
headers: {
|
|
2039
|
+
'Content-Type': 'application/json'
|
|
2040
|
+
}
|
|
2041
|
+
});
|
|
2042
|
+
};
|
|
2043
|
+
const handleApiRequest = async (request, ctx)=>{
|
|
2044
|
+
const { logger } = ctx;
|
|
2045
|
+
const enrichedContext = {
|
|
2046
|
+
...context,
|
|
2047
|
+
ipAddress: getIpAddress(request, options),
|
|
2048
|
+
userAgent: request.headers.get('user-agent') || void 0
|
|
2049
|
+
};
|
|
2050
|
+
processCors(request, enrichedContext, options.trustedOrigins);
|
|
2051
|
+
processTelemetry(request, enrichedContext);
|
|
2052
|
+
logger.debug?.('Handling prefix', {
|
|
2053
|
+
prefix: options.basePath || '/'
|
|
2054
|
+
});
|
|
2055
|
+
const { matched, response } = await rpcHandler.handle(request, {
|
|
2056
|
+
prefix: options.basePath || '/',
|
|
2057
|
+
context: enrichedContext
|
|
2058
|
+
});
|
|
2059
|
+
if (matched && response) {
|
|
2060
|
+
logger.debug('Handler matched', {
|
|
2061
|
+
request,
|
|
2062
|
+
matched,
|
|
2063
|
+
response
|
|
2064
|
+
});
|
|
2065
|
+
return response;
|
|
2066
|
+
}
|
|
2067
|
+
logger.debug('No handler matched', {
|
|
2068
|
+
request,
|
|
2069
|
+
matched,
|
|
2070
|
+
response
|
|
2071
|
+
});
|
|
2072
|
+
return new Response('Not Found', {
|
|
2073
|
+
status: 404
|
|
2074
|
+
});
|
|
2075
|
+
};
|
|
2076
|
+
const handler = async (request, ctxOverride)=>{
|
|
2077
|
+
try {
|
|
2078
|
+
const url = new URL(request.url);
|
|
2079
|
+
(0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options.logger)?.debug?.('Incoming request', {
|
|
2080
|
+
method: request.method,
|
|
2081
|
+
pathname: url.pathname
|
|
2082
|
+
});
|
|
2083
|
+
const openApiResponse = await handleOpenApiSpecRequest(url);
|
|
2084
|
+
if (openApiResponse) return openApiResponse;
|
|
2085
|
+
const docsResponse = handleDocsUiRequest(url);
|
|
2086
|
+
if (docsResponse) return docsResponse;
|
|
2087
|
+
const ctx = (0, __WEBPACK_EXTERNAL_MODULE_defu__["default"])(ctxOverride || {}, context);
|
|
2088
|
+
const basePath = options.basePath;
|
|
2089
|
+
(0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options.logger)?.debug?.('[c15t] Using basePath', {
|
|
2090
|
+
basePath
|
|
2091
|
+
});
|
|
2092
|
+
(0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options.logger)?.debug?.('[c15t] Routing request', {
|
|
2093
|
+
method: request.method,
|
|
2094
|
+
url: request.url,
|
|
2095
|
+
prefix: basePath
|
|
2096
|
+
});
|
|
2097
|
+
return await handleApiRequest(request, ctx);
|
|
2098
|
+
} catch (error) {
|
|
2099
|
+
const logger = options.logger ? (0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options.logger) : console;
|
|
2100
|
+
logger.error('Request handling error:', error);
|
|
2101
|
+
if (error instanceof __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError) return createORPCErrorResponse(error);
|
|
2102
|
+
return createUnknownErrorResponse(error);
|
|
2103
|
+
}
|
|
2104
|
+
};
|
|
2105
|
+
const createNextHandlers = ()=>{
|
|
2106
|
+
const nextHandler = async (request)=>await handler(request);
|
|
2107
|
+
return {
|
|
2108
|
+
GET: nextHandler,
|
|
2109
|
+
POST: nextHandler,
|
|
2110
|
+
PUT: nextHandler,
|
|
2111
|
+
PATCH: nextHandler,
|
|
2112
|
+
DELETE: nextHandler,
|
|
2113
|
+
OPTIONS: nextHandler,
|
|
2114
|
+
HEAD: nextHandler
|
|
2115
|
+
};
|
|
2116
|
+
};
|
|
2117
|
+
return {
|
|
2118
|
+
options,
|
|
2119
|
+
$context: context,
|
|
2120
|
+
router: router,
|
|
2121
|
+
handler,
|
|
2122
|
+
...createNextHandlers(),
|
|
2123
|
+
getOpenAPISpec: ()=>{
|
|
2124
|
+
const getOpenAPISpec = createOpenAPISpec(context, options);
|
|
2125
|
+
return getOpenAPISpec();
|
|
2126
|
+
},
|
|
2127
|
+
getDocsUI
|
|
2128
|
+
};
|
|
2129
|
+
};
|
|
2130
|
+
export { c15tInstance, defineConfig, version };
|