@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
|
@@ -106,32 +106,20 @@ function getDatabaseType() {
|
|
|
106
106
|
}
|
|
107
107
|
const external_zod_namespaceObject = require("zod");
|
|
108
108
|
const fieldConfigSchema = external_zod_namespaceObject.z.object({
|
|
109
|
-
required: external_zod_namespaceObject.z.boolean().
|
|
110
|
-
returned: external_zod_namespaceObject.z.boolean().
|
|
111
|
-
input: external_zod_namespaceObject.z.boolean().
|
|
112
|
-
defaultValue: external_zod_namespaceObject.z.
|
|
113
|
-
external_zod_namespaceObject.z.any(),
|
|
114
|
-
external_zod_namespaceObject.z["function"]().returns(external_zod_namespaceObject.z.any())
|
|
115
|
-
]).optional(),
|
|
109
|
+
required: external_zod_namespaceObject.z.boolean().prefault(true),
|
|
110
|
+
returned: external_zod_namespaceObject.z.boolean().prefault(true),
|
|
111
|
+
input: external_zod_namespaceObject.z.boolean().prefault(true),
|
|
112
|
+
defaultValue: external_zod_namespaceObject.z.any().optional(),
|
|
116
113
|
transform: external_zod_namespaceObject.z.object({
|
|
117
|
-
input: external_zod_namespaceObject.z
|
|
118
|
-
|
|
119
|
-
external_zod_namespaceObject.z.promise(external_zod_namespaceObject.z.any())
|
|
120
|
-
])).optional(),
|
|
121
|
-
output: external_zod_namespaceObject.z["function"]().args(external_zod_namespaceObject.z.any()).returns(external_zod_namespaceObject.z.union([
|
|
122
|
-
external_zod_namespaceObject.z.any(),
|
|
123
|
-
external_zod_namespaceObject.z.promise(external_zod_namespaceObject.z.any())
|
|
124
|
-
])).optional()
|
|
114
|
+
input: external_zod_namespaceObject.z.any().optional(),
|
|
115
|
+
output: external_zod_namespaceObject.z.any().optional()
|
|
125
116
|
}).optional(),
|
|
126
|
-
validator: external_zod_namespaceObject.z
|
|
127
|
-
external_zod_namespaceObject.z.string(),
|
|
128
|
-
external_zod_namespaceObject.z["null"]()
|
|
129
|
-
])).optional(),
|
|
117
|
+
validator: external_zod_namespaceObject.z.any().optional(),
|
|
130
118
|
unique: external_zod_namespaceObject.z.boolean().optional(),
|
|
131
119
|
indexed: external_zod_namespaceObject.z.boolean().optional(),
|
|
132
|
-
sortable: external_zod_namespaceObject.z.boolean().
|
|
120
|
+
sortable: external_zod_namespaceObject.z.boolean().prefault(true),
|
|
133
121
|
fieldName: external_zod_namespaceObject.z.string().optional(),
|
|
134
|
-
bigint: external_zod_namespaceObject.z.boolean().
|
|
122
|
+
bigint: external_zod_namespaceObject.z.boolean().prefault(false)
|
|
135
123
|
});
|
|
136
124
|
const stringFieldSchema = fieldConfigSchema.extend({
|
|
137
125
|
type: external_zod_namespaceObject.z.literal('string'),
|
|
@@ -151,18 +139,18 @@ const dateFieldSchema = fieldConfigSchema.extend({
|
|
|
151
139
|
type: external_zod_namespaceObject.z.literal('date'),
|
|
152
140
|
minDate: external_zod_namespaceObject.z.date().optional(),
|
|
153
141
|
maxDate: external_zod_namespaceObject.z.date().optional(),
|
|
154
|
-
dateOnly: external_zod_namespaceObject.z.boolean().
|
|
155
|
-
format: external_zod_namespaceObject.z.record(external_zod_namespaceObject.z.unknown()).optional()
|
|
142
|
+
dateOnly: external_zod_namespaceObject.z.boolean().prefault(false),
|
|
143
|
+
format: external_zod_namespaceObject.z.record(external_zod_namespaceObject.z.string(), external_zod_namespaceObject.z.unknown()).optional()
|
|
156
144
|
});
|
|
157
145
|
const timezoneFieldSchema = fieldConfigSchema.extend({
|
|
158
146
|
type: external_zod_namespaceObject.z.literal('timezone'),
|
|
159
|
-
validateTimezone: external_zod_namespaceObject.z.boolean().
|
|
147
|
+
validateTimezone: external_zod_namespaceObject.z.boolean().prefault(true),
|
|
160
148
|
suggestedValues: external_zod_namespaceObject.z.array(external_zod_namespaceObject.z.string()).optional(),
|
|
161
|
-
restrictToSuggestedValues: external_zod_namespaceObject.z.boolean().
|
|
149
|
+
restrictToSuggestedValues: external_zod_namespaceObject.z.boolean().prefault(false)
|
|
162
150
|
});
|
|
163
151
|
const jsonFieldSchema = fieldConfigSchema.extend({
|
|
164
152
|
type: external_zod_namespaceObject.z.literal('json'),
|
|
165
|
-
validateJson: external_zod_namespaceObject.z.boolean().
|
|
153
|
+
validateJson: external_zod_namespaceObject.z.boolean().prefault(true)
|
|
166
154
|
});
|
|
167
155
|
const stringArrayFieldSchema = fieldConfigSchema.extend({
|
|
168
156
|
type: external_zod_namespaceObject.z.literal('string[]')
|
|
@@ -486,7 +474,27 @@ class error_class_DoubleTieError extends server_namespaceObject.ORPCError {
|
|
|
486
474
|
return formattedMessage;
|
|
487
475
|
}
|
|
488
476
|
}
|
|
489
|
-
|
|
477
|
+
function auditLogRegistry({ adapter, ...ctx }) {
|
|
478
|
+
const { createWithHooks } = getWithHooks(adapter, ctx);
|
|
479
|
+
return {
|
|
480
|
+
createAuditLog: async (auditLog, context)=>{
|
|
481
|
+
const createdLog = await createWithHooks({
|
|
482
|
+
data: {
|
|
483
|
+
createdAt: new Date(),
|
|
484
|
+
...auditLog
|
|
485
|
+
},
|
|
486
|
+
model: 'auditLog',
|
|
487
|
+
customFn: void 0,
|
|
488
|
+
context
|
|
489
|
+
});
|
|
490
|
+
if (!createdLog) throw new error_class_DoubleTieError('Failed to create audit log - operation returned null', {
|
|
491
|
+
code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
492
|
+
status: 500
|
|
493
|
+
});
|
|
494
|
+
return createdLog;
|
|
495
|
+
}
|
|
496
|
+
};
|
|
497
|
+
}
|
|
490
498
|
const auditLogSchema = external_zod_namespaceObject.z.object({
|
|
491
499
|
id: external_zod_namespaceObject.z.string(),
|
|
492
500
|
entityType: external_zod_namespaceObject.z.string(),
|
|
@@ -495,9 +503,9 @@ const auditLogSchema = external_zod_namespaceObject.z.object({
|
|
|
495
503
|
subjectId: external_zod_namespaceObject.z.string().optional(),
|
|
496
504
|
ipAddress: external_zod_namespaceObject.z.string().optional(),
|
|
497
505
|
userAgent: external_zod_namespaceObject.z.string().optional(),
|
|
498
|
-
changes: external_zod_namespaceObject.z.record(external_zod_namespaceObject.z.unknown()).optional(),
|
|
499
|
-
metadata: external_zod_namespaceObject.z.record(external_zod_namespaceObject.z.unknown()).optional(),
|
|
500
|
-
createdAt: external_zod_namespaceObject.z.date().
|
|
506
|
+
changes: external_zod_namespaceObject.z.record(external_zod_namespaceObject.z.string(), external_zod_namespaceObject.z.unknown()).optional(),
|
|
507
|
+
metadata: external_zod_namespaceObject.z.record(external_zod_namespaceObject.z.string(), external_zod_namespaceObject.z.unknown()).optional(),
|
|
508
|
+
createdAt: external_zod_namespaceObject.z.date().prefault(()=>new Date())
|
|
501
509
|
});
|
|
502
510
|
function getAuditLogTable(options, auditLogFields) {
|
|
503
511
|
const auditLogConfig = options.tables?.auditLog;
|
|
@@ -596,6 +604,129 @@ function getAuditLogTable(options, auditLogFields) {
|
|
|
596
604
|
order: 5
|
|
597
605
|
};
|
|
598
606
|
}
|
|
607
|
+
const logger_namespaceObject = require("@doubletie/logger");
|
|
608
|
+
const consentSchema = external_zod_namespaceObject.z.object({
|
|
609
|
+
id: external_zod_namespaceObject.z.string(),
|
|
610
|
+
subjectId: external_zod_namespaceObject.z.string(),
|
|
611
|
+
domainId: external_zod_namespaceObject.z.string(),
|
|
612
|
+
purposeIds: external_zod_namespaceObject.z.array(external_zod_namespaceObject.z.string()),
|
|
613
|
+
metadata: external_zod_namespaceObject.z.record(external_zod_namespaceObject.z.string(), external_zod_namespaceObject.z.unknown()).nullable().optional(),
|
|
614
|
+
policyId: external_zod_namespaceObject.z.string().optional(),
|
|
615
|
+
ipAddress: external_zod_namespaceObject.z.string().nullable().optional(),
|
|
616
|
+
userAgent: external_zod_namespaceObject.z.string().nullable().optional(),
|
|
617
|
+
status: external_zod_namespaceObject.z["enum"]([
|
|
618
|
+
'active',
|
|
619
|
+
'withdrawn',
|
|
620
|
+
'expired'
|
|
621
|
+
]).prefault('active'),
|
|
622
|
+
withdrawalReason: external_zod_namespaceObject.z.string().nullable().optional(),
|
|
623
|
+
givenAt: external_zod_namespaceObject.z.date().prefault(()=>new Date()),
|
|
624
|
+
validUntil: external_zod_namespaceObject.z.date().nullable().optional(),
|
|
625
|
+
isActive: external_zod_namespaceObject.z.boolean().prefault(true)
|
|
626
|
+
});
|
|
627
|
+
function getConsentTable(options, consentFields) {
|
|
628
|
+
const consentConfig = options.tables?.consent;
|
|
629
|
+
const subjectConfig = options.tables?.subject;
|
|
630
|
+
const domainConfig = options.tables?.domain;
|
|
631
|
+
const policyConfig = options.tables?.consentPolicy;
|
|
632
|
+
return {
|
|
633
|
+
entityName: consentConfig?.entityName || 'consent',
|
|
634
|
+
entityPrefix: consentConfig?.entityPrefix || 'cns',
|
|
635
|
+
schema: consentSchema,
|
|
636
|
+
fields: {
|
|
637
|
+
subjectId: {
|
|
638
|
+
type: 'string',
|
|
639
|
+
required: true,
|
|
640
|
+
fieldName: consentConfig?.fields?.subjectId || 'subjectId',
|
|
641
|
+
references: {
|
|
642
|
+
model: subjectConfig?.entityName || 'subject',
|
|
643
|
+
field: 'id'
|
|
644
|
+
}
|
|
645
|
+
},
|
|
646
|
+
domainId: {
|
|
647
|
+
type: 'string',
|
|
648
|
+
required: true,
|
|
649
|
+
fieldName: consentConfig?.fields?.domainId || 'domainId',
|
|
650
|
+
references: {
|
|
651
|
+
model: domainConfig?.entityName || 'domain',
|
|
652
|
+
field: 'id'
|
|
653
|
+
}
|
|
654
|
+
},
|
|
655
|
+
purposeIds: {
|
|
656
|
+
type: 'json',
|
|
657
|
+
required: false,
|
|
658
|
+
fieldName: consentConfig?.fields?.purposeIds || 'purposeIds'
|
|
659
|
+
},
|
|
660
|
+
metadata: {
|
|
661
|
+
type: 'json',
|
|
662
|
+
required: false,
|
|
663
|
+
fieldName: consentConfig?.fields?.metadata || 'metadata'
|
|
664
|
+
},
|
|
665
|
+
policyId: {
|
|
666
|
+
type: 'string',
|
|
667
|
+
required: false,
|
|
668
|
+
fieldName: consentConfig?.fields?.policyId || 'policyId',
|
|
669
|
+
references: {
|
|
670
|
+
model: policyConfig?.entityName || 'consentPolicy',
|
|
671
|
+
field: 'id'
|
|
672
|
+
}
|
|
673
|
+
},
|
|
674
|
+
ipAddress: {
|
|
675
|
+
type: 'string',
|
|
676
|
+
required: false,
|
|
677
|
+
fieldName: consentConfig?.fields?.ipAddress || 'ipAddress'
|
|
678
|
+
},
|
|
679
|
+
userAgent: {
|
|
680
|
+
type: 'string',
|
|
681
|
+
required: false,
|
|
682
|
+
fieldName: consentConfig?.fields?.userAgent || 'userAgent'
|
|
683
|
+
},
|
|
684
|
+
status: {
|
|
685
|
+
type: 'string',
|
|
686
|
+
defaultValue: ()=>'active',
|
|
687
|
+
required: true,
|
|
688
|
+
fieldName: consentConfig?.fields?.status || 'status'
|
|
689
|
+
},
|
|
690
|
+
withdrawalReason: {
|
|
691
|
+
type: 'string',
|
|
692
|
+
required: false,
|
|
693
|
+
fieldName: consentConfig?.fields?.withdrawalReason || 'withdrawalReason'
|
|
694
|
+
},
|
|
695
|
+
givenAt: {
|
|
696
|
+
type: 'date',
|
|
697
|
+
defaultValue: ()=>new Date(),
|
|
698
|
+
required: true,
|
|
699
|
+
fieldName: consentConfig?.fields?.givenAt || 'givenAt'
|
|
700
|
+
},
|
|
701
|
+
validUntil: {
|
|
702
|
+
type: 'date',
|
|
703
|
+
required: false,
|
|
704
|
+
fieldName: consentConfig?.fields?.validUntil || 'validUntil',
|
|
705
|
+
transform: {
|
|
706
|
+
input: (val, data)=>{
|
|
707
|
+
if (val) return val;
|
|
708
|
+
const expiresIn = consentConfig?.expiresIn || 31536000;
|
|
709
|
+
const givenAt = data.givenAt instanceof Date ? data.givenAt : new Date();
|
|
710
|
+
if (expiresIn > 0) {
|
|
711
|
+
const validUntil = new Date(givenAt);
|
|
712
|
+
validUntil.setSeconds(validUntil.getSeconds() + expiresIn);
|
|
713
|
+
return validUntil;
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
},
|
|
718
|
+
isActive: {
|
|
719
|
+
type: 'boolean',
|
|
720
|
+
defaultValue: true,
|
|
721
|
+
required: true,
|
|
722
|
+
fieldName: consentConfig?.fields?.isActive || 'isActive'
|
|
723
|
+
},
|
|
724
|
+
...consentFields || {},
|
|
725
|
+
...consentConfig?.additionalFields || {}
|
|
726
|
+
},
|
|
727
|
+
order: 3
|
|
728
|
+
};
|
|
729
|
+
}
|
|
599
730
|
const PolicyTypeSchema = external_zod_namespaceObject.z["enum"]([
|
|
600
731
|
'cookie_banner',
|
|
601
732
|
'privacy_policy',
|
|
@@ -614,9 +745,9 @@ const consentPolicySchema = external_zod_namespaceObject.z.object({
|
|
|
614
745
|
expirationDate: external_zod_namespaceObject.z.date().nullable().optional(),
|
|
615
746
|
content: external_zod_namespaceObject.z.string(),
|
|
616
747
|
contentHash: external_zod_namespaceObject.z.string(),
|
|
617
|
-
isActive: external_zod_namespaceObject.z.boolean().
|
|
618
|
-
createdAt: external_zod_namespaceObject.z.date().
|
|
619
|
-
updatedAt: external_zod_namespaceObject.z.date().
|
|
748
|
+
isActive: external_zod_namespaceObject.z.boolean().prefault(true),
|
|
749
|
+
createdAt: external_zod_namespaceObject.z.date().prefault(()=>new Date()),
|
|
750
|
+
updatedAt: external_zod_namespaceObject.z.date().prefault(()=>new Date())
|
|
620
751
|
});
|
|
621
752
|
function getConsentPolicyTable(options, policyFields) {
|
|
622
753
|
const consentPolicyConfig = options.tables?.consentPolicy;
|
|
@@ -683,12 +814,12 @@ const purposeSchema = external_zod_namespaceObject.z.object({
|
|
|
683
814
|
code: external_zod_namespaceObject.z.string(),
|
|
684
815
|
name: external_zod_namespaceObject.z.string(),
|
|
685
816
|
description: external_zod_namespaceObject.z.string(),
|
|
686
|
-
isEssential: external_zod_namespaceObject.z.boolean().
|
|
817
|
+
isEssential: external_zod_namespaceObject.z.boolean().prefault(false),
|
|
687
818
|
dataCategory: external_zod_namespaceObject.z.string().nullish(),
|
|
688
819
|
legalBasis: external_zod_namespaceObject.z.string().nullish(),
|
|
689
|
-
isActive: external_zod_namespaceObject.z.boolean().
|
|
690
|
-
createdAt: external_zod_namespaceObject.z.date().
|
|
691
|
-
updatedAt: external_zod_namespaceObject.z.date().
|
|
820
|
+
isActive: external_zod_namespaceObject.z.boolean().prefault(true),
|
|
821
|
+
createdAt: external_zod_namespaceObject.z.date().prefault(()=>new Date()),
|
|
822
|
+
updatedAt: external_zod_namespaceObject.z.date().prefault(()=>new Date())
|
|
692
823
|
});
|
|
693
824
|
function getPurposeTable(options, purposeFields) {
|
|
694
825
|
const purposeConfig = options.tables?.consentPurpose;
|
|
@@ -757,9 +888,9 @@ const consentRecordSchema = external_zod_namespaceObject.z.object({
|
|
|
757
888
|
subjectId: external_zod_namespaceObject.z.string(),
|
|
758
889
|
consentId: external_zod_namespaceObject.z.string().optional(),
|
|
759
890
|
actionType: external_zod_namespaceObject.z.string(),
|
|
760
|
-
details: external_zod_namespaceObject.z.record(external_zod_namespaceObject.z.unknown()).optional(),
|
|
761
|
-
createdAt: external_zod_namespaceObject.z.date().
|
|
762
|
-
updatedAt: external_zod_namespaceObject.z.date().
|
|
891
|
+
details: external_zod_namespaceObject.z.record(external_zod_namespaceObject.z.string(), external_zod_namespaceObject.z.unknown()).optional(),
|
|
892
|
+
createdAt: external_zod_namespaceObject.z.date().prefault(()=>new Date()),
|
|
893
|
+
updatedAt: external_zod_namespaceObject.z.date().prefault(()=>new Date())
|
|
763
894
|
});
|
|
764
895
|
function getConsentRecordTable(options, recordFields) {
|
|
765
896
|
const recordConfig = options.tables?.record;
|
|
@@ -810,184 +941,62 @@ function getConsentRecordTable(options, recordFields) {
|
|
|
810
941
|
order: 4
|
|
811
942
|
};
|
|
812
943
|
}
|
|
813
|
-
const
|
|
944
|
+
const domainSchema = external_zod_namespaceObject.z.object({
|
|
814
945
|
id: external_zod_namespaceObject.z.string(),
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
status: external_zod_namespaceObject.z["enum"]([
|
|
823
|
-
'active',
|
|
824
|
-
'withdrawn',
|
|
825
|
-
'expired'
|
|
826
|
-
]).default('active'),
|
|
827
|
-
withdrawalReason: external_zod_namespaceObject.z.string().nullable().optional(),
|
|
828
|
-
givenAt: external_zod_namespaceObject.z.date().default(()=>new Date()),
|
|
829
|
-
validUntil: external_zod_namespaceObject.z.date().nullable().optional(),
|
|
830
|
-
isActive: external_zod_namespaceObject.z.boolean().default(true)
|
|
946
|
+
name: external_zod_namespaceObject.z.string().min(1),
|
|
947
|
+
description: external_zod_namespaceObject.z.string().optional(),
|
|
948
|
+
allowedOrigins: external_zod_namespaceObject.z.array(external_zod_namespaceObject.z.string()).optional().prefault([]),
|
|
949
|
+
isVerified: external_zod_namespaceObject.z.boolean().prefault(true),
|
|
950
|
+
isActive: external_zod_namespaceObject.z.boolean().prefault(true),
|
|
951
|
+
createdAt: external_zod_namespaceObject.z.date().prefault(()=>new Date()),
|
|
952
|
+
updatedAt: external_zod_namespaceObject.z.date().prefault(()=>new Date())
|
|
831
953
|
});
|
|
832
|
-
function
|
|
833
|
-
const consentConfig = options.tables?.consent;
|
|
834
|
-
const subjectConfig = options.tables?.subject;
|
|
954
|
+
function getDomainTable(options, domainFields) {
|
|
835
955
|
const domainConfig = options.tables?.domain;
|
|
836
|
-
const policyConfig = options.tables?.consentPolicy;
|
|
837
956
|
return {
|
|
838
|
-
entityName:
|
|
839
|
-
entityPrefix:
|
|
840
|
-
schema:
|
|
957
|
+
entityName: domainConfig?.entityName || 'domain',
|
|
958
|
+
entityPrefix: domainConfig?.entityPrefix || 'dom',
|
|
959
|
+
schema: domainSchema,
|
|
841
960
|
fields: {
|
|
842
|
-
|
|
961
|
+
name: {
|
|
843
962
|
type: 'string',
|
|
844
963
|
required: true,
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
model: subjectConfig?.entityName || 'subject',
|
|
848
|
-
field: 'id'
|
|
849
|
-
}
|
|
964
|
+
unique: true,
|
|
965
|
+
fieldName: domainConfig?.fields?.name || 'name'
|
|
850
966
|
},
|
|
851
|
-
|
|
967
|
+
description: {
|
|
852
968
|
type: 'string',
|
|
853
|
-
required: true,
|
|
854
|
-
fieldName: consentConfig?.fields?.domainId || 'domainId',
|
|
855
|
-
references: {
|
|
856
|
-
model: domainConfig?.entityName || 'domain',
|
|
857
|
-
field: 'id'
|
|
858
|
-
}
|
|
859
|
-
},
|
|
860
|
-
purposeIds: {
|
|
861
|
-
type: 'json',
|
|
862
969
|
required: false,
|
|
863
|
-
fieldName:
|
|
970
|
+
fieldName: domainConfig?.fields?.description || "description"
|
|
864
971
|
},
|
|
865
|
-
|
|
972
|
+
allowedOrigins: {
|
|
866
973
|
type: 'json',
|
|
974
|
+
defaultValue: ()=>[],
|
|
867
975
|
required: false,
|
|
868
|
-
fieldName:
|
|
869
|
-
},
|
|
870
|
-
policyId: {
|
|
871
|
-
type: 'string',
|
|
872
|
-
required: false,
|
|
873
|
-
fieldName: consentConfig?.fields?.policyId || 'policyId',
|
|
874
|
-
references: {
|
|
875
|
-
model: policyConfig?.entityName || 'consentPolicy',
|
|
876
|
-
field: 'id'
|
|
877
|
-
}
|
|
878
|
-
},
|
|
879
|
-
ipAddress: {
|
|
880
|
-
type: 'string',
|
|
881
|
-
required: false,
|
|
882
|
-
fieldName: consentConfig?.fields?.ipAddress || 'ipAddress'
|
|
883
|
-
},
|
|
884
|
-
userAgent: {
|
|
885
|
-
type: 'string',
|
|
886
|
-
required: false,
|
|
887
|
-
fieldName: consentConfig?.fields?.userAgent || 'userAgent'
|
|
976
|
+
fieldName: domainConfig?.fields?.allowedOrigins || 'allowedOrigins'
|
|
888
977
|
},
|
|
889
|
-
|
|
890
|
-
type: '
|
|
891
|
-
defaultValue:
|
|
978
|
+
isVerified: {
|
|
979
|
+
type: 'boolean',
|
|
980
|
+
defaultValue: true,
|
|
892
981
|
required: true,
|
|
893
|
-
fieldName:
|
|
982
|
+
fieldName: domainConfig?.fields?.isVerified || 'isVerified'
|
|
894
983
|
},
|
|
895
|
-
|
|
896
|
-
type: '
|
|
897
|
-
|
|
898
|
-
|
|
984
|
+
isActive: {
|
|
985
|
+
type: 'boolean',
|
|
986
|
+
defaultValue: true,
|
|
987
|
+
required: true,
|
|
988
|
+
fieldName: domainConfig?.fields?.isActive || 'isActive'
|
|
899
989
|
},
|
|
900
|
-
|
|
990
|
+
createdAt: {
|
|
901
991
|
type: 'date',
|
|
902
992
|
defaultValue: ()=>new Date(),
|
|
903
993
|
required: true,
|
|
904
|
-
fieldName:
|
|
994
|
+
fieldName: domainConfig?.fields?.createdAt || 'createdAt'
|
|
905
995
|
},
|
|
906
|
-
|
|
996
|
+
updatedAt: {
|
|
907
997
|
type: 'date',
|
|
908
998
|
required: false,
|
|
909
|
-
fieldName:
|
|
910
|
-
transform: {
|
|
911
|
-
input: (val, data)=>{
|
|
912
|
-
if (val) return val;
|
|
913
|
-
const expiresIn = consentConfig?.expiresIn || 31536000;
|
|
914
|
-
const givenAt = data.givenAt instanceof Date ? data.givenAt : new Date();
|
|
915
|
-
if (expiresIn > 0) {
|
|
916
|
-
const validUntil = new Date(givenAt);
|
|
917
|
-
validUntil.setSeconds(validUntil.getSeconds() + expiresIn);
|
|
918
|
-
return validUntil;
|
|
919
|
-
}
|
|
920
|
-
}
|
|
921
|
-
}
|
|
922
|
-
},
|
|
923
|
-
isActive: {
|
|
924
|
-
type: 'boolean',
|
|
925
|
-
defaultValue: true,
|
|
926
|
-
required: true,
|
|
927
|
-
fieldName: consentConfig?.fields?.isActive || 'isActive'
|
|
928
|
-
},
|
|
929
|
-
...consentFields || {},
|
|
930
|
-
...consentConfig?.additionalFields || {}
|
|
931
|
-
},
|
|
932
|
-
order: 3
|
|
933
|
-
};
|
|
934
|
-
}
|
|
935
|
-
const domainSchema = external_zod_namespaceObject.z.object({
|
|
936
|
-
id: external_zod_namespaceObject.z.string(),
|
|
937
|
-
name: external_zod_namespaceObject.z.string().min(1),
|
|
938
|
-
description: external_zod_namespaceObject.z.string().optional(),
|
|
939
|
-
allowedOrigins: external_zod_namespaceObject.z.array(external_zod_namespaceObject.z.string()).optional().default([]),
|
|
940
|
-
isVerified: external_zod_namespaceObject.z.boolean().default(true),
|
|
941
|
-
isActive: external_zod_namespaceObject.z.boolean().default(true),
|
|
942
|
-
createdAt: external_zod_namespaceObject.z.date().default(()=>new Date()),
|
|
943
|
-
updatedAt: external_zod_namespaceObject.z.date().default(()=>new Date())
|
|
944
|
-
});
|
|
945
|
-
function getDomainTable(options, domainFields) {
|
|
946
|
-
const domainConfig = options.tables?.domain;
|
|
947
|
-
return {
|
|
948
|
-
entityName: domainConfig?.entityName || 'domain',
|
|
949
|
-
entityPrefix: domainConfig?.entityPrefix || 'dom',
|
|
950
|
-
schema: domainSchema,
|
|
951
|
-
fields: {
|
|
952
|
-
name: {
|
|
953
|
-
type: 'string',
|
|
954
|
-
required: true,
|
|
955
|
-
unique: true,
|
|
956
|
-
fieldName: domainConfig?.fields?.name || 'name'
|
|
957
|
-
},
|
|
958
|
-
description: {
|
|
959
|
-
type: 'string',
|
|
960
|
-
required: false,
|
|
961
|
-
fieldName: domainConfig?.fields?.description || "description"
|
|
962
|
-
},
|
|
963
|
-
allowedOrigins: {
|
|
964
|
-
type: 'json',
|
|
965
|
-
defaultValue: ()=>[],
|
|
966
|
-
required: false,
|
|
967
|
-
fieldName: domainConfig?.fields?.allowedOrigins || 'allowedOrigins'
|
|
968
|
-
},
|
|
969
|
-
isVerified: {
|
|
970
|
-
type: 'boolean',
|
|
971
|
-
defaultValue: true,
|
|
972
|
-
required: true,
|
|
973
|
-
fieldName: domainConfig?.fields?.isVerified || 'isVerified'
|
|
974
|
-
},
|
|
975
|
-
isActive: {
|
|
976
|
-
type: 'boolean',
|
|
977
|
-
defaultValue: true,
|
|
978
|
-
required: true,
|
|
979
|
-
fieldName: domainConfig?.fields?.isActive || 'isActive'
|
|
980
|
-
},
|
|
981
|
-
createdAt: {
|
|
982
|
-
type: 'date',
|
|
983
|
-
defaultValue: ()=>new Date(),
|
|
984
|
-
required: true,
|
|
985
|
-
fieldName: domainConfig?.fields?.createdAt || 'createdAt'
|
|
986
|
-
},
|
|
987
|
-
updatedAt: {
|
|
988
|
-
type: 'date',
|
|
989
|
-
required: false,
|
|
990
|
-
fieldName: domainConfig?.fields?.updatedAt || 'updatedAt'
|
|
999
|
+
fieldName: domainConfig?.fields?.updatedAt || 'updatedAt'
|
|
991
1000
|
},
|
|
992
1001
|
...domainFields || {},
|
|
993
1002
|
...domainConfig?.additionalFields || {}
|
|
@@ -997,12 +1006,12 @@ function getDomainTable(options, domainFields) {
|
|
|
997
1006
|
}
|
|
998
1007
|
const subjectSchema = external_zod_namespaceObject.z.object({
|
|
999
1008
|
id: external_zod_namespaceObject.z.string(),
|
|
1000
|
-
isIdentified: external_zod_namespaceObject.z.boolean().
|
|
1009
|
+
isIdentified: external_zod_namespaceObject.z.boolean().prefault(false),
|
|
1001
1010
|
externalId: external_zod_namespaceObject.z.string().nullable().optional(),
|
|
1002
1011
|
identityProvider: external_zod_namespaceObject.z.string().optional(),
|
|
1003
1012
|
lastIpAddress: external_zod_namespaceObject.z.string().optional(),
|
|
1004
|
-
createdAt: external_zod_namespaceObject.z.date().
|
|
1005
|
-
updatedAt: external_zod_namespaceObject.z.date().
|
|
1013
|
+
createdAt: external_zod_namespaceObject.z.date().prefault(()=>new Date()),
|
|
1014
|
+
updatedAt: external_zod_namespaceObject.z.date().prefault(()=>new Date())
|
|
1006
1015
|
});
|
|
1007
1016
|
function getSubjectTable(options, subjectFields) {
|
|
1008
1017
|
const subjectConfig = options.tables?.subject;
|
|
@@ -1099,157 +1108,6 @@ function validateEntityOutput(tableName, data, options) {
|
|
|
1099
1108
|
throw error;
|
|
1100
1109
|
}
|
|
1101
1110
|
}
|
|
1102
|
-
function subjectRegistry({ adapter, ...ctx }) {
|
|
1103
|
-
const { createWithHooks } = getWithHooks(adapter, ctx);
|
|
1104
|
-
return {
|
|
1105
|
-
createSubject: async (subject, context)=>{
|
|
1106
|
-
const createdSubject = await createWithHooks({
|
|
1107
|
-
data: {
|
|
1108
|
-
createdAt: new Date(),
|
|
1109
|
-
updatedAt: new Date(),
|
|
1110
|
-
...subject
|
|
1111
|
-
},
|
|
1112
|
-
model: 'subject',
|
|
1113
|
-
customFn: void 0,
|
|
1114
|
-
context
|
|
1115
|
-
});
|
|
1116
|
-
return createdSubject ? validateEntityOutput('subject', createdSubject, ctx.options) : null;
|
|
1117
|
-
},
|
|
1118
|
-
findOrCreateSubject: async function({ subjectId, externalSubjectId, ipAddress = 'unknown', context }) {
|
|
1119
|
-
if (subjectId && externalSubjectId) {
|
|
1120
|
-
const [subjectById, subjectByExternalId] = await Promise.all([
|
|
1121
|
-
this.findSubjectById(subjectId),
|
|
1122
|
-
this.findSubjectByExternalId(externalSubjectId)
|
|
1123
|
-
]);
|
|
1124
|
-
if (!subjectById || !subjectByExternalId) {
|
|
1125
|
-
ctx.logger?.error('Subject validation failed: One or both subjects not found', {
|
|
1126
|
-
providedSubjectId: subjectId,
|
|
1127
|
-
providedExternalId: externalSubjectId,
|
|
1128
|
-
subjectByIdFound: !!subjectById,
|
|
1129
|
-
subjectByExternalIdFound: !!subjectByExternalId
|
|
1130
|
-
});
|
|
1131
|
-
throw new error_class_DoubleTieError('The specified subject could not be found. Please verify the subject identifiers and try again.', {
|
|
1132
|
-
code: error_codes_ERROR_CODES.NOT_FOUND,
|
|
1133
|
-
status: 404,
|
|
1134
|
-
meta: {
|
|
1135
|
-
providedSubjectId: subjectId,
|
|
1136
|
-
providedExternalId: externalSubjectId
|
|
1137
|
-
}
|
|
1138
|
-
});
|
|
1139
|
-
}
|
|
1140
|
-
if (subjectById.id !== subjectByExternalId.id) {
|
|
1141
|
-
ctx.logger?.warn('Subject validation failed: IDs do not match the same subject', {
|
|
1142
|
-
providedSubjectId: subjectId,
|
|
1143
|
-
providedExternalId: externalSubjectId,
|
|
1144
|
-
subjectByIdId: subjectById.id,
|
|
1145
|
-
subjectByExternalIdId: subjectByExternalId.id
|
|
1146
|
-
});
|
|
1147
|
-
throw new error_class_DoubleTieError('The provided subjectId and externalSubjectId do not match the same subject. Please ensure both identifiers refer to the same subject.', {
|
|
1148
|
-
code: error_codes_ERROR_CODES.CONFLICT,
|
|
1149
|
-
status: 409,
|
|
1150
|
-
meta: {
|
|
1151
|
-
providedSubjectId: subjectId,
|
|
1152
|
-
providedExternalId: externalSubjectId,
|
|
1153
|
-
subjectByIdId: subjectById.id,
|
|
1154
|
-
subjectByExternalIdId: subjectByExternalId.id
|
|
1155
|
-
}
|
|
1156
|
-
});
|
|
1157
|
-
}
|
|
1158
|
-
return subjectById;
|
|
1159
|
-
}
|
|
1160
|
-
if (subjectId) {
|
|
1161
|
-
const subject = await this.findSubjectById(subjectId);
|
|
1162
|
-
if (subject) return subject;
|
|
1163
|
-
throw new error_class_DoubleTieError('Subject not found by subjectId', {
|
|
1164
|
-
code: error_codes_ERROR_CODES.NOT_FOUND,
|
|
1165
|
-
status: 404
|
|
1166
|
-
});
|
|
1167
|
-
}
|
|
1168
|
-
if (externalSubjectId) try {
|
|
1169
|
-
const subject = await this.findSubjectByExternalId(externalSubjectId);
|
|
1170
|
-
if (subject) {
|
|
1171
|
-
ctx.logger?.debug('Found existing subject by external ID', {
|
|
1172
|
-
externalSubjectId
|
|
1173
|
-
});
|
|
1174
|
-
return subject;
|
|
1175
|
-
}
|
|
1176
|
-
ctx.logger?.info('Creating new subject with external ID', {
|
|
1177
|
-
externalSubjectId
|
|
1178
|
-
});
|
|
1179
|
-
return await this.createSubject({
|
|
1180
|
-
externalId: externalSubjectId,
|
|
1181
|
-
identityProvider: 'external',
|
|
1182
|
-
lastIpAddress: ipAddress,
|
|
1183
|
-
isIdentified: true
|
|
1184
|
-
}, context);
|
|
1185
|
-
} catch (error) {
|
|
1186
|
-
if (error instanceof Error && error.message.includes('unique constraint')) {
|
|
1187
|
-
ctx.logger?.info('Handling duplicate key violation for external ID', {
|
|
1188
|
-
externalSubjectId
|
|
1189
|
-
});
|
|
1190
|
-
const subject = await this.findSubjectByExternalId(externalSubjectId);
|
|
1191
|
-
if (subject) return subject;
|
|
1192
|
-
}
|
|
1193
|
-
ctx.logger?.error('Failed to create or find subject with external ID', {
|
|
1194
|
-
externalSubjectId,
|
|
1195
|
-
error: error instanceof Error ? error.message : 'Unknown error'
|
|
1196
|
-
});
|
|
1197
|
-
throw new error_class_DoubleTieError('Failed to create or find subject with external ID', {
|
|
1198
|
-
code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
1199
|
-
status: 500,
|
|
1200
|
-
meta: {
|
|
1201
|
-
error: error instanceof Error ? error.message : 'Unknown error'
|
|
1202
|
-
}
|
|
1203
|
-
});
|
|
1204
|
-
}
|
|
1205
|
-
try {
|
|
1206
|
-
ctx.logger?.info('Creating new anonymous subject');
|
|
1207
|
-
return await this.createSubject({
|
|
1208
|
-
externalId: null,
|
|
1209
|
-
identityProvider: 'anonymous',
|
|
1210
|
-
lastIpAddress: ipAddress,
|
|
1211
|
-
isIdentified: false
|
|
1212
|
-
}, context);
|
|
1213
|
-
} catch (error) {
|
|
1214
|
-
ctx.logger?.error('Failed to create anonymous subject', {
|
|
1215
|
-
ipAddress,
|
|
1216
|
-
error: error instanceof Error ? error.message : 'Unknown error'
|
|
1217
|
-
});
|
|
1218
|
-
throw new error_class_DoubleTieError('Failed to create anonymous subject', {
|
|
1219
|
-
code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
1220
|
-
status: 500,
|
|
1221
|
-
meta: {
|
|
1222
|
-
error: error instanceof Error ? error.message : 'Unknown error'
|
|
1223
|
-
}
|
|
1224
|
-
});
|
|
1225
|
-
}
|
|
1226
|
-
},
|
|
1227
|
-
findSubjectById: async (subjectId)=>{
|
|
1228
|
-
const subject = await adapter.findOne({
|
|
1229
|
-
model: 'subject',
|
|
1230
|
-
where: [
|
|
1231
|
-
{
|
|
1232
|
-
field: 'id',
|
|
1233
|
-
value: subjectId
|
|
1234
|
-
}
|
|
1235
|
-
]
|
|
1236
|
-
});
|
|
1237
|
-
return subject ? validateEntityOutput('subject', subject, ctx.options) : null;
|
|
1238
|
-
},
|
|
1239
|
-
findSubjectByExternalId: async (externalId)=>{
|
|
1240
|
-
const subject = await adapter.findOne({
|
|
1241
|
-
model: 'subject',
|
|
1242
|
-
where: [
|
|
1243
|
-
{
|
|
1244
|
-
field: 'externalId',
|
|
1245
|
-
value: externalId
|
|
1246
|
-
}
|
|
1247
|
-
]
|
|
1248
|
-
});
|
|
1249
|
-
return subject ? validateEntityOutput('subject', subject, ctx.options) : null;
|
|
1250
|
-
}
|
|
1251
|
-
};
|
|
1252
|
-
}
|
|
1253
1111
|
function consentRegistry({ adapter, ...ctx }) {
|
|
1254
1112
|
const { createWithHooks, updateWithHooks } = getWithHooks(adapter, ctx);
|
|
1255
1113
|
const registry = {
|
|
@@ -1525,24 +1383,154 @@ function domainRegistry({ adapter, ...ctx }) {
|
|
|
1525
1383
|
};
|
|
1526
1384
|
return registry;
|
|
1527
1385
|
}
|
|
1528
|
-
function
|
|
1386
|
+
function subjectRegistry({ adapter, ...ctx }) {
|
|
1529
1387
|
const { createWithHooks } = getWithHooks(adapter, ctx);
|
|
1530
1388
|
return {
|
|
1531
|
-
|
|
1532
|
-
const
|
|
1389
|
+
createSubject: async (subject, context)=>{
|
|
1390
|
+
const createdSubject = await createWithHooks({
|
|
1533
1391
|
data: {
|
|
1534
1392
|
createdAt: new Date(),
|
|
1535
|
-
|
|
1393
|
+
updatedAt: new Date(),
|
|
1394
|
+
...subject
|
|
1536
1395
|
},
|
|
1537
|
-
model: '
|
|
1396
|
+
model: 'subject',
|
|
1538
1397
|
customFn: void 0,
|
|
1539
1398
|
context
|
|
1540
1399
|
});
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1400
|
+
return createdSubject ? validateEntityOutput('subject', createdSubject, ctx.options) : null;
|
|
1401
|
+
},
|
|
1402
|
+
findOrCreateSubject: async function({ subjectId, externalSubjectId, ipAddress = 'unknown', context }) {
|
|
1403
|
+
if (subjectId && externalSubjectId) {
|
|
1404
|
+
const [subjectById, subjectByExternalId] = await Promise.all([
|
|
1405
|
+
this.findSubjectById(subjectId),
|
|
1406
|
+
this.findSubjectByExternalId(externalSubjectId)
|
|
1407
|
+
]);
|
|
1408
|
+
if (!subjectById || !subjectByExternalId) {
|
|
1409
|
+
ctx.logger?.error('Subject validation failed: One or both subjects not found', {
|
|
1410
|
+
providedSubjectId: subjectId,
|
|
1411
|
+
providedExternalId: externalSubjectId,
|
|
1412
|
+
subjectByIdFound: !!subjectById,
|
|
1413
|
+
subjectByExternalIdFound: !!subjectByExternalId
|
|
1414
|
+
});
|
|
1415
|
+
throw new error_class_DoubleTieError('The specified subject could not be found. Please verify the subject identifiers and try again.', {
|
|
1416
|
+
code: error_codes_ERROR_CODES.NOT_FOUND,
|
|
1417
|
+
status: 404,
|
|
1418
|
+
meta: {
|
|
1419
|
+
providedSubjectId: subjectId,
|
|
1420
|
+
providedExternalId: externalSubjectId
|
|
1421
|
+
}
|
|
1422
|
+
});
|
|
1423
|
+
}
|
|
1424
|
+
if (subjectById.id !== subjectByExternalId.id) {
|
|
1425
|
+
ctx.logger?.warn('Subject validation failed: IDs do not match the same subject', {
|
|
1426
|
+
providedSubjectId: subjectId,
|
|
1427
|
+
providedExternalId: externalSubjectId,
|
|
1428
|
+
subjectByIdId: subjectById.id,
|
|
1429
|
+
subjectByExternalIdId: subjectByExternalId.id
|
|
1430
|
+
});
|
|
1431
|
+
throw new error_class_DoubleTieError('The provided subjectId and externalSubjectId do not match the same subject. Please ensure both identifiers refer to the same subject.', {
|
|
1432
|
+
code: error_codes_ERROR_CODES.CONFLICT,
|
|
1433
|
+
status: 409,
|
|
1434
|
+
meta: {
|
|
1435
|
+
providedSubjectId: subjectId,
|
|
1436
|
+
providedExternalId: externalSubjectId,
|
|
1437
|
+
subjectByIdId: subjectById.id,
|
|
1438
|
+
subjectByExternalIdId: subjectByExternalId.id
|
|
1439
|
+
}
|
|
1440
|
+
});
|
|
1441
|
+
}
|
|
1442
|
+
return subjectById;
|
|
1443
|
+
}
|
|
1444
|
+
if (subjectId) {
|
|
1445
|
+
const subject = await this.findSubjectById(subjectId);
|
|
1446
|
+
if (subject) return subject;
|
|
1447
|
+
throw new error_class_DoubleTieError('Subject not found by subjectId', {
|
|
1448
|
+
code: error_codes_ERROR_CODES.NOT_FOUND,
|
|
1449
|
+
status: 404
|
|
1450
|
+
});
|
|
1451
|
+
}
|
|
1452
|
+
if (externalSubjectId) try {
|
|
1453
|
+
const subject = await this.findSubjectByExternalId(externalSubjectId);
|
|
1454
|
+
if (subject) {
|
|
1455
|
+
ctx.logger?.debug('Found existing subject by external ID', {
|
|
1456
|
+
externalSubjectId
|
|
1457
|
+
});
|
|
1458
|
+
return subject;
|
|
1459
|
+
}
|
|
1460
|
+
ctx.logger?.info('Creating new subject with external ID', {
|
|
1461
|
+
externalSubjectId
|
|
1462
|
+
});
|
|
1463
|
+
return await this.createSubject({
|
|
1464
|
+
externalId: externalSubjectId,
|
|
1465
|
+
identityProvider: 'external',
|
|
1466
|
+
lastIpAddress: ipAddress,
|
|
1467
|
+
isIdentified: true
|
|
1468
|
+
}, context);
|
|
1469
|
+
} catch (error) {
|
|
1470
|
+
if (error instanceof Error && error.message.includes('unique constraint')) {
|
|
1471
|
+
ctx.logger?.info('Handling duplicate key violation for external ID', {
|
|
1472
|
+
externalSubjectId
|
|
1473
|
+
});
|
|
1474
|
+
const subject = await this.findSubjectByExternalId(externalSubjectId);
|
|
1475
|
+
if (subject) return subject;
|
|
1476
|
+
}
|
|
1477
|
+
ctx.logger?.error('Failed to create or find subject with external ID', {
|
|
1478
|
+
externalSubjectId,
|
|
1479
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
1480
|
+
});
|
|
1481
|
+
throw new error_class_DoubleTieError('Failed to create or find subject with external ID', {
|
|
1482
|
+
code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
1483
|
+
status: 500,
|
|
1484
|
+
meta: {
|
|
1485
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
1486
|
+
}
|
|
1487
|
+
});
|
|
1488
|
+
}
|
|
1489
|
+
try {
|
|
1490
|
+
ctx.logger?.info('Creating new anonymous subject');
|
|
1491
|
+
return await this.createSubject({
|
|
1492
|
+
externalId: null,
|
|
1493
|
+
identityProvider: 'anonymous',
|
|
1494
|
+
lastIpAddress: ipAddress,
|
|
1495
|
+
isIdentified: false
|
|
1496
|
+
}, context);
|
|
1497
|
+
} catch (error) {
|
|
1498
|
+
ctx.logger?.error('Failed to create anonymous subject', {
|
|
1499
|
+
ipAddress,
|
|
1500
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
1501
|
+
});
|
|
1502
|
+
throw new error_class_DoubleTieError('Failed to create anonymous subject', {
|
|
1503
|
+
code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
1504
|
+
status: 500,
|
|
1505
|
+
meta: {
|
|
1506
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
1507
|
+
}
|
|
1508
|
+
});
|
|
1509
|
+
}
|
|
1510
|
+
},
|
|
1511
|
+
findSubjectById: async (subjectId)=>{
|
|
1512
|
+
const subject = await adapter.findOne({
|
|
1513
|
+
model: 'subject',
|
|
1514
|
+
where: [
|
|
1515
|
+
{
|
|
1516
|
+
field: 'id',
|
|
1517
|
+
value: subjectId
|
|
1518
|
+
}
|
|
1519
|
+
]
|
|
1544
1520
|
});
|
|
1545
|
-
return
|
|
1521
|
+
return subject ? validateEntityOutput('subject', subject, ctx.options) : null;
|
|
1522
|
+
},
|
|
1523
|
+
findSubjectByExternalId: async (externalId)=>{
|
|
1524
|
+
const subject = await adapter.findOne({
|
|
1525
|
+
model: 'subject',
|
|
1526
|
+
where: [
|
|
1527
|
+
{
|
|
1528
|
+
field: 'externalId',
|
|
1529
|
+
value: externalId
|
|
1530
|
+
}
|
|
1531
|
+
]
|
|
1532
|
+
});
|
|
1533
|
+
return subject ? validateEntityOutput('subject', subject, ctx.options) : null;
|
|
1546
1534
|
}
|
|
1547
1535
|
};
|
|
1548
1536
|
}
|