@c15t/backend 0.0.1-rc.10
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 +11 -0
- package/.turbo/turbo-check-types.log +5 -0
- package/.turbo/turbo-fmt.log +7 -0
- package/.turbo/turbo-lint.log +6 -0
- package/.turbo/turbo-test.log +26 -0
- package/README-next.md +223 -0
- package/README.md +164 -0
- package/dist/api/call.d.ts +176 -0
- package/dist/api/call.d.ts.map +1 -0
- package/dist/api/index.d.ts +935 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/middlewares/index.d.ts +39 -0
- package/dist/api/middlewares/index.d.ts.map +1 -0
- package/dist/api/middlewares/origin-check.d.ts +82 -0
- package/dist/api/middlewares/origin-check.d.ts.map +1 -0
- package/dist/api/middlewares/validate-context.d.ts +38 -0
- package/dist/api/middlewares/validate-context.d.ts.map +1 -0
- package/dist/api/routes/__tests__/consent.test.d.ts +2 -0
- package/dist/api/routes/__tests__/consent.test.d.ts.map +1 -0
- package/dist/api/routes/__tests__/status.test.d.ts +2 -0
- package/dist/api/routes/__tests__/status.test.d.ts.map +1 -0
- package/dist/api/routes/error.d.ts +57 -0
- package/dist/api/routes/error.d.ts.map +1 -0
- package/dist/api/routes/generate-consent-receipt.d.ts +130 -0
- package/dist/api/routes/generate-consent-receipt.d.ts.map +1 -0
- package/dist/api/routes/get-consent-history.d.ts +133 -0
- package/dist/api/routes/get-consent-history.d.ts.map +1 -0
- package/dist/api/routes/get-consent-policy.d.ts +164 -0
- package/dist/api/routes/get-consent-policy.d.ts.map +1 -0
- package/dist/api/routes/get-consent.d.ts +148 -0
- package/dist/api/routes/get-consent.d.ts.map +1 -0
- package/dist/api/routes/index.d.ts +339 -0
- package/dist/api/routes/index.d.ts.map +1 -0
- package/dist/api/routes/ok.d.ts +87 -0
- package/dist/api/routes/ok.d.ts.map +1 -0
- package/dist/api/routes/set-consent.d.ts +245 -0
- package/dist/api/routes/set-consent.d.ts.map +1 -0
- package/dist/api/routes/show-consent-banner.d.ts +127 -0
- package/dist/api/routes/show-consent-banner.d.ts.map +1 -0
- package/dist/api/routes/status.d.ts +61 -0
- package/dist/api/routes/status.d.ts.map +1 -0
- package/dist/api/routes/verify-consent.d.ts +179 -0
- package/dist/api/routes/verify-consent.d.ts.map +1 -0
- package/dist/api/routes/withdraw-consent.d.ts +194 -0
- package/dist/api/routes/withdraw-consent.d.ts.map +1 -0
- package/dist/api/to-endpoints.d.ts +35 -0
- package/dist/api/to-endpoints.d.ts.map +1 -0
- package/dist/client/index.cjs +139 -0
- package/dist/client/index.d.ts +203 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +106 -0
- package/dist/client/types.d.ts +431 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/core.d.ts +124 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.test.d.ts +2 -0
- package/dist/core.test.d.ts.map +1 -0
- package/dist/db/adapters/drizzle-adapter/drizzle-adapter.d.ts +122 -0
- package/dist/db/adapters/drizzle-adapter/drizzle-adapter.d.ts.map +1 -0
- package/dist/db/adapters/drizzle-adapter/index.d.ts +2 -0
- package/dist/db/adapters/drizzle-adapter/index.d.ts.map +1 -0
- package/dist/db/adapters/drizzle.cjs +1531 -0
- package/dist/db/adapters/drizzle.js +1489 -0
- package/dist/db/adapters/kysely-adapter/dialect.d.ts +72 -0
- package/dist/db/adapters/kysely-adapter/dialect.d.ts.map +1 -0
- package/dist/db/adapters/kysely-adapter/index.d.ts +4 -0
- package/dist/db/adapters/kysely-adapter/index.d.ts.map +1 -0
- package/dist/db/adapters/kysely-adapter/kysely-adapter.d.ts +98 -0
- package/dist/db/adapters/kysely-adapter/kysely-adapter.d.ts.map +1 -0
- package/dist/db/adapters/kysely-adapter/types.d.ts +281 -0
- package/dist/db/adapters/kysely-adapter/types.d.ts.map +1 -0
- package/dist/db/adapters/kysely.cjs +1551 -0
- package/dist/db/adapters/kysely.js +1508 -0
- package/dist/db/adapters/memory-adapter/index.d.ts +2 -0
- package/dist/db/adapters/memory-adapter/index.d.ts.map +1 -0
- package/dist/db/adapters/memory-adapter/memory-adapter.d.ts +56 -0
- package/dist/db/adapters/memory-adapter/memory-adapter.d.ts.map +1 -0
- package/dist/db/adapters/memory.cjs +1391 -0
- package/dist/db/adapters/memory.js +1349 -0
- package/dist/db/adapters/prisma-adapter/index.d.ts +2 -0
- package/dist/db/adapters/prisma-adapter/index.d.ts.map +1 -0
- package/dist/db/adapters/prisma-adapter/prisma-adapter.d.ts +143 -0
- package/dist/db/adapters/prisma-adapter/prisma-adapter.d.ts.map +1 -0
- package/dist/db/adapters/prisma.cjs +1503 -0
- package/dist/db/adapters/prisma.js +1461 -0
- package/dist/db/adapters/types.d.ts +154 -0
- package/dist/db/adapters/types.d.ts.map +1 -0
- package/dist/db/adapters/utils.d.ts +36 -0
- package/dist/db/adapters/utils.d.ts.map +1 -0
- package/dist/db/core/fields/field-factory.d.ts +383 -0
- package/dist/db/core/fields/field-factory.d.ts.map +1 -0
- package/dist/db/core/fields/field-inference.d.ts +218 -0
- package/dist/db/core/fields/field-inference.d.ts.map +1 -0
- package/dist/db/core/fields/field-options-integration.d.ts +90 -0
- package/dist/db/core/fields/field-options-integration.d.ts.map +1 -0
- package/dist/db/core/fields/field-types.d.ts +182 -0
- package/dist/db/core/fields/field-types.d.ts.map +1 -0
- package/dist/db/core/fields/id-generator.d.ts +19 -0
- package/dist/db/core/fields/id-generator.d.ts.map +1 -0
- package/dist/db/core/fields/index.d.ts +8 -0
- package/dist/db/core/fields/index.d.ts.map +1 -0
- package/dist/db/core/fields/superjson-utils.d.ts +34 -0
- package/dist/db/core/fields/superjson-utils.d.ts.map +1 -0
- package/dist/db/core/fields/zod-fields.d.ts +1011 -0
- package/dist/db/core/fields/zod-fields.d.ts.map +1 -0
- package/dist/db/core/get-schema.d.ts +36 -0
- package/dist/db/core/get-schema.d.ts.map +1 -0
- package/dist/db/core/types.d.ts +41 -0
- package/dist/db/core/types.d.ts.map +1 -0
- package/dist/db/create-registry.d.ts +760 -0
- package/dist/db/create-registry.d.ts.map +1 -0
- package/dist/db/hooks/create-hooks.d.ts +32 -0
- package/dist/db/hooks/create-hooks.d.ts.map +1 -0
- package/dist/db/hooks/index.d.ts +40 -0
- package/dist/db/hooks/index.d.ts.map +1 -0
- package/dist/db/hooks/types.d.ts +133 -0
- package/dist/db/hooks/types.d.ts.map +1 -0
- package/dist/db/hooks/update-hooks.d.ts +33 -0
- package/dist/db/hooks/update-hooks.d.ts.map +1 -0
- package/dist/db/hooks/update-many-hooks.d.ts +55 -0
- package/dist/db/hooks/update-many-hooks.d.ts.map +1 -0
- package/dist/db/hooks/utils.d.ts +62 -0
- package/dist/db/hooks/utils.d.ts.map +1 -0
- package/dist/db/hooks/with-hooks-factory.d.ts +33 -0
- package/dist/db/hooks/with-hooks-factory.d.ts.map +1 -0
- package/dist/db/index.cjs +2458 -0
- package/dist/db/index.d.ts +11 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +2404 -0
- package/dist/db/migration/get-migration.d.ts +32 -0
- package/dist/db/migration/get-migration.d.ts.map +1 -0
- package/dist/db/migration/get-schema/get-schema.d.ts +27 -0
- package/dist/db/migration/get-schema/get-schema.d.ts.map +1 -0
- package/dist/db/migration/get-schema/index.d.ts +21 -0
- package/dist/db/migration/get-schema/index.d.ts.map +1 -0
- package/dist/db/migration/get-schema/process-fields.d.ts +16 -0
- package/dist/db/migration/get-schema/process-fields.d.ts.map +1 -0
- package/dist/db/migration/get-schema/process-tables.d.ts +13 -0
- package/dist/db/migration/get-schema/process-tables.d.ts.map +1 -0
- package/dist/db/migration/get-schema/types.d.ts +17 -0
- package/dist/db/migration/get-schema/types.d.ts.map +1 -0
- package/dist/db/migration/index.cjs +1613 -0
- package/dist/db/migration/index.d.ts +14 -0
- package/dist/db/migration/index.d.ts.map +1 -0
- package/dist/db/migration/index.js +1571 -0
- package/dist/db/migration/migration-builders.d.ts +28 -0
- package/dist/db/migration/migration-builders.d.ts.map +1 -0
- package/dist/db/migration/migration-execution.d.ts +12 -0
- package/dist/db/migration/migration-execution.d.ts.map +1 -0
- package/dist/db/migration/schema-comparison.d.ts +54 -0
- package/dist/db/migration/schema-comparison.d.ts.map +1 -0
- package/dist/db/migration/type-mapping.d.ts +86 -0
- package/dist/db/migration/type-mapping.d.ts.map +1 -0
- package/dist/db/migration/types.d.ts +37 -0
- package/dist/db/migration/types.d.ts.map +1 -0
- package/dist/db/schema/audit-log/index.d.ts +4 -0
- package/dist/db/schema/audit-log/index.d.ts.map +1 -0
- package/dist/db/schema/audit-log/registry.d.ts +128 -0
- package/dist/db/schema/audit-log/registry.d.ts.map +1 -0
- package/dist/db/schema/audit-log/schema.d.ts +67 -0
- package/dist/db/schema/audit-log/schema.d.ts.map +1 -0
- package/dist/db/schema/audit-log/table.d.ts +175 -0
- package/dist/db/schema/audit-log/table.d.ts.map +1 -0
- package/dist/db/schema/audit-log/types.d.ts +29 -0
- package/dist/db/schema/audit-log/types.d.ts.map +1 -0
- package/dist/db/schema/consent/index.d.ts +4 -0
- package/dist/db/schema/consent/index.d.ts.map +1 -0
- package/dist/db/schema/consent/registry.d.ts +318 -0
- package/dist/db/schema/consent/registry.d.ts.map +1 -0
- package/dist/db/schema/consent/schema.d.ts +135 -0
- package/dist/db/schema/consent/schema.d.ts.map +1 -0
- package/dist/db/schema/consent/table.d.ts +245 -0
- package/dist/db/schema/consent/table.d.ts.map +1 -0
- package/dist/db/schema/consent/types.d.ts +37 -0
- package/dist/db/schema/consent/types.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/index.d.ts +4 -0
- package/dist/db/schema/consent-geo-location/index.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/registry.d.ts +96 -0
- package/dist/db/schema/consent-geo-location/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/schema.d.ts +71 -0
- package/dist/db/schema/consent-geo-location/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/table.d.ts +167 -0
- package/dist/db/schema/consent-geo-location/table.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/types.d.ts +21 -0
- package/dist/db/schema/consent-geo-location/types.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/index.d.ts +4 -0
- package/dist/db/schema/consent-policy/index.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/registry.d.ts +186 -0
- package/dist/db/schema/consent-policy/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/schema.d.ts +68 -0
- package/dist/db/schema/consent-policy/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/table.d.ts +147 -0
- package/dist/db/schema/consent-policy/table.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/types.d.ts +28 -0
- package/dist/db/schema/consent-policy/types.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/index.d.ts +4 -0
- package/dist/db/schema/consent-purpose/index.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/registry.d.ts +136 -0
- package/dist/db/schema/consent-purpose/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/schema.d.ts +79 -0
- package/dist/db/schema/consent-purpose/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/table.d.ts +161 -0
- package/dist/db/schema/consent-purpose/table.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/types.d.ts +16 -0
- package/dist/db/schema/consent-purpose/types.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/index.d.ts +4 -0
- package/dist/db/schema/consent-purpose-junction/index.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/registry.d.ts +109 -0
- package/dist/db/schema/consent-purpose-junction/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/schema.d.ts +57 -0
- package/dist/db/schema/consent-purpose-junction/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/table.d.ts +138 -0
- package/dist/db/schema/consent-purpose-junction/table.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/types.d.ts +14 -0
- package/dist/db/schema/consent-purpose-junction/types.d.ts.map +1 -0
- package/dist/db/schema/consent-record/index.d.ts +4 -0
- package/dist/db/schema/consent-record/index.d.ts.map +1 -0
- package/dist/db/schema/consent-record/registry.d.ts +119 -0
- package/dist/db/schema/consent-record/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-record/schema.d.ts +57 -0
- package/dist/db/schema/consent-record/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-record/table.d.ts +123 -0
- package/dist/db/schema/consent-record/table.d.ts.map +1 -0
- package/dist/db/schema/consent-record/types.d.ts +21 -0
- package/dist/db/schema/consent-record/types.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/index.d.ts +4 -0
- package/dist/db/schema/consent-withdrawal/index.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/registry.d.ts +134 -0
- package/dist/db/schema/consent-withdrawal/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/schema.d.ts +67 -0
- package/dist/db/schema/consent-withdrawal/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/table.d.ts +170 -0
- package/dist/db/schema/consent-withdrawal/table.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/types.d.ts +28 -0
- package/dist/db/schema/consent-withdrawal/types.d.ts.map +1 -0
- package/dist/db/schema/definition.d.ts +1100 -0
- package/dist/db/schema/definition.d.ts.map +1 -0
- package/dist/db/schema/domain/index.d.ts +4 -0
- package/dist/db/schema/domain/index.d.ts.map +1 -0
- package/dist/db/schema/domain/registry.d.ts +169 -0
- package/dist/db/schema/domain/registry.d.ts.map +1 -0
- package/dist/db/schema/domain/schema.d.ts +60 -0
- package/dist/db/schema/domain/schema.d.ts.map +1 -0
- package/dist/db/schema/domain/table.d.ts +140 -0
- package/dist/db/schema/domain/table.d.ts.map +1 -0
- package/dist/db/schema/domain/types.d.ts +27 -0
- package/dist/db/schema/domain/types.d.ts.map +1 -0
- package/dist/db/schema/geo-location/index.d.ts +4 -0
- package/dist/db/schema/geo-location/index.d.ts.map +1 -0
- package/dist/db/schema/geo-location/registry.d.ts +114 -0
- package/dist/db/schema/geo-location/registry.d.ts.map +1 -0
- package/dist/db/schema/geo-location/schema.d.ts +58 -0
- package/dist/db/schema/geo-location/schema.d.ts.map +1 -0
- package/dist/db/schema/geo-location/table.d.ts +132 -0
- package/dist/db/schema/geo-location/table.d.ts.map +1 -0
- package/dist/db/schema/geo-location/types.d.ts +17 -0
- package/dist/db/schema/geo-location/types.d.ts.map +1 -0
- package/dist/db/schema/index.d.ts +85 -0
- package/dist/db/schema/index.d.ts.map +1 -0
- package/dist/db/schema/parser.d.ts +183 -0
- package/dist/db/schema/parser.d.ts.map +1 -0
- package/dist/db/schema/schemas.d.ts +383 -0
- package/dist/db/schema/schemas.d.ts.map +1 -0
- package/dist/db/schema/subject/index.d.ts +4 -0
- package/dist/db/schema/subject/index.d.ts.map +1 -0
- package/dist/db/schema/subject/registry.d.ts +141 -0
- package/dist/db/schema/subject/registry.d.ts.map +1 -0
- package/dist/db/schema/subject/schema.d.ts +56 -0
- package/dist/db/schema/subject/schema.d.ts.map +1 -0
- package/dist/db/schema/subject/table.d.ts +136 -0
- package/dist/db/schema/subject/table.d.ts.map +1 -0
- package/dist/db/schema/subject/types.d.ts +22 -0
- package/dist/db/schema/subject/types.d.ts.map +1 -0
- package/dist/db/schema/types.d.ts +136 -0
- package/dist/db/schema/types.d.ts.map +1 -0
- package/dist/db/utils/adapter-factory.d.ts +21 -0
- package/dist/db/utils/adapter-factory.d.ts.map +1 -0
- package/dist/db/utils/index.d.ts +10 -0
- package/dist/db/utils/index.d.ts.map +1 -0
- package/dist/db/utils.d.ts +4 -0
- package/dist/db/utils.d.ts.map +1 -0
- package/dist/error/codes.cjs +68 -0
- package/dist/error/codes.d.ts +175 -0
- package/dist/error/codes.d.ts.map +1 -0
- package/dist/error/codes.js +35 -0
- package/dist/error/error.d.ts +79 -0
- package/dist/error/error.d.ts.map +1 -0
- package/dist/error/index.cjs +172 -0
- package/dist/error/index.d.ts +9 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +129 -0
- package/dist/error/logging.d.ts +25 -0
- package/dist/error/logging.d.ts.map +1 -0
- package/dist/error/pipeline.d.ts +19 -0
- package/dist/error/pipeline.d.ts.map +1 -0
- package/dist/error/recovery.d.ts +22 -0
- package/dist/error/recovery.d.ts.map +1 -0
- package/dist/error/results.d.ts +56 -0
- package/dist/error/results.d.ts.map +1 -0
- package/dist/index.cjs +4777 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4708 -0
- package/dist/init.d.ts +52 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.test.d.ts +2 -0
- package/dist/init.test.d.ts.map +1 -0
- package/dist/integrations/index.cjs +281 -0
- package/dist/integrations/index.d.ts +7 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +248 -0
- package/dist/integrations/next.cjs +131 -0
- package/dist/integrations/next.d.ts +29 -0
- package/dist/integrations/next.d.ts.map +1 -0
- package/dist/integrations/next.js +99 -0
- package/dist/integrations/react.cjs +182 -0
- package/dist/integrations/react.d.ts +257 -0
- package/dist/integrations/react.d.ts.map +1 -0
- package/dist/integrations/react.js +150 -0
- package/dist/plugins/geo/index.d.ts +2 -0
- package/dist/plugins/geo/index.d.ts.map +1 -0
- package/dist/test/utils.d.ts +65 -0
- package/dist/test/utils.d.ts.map +1 -0
- package/dist/types/api.d.ts +89 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/context.d.ts +205 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/helper.d.ts +78 -0
- package/dist/types/helper.d.ts.map +1 -0
- package/dist/types/index.cjs +19 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +0 -0
- package/dist/types/options.d.ts +172 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/plugins.d.ts +442 -0
- package/dist/types/plugins.d.ts.map +1 -0
- package/dist/utils/env.d.ts +77 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/hide-metadata.d.ts +22 -0
- package/dist/utils/hide-metadata.d.ts.map +1 -0
- package/dist/utils/index.cjs +268 -0
- package/dist/utils/index.d.ts +18 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +210 -0
- package/dist/utils/ip.d.ts +10 -0
- package/dist/utils/ip.d.ts.map +1 -0
- package/dist/utils/json.d.ts +14 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +108 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/url.d.ts +87 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/wildcard.d.ts +46 -0
- package/dist/utils/wildcard.d.ts.map +1 -0
- package/knip.json +37 -0
- package/package.json +146 -0
- package/rslib.config.ts +104 -0
- package/src/api/call.ts +177 -0
- package/src/api/index.ts +303 -0
- package/src/api/middlewares/index.ts +38 -0
- package/src/api/middlewares/origin-check.ts +260 -0
- package/src/api/middlewares/validate-context.ts +175 -0
- package/src/api/routes/__tests__/consent.test.ts +270 -0
- package/src/api/routes/__tests__/status.test.ts +36 -0
- package/src/api/routes/error.ts +130 -0
- package/src/api/routes/generate-consent-receipt.ts +244 -0
- package/src/api/routes/get-consent-history.ts +128 -0
- package/src/api/routes/get-consent-policy.ts +327 -0
- package/src/api/routes/get-consent.ts +230 -0
- package/src/api/routes/index.ts +12 -0
- package/src/api/routes/ok.ts +45 -0
- package/src/api/routes/set-consent.ts +328 -0
- package/src/api/routes/show-consent-banner.ts +149 -0
- package/src/api/routes/status.ts +62 -0
- package/src/api/routes/verify-consent.ts +272 -0
- package/src/api/routes/withdraw-consent.ts +293 -0
- package/src/api/to-endpoints.ts +371 -0
- package/src/client/index.ts +471 -0
- package/src/client/types.ts +458 -0
- package/src/core.test.ts +303 -0
- package/src/core.ts +267 -0
- package/src/db/adapters/drizzle-adapter/drizzle-adapter.ts +711 -0
- package/src/db/adapters/drizzle-adapter/index.ts +1 -0
- package/src/db/adapters/kysely-adapter/dialect.ts +192 -0
- package/src/db/adapters/kysely-adapter/index.ts +3 -0
- package/src/db/adapters/kysely-adapter/kysely-adapter.ts +1168 -0
- package/src/db/adapters/kysely-adapter/types.ts +307 -0
- package/src/db/adapters/memory-adapter/index.ts +1 -0
- package/src/db/adapters/memory-adapter/memory-adapter.ts +648 -0
- package/src/db/adapters/prisma-adapter/index.ts +1 -0
- package/src/db/adapters/prisma-adapter/prisma-adapter.ts +586 -0
- package/src/db/adapters/types.ts +203 -0
- package/src/db/adapters/utils.ts +51 -0
- package/src/db/core/fields/field-factory.ts +804 -0
- package/src/db/core/fields/field-inference.ts +298 -0
- package/src/db/core/fields/field-options-integration.ts +135 -0
- package/src/db/core/fields/field-types.ts +233 -0
- package/src/db/core/fields/id-generator.ts +57 -0
- package/src/db/core/fields/index.ts +56 -0
- package/src/db/core/fields/superjson-utils.ts +155 -0
- package/src/db/core/fields/zod-fields.ts +269 -0
- package/src/db/core/get-schema.ts +102 -0
- package/src/db/core/types.ts +52 -0
- package/src/db/create-registry.ts +31 -0
- package/src/db/hooks/create-hooks.ts +88 -0
- package/src/db/hooks/index.ts +39 -0
- package/src/db/hooks/types.ts +164 -0
- package/src/db/hooks/update-hooks.ts +91 -0
- package/src/db/hooks/update-many-hooks.ts +176 -0
- package/src/db/hooks/utils.ts +151 -0
- package/src/db/hooks/with-hooks-factory.ts +68 -0
- package/src/db/index.ts +32 -0
- package/src/db/migration/get-migration.ts +89 -0
- package/src/db/migration/get-schema/get-schema.ts +44 -0
- package/src/db/migration/get-schema/index.ts +20 -0
- package/src/db/migration/get-schema/process-fields.ts +66 -0
- package/src/db/migration/get-schema/process-tables.ts +68 -0
- package/src/db/migration/get-schema/types.ts +18 -0
- package/src/db/migration/index.ts +18 -0
- package/src/db/migration/migration-builders.ts +170 -0
- package/src/db/migration/migration-execution.ts +79 -0
- package/src/db/migration/schema-comparison.ts +216 -0
- package/src/db/migration/type-mapping.ts +255 -0
- package/src/db/migration/types.ts +46 -0
- package/src/db/schema/audit-log/index.ts +3 -0
- package/src/db/schema/audit-log/registry.ts +228 -0
- package/src/db/schema/audit-log/schema.ts +46 -0
- package/src/db/schema/audit-log/table.ts +185 -0
- package/src/db/schema/audit-log/types.ts +29 -0
- package/src/db/schema/consent/index.ts +3 -0
- package/src/db/schema/consent/registry.ts +381 -0
- package/src/db/schema/consent/schema.ts +65 -0
- package/src/db/schema/consent/table.ts +220 -0
- package/src/db/schema/consent/types.ts +39 -0
- package/src/db/schema/consent-geo-location/index.ts +3 -0
- package/src/db/schema/consent-geo-location/registry.ts +124 -0
- package/src/db/schema/consent-geo-location/schema.ts +51 -0
- package/src/db/schema/consent-geo-location/table.ts +169 -0
- package/src/db/schema/consent-geo-location/types.ts +21 -0
- package/src/db/schema/consent-policy/index.ts +3 -0
- package/src/db/schema/consent-policy/registry.ts +313 -0
- package/src/db/schema/consent-policy/schema.ts +47 -0
- package/src/db/schema/consent-policy/table.ts +141 -0
- package/src/db/schema/consent-policy/types.ts +28 -0
- package/src/db/schema/consent-purpose/index.ts +3 -0
- package/src/db/schema/consent-purpose/registry.ts +188 -0
- package/src/db/schema/consent-purpose/schema.ts +58 -0
- package/src/db/schema/consent-purpose/table.ts +154 -0
- package/src/db/schema/consent-purpose/types.ts +16 -0
- package/src/db/schema/consent-purpose-junction/index.ts +3 -0
- package/src/db/schema/consent-purpose-junction/registry.ts +189 -0
- package/src/db/schema/consent-purpose-junction/schema.ts +49 -0
- package/src/db/schema/consent-purpose-junction/table.ts +142 -0
- package/src/db/schema/consent-purpose-junction/types.ts +14 -0
- package/src/db/schema/consent-record/index.ts +3 -0
- package/src/db/schema/consent-record/registry.ts +209 -0
- package/src/db/schema/consent-record/schema.ts +42 -0
- package/src/db/schema/consent-record/table.ts +124 -0
- package/src/db/schema/consent-record/types.ts +21 -0
- package/src/db/schema/consent-withdrawal/index.ts +3 -0
- package/src/db/schema/consent-withdrawal/registry.ts +219 -0
- package/src/db/schema/consent-withdrawal/schema.ts +48 -0
- package/src/db/schema/consent-withdrawal/table.ts +181 -0
- package/src/db/schema/consent-withdrawal/types.ts +29 -0
- package/src/db/schema/definition.ts +196 -0
- package/src/db/schema/domain/index.ts +3 -0
- package/src/db/schema/domain/registry.ts +272 -0
- package/src/db/schema/domain/schema.ts +43 -0
- package/src/db/schema/domain/table.ts +137 -0
- package/src/db/schema/domain/types.ts +27 -0
- package/src/db/schema/geo-location/index.ts +3 -0
- package/src/db/schema/geo-location/registry.ts +159 -0
- package/src/db/schema/geo-location/schema.ts +45 -0
- package/src/db/schema/geo-location/table.ts +148 -0
- package/src/db/schema/geo-location/types.ts +18 -0
- package/src/db/schema/index.ts +96 -0
- package/src/db/schema/parser.ts +417 -0
- package/src/db/schema/schemas.ts +35 -0
- package/src/db/schema/subject/index.ts +3 -0
- package/src/db/schema/subject/registry.ts +371 -0
- package/src/db/schema/subject/schema.ts +41 -0
- package/src/db/schema/subject/table.ts +139 -0
- package/src/db/schema/subject/types.ts +22 -0
- package/src/db/schema/types.ts +154 -0
- package/src/db/utils/adapter-factory.ts +64 -0
- package/src/db/utils/index.ts +10 -0
- package/src/db/utils.ts +42 -0
- package/src/docs/ADVANCED_JSON_HANDLING.md +99 -0
- package/src/docs/neverthrow.md +171 -0
- package/src/error/codes.ts +201 -0
- package/src/error/error.ts +145 -0
- package/src/error/index.ts +23 -0
- package/src/error/logging.ts +52 -0
- package/src/error/pipeline.ts +57 -0
- package/src/error/recovery.ts +45 -0
- package/src/error/results.ts +100 -0
- package/src/index.ts +79 -0
- package/src/init.test.ts +235 -0
- package/src/init.ts +261 -0
- package/src/integrations/index.ts +10 -0
- package/src/integrations/next.ts +136 -0
- package/src/integrations/react.ts +567 -0
- package/src/plugins/geo/index.ts +563 -0
- package/src/test/utils.ts +244 -0
- package/src/types/api.ts +101 -0
- package/src/types/context.ts +235 -0
- package/src/types/helper.ts +87 -0
- package/src/types/index.ts +5 -0
- package/src/types/options.ts +189 -0
- package/src/types/plugins.ts +538 -0
- package/src/utils/env.ts +103 -0
- package/src/utils/hide-metadata.ts +21 -0
- package/src/utils/index.ts +17 -0
- package/src/utils/ip.ts +45 -0
- package/src/utils/json.ts +19 -0
- package/src/utils/logger.ts +252 -0
- package/src/utils/url.ts +194 -0
- package/src/utils/wildcard.ts +253 -0
- package/tsconfig.json +12 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { EntityOutputFields } from '~/db/schema/definition';
|
|
3
|
+
import { BASE_ERROR_CODES, C15TError } from '~/error';
|
|
4
|
+
import type { C15TContext } from '../../types';
|
|
5
|
+
import { createAuthEndpoint } from '../call';
|
|
6
|
+
|
|
7
|
+
// Schema for the base verification criteria (at least domain is required)
|
|
8
|
+
const baseVerificationSchema = z.object({
|
|
9
|
+
domain: z.string(),
|
|
10
|
+
requiredPreferences: z.record(z.string().datetime().nullable()).optional(),
|
|
11
|
+
requireExactMatch: z.boolean().optional().default(false),
|
|
12
|
+
policyVersion: z.string().optional(),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
// Define schemas for the different identification methods
|
|
16
|
+
// At least one identifier must be provided
|
|
17
|
+
const identifierSchema = z
|
|
18
|
+
.object({
|
|
19
|
+
subjectId: z.string().optional(),
|
|
20
|
+
externalId: z.string().optional(),
|
|
21
|
+
ipAddress: z.string().optional(),
|
|
22
|
+
})
|
|
23
|
+
.refine(
|
|
24
|
+
(data) =>
|
|
25
|
+
data.subjectId !== undefined ||
|
|
26
|
+
data.externalId !== undefined ||
|
|
27
|
+
data.ipAddress !== undefined,
|
|
28
|
+
{
|
|
29
|
+
message:
|
|
30
|
+
'At least one identifier (subjectId, externalId, or ipAddress) must be provided',
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
// Combine the schemas
|
|
35
|
+
const verifyConsentSchema = baseVerificationSchema.and(identifierSchema);
|
|
36
|
+
|
|
37
|
+
export interface VerifyConsentResponse {
|
|
38
|
+
success: boolean;
|
|
39
|
+
data: {
|
|
40
|
+
verified: boolean;
|
|
41
|
+
consentDetails: {
|
|
42
|
+
id: string;
|
|
43
|
+
givenAt: string;
|
|
44
|
+
policyVersion: string;
|
|
45
|
+
preferences: Record<string, string | null>;
|
|
46
|
+
} | null;
|
|
47
|
+
identifiedBy: string | null;
|
|
48
|
+
verificationResults: {
|
|
49
|
+
hasActiveConsent: boolean;
|
|
50
|
+
meetsPreferenceRequirements: boolean;
|
|
51
|
+
matchesPolicyVersion: boolean;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Endpoint for verifying if a subject has given consent.
|
|
58
|
+
*
|
|
59
|
+
* This endpoint allows checking if a subject has provided consent for a specific domain
|
|
60
|
+
* and verifies if the consent meets specific criteria (required preferences, policy version).
|
|
61
|
+
* Subjects can be identified by subjectId, externalId, or ipAddress.
|
|
62
|
+
*
|
|
63
|
+
* @endpoint GET /consent/verify
|
|
64
|
+
*/
|
|
65
|
+
export const verifyConsent = createAuthEndpoint(
|
|
66
|
+
'/consent/verify',
|
|
67
|
+
{
|
|
68
|
+
method: 'GET',
|
|
69
|
+
query: verifyConsentSchema,
|
|
70
|
+
},
|
|
71
|
+
async (ctx) => {
|
|
72
|
+
try {
|
|
73
|
+
const validatedData = verifyConsentSchema.safeParse(ctx.query);
|
|
74
|
+
|
|
75
|
+
if (!validatedData.success) {
|
|
76
|
+
throw new C15TError(
|
|
77
|
+
'The request data is invalid. Please ensure all required fields are correctly filled and formatted.',
|
|
78
|
+
{
|
|
79
|
+
code: BASE_ERROR_CODES.BAD_REQUEST,
|
|
80
|
+
status: 400,
|
|
81
|
+
data: {
|
|
82
|
+
details: validatedData.error.errors,
|
|
83
|
+
},
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const params = validatedData.data;
|
|
89
|
+
const { registry } = ctx.context as C15TContext;
|
|
90
|
+
|
|
91
|
+
if (!registry) {
|
|
92
|
+
throw new C15TError(
|
|
93
|
+
'The registry service is currently unavailable. Please check the service status and try again later.',
|
|
94
|
+
{
|
|
95
|
+
code: BASE_ERROR_CODES.INITIALIZATION_FAILED,
|
|
96
|
+
status: 503,
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Find subject based on provided identifiers
|
|
102
|
+
let subjectRecord: EntityOutputFields<'subject'> | null = null;
|
|
103
|
+
let identifierUsed: string | null = null;
|
|
104
|
+
|
|
105
|
+
// Try to find subject by subjectId (most precise)
|
|
106
|
+
if (params.subjectId) {
|
|
107
|
+
subjectRecord = await registry.findSubjectById(params.subjectId);
|
|
108
|
+
if (subjectRecord) {
|
|
109
|
+
identifierUsed = 'subjectId';
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// If not found and externalId provided, try that
|
|
114
|
+
if (!subjectRecord && params.externalId) {
|
|
115
|
+
subjectRecord = await registry.findSubjectByExternalId(
|
|
116
|
+
params.externalId
|
|
117
|
+
);
|
|
118
|
+
if (subjectRecord) {
|
|
119
|
+
identifierUsed = 'externalId';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// If no subject found, return negative verification
|
|
124
|
+
if (!subjectRecord) {
|
|
125
|
+
return {
|
|
126
|
+
success: true,
|
|
127
|
+
data: {
|
|
128
|
+
verified: false,
|
|
129
|
+
consentDetails: null,
|
|
130
|
+
identifiedBy: null,
|
|
131
|
+
verificationResults: {
|
|
132
|
+
hasActiveConsent: false,
|
|
133
|
+
meetsPreferenceRequirements: false,
|
|
134
|
+
matchesPolicyVersion: false,
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Find active consents for this subject
|
|
141
|
+
const subjectConsents = await registry.findConsents({
|
|
142
|
+
subjectId: subjectRecord.id,
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
// Filter for active consents that match the domain
|
|
146
|
+
const activeConsents = subjectConsents.filter(
|
|
147
|
+
(consent) =>
|
|
148
|
+
consent.status === 'active' && consent.domainId === params.domain
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
// Sort consents by givenAt date, most recent first
|
|
152
|
+
activeConsents.sort(
|
|
153
|
+
(a, b) => new Date(b.givenAt).getTime() - new Date(a.givenAt).getTime()
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
// Get the most recent active consent for this domain, if any
|
|
157
|
+
const record = activeConsents.length > 0 ? activeConsents[0] : null;
|
|
158
|
+
|
|
159
|
+
// If no consent found, return negative verification
|
|
160
|
+
if (!record) {
|
|
161
|
+
return {
|
|
162
|
+
success: true,
|
|
163
|
+
data: {
|
|
164
|
+
verified: false,
|
|
165
|
+
consentDetails: null,
|
|
166
|
+
identifiedBy: identifierUsed,
|
|
167
|
+
verificationResults: {
|
|
168
|
+
hasActiveConsent: false,
|
|
169
|
+
meetsPreferenceRequirements: false,
|
|
170
|
+
matchesPolicyVersion: false,
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Verify consent meets criteria if specified
|
|
177
|
+
let meetsPreferenceRequirements = true;
|
|
178
|
+
if (params.requiredPreferences) {
|
|
179
|
+
const preferences =
|
|
180
|
+
(record.metadata as Record<string, unknown>)?.preferences || {};
|
|
181
|
+
|
|
182
|
+
// Check if all required preferences are present and have the correct values
|
|
183
|
+
for (const [key, requiredValue] of Object.entries(
|
|
184
|
+
params.requiredPreferences
|
|
185
|
+
)) {
|
|
186
|
+
//@ts-expect-error
|
|
187
|
+
const hasPreference = key in preferences;
|
|
188
|
+
//@ts-expect-error
|
|
189
|
+
const preferenceEnabled = hasPreference && preferences[key] !== null;
|
|
190
|
+
|
|
191
|
+
if (params.requireExactMatch) {
|
|
192
|
+
// Exact match requires preference to exist and match value exactly
|
|
193
|
+
if (
|
|
194
|
+
!hasPreference ||
|
|
195
|
+
preferenceEnabled !== (requiredValue !== null)
|
|
196
|
+
) {
|
|
197
|
+
meetsPreferenceRequirements = false;
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
} else if (requiredValue !== null && !preferenceEnabled) {
|
|
201
|
+
// Non-exact match only checks if required trues are true
|
|
202
|
+
meetsPreferenceRequirements = false;
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Verify policy version if specified
|
|
209
|
+
const matchesPolicyVersion = params.policyVersion
|
|
210
|
+
? record.policyId === params.policyVersion
|
|
211
|
+
: true;
|
|
212
|
+
|
|
213
|
+
// Determine overall verification result
|
|
214
|
+
const verified =
|
|
215
|
+
record.status === 'active' &&
|
|
216
|
+
meetsPreferenceRequirements &&
|
|
217
|
+
matchesPolicyVersion;
|
|
218
|
+
|
|
219
|
+
// Return verification result
|
|
220
|
+
return {
|
|
221
|
+
success: true,
|
|
222
|
+
data: {
|
|
223
|
+
verified,
|
|
224
|
+
consentDetails: {
|
|
225
|
+
id: record.id,
|
|
226
|
+
givenAt: record.givenAt.toISOString(),
|
|
227
|
+
policyVersion: record.policyId || '',
|
|
228
|
+
preferences:
|
|
229
|
+
(record.metadata as Record<string, unknown>)?.preferences || {},
|
|
230
|
+
},
|
|
231
|
+
identifiedBy: identifierUsed,
|
|
232
|
+
verificationResults: {
|
|
233
|
+
hasActiveConsent: record.status === 'active',
|
|
234
|
+
meetsPreferenceRequirements,
|
|
235
|
+
matchesPolicyVersion,
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
} catch (error) {
|
|
240
|
+
const context = ctx.context as C15TContext;
|
|
241
|
+
context.logger?.error?.('Error verifying consent:', error);
|
|
242
|
+
|
|
243
|
+
if (error instanceof C15TError) {
|
|
244
|
+
throw error;
|
|
245
|
+
}
|
|
246
|
+
if (error instanceof z.ZodError) {
|
|
247
|
+
throw new C15TError(
|
|
248
|
+
'The request data is invalid. Please ensure all required fields are correctly filled and formatted.',
|
|
249
|
+
{
|
|
250
|
+
code: BASE_ERROR_CODES.BAD_REQUEST,
|
|
251
|
+
status: 400,
|
|
252
|
+
data: {
|
|
253
|
+
details: error.errors,
|
|
254
|
+
},
|
|
255
|
+
}
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
throw new C15TError(
|
|
260
|
+
'Failed to verify consent. Please try again later or contact support if the issue persists.',
|
|
261
|
+
{
|
|
262
|
+
code: BASE_ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
263
|
+
status: 503,
|
|
264
|
+
data: {
|
|
265
|
+
details:
|
|
266
|
+
error instanceof Error ? { message: error.message } : { error },
|
|
267
|
+
},
|
|
268
|
+
}
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
);
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { EntityOutputFields } from '~/db/schema/definition';
|
|
3
|
+
import { BASE_ERROR_CODES, C15TError } from '~/error';
|
|
4
|
+
import type { C15TContext } from '../../types';
|
|
5
|
+
import { createAuthEndpoint } from '../call';
|
|
6
|
+
|
|
7
|
+
// Define the schemas for validating request body
|
|
8
|
+
// We'll have three different schemas for the three identification methods
|
|
9
|
+
const withdrawByConsentIdSchema = z.object({
|
|
10
|
+
consentId: z.string(),
|
|
11
|
+
identifierType: z.literal('consentId'),
|
|
12
|
+
reason: z.string().optional(),
|
|
13
|
+
method: z.string().min(1).max(50),
|
|
14
|
+
actor: z.string().optional(),
|
|
15
|
+
metadata: z.record(z.any()).optional(),
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
const withdrawBySubjectIdSchema = z.object({
|
|
19
|
+
subjectId: z.string(),
|
|
20
|
+
domain: z.string(),
|
|
21
|
+
identifierType: z.literal('subjectId'),
|
|
22
|
+
reason: z.string().optional(),
|
|
23
|
+
method: z.string().min(1).max(50),
|
|
24
|
+
actor: z.string().optional(),
|
|
25
|
+
metadata: z.record(z.any()).optional(),
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const withdrawByExternalIdSchema = z.object({
|
|
29
|
+
externalId: z.string(),
|
|
30
|
+
domain: z.string(),
|
|
31
|
+
identifierType: z.literal('externalId'),
|
|
32
|
+
reason: z.string().optional(),
|
|
33
|
+
method: z.string().min(1).max(50),
|
|
34
|
+
actor: z.string().optional(),
|
|
35
|
+
metadata: z.record(z.any()).optional(),
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Combined schema using discriminated union
|
|
39
|
+
const withdrawConsentSchema = z.discriminatedUnion('identifierType', [
|
|
40
|
+
withdrawByConsentIdSchema,
|
|
41
|
+
withdrawBySubjectIdSchema,
|
|
42
|
+
withdrawByExternalIdSchema,
|
|
43
|
+
]);
|
|
44
|
+
|
|
45
|
+
export interface WithdrawConsentResponse {
|
|
46
|
+
success: boolean;
|
|
47
|
+
data: {
|
|
48
|
+
withdrawalIds: string[];
|
|
49
|
+
consentIds: string[];
|
|
50
|
+
revokedAt: string;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Endpoint for withdrawing previously given consent.
|
|
56
|
+
*
|
|
57
|
+
* This endpoint allows clients to revoke a subject's consent by specifying either:
|
|
58
|
+
* 1. The specific consent ID to withdraw
|
|
59
|
+
* 2. The subject ID and domain to withdraw all active consents for that subject on that domain
|
|
60
|
+
* 3. The external subject ID and domain to withdraw all active consents for that subject on that domain
|
|
61
|
+
*
|
|
62
|
+
* @endpoint POST /consent/withdraw
|
|
63
|
+
*/
|
|
64
|
+
export const withdrawConsent = createAuthEndpoint(
|
|
65
|
+
'/consent/withdraw',
|
|
66
|
+
{
|
|
67
|
+
method: 'POST',
|
|
68
|
+
body: withdrawConsentSchema,
|
|
69
|
+
},
|
|
70
|
+
async (ctx) => {
|
|
71
|
+
try {
|
|
72
|
+
const validatedData = withdrawConsentSchema.safeParse(ctx.body);
|
|
73
|
+
|
|
74
|
+
if (!validatedData.success) {
|
|
75
|
+
throw new C15TError(
|
|
76
|
+
'The request data is invalid. Please ensure all required fields are correctly filled and formatted.',
|
|
77
|
+
{
|
|
78
|
+
code: BASE_ERROR_CODES.BAD_REQUEST,
|
|
79
|
+
status: 400,
|
|
80
|
+
data: { details: validatedData.error.errors },
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const params = validatedData.data;
|
|
86
|
+
const { registry } = ctx.context as C15TContext;
|
|
87
|
+
|
|
88
|
+
if (!registry) {
|
|
89
|
+
throw new C15TError(
|
|
90
|
+
'The registry service is currently unavailable. Please check the service status and try again later.',
|
|
91
|
+
{
|
|
92
|
+
code: BASE_ERROR_CODES.INITIALIZATION_FAILED,
|
|
93
|
+
status: 503,
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Find the consent records to withdraw based on the identifier type
|
|
99
|
+
let recordsToWithdraw: EntityOutputFields<'consent'>[] = [];
|
|
100
|
+
|
|
101
|
+
if (params.identifierType === 'consentId') {
|
|
102
|
+
// Find by consent ID
|
|
103
|
+
const record = await registry.findConsentById(params.consentId);
|
|
104
|
+
|
|
105
|
+
if (!record) {
|
|
106
|
+
throw new C15TError(
|
|
107
|
+
'The specified consent record could not be found. Please verify the consent ID and try again.',
|
|
108
|
+
{
|
|
109
|
+
code: BASE_ERROR_CODES.CONSENT_NOT_FOUND,
|
|
110
|
+
status: 404,
|
|
111
|
+
data: { consentId: params.consentId },
|
|
112
|
+
}
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (record.status !== 'active') {
|
|
117
|
+
throw new C15TError(
|
|
118
|
+
'The consent has already been withdrawn. No further action is required.',
|
|
119
|
+
{
|
|
120
|
+
code: BASE_ERROR_CODES.CONFLICT,
|
|
121
|
+
status: 409,
|
|
122
|
+
data: {
|
|
123
|
+
consentId: params.consentId,
|
|
124
|
+
currentStatus: record.status,
|
|
125
|
+
},
|
|
126
|
+
}
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
recordsToWithdraw = [record];
|
|
131
|
+
} else if (
|
|
132
|
+
params.identifierType === 'subjectId' ||
|
|
133
|
+
params.identifierType === 'externalId'
|
|
134
|
+
) {
|
|
135
|
+
// Find subject
|
|
136
|
+
let subjectRecord: EntityOutputFields<'subject'> | null = null;
|
|
137
|
+
if (params.identifierType === 'subjectId') {
|
|
138
|
+
subjectRecord = await registry.findSubjectById(params.subjectId);
|
|
139
|
+
} else {
|
|
140
|
+
subjectRecord = await registry.findSubjectByExternalId(
|
|
141
|
+
params.externalId
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (!subjectRecord) {
|
|
146
|
+
throw new C15TError(
|
|
147
|
+
'The specified subject could not be found. Please verify the subject ID or external ID and try again.',
|
|
148
|
+
{
|
|
149
|
+
code: BASE_ERROR_CODES.NOT_FOUND,
|
|
150
|
+
status: 404,
|
|
151
|
+
data:
|
|
152
|
+
params.identifierType === 'subjectId'
|
|
153
|
+
? { subjectId: params.subjectId }
|
|
154
|
+
: { externalId: params.externalId },
|
|
155
|
+
}
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Find all active consents for this subject and domain
|
|
160
|
+
const subjectConsents = await registry.findConsents({
|
|
161
|
+
subjectId: subjectRecord.id,
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// Filter for active consents with matching domain
|
|
165
|
+
recordsToWithdraw = subjectConsents.filter(
|
|
166
|
+
(consent) =>
|
|
167
|
+
consent.status === 'active' && consent.domainId === params.domain
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
if (recordsToWithdraw.length === 0) {
|
|
171
|
+
throw new C15TError(
|
|
172
|
+
'No active consent records were found for this subject and domain. Please ensure the subject and domain are correct.',
|
|
173
|
+
{
|
|
174
|
+
code: BASE_ERROR_CODES.CONSENT_NOT_FOUND,
|
|
175
|
+
status: 404,
|
|
176
|
+
data: {
|
|
177
|
+
domain: params.domain,
|
|
178
|
+
...(params.identifierType === 'subjectId'
|
|
179
|
+
? { subjectId: params.subjectId }
|
|
180
|
+
: { externalId: params.externalId }),
|
|
181
|
+
},
|
|
182
|
+
}
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Get device info from request
|
|
188
|
+
const requestHeaders = ctx.request?.headers as
|
|
189
|
+
| Record<string, string>
|
|
190
|
+
| undefined;
|
|
191
|
+
const deviceInfo = requestHeaders?.['user-agent'] || '';
|
|
192
|
+
// @ts-expect-error
|
|
193
|
+
const ipAddress = ctx.request?.ip || '';
|
|
194
|
+
|
|
195
|
+
// Process each consent record to withdraw
|
|
196
|
+
const withdrawalResults: Array<{
|
|
197
|
+
id: string;
|
|
198
|
+
consentId: string;
|
|
199
|
+
revokedAt: string;
|
|
200
|
+
}> = [];
|
|
201
|
+
|
|
202
|
+
const currentTime = new Date();
|
|
203
|
+
|
|
204
|
+
for (const record of recordsToWithdraw) {
|
|
205
|
+
// Use the revokeConsent method from the internal adapter
|
|
206
|
+
const withdrawalResult = await registry.revokeConsent({
|
|
207
|
+
consentId: record.id,
|
|
208
|
+
reason: params.reason || '',
|
|
209
|
+
actor: params.actor || 'system',
|
|
210
|
+
metadata: params.metadata || {},
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
// Add consent record for the consentWithdrawal
|
|
214
|
+
await registry.createConsentRecord({
|
|
215
|
+
subjectId: record.subjectId,
|
|
216
|
+
consentId: record.id,
|
|
217
|
+
actionType: 'withdraw_consent',
|
|
218
|
+
details: {
|
|
219
|
+
reason: params.reason,
|
|
220
|
+
method: params.method,
|
|
221
|
+
identifierType: params.identifierType,
|
|
222
|
+
withdrawnAt: currentTime.toISOString(),
|
|
223
|
+
},
|
|
224
|
+
createdAt: currentTime,
|
|
225
|
+
updatedAt: currentTime,
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// Log the action in the audit log
|
|
229
|
+
await registry.createAuditLog({
|
|
230
|
+
subjectId: record.subjectId,
|
|
231
|
+
entityType: 'consent',
|
|
232
|
+
entityId: record.id,
|
|
233
|
+
actionType: 'withdraw_consent',
|
|
234
|
+
changes: {
|
|
235
|
+
policyVersion: record.policyId,
|
|
236
|
+
},
|
|
237
|
+
metadata: {
|
|
238
|
+
source: 'api',
|
|
239
|
+
...params.metadata,
|
|
240
|
+
},
|
|
241
|
+
ipAddress,
|
|
242
|
+
userAgent: deviceInfo,
|
|
243
|
+
createdAt: currentTime,
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
withdrawalResults.push({
|
|
247
|
+
id: withdrawalResult?.id || `wdr_${record.id}`,
|
|
248
|
+
consentId: record.id,
|
|
249
|
+
revokedAt: currentTime.toISOString(),
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Return success response with consentWithdrawal details
|
|
254
|
+
return {
|
|
255
|
+
success: true,
|
|
256
|
+
data: {
|
|
257
|
+
withdrawalIds: withdrawalResults.map((wr) => wr.id),
|
|
258
|
+
consentIds: withdrawalResults.map((wr) => wr.consentId),
|
|
259
|
+
revokedAt:
|
|
260
|
+
withdrawalResults[0]?.revokedAt || currentTime.toISOString(),
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
} catch (error) {
|
|
264
|
+
const context = ctx.context as C15TContext;
|
|
265
|
+
context.logger?.error?.('Error withdrawing consent:', error);
|
|
266
|
+
|
|
267
|
+
if (error instanceof C15TError) {
|
|
268
|
+
throw error;
|
|
269
|
+
}
|
|
270
|
+
if (error instanceof z.ZodError) {
|
|
271
|
+
throw new C15TError(
|
|
272
|
+
'The request data is invalid. Please ensure all required fields are correctly filled and formatted.',
|
|
273
|
+
{
|
|
274
|
+
code: BASE_ERROR_CODES.BAD_REQUEST,
|
|
275
|
+
status: 400,
|
|
276
|
+
data: { details: error.errors },
|
|
277
|
+
}
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
throw new C15TError(
|
|
282
|
+
'Failed to withdraw consent. Please try again later or contact support if the issue persists.',
|
|
283
|
+
{
|
|
284
|
+
code: BASE_ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
285
|
+
status: 503,
|
|
286
|
+
data: {
|
|
287
|
+
error: error instanceof Error ? error.message : String(error),
|
|
288
|
+
},
|
|
289
|
+
}
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
);
|