@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
|
@@ -0,0 +1,1231 @@
|
|
|
1
|
+
import * as __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__ from "@orpc/server";
|
|
2
|
+
import * as __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__ from "@orpc/contract";
|
|
3
|
+
import * as __WEBPACK_EXTERNAL_MODULE_zod__ from "zod";
|
|
4
|
+
import * as __WEBPACK_EXTERNAL_MODULE_fumadb__ from "fumadb";
|
|
5
|
+
import * as __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__ from "fumadb/schema";
|
|
6
|
+
import * as __WEBPACK_EXTERNAL_MODULE_base_x_aeb88370__ from "base-x";
|
|
7
|
+
import * as __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__ from "@c15t/translations";
|
|
8
|
+
const auditLogTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('auditLog', {
|
|
9
|
+
id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
|
|
10
|
+
entityType: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('entityType', 'string'),
|
|
11
|
+
entityId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('entityId', 'string'),
|
|
12
|
+
actionType: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('actionType', 'string'),
|
|
13
|
+
subjectId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectId', 'string').nullable(),
|
|
14
|
+
ipAddress: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('ipAddress', 'string').nullable(),
|
|
15
|
+
userAgent: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('userAgent', 'string').nullable(),
|
|
16
|
+
changes: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('changes', 'json').nullable(),
|
|
17
|
+
metadata: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('metadata', 'json').nullable(),
|
|
18
|
+
createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
|
|
19
|
+
eventTimezone: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('eventTimezone', 'string').defaultTo$(()=>'UTC')
|
|
20
|
+
});
|
|
21
|
+
__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
22
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
23
|
+
entityType: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
24
|
+
entityId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
25
|
+
actionType: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
26
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
27
|
+
ipAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
28
|
+
userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
29
|
+
changes: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
|
|
30
|
+
metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
|
|
31
|
+
createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
|
|
32
|
+
eventTimezone: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().prefault('UTC')
|
|
33
|
+
});
|
|
34
|
+
const consentTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consent', {
|
|
35
|
+
id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
|
|
36
|
+
subjectId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectId', 'string'),
|
|
37
|
+
domainId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('domainId', 'string'),
|
|
38
|
+
policyId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('policyId', 'string').nullable(),
|
|
39
|
+
purposeIds: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('purposeIds', 'json'),
|
|
40
|
+
metadata: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('metadata', 'json').nullable(),
|
|
41
|
+
ipAddress: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('ipAddress', 'string').nullable(),
|
|
42
|
+
userAgent: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('userAgent', 'string').nullable(),
|
|
43
|
+
status: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('status', 'string').defaultTo$(()=>'active'),
|
|
44
|
+
withdrawalReason: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('withdrawalReason', 'string').nullable(),
|
|
45
|
+
givenAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('givenAt', 'timestamp').defaultTo$('now'),
|
|
46
|
+
validUntil: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('validUntil', 'timestamp').nullable(),
|
|
47
|
+
isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true)
|
|
48
|
+
});
|
|
49
|
+
const consentStatusSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
|
|
50
|
+
'active',
|
|
51
|
+
'withdrawn',
|
|
52
|
+
'expired'
|
|
53
|
+
]);
|
|
54
|
+
__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
55
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
56
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
57
|
+
domainId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
58
|
+
purposeIds: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
|
|
59
|
+
metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).nullish(),
|
|
60
|
+
policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
61
|
+
ipAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
62
|
+
userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
63
|
+
status: consentStatusSchema.prefault('active'),
|
|
64
|
+
withdrawalReason: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
65
|
+
givenAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
|
|
66
|
+
validUntil: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().nullish(),
|
|
67
|
+
isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true)
|
|
68
|
+
});
|
|
69
|
+
const consentPolicyTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consentPolicy', {
|
|
70
|
+
id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
|
|
71
|
+
version: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('version', 'string'),
|
|
72
|
+
type: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('type', 'string'),
|
|
73
|
+
name: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('name', 'string'),
|
|
74
|
+
effectiveDate: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('effectiveDate', 'timestamp'),
|
|
75
|
+
expirationDate: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('expirationDate', 'timestamp').nullable(),
|
|
76
|
+
content: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('content', 'string'),
|
|
77
|
+
contentHash: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('contentHash', 'string'),
|
|
78
|
+
isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true),
|
|
79
|
+
createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now')
|
|
80
|
+
});
|
|
81
|
+
const PolicyTypeSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
|
|
82
|
+
'cookie_banner',
|
|
83
|
+
'privacy_policy',
|
|
84
|
+
'dpa',
|
|
85
|
+
'terms_and_conditions',
|
|
86
|
+
'marketing_communications',
|
|
87
|
+
'age_verification',
|
|
88
|
+
'other'
|
|
89
|
+
]);
|
|
90
|
+
__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
91
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
92
|
+
version: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
93
|
+
type: PolicyTypeSchema,
|
|
94
|
+
name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
95
|
+
effectiveDate: __WEBPACK_EXTERNAL_MODULE_zod__.z.date(),
|
|
96
|
+
expirationDate: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().nullish(),
|
|
97
|
+
content: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
98
|
+
contentHash: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
99
|
+
isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
|
|
100
|
+
createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
|
|
101
|
+
});
|
|
102
|
+
const consentPurposeTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consentPurpose', {
|
|
103
|
+
id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
|
|
104
|
+
code: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('code', 'string'),
|
|
105
|
+
name: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('name', 'string'),
|
|
106
|
+
description: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)("description", 'string'),
|
|
107
|
+
isEssential: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isEssential', 'bool'),
|
|
108
|
+
dataCategory: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('dataCategory', 'string').nullable(),
|
|
109
|
+
legalBasis: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('legalBasis', 'string').nullable(),
|
|
110
|
+
isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true),
|
|
111
|
+
createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
|
|
112
|
+
updatedAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('updatedAt', 'timestamp').defaultTo$('now')
|
|
113
|
+
});
|
|
114
|
+
__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
115
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
116
|
+
code: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
117
|
+
name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
118
|
+
description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
119
|
+
isEssential: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean(),
|
|
120
|
+
dataCategory: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
121
|
+
legalBasis: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
122
|
+
isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
|
|
123
|
+
createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
|
|
124
|
+
updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
|
|
125
|
+
});
|
|
126
|
+
const consentRecordTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consentRecord', {
|
|
127
|
+
id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
|
|
128
|
+
subjectId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectId', 'string'),
|
|
129
|
+
consentId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('consentId', 'string').nullable(),
|
|
130
|
+
actionType: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('actionType', 'string'),
|
|
131
|
+
details: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('details', 'json').nullable(),
|
|
132
|
+
createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now')
|
|
133
|
+
});
|
|
134
|
+
__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
135
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
136
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
137
|
+
consentId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
138
|
+
actionType: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
139
|
+
details: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).nullish(),
|
|
140
|
+
createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
|
|
141
|
+
});
|
|
142
|
+
const domainTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('domain', {
|
|
143
|
+
id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
|
|
144
|
+
name: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('name', 'string').unique(),
|
|
145
|
+
description: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)("description", 'string').nullable(),
|
|
146
|
+
allowedOrigins: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('allowedOrigins', 'json').nullable(),
|
|
147
|
+
isVerified: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isVerified', 'bool').defaultTo$(()=>true),
|
|
148
|
+
isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true),
|
|
149
|
+
createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
|
|
150
|
+
updatedAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('updatedAt', 'timestamp').defaultTo$('now')
|
|
151
|
+
});
|
|
152
|
+
__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
153
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
154
|
+
name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
155
|
+
description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
156
|
+
allowedOrigins: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).nullish(),
|
|
157
|
+
isVerified: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
|
|
158
|
+
isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
|
|
159
|
+
createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
|
|
160
|
+
updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
|
|
161
|
+
});
|
|
162
|
+
const subjectTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('subject', {
|
|
163
|
+
id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
|
|
164
|
+
isIdentified: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isIdentified', 'bool').defaultTo$(()=>false),
|
|
165
|
+
externalId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('externalId', 'string').nullable(),
|
|
166
|
+
identityProvider: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('identityProvider', 'string').nullable(),
|
|
167
|
+
lastIpAddress: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('lastIpAddress', 'string').nullable(),
|
|
168
|
+
subjectTimezone: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectTimezone', 'string').nullable(),
|
|
169
|
+
createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
|
|
170
|
+
updatedAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('updatedAt', 'timestamp').defaultTo$('now')
|
|
171
|
+
});
|
|
172
|
+
__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
173
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
174
|
+
isIdentified: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(false),
|
|
175
|
+
externalId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
176
|
+
identityProvider: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
177
|
+
lastIpAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
178
|
+
subjectTimezone: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
|
|
179
|
+
createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
|
|
180
|
+
updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
|
|
181
|
+
});
|
|
182
|
+
const v1 = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.schema)({
|
|
183
|
+
version: '1.0.0',
|
|
184
|
+
tables: {
|
|
185
|
+
subject: subjectTable,
|
|
186
|
+
domain: domainTable,
|
|
187
|
+
consentPolicy: consentPolicyTable,
|
|
188
|
+
consentPurpose: consentPurposeTable,
|
|
189
|
+
consent: consentTable,
|
|
190
|
+
auditLog: auditLogTable,
|
|
191
|
+
consentRecord: consentRecordTable
|
|
192
|
+
},
|
|
193
|
+
relations: {
|
|
194
|
+
subject: ({ many })=>({
|
|
195
|
+
consents: many('consent'),
|
|
196
|
+
consentRecords: many('consentRecord'),
|
|
197
|
+
auditLogs: many('auditLog')
|
|
198
|
+
}),
|
|
199
|
+
domain: ({ many })=>({
|
|
200
|
+
consents: many('consent')
|
|
201
|
+
}),
|
|
202
|
+
consentPolicy: ({ many })=>({
|
|
203
|
+
consents: many('consent')
|
|
204
|
+
}),
|
|
205
|
+
consentPurpose: ()=>({}),
|
|
206
|
+
consent: ({ one, many })=>({
|
|
207
|
+
subject: one('subject', [
|
|
208
|
+
'subjectId',
|
|
209
|
+
'id'
|
|
210
|
+
]).foreignKey(),
|
|
211
|
+
domain: one('domain', [
|
|
212
|
+
'domainId',
|
|
213
|
+
'id'
|
|
214
|
+
]).foreignKey(),
|
|
215
|
+
policy: one('consentPolicy', [
|
|
216
|
+
'policyId',
|
|
217
|
+
'id'
|
|
218
|
+
]).foreignKey(),
|
|
219
|
+
consentRecords: many('consentRecord')
|
|
220
|
+
}),
|
|
221
|
+
consentRecord: ({ one })=>({
|
|
222
|
+
subject: one('subject', [
|
|
223
|
+
'subjectId',
|
|
224
|
+
'id'
|
|
225
|
+
]).foreignKey(),
|
|
226
|
+
consent: one('consent', [
|
|
227
|
+
'consentId',
|
|
228
|
+
'id'
|
|
229
|
+
]).foreignKey()
|
|
230
|
+
}),
|
|
231
|
+
auditLog: ({ one })=>({
|
|
232
|
+
subject: one('subject', [
|
|
233
|
+
'subjectId',
|
|
234
|
+
'id'
|
|
235
|
+
]).foreignKey()
|
|
236
|
+
})
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
(0, __WEBPACK_EXTERNAL_MODULE_fumadb__.fumadb)({
|
|
240
|
+
namespace: 'c15t',
|
|
241
|
+
schemas: [
|
|
242
|
+
v1
|
|
243
|
+
]
|
|
244
|
+
});
|
|
245
|
+
const baseConsentSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
246
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
247
|
+
externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
248
|
+
domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
249
|
+
type: PolicyTypeSchema,
|
|
250
|
+
metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional()
|
|
251
|
+
});
|
|
252
|
+
const cookieBannerSchema = baseConsentSchema.extend({
|
|
253
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z.literal('cookie_banner'),
|
|
254
|
+
preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean())
|
|
255
|
+
});
|
|
256
|
+
const policyBasedSchema = baseConsentSchema.extend({
|
|
257
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
|
|
258
|
+
'privacy_policy',
|
|
259
|
+
'dpa',
|
|
260
|
+
'terms_and_conditions'
|
|
261
|
+
]),
|
|
262
|
+
policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
263
|
+
preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean()).optional()
|
|
264
|
+
});
|
|
265
|
+
const otherConsentSchema = baseConsentSchema.extend({
|
|
266
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
|
|
267
|
+
'marketing_communications',
|
|
268
|
+
'age_verification',
|
|
269
|
+
'other'
|
|
270
|
+
]),
|
|
271
|
+
preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean()).optional()
|
|
272
|
+
});
|
|
273
|
+
const postConsentContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
|
|
274
|
+
method: 'POST',
|
|
275
|
+
path: '/consent/set',
|
|
276
|
+
description: `Records a user's consent preferences and creates necessary consent records.
|
|
277
|
+
This endpoint handles various types of consent submissions:
|
|
278
|
+
|
|
279
|
+
1. Cookie Banner Consent:
|
|
280
|
+
- Records granular cookie preferences
|
|
281
|
+
- Supports multiple consent purposes
|
|
282
|
+
- Creates audit trail for compliance
|
|
283
|
+
|
|
284
|
+
2. Policy-Based Consent:
|
|
285
|
+
- Privacy Policy acceptance
|
|
286
|
+
- Data Processing Agreement (DPA) consent
|
|
287
|
+
- Terms and Conditions acceptance
|
|
288
|
+
- Links consent to specific policy versions
|
|
289
|
+
|
|
290
|
+
3. Other Consent Types:
|
|
291
|
+
- Marketing communications preferences
|
|
292
|
+
- Age verification consent
|
|
293
|
+
- Custom consent types
|
|
294
|
+
|
|
295
|
+
The endpoint performs the following operations:
|
|
296
|
+
- Creates or retrieves subject records
|
|
297
|
+
- Validates domain and policy information
|
|
298
|
+
- Creates consent records with audit trails
|
|
299
|
+
- Records consent purposes and preferences
|
|
300
|
+
- Generates audit logs for compliance
|
|
301
|
+
|
|
302
|
+
Use this endpoint to record user consent and maintain a compliant consent management system.`,
|
|
303
|
+
tags: [
|
|
304
|
+
'consent',
|
|
305
|
+
'cookie-banner'
|
|
306
|
+
]
|
|
307
|
+
}).errors({
|
|
308
|
+
INPUT_VALIDATION_FAILED: {
|
|
309
|
+
status: 422,
|
|
310
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
311
|
+
formErrors: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
|
|
312
|
+
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()))
|
|
313
|
+
}),
|
|
314
|
+
error: 'Invalid input parameters'
|
|
315
|
+
},
|
|
316
|
+
SUBJECT_CREATION_FAILED: {
|
|
317
|
+
status: 400,
|
|
318
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
319
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
320
|
+
externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional()
|
|
321
|
+
}),
|
|
322
|
+
error: 'Failed to create or find subject'
|
|
323
|
+
},
|
|
324
|
+
DOMAIN_CREATION_FAILED: {
|
|
325
|
+
status: 500,
|
|
326
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
327
|
+
domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
328
|
+
}),
|
|
329
|
+
error: 'Failed to create or find domain'
|
|
330
|
+
},
|
|
331
|
+
POLICY_NOT_FOUND: {
|
|
332
|
+
status: 404,
|
|
333
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
334
|
+
policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
335
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
336
|
+
}),
|
|
337
|
+
error: 'Policy not found'
|
|
338
|
+
},
|
|
339
|
+
POLICY_INACTIVE: {
|
|
340
|
+
status: 409,
|
|
341
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
342
|
+
policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
343
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
344
|
+
}),
|
|
345
|
+
error: 'Policy is not active'
|
|
346
|
+
},
|
|
347
|
+
POLICY_CREATION_FAILED: {
|
|
348
|
+
status: 500,
|
|
349
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
350
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
351
|
+
}),
|
|
352
|
+
error: 'Failed to create or find policy'
|
|
353
|
+
},
|
|
354
|
+
PURPOSE_CREATION_FAILED: {
|
|
355
|
+
status: 500,
|
|
356
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
357
|
+
purposeCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
358
|
+
}),
|
|
359
|
+
error: 'Failed to create consent purpose'
|
|
360
|
+
},
|
|
361
|
+
CONSENT_CREATION_FAILED: {
|
|
362
|
+
status: 500,
|
|
363
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
364
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
365
|
+
domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
366
|
+
}),
|
|
367
|
+
error: 'Failed to create consent record'
|
|
368
|
+
}
|
|
369
|
+
}).input(__WEBPACK_EXTERNAL_MODULE_zod__.z.discriminatedUnion('type', [
|
|
370
|
+
cookieBannerSchema,
|
|
371
|
+
policyBasedSchema,
|
|
372
|
+
otherConsentSchema
|
|
373
|
+
])).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
374
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
375
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
376
|
+
externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
377
|
+
domainId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
378
|
+
domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
379
|
+
type: PolicyTypeSchema,
|
|
380
|
+
status: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
381
|
+
recordId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
382
|
+
metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
|
|
383
|
+
givenAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date()
|
|
384
|
+
}));
|
|
385
|
+
const types_branding = [
|
|
386
|
+
'c15t',
|
|
387
|
+
'consent',
|
|
388
|
+
'none'
|
|
389
|
+
];
|
|
390
|
+
const JurisdictionMessages = {
|
|
391
|
+
GDPR: 'GDPR or equivalent regulations require a cookie banner.',
|
|
392
|
+
CH: 'Switzerland requires similar data protection measures.',
|
|
393
|
+
BR: "Brazil's LGPD requires consent for cookies.",
|
|
394
|
+
PIPEDA: 'PIPEDA requires consent for data collection.',
|
|
395
|
+
AU: "Australia's Privacy Act mandates transparency about data collection.",
|
|
396
|
+
APPI: "Japan's APPI requires consent for data collection.",
|
|
397
|
+
PIPA: "South Korea's PIPA requires consent for data collection.",
|
|
398
|
+
NONE: 'No specific requirements'
|
|
399
|
+
};
|
|
400
|
+
const JurisdictionCodeSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
|
|
401
|
+
'GDPR',
|
|
402
|
+
'CH',
|
|
403
|
+
'BR',
|
|
404
|
+
'PIPEDA',
|
|
405
|
+
'AU',
|
|
406
|
+
'APPI',
|
|
407
|
+
'PIPA',
|
|
408
|
+
'NONE'
|
|
409
|
+
]);
|
|
410
|
+
const JurisdictionInfoSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
411
|
+
code: JurisdictionCodeSchema,
|
|
412
|
+
message: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
413
|
+
});
|
|
414
|
+
const TitleDescriptionSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
415
|
+
title: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
416
|
+
description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
417
|
+
});
|
|
418
|
+
const TranslationsSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
419
|
+
common: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
420
|
+
acceptAll: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
421
|
+
rejectAll: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
422
|
+
customize: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
423
|
+
save: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
424
|
+
}),
|
|
425
|
+
cookieBanner: TitleDescriptionSchema,
|
|
426
|
+
consentManagerDialog: TitleDescriptionSchema,
|
|
427
|
+
consentTypes: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
428
|
+
experience: TitleDescriptionSchema,
|
|
429
|
+
functionality: TitleDescriptionSchema,
|
|
430
|
+
marketing: TitleDescriptionSchema,
|
|
431
|
+
measurement: TitleDescriptionSchema,
|
|
432
|
+
necessary: TitleDescriptionSchema
|
|
433
|
+
})
|
|
434
|
+
});
|
|
435
|
+
const showConsentBannerContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
|
|
436
|
+
method: 'GET',
|
|
437
|
+
path: '/show-consent-banner',
|
|
438
|
+
description: `Determines if a user should see a consent banner based on their location and applicable privacy regulations.
|
|
439
|
+
This endpoint performs the following checks:
|
|
440
|
+
|
|
441
|
+
1. Detects the user's location using various header information:
|
|
442
|
+
- Cloudflare country headers
|
|
443
|
+
- Vercel IP country headers
|
|
444
|
+
- AWS CloudFront headers
|
|
445
|
+
- Custom country code headers
|
|
446
|
+
|
|
447
|
+
2. Determines the applicable jurisdiction based on the location:
|
|
448
|
+
- GDPR (EU/EEA/UK)
|
|
449
|
+
- Swiss Data Protection Act
|
|
450
|
+
- LGPD (Brazil)
|
|
451
|
+
- PIPEDA (Canada)
|
|
452
|
+
- Australian Privacy Principles
|
|
453
|
+
- APPI (Japan)
|
|
454
|
+
- PIPA (South Korea)
|
|
455
|
+
|
|
456
|
+
3. Returns detailed information about:
|
|
457
|
+
- Whether to show the consent banner
|
|
458
|
+
- The applicable jurisdiction and its requirements
|
|
459
|
+
- The user's detected location (country and region)
|
|
460
|
+
|
|
461
|
+
Use this endpoint to implement geo-targeted consent banners and ensure compliance with regional privacy regulations.`,
|
|
462
|
+
tags: [
|
|
463
|
+
'cookie-banner'
|
|
464
|
+
]
|
|
465
|
+
}).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
466
|
+
showConsentBanner: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean(),
|
|
467
|
+
jurisdiction: JurisdictionInfoSchema,
|
|
468
|
+
location: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
469
|
+
countryCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
|
|
470
|
+
regionCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable()
|
|
471
|
+
}),
|
|
472
|
+
translations: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
473
|
+
language: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
474
|
+
translations: TranslationsSchema
|
|
475
|
+
}),
|
|
476
|
+
branding: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"](types_branding)
|
|
477
|
+
}));
|
|
478
|
+
const verifyConsentInputSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.strictObject({
|
|
479
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
480
|
+
externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
481
|
+
domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
482
|
+
type: PolicyTypeSchema,
|
|
483
|
+
policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
484
|
+
preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).optional()
|
|
485
|
+
});
|
|
486
|
+
const verify_contract_consentSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.looseObject({
|
|
487
|
+
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
488
|
+
purposeIds: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string())
|
|
489
|
+
});
|
|
490
|
+
const verifyConsentContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
|
|
491
|
+
method: 'POST',
|
|
492
|
+
path: '/consent/verify',
|
|
493
|
+
description: `Verifies if a user has given valid consent for a specific policy and domain.
|
|
494
|
+
This endpoint performs comprehensive consent verification by:
|
|
495
|
+
|
|
496
|
+
1. Validating the subject's identity (using subjectId or externalSubjectId)
|
|
497
|
+
2. Verifying the domain's existence and validity
|
|
498
|
+
3. Checking if the specified policy exists and is active
|
|
499
|
+
4. Validating that all required purposes have been consented to
|
|
500
|
+
5. Ensuring the consent record is current and valid
|
|
501
|
+
|
|
502
|
+
The endpoint supports different types of consent verification:
|
|
503
|
+
- Cookie banner consent verification
|
|
504
|
+
- Privacy policy consent verification
|
|
505
|
+
- Terms and conditions verification
|
|
506
|
+
- Marketing communications consent verification
|
|
507
|
+
- Age verification
|
|
508
|
+
- Custom consent types
|
|
509
|
+
|
|
510
|
+
Use this endpoint to ensure compliance with privacy regulations and to verify user consent before processing personal data.`,
|
|
511
|
+
tags: [
|
|
512
|
+
'consent'
|
|
513
|
+
]
|
|
514
|
+
}).errors({
|
|
515
|
+
INPUT_VALIDATION_FAILED: {
|
|
516
|
+
status: 422,
|
|
517
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
518
|
+
formErrors: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
|
|
519
|
+
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())
|
|
520
|
+
}),
|
|
521
|
+
error: 'Invalid input parameters'
|
|
522
|
+
},
|
|
523
|
+
SUBJECT_NOT_FOUND: {
|
|
524
|
+
status: 404,
|
|
525
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
526
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
|
|
527
|
+
externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional()
|
|
528
|
+
}),
|
|
529
|
+
error: 'Subject not found'
|
|
530
|
+
},
|
|
531
|
+
DOMAIN_NOT_FOUND: {
|
|
532
|
+
status: 404,
|
|
533
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
534
|
+
domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
535
|
+
}),
|
|
536
|
+
error: 'Domain not found'
|
|
537
|
+
},
|
|
538
|
+
POLICY_NOT_FOUND: {
|
|
539
|
+
status: 404,
|
|
540
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
541
|
+
policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
542
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
543
|
+
}),
|
|
544
|
+
error: 'Policy not found or invalid'
|
|
545
|
+
},
|
|
546
|
+
PURPOSES_NOT_FOUND: {
|
|
547
|
+
status: 404,
|
|
548
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
549
|
+
preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
|
|
550
|
+
foundPurposes: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string())
|
|
551
|
+
}),
|
|
552
|
+
error: 'Could not find all specified purposes'
|
|
553
|
+
},
|
|
554
|
+
COOKIE_BANNER_PREFERENCES_REQUIRED: {
|
|
555
|
+
status: 400,
|
|
556
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
557
|
+
type: __WEBPACK_EXTERNAL_MODULE_zod__.z.literal('cookie_banner')
|
|
558
|
+
}),
|
|
559
|
+
error: 'Preferences are required for cookie banner consent'
|
|
560
|
+
},
|
|
561
|
+
NO_CONSENT_FOUND: {
|
|
562
|
+
status: 404,
|
|
563
|
+
data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
564
|
+
policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
565
|
+
subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
566
|
+
domainId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
|
|
567
|
+
}),
|
|
568
|
+
error: 'No consent found for the given policy'
|
|
569
|
+
}
|
|
570
|
+
}).input(verifyConsentInputSchema).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
571
|
+
isValid: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean(),
|
|
572
|
+
reasons: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).optional(),
|
|
573
|
+
consent: verify_contract_consentSchema.optional()
|
|
574
|
+
}));
|
|
575
|
+
const consentContracts = {
|
|
576
|
+
post: postConsentContract,
|
|
577
|
+
showBanner: showConsentBannerContract,
|
|
578
|
+
verify: verifyConsentContract
|
|
579
|
+
};
|
|
580
|
+
const statusContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
|
|
581
|
+
method: 'GET',
|
|
582
|
+
path: '/status',
|
|
583
|
+
description: `Returns the current operational status and health metrics of the service.
|
|
584
|
+
This endpoint provides real-time information about:
|
|
585
|
+
- Overall service status (ok/error)
|
|
586
|
+
- Current API version
|
|
587
|
+
- Server timestamp
|
|
588
|
+
- Storage system status and availability
|
|
589
|
+
- Client information (IP, User Agent, Region)
|
|
590
|
+
|
|
591
|
+
Use this endpoint for health checks, monitoring, and service status verification.`,
|
|
592
|
+
tags: [
|
|
593
|
+
'meta'
|
|
594
|
+
]
|
|
595
|
+
}).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
596
|
+
status: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
|
|
597
|
+
'ok',
|
|
598
|
+
'error'
|
|
599
|
+
]),
|
|
600
|
+
version: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
601
|
+
timestamp: __WEBPACK_EXTERNAL_MODULE_zod__.z.date(),
|
|
602
|
+
client: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
603
|
+
ip: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
|
|
604
|
+
userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
|
|
605
|
+
region: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
606
|
+
countryCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
|
|
607
|
+
regionCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable()
|
|
608
|
+
})
|
|
609
|
+
})
|
|
610
|
+
}));
|
|
611
|
+
const metaContracts = {
|
|
612
|
+
status: statusContract
|
|
613
|
+
};
|
|
614
|
+
const config = {
|
|
615
|
+
consent: consentContracts,
|
|
616
|
+
meta: metaContracts
|
|
617
|
+
};
|
|
618
|
+
const os = (0, __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.implement)(config);
|
|
619
|
+
const prefixes = {
|
|
620
|
+
auditLog: 'log',
|
|
621
|
+
consent: 'cns',
|
|
622
|
+
consentPolicy: 'pol',
|
|
623
|
+
consentPurpose: 'pur',
|
|
624
|
+
consentRecord: 'rec',
|
|
625
|
+
domain: 'dom',
|
|
626
|
+
subject: 'sub'
|
|
627
|
+
};
|
|
628
|
+
const b58 = (0, __WEBPACK_EXTERNAL_MODULE_base_x_aeb88370__["default"])('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
|
|
629
|
+
function generateId(model) {
|
|
630
|
+
const buf = crypto.getRandomValues(new Uint8Array(20));
|
|
631
|
+
const prefix = prefixes[model];
|
|
632
|
+
const EPOCH_TIMESTAMP = 1700000000000;
|
|
633
|
+
const t = Date.now() - EPOCH_TIMESTAMP;
|
|
634
|
+
const high = Math.floor(t / 0x100000000);
|
|
635
|
+
const low = t >>> 0;
|
|
636
|
+
buf[0] = high >>> 24 & 255;
|
|
637
|
+
buf[1] = high >>> 16 & 255;
|
|
638
|
+
buf[2] = high >>> 8 & 255;
|
|
639
|
+
buf[3] = 255 & high;
|
|
640
|
+
buf[4] = low >>> 24 & 255;
|
|
641
|
+
buf[5] = low >>> 16 & 255;
|
|
642
|
+
buf[6] = low >>> 8 & 255;
|
|
643
|
+
buf[7] = 255 & low;
|
|
644
|
+
return `${prefix}_${b58.encode(buf)}`;
|
|
645
|
+
}
|
|
646
|
+
async function generateUniqueId(db, model, ctx, options = {}) {
|
|
647
|
+
const { maxRetries = 10, attempt = 0, baseDelay = 5 } = options;
|
|
648
|
+
if (attempt >= maxRetries) {
|
|
649
|
+
const error = new Error(`Failed to generate unique ID for ${model} after ${maxRetries} attempts`);
|
|
650
|
+
ctx?.logger?.error?.('ID generation failed', {
|
|
651
|
+
model,
|
|
652
|
+
maxRetries
|
|
653
|
+
});
|
|
654
|
+
throw error;
|
|
655
|
+
}
|
|
656
|
+
const id = generateId(model);
|
|
657
|
+
try {
|
|
658
|
+
const existing = await db.findFirst(model, {
|
|
659
|
+
where: (b)=>b('id', '=', id)
|
|
660
|
+
});
|
|
661
|
+
if (existing) {
|
|
662
|
+
ctx?.logger?.debug?.('ID conflict detected', {
|
|
663
|
+
id,
|
|
664
|
+
model,
|
|
665
|
+
attempt: attempt + 1,
|
|
666
|
+
maxRetries
|
|
667
|
+
});
|
|
668
|
+
const delay = Math.min(baseDelay * 2 ** attempt, 1000);
|
|
669
|
+
await new Promise((resolve)=>setTimeout(resolve, delay));
|
|
670
|
+
return generateUniqueId(db, model, ctx, {
|
|
671
|
+
maxRetries,
|
|
672
|
+
attempt: attempt + 1,
|
|
673
|
+
baseDelay
|
|
674
|
+
});
|
|
675
|
+
}
|
|
676
|
+
return id;
|
|
677
|
+
} catch (error) {
|
|
678
|
+
ctx?.logger?.error?.('Error checking ID uniqueness', {
|
|
679
|
+
error: error.message,
|
|
680
|
+
model,
|
|
681
|
+
attempt
|
|
682
|
+
});
|
|
683
|
+
if (attempt < maxRetries - 1) {
|
|
684
|
+
const delay = Math.min(baseDelay * 2 ** attempt, 2000);
|
|
685
|
+
await new Promise((resolve)=>setTimeout(resolve, delay));
|
|
686
|
+
return generateUniqueId(db, model, ctx, {
|
|
687
|
+
maxRetries,
|
|
688
|
+
attempt: attempt + 1,
|
|
689
|
+
baseDelay
|
|
690
|
+
});
|
|
691
|
+
}
|
|
692
|
+
throw error;
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
const postConsent = os.consent.post.handler(async ({ input, context })=>{
|
|
696
|
+
const typedContext = context;
|
|
697
|
+
const logger = typedContext.logger;
|
|
698
|
+
logger.info('Handling post-consent request');
|
|
699
|
+
const { db, registry } = typedContext;
|
|
700
|
+
const { type, subjectId, externalSubjectId, domain, metadata, preferences } = input;
|
|
701
|
+
logger.debug('Request parameters', {
|
|
702
|
+
type,
|
|
703
|
+
subjectId,
|
|
704
|
+
externalSubjectId,
|
|
705
|
+
domain
|
|
706
|
+
});
|
|
707
|
+
try {
|
|
708
|
+
const subject = await registry.findOrCreateSubject({
|
|
709
|
+
subjectId,
|
|
710
|
+
externalSubjectId,
|
|
711
|
+
ipAddress: typedContext.ipAddress
|
|
712
|
+
});
|
|
713
|
+
if (!subject) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('SUBJECT_CREATION_FAILED', {
|
|
714
|
+
data: {
|
|
715
|
+
subjectId,
|
|
716
|
+
externalSubjectId
|
|
717
|
+
}
|
|
718
|
+
});
|
|
719
|
+
logger.debug('Subject found/created', {
|
|
720
|
+
subjectId: subject.id
|
|
721
|
+
});
|
|
722
|
+
const domainRecord = await typedContext.registry.findOrCreateDomain(domain);
|
|
723
|
+
if (!domainRecord) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('DOMAIN_CREATION_FAILED', {
|
|
724
|
+
data: {
|
|
725
|
+
domain
|
|
726
|
+
}
|
|
727
|
+
});
|
|
728
|
+
let policyId;
|
|
729
|
+
let purposeIds = [];
|
|
730
|
+
if ('policyId' in input && input.policyId) {
|
|
731
|
+
policyId = input.policyId;
|
|
732
|
+
const policy = await typedContext.registry.findConsentPolicyById(policyId);
|
|
733
|
+
if (!policy) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_NOT_FOUND', {
|
|
734
|
+
data: {
|
|
735
|
+
policyId,
|
|
736
|
+
type
|
|
737
|
+
}
|
|
738
|
+
});
|
|
739
|
+
if (!policy.isActive) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_INACTIVE', {
|
|
740
|
+
data: {
|
|
741
|
+
policyId,
|
|
742
|
+
type
|
|
743
|
+
}
|
|
744
|
+
});
|
|
745
|
+
} else {
|
|
746
|
+
const policy = await typedContext.registry.findOrCreatePolicy(type);
|
|
747
|
+
if (!policy) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_CREATION_FAILED', {
|
|
748
|
+
data: {
|
|
749
|
+
type
|
|
750
|
+
}
|
|
751
|
+
});
|
|
752
|
+
policyId = policy.id;
|
|
753
|
+
}
|
|
754
|
+
if (preferences) {
|
|
755
|
+
const consentedPurposes = Object.entries(preferences).filter(([_, isConsented])=>isConsented).map(([purposeCode])=>purposeCode);
|
|
756
|
+
logger.debug('Consented purposes', {
|
|
757
|
+
consentedPurposes
|
|
758
|
+
});
|
|
759
|
+
const purposesRaw = await Promise.all(consentedPurposes.map((purposeCode)=>typedContext.registry.findOrCreateConsentPurposeByCode(purposeCode)));
|
|
760
|
+
const purposes = purposesRaw.map((purpose)=>purpose?.id);
|
|
761
|
+
logger.debug('Purposes: ', {
|
|
762
|
+
purposes
|
|
763
|
+
});
|
|
764
|
+
purposeIds = purposes;
|
|
765
|
+
}
|
|
766
|
+
const result = await db.transaction(async (tx)=>{
|
|
767
|
+
logger.debug('Creating consent record', {
|
|
768
|
+
subjectId: subject.id,
|
|
769
|
+
domainId: domainRecord.id,
|
|
770
|
+
policyId,
|
|
771
|
+
purposeIds
|
|
772
|
+
});
|
|
773
|
+
const consentRecord = await tx.create('consent', {
|
|
774
|
+
id: await generateUniqueId(tx, 'consent', typedContext),
|
|
775
|
+
subjectId: subject.id,
|
|
776
|
+
domainId: domainRecord.id,
|
|
777
|
+
policyId,
|
|
778
|
+
purposeIds: {
|
|
779
|
+
json: purposeIds
|
|
780
|
+
},
|
|
781
|
+
status: 'active',
|
|
782
|
+
isActive: true,
|
|
783
|
+
ipAddress: typedContext.ipAddress || null,
|
|
784
|
+
userAgent: typedContext.userAgent || null
|
|
785
|
+
});
|
|
786
|
+
logger.debug('Created consent', {
|
|
787
|
+
consentRecord: consentRecord.id
|
|
788
|
+
});
|
|
789
|
+
logger.debug('Creating consentRecord entry', {
|
|
790
|
+
subjectId: subject.id,
|
|
791
|
+
consentId: consentRecord.id,
|
|
792
|
+
actionType: 'consent_given',
|
|
793
|
+
details: metadata
|
|
794
|
+
});
|
|
795
|
+
const record = await tx.create('consentRecord', {
|
|
796
|
+
id: await generateUniqueId(tx, 'consentRecord', typedContext),
|
|
797
|
+
subjectId: subject.id,
|
|
798
|
+
consentId: consentRecord.id,
|
|
799
|
+
actionType: 'consent_given',
|
|
800
|
+
details: metadata
|
|
801
|
+
});
|
|
802
|
+
logger.debug('Created record entry', {
|
|
803
|
+
record: record.id
|
|
804
|
+
});
|
|
805
|
+
logger.debug('Creating audit log', {
|
|
806
|
+
subjectId: subject.id,
|
|
807
|
+
entityType: 'consent',
|
|
808
|
+
entityId: consentRecord.id,
|
|
809
|
+
actionType: 'consent_given',
|
|
810
|
+
metadata: metadata
|
|
811
|
+
});
|
|
812
|
+
await tx.create('auditLog', {
|
|
813
|
+
id: await generateUniqueId(tx, 'auditLog', typedContext),
|
|
814
|
+
subjectId: subject.id,
|
|
815
|
+
entityType: 'consent',
|
|
816
|
+
entityId: consentRecord.id,
|
|
817
|
+
actionType: 'consent_given',
|
|
818
|
+
metadata: {
|
|
819
|
+
consentId: consentRecord.id,
|
|
820
|
+
type
|
|
821
|
+
},
|
|
822
|
+
ipAddress: typedContext.ipAddress || null,
|
|
823
|
+
userAgent: typedContext.userAgent || null,
|
|
824
|
+
eventTimezone: 'UTC'
|
|
825
|
+
});
|
|
826
|
+
logger.debug('Created audit log');
|
|
827
|
+
if (!consentRecord || !record) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('CONSENT_CREATION_FAILED', {
|
|
828
|
+
data: {
|
|
829
|
+
subjectId: subject.id,
|
|
830
|
+
domain
|
|
831
|
+
}
|
|
832
|
+
});
|
|
833
|
+
return {
|
|
834
|
+
consent: consentRecord,
|
|
835
|
+
record
|
|
836
|
+
};
|
|
837
|
+
});
|
|
838
|
+
return {
|
|
839
|
+
id: result.consent.id,
|
|
840
|
+
subjectId: subject.id,
|
|
841
|
+
externalSubjectId: subject.externalId ?? void 0,
|
|
842
|
+
domainId: domainRecord.id,
|
|
843
|
+
domain: domainRecord.name,
|
|
844
|
+
type,
|
|
845
|
+
status: result.consent.status,
|
|
846
|
+
recordId: result.record.id,
|
|
847
|
+
metadata,
|
|
848
|
+
givenAt: result.consent.givenAt
|
|
849
|
+
};
|
|
850
|
+
} catch (error) {
|
|
851
|
+
logger.error('Error in post-consent handler', {
|
|
852
|
+
error: error instanceof Error ? error.message : String(error),
|
|
853
|
+
errorType: error instanceof Error ? error.constructor.name : typeof error
|
|
854
|
+
});
|
|
855
|
+
if (error instanceof __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError) throw error;
|
|
856
|
+
throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('INTERNAL_SERVER_ERROR', {
|
|
857
|
+
message: error instanceof Error ? error.message : String(error)
|
|
858
|
+
});
|
|
859
|
+
}
|
|
860
|
+
});
|
|
861
|
+
function checkJurisdiction(countryCode) {
|
|
862
|
+
const jurisdictions = {
|
|
863
|
+
EU: new Set([
|
|
864
|
+
'AT',
|
|
865
|
+
'BE',
|
|
866
|
+
'BG',
|
|
867
|
+
'HR',
|
|
868
|
+
'CY',
|
|
869
|
+
'CZ',
|
|
870
|
+
'DK',
|
|
871
|
+
'EE',
|
|
872
|
+
'FI',
|
|
873
|
+
'FR',
|
|
874
|
+
'DE',
|
|
875
|
+
'GR',
|
|
876
|
+
'HU',
|
|
877
|
+
'IE',
|
|
878
|
+
'IT',
|
|
879
|
+
'LV',
|
|
880
|
+
'LT',
|
|
881
|
+
'LU',
|
|
882
|
+
'MT',
|
|
883
|
+
'NL',
|
|
884
|
+
'PL',
|
|
885
|
+
'PT',
|
|
886
|
+
'RO',
|
|
887
|
+
'SK',
|
|
888
|
+
'SI',
|
|
889
|
+
'ES',
|
|
890
|
+
'SE'
|
|
891
|
+
]),
|
|
892
|
+
EEA: new Set([
|
|
893
|
+
'IS',
|
|
894
|
+
'NO',
|
|
895
|
+
'LI'
|
|
896
|
+
]),
|
|
897
|
+
UK: new Set([
|
|
898
|
+
'GB'
|
|
899
|
+
]),
|
|
900
|
+
CH: new Set([
|
|
901
|
+
'CH'
|
|
902
|
+
]),
|
|
903
|
+
BR: new Set([
|
|
904
|
+
'BR'
|
|
905
|
+
]),
|
|
906
|
+
CA: new Set([
|
|
907
|
+
'CA'
|
|
908
|
+
]),
|
|
909
|
+
AU: new Set([
|
|
910
|
+
'AU'
|
|
911
|
+
]),
|
|
912
|
+
JP: new Set([
|
|
913
|
+
'JP'
|
|
914
|
+
]),
|
|
915
|
+
KR: new Set([
|
|
916
|
+
'KR'
|
|
917
|
+
])
|
|
918
|
+
};
|
|
919
|
+
let showConsentBanner = true;
|
|
920
|
+
let jurisdictionCode = 'NONE';
|
|
921
|
+
if (countryCode) {
|
|
922
|
+
const normalizedCountryCode = countryCode.toUpperCase();
|
|
923
|
+
showConsentBanner = false;
|
|
924
|
+
const jurisdictionMap = [
|
|
925
|
+
{
|
|
926
|
+
sets: [
|
|
927
|
+
jurisdictions.EU,
|
|
928
|
+
jurisdictions.EEA,
|
|
929
|
+
jurisdictions.UK
|
|
930
|
+
],
|
|
931
|
+
code: 'GDPR'
|
|
932
|
+
},
|
|
933
|
+
{
|
|
934
|
+
sets: [
|
|
935
|
+
jurisdictions.CH
|
|
936
|
+
],
|
|
937
|
+
code: 'CH'
|
|
938
|
+
},
|
|
939
|
+
{
|
|
940
|
+
sets: [
|
|
941
|
+
jurisdictions.BR
|
|
942
|
+
],
|
|
943
|
+
code: 'BR'
|
|
944
|
+
},
|
|
945
|
+
{
|
|
946
|
+
sets: [
|
|
947
|
+
jurisdictions.CA
|
|
948
|
+
],
|
|
949
|
+
code: 'PIPEDA'
|
|
950
|
+
},
|
|
951
|
+
{
|
|
952
|
+
sets: [
|
|
953
|
+
jurisdictions.AU
|
|
954
|
+
],
|
|
955
|
+
code: 'AU'
|
|
956
|
+
},
|
|
957
|
+
{
|
|
958
|
+
sets: [
|
|
959
|
+
jurisdictions.JP
|
|
960
|
+
],
|
|
961
|
+
code: 'APPI'
|
|
962
|
+
},
|
|
963
|
+
{
|
|
964
|
+
sets: [
|
|
965
|
+
jurisdictions.KR
|
|
966
|
+
],
|
|
967
|
+
code: 'PIPA'
|
|
968
|
+
}
|
|
969
|
+
];
|
|
970
|
+
for (const { sets, code } of jurisdictionMap)if (sets.some((set)=>set.has(normalizedCountryCode))) {
|
|
971
|
+
jurisdictionCode = code;
|
|
972
|
+
showConsentBanner = true;
|
|
973
|
+
break;
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
const message = JurisdictionMessages[jurisdictionCode];
|
|
977
|
+
return {
|
|
978
|
+
showConsentBanner,
|
|
979
|
+
jurisdictionCode,
|
|
980
|
+
message
|
|
981
|
+
};
|
|
982
|
+
}
|
|
983
|
+
function isSupportedBaseLanguage(lang) {
|
|
984
|
+
return lang in __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations;
|
|
985
|
+
}
|
|
986
|
+
function getPreferredLanguage(acceptLanguage, supportedLanguages) {
|
|
987
|
+
if (!acceptLanguage) return 'en';
|
|
988
|
+
const primaryLang = acceptLanguage.split(',')[0]?.split(';')[0]?.split('-')[0]?.toLowerCase();
|
|
989
|
+
if (primaryLang && supportedLanguages.includes(primaryLang)) return primaryLang;
|
|
990
|
+
return 'en';
|
|
991
|
+
}
|
|
992
|
+
function getTranslations(acceptLanguage, customTranslations) {
|
|
993
|
+
const supportedDefaultLanguages = Object.keys(__WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations);
|
|
994
|
+
const supportedCustomLanguages = Object.keys(customTranslations || {});
|
|
995
|
+
const supportedLanguages = [
|
|
996
|
+
...supportedDefaultLanguages,
|
|
997
|
+
...supportedCustomLanguages
|
|
998
|
+
];
|
|
999
|
+
const preferredLanguage = getPreferredLanguage(acceptLanguage, supportedLanguages);
|
|
1000
|
+
const base = isSupportedBaseLanguage(preferredLanguage) ? __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations[preferredLanguage] : __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations.en;
|
|
1001
|
+
const custom = supportedCustomLanguages.includes(preferredLanguage) ? customTranslations?.[preferredLanguage] : {};
|
|
1002
|
+
const translations = custom ? (0, __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.deepMergeTranslations)(base, custom) : base;
|
|
1003
|
+
return {
|
|
1004
|
+
translations: translations,
|
|
1005
|
+
language: preferredLanguage
|
|
1006
|
+
};
|
|
1007
|
+
}
|
|
1008
|
+
function getHeaders(headers) {
|
|
1009
|
+
if (!headers) return {
|
|
1010
|
+
countryCode: null,
|
|
1011
|
+
regionCode: null,
|
|
1012
|
+
acceptLanguage: null
|
|
1013
|
+
};
|
|
1014
|
+
const normalizeHeader = (value)=>{
|
|
1015
|
+
if (!value) return null;
|
|
1016
|
+
return Array.isArray(value) ? value[0] ?? null : value;
|
|
1017
|
+
};
|
|
1018
|
+
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'));
|
|
1019
|
+
const regionCode = normalizeHeader(headers.get('x-c15t-region')) ?? normalizeHeader(headers.get('x-vercel-ip-country-region')) ?? normalizeHeader(headers.get('x-region-code'));
|
|
1020
|
+
const acceptLanguage = normalizeHeader(headers.get('accept-language'));
|
|
1021
|
+
return {
|
|
1022
|
+
countryCode,
|
|
1023
|
+
regionCode,
|
|
1024
|
+
acceptLanguage
|
|
1025
|
+
};
|
|
1026
|
+
}
|
|
1027
|
+
function buildResponse({ shouldShowBanner, jurisdiction, location, acceptLanguage, customTranslations, branding = 'c15t' }) {
|
|
1028
|
+
return {
|
|
1029
|
+
showConsentBanner: shouldShowBanner,
|
|
1030
|
+
jurisdiction,
|
|
1031
|
+
location,
|
|
1032
|
+
translations: getTranslations(acceptLanguage, customTranslations),
|
|
1033
|
+
branding: branding
|
|
1034
|
+
};
|
|
1035
|
+
}
|
|
1036
|
+
const handler_showConsentBanner = os.consent.showBanner.handler(({ context })=>{
|
|
1037
|
+
const typedContext = context;
|
|
1038
|
+
const { customTranslations, disableGeoLocation, branding } = typedContext.advanced ?? {};
|
|
1039
|
+
const { countryCode, regionCode, acceptLanguage } = getHeaders(typedContext.headers);
|
|
1040
|
+
if (disableGeoLocation) return buildResponse({
|
|
1041
|
+
shouldShowBanner: true,
|
|
1042
|
+
jurisdiction: {
|
|
1043
|
+
code: 'NONE',
|
|
1044
|
+
message: JurisdictionMessages.NONE
|
|
1045
|
+
},
|
|
1046
|
+
location: {
|
|
1047
|
+
countryCode: null,
|
|
1048
|
+
regionCode: null
|
|
1049
|
+
},
|
|
1050
|
+
acceptLanguage,
|
|
1051
|
+
customTranslations,
|
|
1052
|
+
branding
|
|
1053
|
+
});
|
|
1054
|
+
const { showConsentBanner, jurisdictionCode, message } = checkJurisdiction(countryCode);
|
|
1055
|
+
return buildResponse({
|
|
1056
|
+
shouldShowBanner: showConsentBanner,
|
|
1057
|
+
jurisdiction: {
|
|
1058
|
+
code: jurisdictionCode,
|
|
1059
|
+
message
|
|
1060
|
+
},
|
|
1061
|
+
location: {
|
|
1062
|
+
countryCode,
|
|
1063
|
+
regionCode
|
|
1064
|
+
},
|
|
1065
|
+
acceptLanguage,
|
|
1066
|
+
customTranslations,
|
|
1067
|
+
branding
|
|
1068
|
+
});
|
|
1069
|
+
});
|
|
1070
|
+
const verifyConsent = os.consent.verify.handler(async ({ input, context })=>{
|
|
1071
|
+
const typedContext = context;
|
|
1072
|
+
const logger = typedContext.logger;
|
|
1073
|
+
logger.info('Handling verify-consent request');
|
|
1074
|
+
const { type, subjectId, externalSubjectId, domain, policyId, preferences } = input;
|
|
1075
|
+
logger.debug('Request parameters', {
|
|
1076
|
+
type,
|
|
1077
|
+
subjectId,
|
|
1078
|
+
externalSubjectId,
|
|
1079
|
+
domain,
|
|
1080
|
+
policyId,
|
|
1081
|
+
preferences
|
|
1082
|
+
});
|
|
1083
|
+
try {
|
|
1084
|
+
const domainRecord = await typedContext.registry.findDomainByName(domain);
|
|
1085
|
+
if (!domainRecord) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('DOMAIN_NOT_FOUND', {
|
|
1086
|
+
data: {
|
|
1087
|
+
domain
|
|
1088
|
+
}
|
|
1089
|
+
});
|
|
1090
|
+
const subject = await typedContext.registry.findOrCreateSubject({
|
|
1091
|
+
subjectId,
|
|
1092
|
+
externalSubjectId,
|
|
1093
|
+
ipAddress: typedContext.ipAddress ?? 'unknown'
|
|
1094
|
+
});
|
|
1095
|
+
if (!subject) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('SUBJECT_NOT_FOUND', {
|
|
1096
|
+
data: {
|
|
1097
|
+
subjectId,
|
|
1098
|
+
externalSubjectId
|
|
1099
|
+
}
|
|
1100
|
+
});
|
|
1101
|
+
if ('cookie_banner' === type && (!preferences || 0 === preferences.length)) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('COOKIE_BANNER_PREFERENCES_REQUIRED', {
|
|
1102
|
+
data: {
|
|
1103
|
+
type: 'cookie_banner'
|
|
1104
|
+
}
|
|
1105
|
+
});
|
|
1106
|
+
const purposePromises = preferences?.map((purpose)=>typedContext.registry.findOrCreateConsentPurposeByCode(purpose));
|
|
1107
|
+
const rawPurposes = await Promise.all(purposePromises ?? []);
|
|
1108
|
+
const purposeIds = rawPurposes.filter((purpose)=>null !== purpose).map((purpose)=>purpose.id);
|
|
1109
|
+
if (purposeIds.length !== (preferences?.length ?? 0)) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('PURPOSES_NOT_FOUND', {
|
|
1110
|
+
data: {
|
|
1111
|
+
preferences: preferences ?? [],
|
|
1112
|
+
foundPurposes: rawPurposes.filter((p)=>null !== p).map((p)=>p.code)
|
|
1113
|
+
}
|
|
1114
|
+
});
|
|
1115
|
+
if (policyId) {
|
|
1116
|
+
const policy = await typedContext.registry.findConsentPolicyById(policyId);
|
|
1117
|
+
if (!policy || policy.type !== type) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_NOT_FOUND', {
|
|
1118
|
+
data: {
|
|
1119
|
+
policyId,
|
|
1120
|
+
type
|
|
1121
|
+
}
|
|
1122
|
+
});
|
|
1123
|
+
return await checkPolicyConsent({
|
|
1124
|
+
policyId: policy.id,
|
|
1125
|
+
subjectId: subject.id,
|
|
1126
|
+
domainId: domainRecord.id,
|
|
1127
|
+
purposeIds,
|
|
1128
|
+
type,
|
|
1129
|
+
context: typedContext
|
|
1130
|
+
});
|
|
1131
|
+
}
|
|
1132
|
+
const latestPolicy = await typedContext.registry.findOrCreatePolicy(type);
|
|
1133
|
+
if (!latestPolicy) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_NOT_FOUND', {
|
|
1134
|
+
data: {
|
|
1135
|
+
policyId: 'latest',
|
|
1136
|
+
type
|
|
1137
|
+
}
|
|
1138
|
+
});
|
|
1139
|
+
return await checkPolicyConsent({
|
|
1140
|
+
policyId: latestPolicy.id,
|
|
1141
|
+
subjectId: subject.id,
|
|
1142
|
+
domainId: domainRecord.id,
|
|
1143
|
+
purposeIds,
|
|
1144
|
+
type,
|
|
1145
|
+
context: typedContext
|
|
1146
|
+
});
|
|
1147
|
+
} catch (error) {
|
|
1148
|
+
logger.error('Error in verify-consent handler', {
|
|
1149
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1150
|
+
errorType: error instanceof Error ? error.constructor.name : typeof error
|
|
1151
|
+
});
|
|
1152
|
+
if (error instanceof __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError) throw error;
|
|
1153
|
+
throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('INTERNAL_SERVER_ERROR', {
|
|
1154
|
+
message: error instanceof Error ? error.message : String(error)
|
|
1155
|
+
});
|
|
1156
|
+
}
|
|
1157
|
+
});
|
|
1158
|
+
async function checkPolicyConsent({ policyId, subjectId, domainId, purposeIds, type, context }) {
|
|
1159
|
+
const { registry, db } = context;
|
|
1160
|
+
const rawConsents = await db.findMany('consent', {
|
|
1161
|
+
where: (b)=>b.and(b('subjectId', '=', subjectId), b('policyId', '=', policyId), b('domainId', '=', domainId)),
|
|
1162
|
+
orderBy: [
|
|
1163
|
+
'givenAt',
|
|
1164
|
+
'desc'
|
|
1165
|
+
]
|
|
1166
|
+
});
|
|
1167
|
+
const filteredConsents = rawConsents.filter((consent)=>{
|
|
1168
|
+
if (!purposeIds) return true;
|
|
1169
|
+
return purposeIds.every((id)=>consent.purposeIds.some((purposeId)=>purposeId === id));
|
|
1170
|
+
});
|
|
1171
|
+
await registry.createAuditLog({
|
|
1172
|
+
subjectId,
|
|
1173
|
+
entityType: 'consent_policy',
|
|
1174
|
+
entityId: policyId,
|
|
1175
|
+
actionType: 'verify_consent',
|
|
1176
|
+
metadata: {
|
|
1177
|
+
type,
|
|
1178
|
+
policyId,
|
|
1179
|
+
purposeIds,
|
|
1180
|
+
success: 0 !== filteredConsents.length,
|
|
1181
|
+
...filteredConsents.length > 0 ? {
|
|
1182
|
+
consentId: filteredConsents[0]?.id
|
|
1183
|
+
} : {}
|
|
1184
|
+
},
|
|
1185
|
+
eventTimezone: 'UTC'
|
|
1186
|
+
});
|
|
1187
|
+
if (0 === rawConsents.length || 0 === filteredConsents.length) return {
|
|
1188
|
+
isValid: false
|
|
1189
|
+
};
|
|
1190
|
+
return {
|
|
1191
|
+
isValid: true,
|
|
1192
|
+
consent: filteredConsents[0]
|
|
1193
|
+
};
|
|
1194
|
+
}
|
|
1195
|
+
const consentHandlers = {
|
|
1196
|
+
post: postConsent,
|
|
1197
|
+
showBanner: handler_showConsentBanner,
|
|
1198
|
+
verify: verifyConsent
|
|
1199
|
+
};
|
|
1200
|
+
const version = '1.6.0';
|
|
1201
|
+
const statusHandler = os.meta.status.handler(({ context })=>{
|
|
1202
|
+
const typedContext = context;
|
|
1203
|
+
const headers = typedContext.headers;
|
|
1204
|
+
const normalizeHeader = (value)=>{
|
|
1205
|
+
if (!value) return null;
|
|
1206
|
+
return Array.isArray(value) ? value[0] ?? null : value;
|
|
1207
|
+
};
|
|
1208
|
+
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'));
|
|
1209
|
+
const regionCode = normalizeHeader(headers?.get('x-vercel-ip-country-region')) ?? normalizeHeader(headers?.get('x-region-code'));
|
|
1210
|
+
return {
|
|
1211
|
+
status: 'ok',
|
|
1212
|
+
version: version,
|
|
1213
|
+
timestamp: new Date(),
|
|
1214
|
+
client: {
|
|
1215
|
+
ip: typedContext.ipAddress ?? null,
|
|
1216
|
+
userAgent: typedContext.userAgent ?? null,
|
|
1217
|
+
region: {
|
|
1218
|
+
countryCode,
|
|
1219
|
+
regionCode
|
|
1220
|
+
}
|
|
1221
|
+
}
|
|
1222
|
+
};
|
|
1223
|
+
});
|
|
1224
|
+
const metaHandlers = {
|
|
1225
|
+
status: statusHandler
|
|
1226
|
+
};
|
|
1227
|
+
const router = os.router({
|
|
1228
|
+
consent: consentHandlers,
|
|
1229
|
+
meta: metaHandlers
|
|
1230
|
+
});
|
|
1231
|
+
export { router };
|