@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,327 @@
|
|
|
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 schema for the base parameters (domain is always required)
|
|
8
|
+
const baseParamsSchema = z.object({
|
|
9
|
+
domain: z.string(),
|
|
10
|
+
version: z.string().optional(),
|
|
11
|
+
includePreferences: z.boolean().optional().default(true),
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
// Define schemas for the different identification methods (all optional)
|
|
15
|
+
const subjectIdentifierSchema = z.object({
|
|
16
|
+
subjectId: z.string().optional(),
|
|
17
|
+
externalId: z.string().optional(),
|
|
18
|
+
ipAddress: z.string().optional(),
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// Combine the schemas
|
|
22
|
+
const getPolicySchema = baseParamsSchema.merge(subjectIdentifierSchema);
|
|
23
|
+
|
|
24
|
+
export interface GetPolicyResponse {
|
|
25
|
+
success: boolean;
|
|
26
|
+
data: {
|
|
27
|
+
policy: {
|
|
28
|
+
id: string;
|
|
29
|
+
domain: string;
|
|
30
|
+
version: string;
|
|
31
|
+
content: string;
|
|
32
|
+
availablePreferences?: Record<string, unknown>;
|
|
33
|
+
createdAt: string;
|
|
34
|
+
};
|
|
35
|
+
subjectConsentStatus?: {
|
|
36
|
+
hasConsent: boolean;
|
|
37
|
+
currentPreferences: Record<string, string | null> | null;
|
|
38
|
+
consentedAt: string | null;
|
|
39
|
+
needsRenewal: boolean;
|
|
40
|
+
identifiedBy: string | null;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Endpoint for retrieving consent policy information.
|
|
47
|
+
*
|
|
48
|
+
* This endpoint allows clients to retrieve the consent policy for a domain.
|
|
49
|
+
* It supports retrieving the latest policy or a specific version.
|
|
50
|
+
* It can also return personalized policy information if subject identifiers are provided.
|
|
51
|
+
*
|
|
52
|
+
* @endpoint GET /consent/policy
|
|
53
|
+
* @requestExample
|
|
54
|
+
* ```
|
|
55
|
+
* // Basic policy request
|
|
56
|
+
* GET /api/consent/policy?domain=example.com
|
|
57
|
+
* ```
|
|
58
|
+
*
|
|
59
|
+
* @requestExample
|
|
60
|
+
* ```
|
|
61
|
+
* // Specific version
|
|
62
|
+
* GET /api/consent/policy?domain=example.com&version=1.2
|
|
63
|
+
* ```
|
|
64
|
+
*
|
|
65
|
+
* @requestExample
|
|
66
|
+
* ```
|
|
67
|
+
* // With subject context
|
|
68
|
+
* GET /api/consent/policy?domain=example.com&subjectId=550e8400-e29b-41d4-a716-446655440000
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
71
|
+
* @responseExample
|
|
72
|
+
* ```json
|
|
73
|
+
* {
|
|
74
|
+
* "success": true,
|
|
75
|
+
* "data": {
|
|
76
|
+
* "policy": {
|
|
77
|
+
* "id": 1,
|
|
78
|
+
* "domain": "example.com",
|
|
79
|
+
* "version": "1.0",
|
|
80
|
+
* "content": {
|
|
81
|
+
* "title": "Privacy Policy",
|
|
82
|
+
* "description": "How we use your data",
|
|
83
|
+
* "lastUpdated": "2023-04-01"
|
|
84
|
+
* },
|
|
85
|
+
* "availablePreferences": {
|
|
86
|
+
* "marketing": {
|
|
87
|
+
* "title": "Marketing",
|
|
88
|
+
* "description": "Allow us to send you marketing communications",
|
|
89
|
+
* "default": false
|
|
90
|
+
* },
|
|
91
|
+
* "analytics": {
|
|
92
|
+
* "title": "Analytics",
|
|
93
|
+
* "description": "Allow us to collect usage data to improve our service",
|
|
94
|
+
* "default": true
|
|
95
|
+
* }
|
|
96
|
+
* },
|
|
97
|
+
* "createdAt": "2023-04-01T12:34:56.789Z"
|
|
98
|
+
* },
|
|
99
|
+
* "subjectConsentStatus": {
|
|
100
|
+
* "hasConsent": true,
|
|
101
|
+
* "currentPreferences": {
|
|
102
|
+
* "marketing": null,
|
|
103
|
+
* "analytics": "2023-04-02T10:30:00.000Z"
|
|
104
|
+
* },
|
|
105
|
+
* "consentedAt": "2023-04-02T10:30:00.000Z",
|
|
106
|
+
* "needsRenewal": false
|
|
107
|
+
* }
|
|
108
|
+
* }
|
|
109
|
+
* }
|
|
110
|
+
* ```
|
|
111
|
+
*
|
|
112
|
+
* @returns {Object} Result of getting policy
|
|
113
|
+
* @returns {boolean} success - Whether the request was successful
|
|
114
|
+
* @returns {Object} data - The policy data
|
|
115
|
+
* @returns {Object} data.policy - The consent policy information
|
|
116
|
+
* @returns {Object} [data.subjectConsentStatus] - Subject's consent status if subject identifiers were provided
|
|
117
|
+
*
|
|
118
|
+
* @throws {C15TError} BAD_REQUEST - When request parameters are invalid
|
|
119
|
+
* @throws {C15TError} NOT_FOUND - When the domain or policy version doesn't exist
|
|
120
|
+
*/
|
|
121
|
+
export const getConsentPolicy = createAuthEndpoint(
|
|
122
|
+
'/consent/policy',
|
|
123
|
+
{
|
|
124
|
+
method: 'GET',
|
|
125
|
+
query: getPolicySchema,
|
|
126
|
+
},
|
|
127
|
+
async (ctx) => {
|
|
128
|
+
try {
|
|
129
|
+
const validatedData = getPolicySchema.safeParse(ctx.query);
|
|
130
|
+
|
|
131
|
+
if (!validatedData.success) {
|
|
132
|
+
throw new C15TError('BAD_REQUEST', {
|
|
133
|
+
code: BASE_ERROR_CODES.BAD_REQUEST,
|
|
134
|
+
status: 400,
|
|
135
|
+
data: {
|
|
136
|
+
message: 'Invalid request data',
|
|
137
|
+
details: validatedData.error.errors,
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const params = validatedData.data;
|
|
143
|
+
const { registry } = ctx.context as C15TContext;
|
|
144
|
+
|
|
145
|
+
if (!registry) {
|
|
146
|
+
throw new C15TError('INTERNAL_SERVER_ERROR', {
|
|
147
|
+
code: BASE_ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
148
|
+
status: 503,
|
|
149
|
+
data: {
|
|
150
|
+
message: 'Registry not available',
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Find domain
|
|
156
|
+
let domain: EntityOutputFields<'domain'> | null = null;
|
|
157
|
+
try {
|
|
158
|
+
if (registry.findDomain) {
|
|
159
|
+
domain = await registry.findDomain(params.domain);
|
|
160
|
+
}
|
|
161
|
+
} catch {
|
|
162
|
+
throw new C15TError(
|
|
163
|
+
'The specified domain could not be found. Please verify the domain name and try again.',
|
|
164
|
+
{
|
|
165
|
+
code: BASE_ERROR_CODES.NOT_FOUND,
|
|
166
|
+
status: 404,
|
|
167
|
+
data: {
|
|
168
|
+
domain: params.domain,
|
|
169
|
+
},
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (!domain) {
|
|
175
|
+
throw new C15TError(
|
|
176
|
+
'The specified domain could not be found. Please verify the domain name and try again.',
|
|
177
|
+
{
|
|
178
|
+
code: BASE_ERROR_CODES.NOT_FOUND,
|
|
179
|
+
status: 404,
|
|
180
|
+
data: {
|
|
181
|
+
domain: params.domain,
|
|
182
|
+
},
|
|
183
|
+
}
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Find the policy
|
|
188
|
+
let policy: EntityOutputFields<'consentPolicy'> | null = null;
|
|
189
|
+
try {
|
|
190
|
+
if (registry.findPolicy) {
|
|
191
|
+
policy = await registry.findPolicy(domain.id, params.version);
|
|
192
|
+
}
|
|
193
|
+
} catch {
|
|
194
|
+
throw new C15TError(
|
|
195
|
+
params.version
|
|
196
|
+
? `The specified policy version ${params.version} for domain ${params.domain} could not be found. Please verify the version number and domain name, and try again.`
|
|
197
|
+
: `No policy could be found for the domain ${params.domain}. Please ensure the domain name is correct and try again.`,
|
|
198
|
+
{
|
|
199
|
+
code: BASE_ERROR_CODES.NOT_FOUND,
|
|
200
|
+
status: 404,
|
|
201
|
+
data: {
|
|
202
|
+
domain: params.domain,
|
|
203
|
+
version: params.version,
|
|
204
|
+
},
|
|
205
|
+
}
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (!policy) {
|
|
210
|
+
throw new C15TError(
|
|
211
|
+
params.version
|
|
212
|
+
? `The specified policy version ${params.version} for domain ${params.domain} could not be found. Please verify the version number and domain name, and try again.`
|
|
213
|
+
: `No policy could be found for the domain ${params.domain}. Please ensure the domain name is correct and try again.`,
|
|
214
|
+
{
|
|
215
|
+
code: BASE_ERROR_CODES.NOT_FOUND,
|
|
216
|
+
status: 404,
|
|
217
|
+
data: {
|
|
218
|
+
domain: params.domain,
|
|
219
|
+
version: params.version,
|
|
220
|
+
},
|
|
221
|
+
}
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Format basic response
|
|
226
|
+
const response: GetPolicyResponse = {
|
|
227
|
+
success: true,
|
|
228
|
+
data: {
|
|
229
|
+
policy: {
|
|
230
|
+
id: policy.id,
|
|
231
|
+
domain: params.domain,
|
|
232
|
+
version: policy.version,
|
|
233
|
+
content: policy.content,
|
|
234
|
+
availablePreferences: params.includePreferences
|
|
235
|
+
? //@ts-expect-error
|
|
236
|
+
policy.availablePreferences
|
|
237
|
+
: undefined,
|
|
238
|
+
createdAt: policy.createdAt.toISOString(),
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
// If subject identifiers were provided, try to find the subject's consent status
|
|
244
|
+
if (params.subjectId || params.externalId || params.ipAddress) {
|
|
245
|
+
let subjectRecord: EntityOutputFields<'subject'> | null = null;
|
|
246
|
+
let identifierUsed: string | null = null;
|
|
247
|
+
|
|
248
|
+
// Try to find subject by subjectId
|
|
249
|
+
if (params.subjectId) {
|
|
250
|
+
subjectRecord = await registry.findSubjectById(params.subjectId);
|
|
251
|
+
if (subjectRecord) {
|
|
252
|
+
identifierUsed = 'subjectId';
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// If not found and externalId provided, try that
|
|
257
|
+
if (!subjectRecord && params.externalId) {
|
|
258
|
+
subjectRecord = await registry.findSubjectByExternalId(
|
|
259
|
+
params.externalId
|
|
260
|
+
);
|
|
261
|
+
if (subjectRecord) {
|
|
262
|
+
identifierUsed = 'externalId';
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// If we found a subject, get their consent status
|
|
267
|
+
if (subjectRecord) {
|
|
268
|
+
// Get subject's active consents for this domain
|
|
269
|
+
const subjectConsents = await registry.findConsents({
|
|
270
|
+
subjectId: subjectRecord.id,
|
|
271
|
+
domainId: domain.id,
|
|
272
|
+
status: 'active',
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
// Get the latest active consent
|
|
276
|
+
const subjectConsent =
|
|
277
|
+
subjectConsents.length > 0 ? subjectConsents[0] : null;
|
|
278
|
+
|
|
279
|
+
// Add subject consent info to response
|
|
280
|
+
response.data.subjectConsentStatus = {
|
|
281
|
+
hasConsent: !!subjectConsent,
|
|
282
|
+
currentPreferences: subjectConsent
|
|
283
|
+
? // @ts-expect-error
|
|
284
|
+
subjectConsent.preferences
|
|
285
|
+
: null,
|
|
286
|
+
consentedAt: subjectConsent
|
|
287
|
+
? subjectConsent.givenAt.toISOString() || null
|
|
288
|
+
: null,
|
|
289
|
+
needsRenewal: subjectConsent
|
|
290
|
+
? subjectConsent.policyId !== policy.id
|
|
291
|
+
: true,
|
|
292
|
+
identifiedBy: identifierUsed,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return response;
|
|
298
|
+
} catch (error) {
|
|
299
|
+
const context = ctx.context as C15TContext;
|
|
300
|
+
context.logger?.error?.('Error getting consent policy:', error);
|
|
301
|
+
|
|
302
|
+
if (error instanceof C15TError) {
|
|
303
|
+
throw error;
|
|
304
|
+
}
|
|
305
|
+
if (error instanceof z.ZodError) {
|
|
306
|
+
throw new C15TError('BAD_REQUEST', {
|
|
307
|
+
code: BASE_ERROR_CODES.BAD_REQUEST,
|
|
308
|
+
status: 400,
|
|
309
|
+
data: {
|
|
310
|
+
message: 'Invalid request data',
|
|
311
|
+
details: error.errors,
|
|
312
|
+
},
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
throw new C15TError('INTERNAL_SERVER_ERROR', {
|
|
317
|
+
code: BASE_ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
318
|
+
status: 503,
|
|
319
|
+
data: {
|
|
320
|
+
message: 'Failed to get consent policy',
|
|
321
|
+
details:
|
|
322
|
+
error instanceof Error ? { message: error.message } : { error },
|
|
323
|
+
},
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
);
|
|
@@ -0,0 +1,230 @@
|
|
|
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 schemas for the different identification methods
|
|
8
|
+
const getBySubjectIdSchema = z.object({
|
|
9
|
+
subjectId: z.string(),
|
|
10
|
+
domain: z.string().optional(),
|
|
11
|
+
identifierType: z.literal('subjectId'),
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const getByExternalIdSchema = z.object({
|
|
15
|
+
externalId: z.string(),
|
|
16
|
+
domain: z.string().optional(),
|
|
17
|
+
identifierType: z.literal('externalId'),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const getByIpAddressSchema = z.object({
|
|
21
|
+
ipAddress: z.string(),
|
|
22
|
+
domain: z.string(),
|
|
23
|
+
identifierType: z.literal('ipAddress'),
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
// Combined schema using discriminated union
|
|
27
|
+
const getConsentSchema = z.discriminatedUnion('identifierType', [
|
|
28
|
+
getBySubjectIdSchema,
|
|
29
|
+
getByExternalIdSchema,
|
|
30
|
+
getByIpAddressSchema,
|
|
31
|
+
]);
|
|
32
|
+
|
|
33
|
+
export interface GetConsentResponse {
|
|
34
|
+
success: boolean;
|
|
35
|
+
data: {
|
|
36
|
+
hasActiveConsent: boolean;
|
|
37
|
+
records: Array<{
|
|
38
|
+
id: string;
|
|
39
|
+
subjectId: string;
|
|
40
|
+
domain: string;
|
|
41
|
+
status: string;
|
|
42
|
+
givenAt: string;
|
|
43
|
+
policyId: string;
|
|
44
|
+
preferences: Record<string, string | null>;
|
|
45
|
+
}>;
|
|
46
|
+
identifiedBy: string | null;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Endpoint for retrieving active consent records.
|
|
52
|
+
*
|
|
53
|
+
* This endpoint allows clients to retrieve a subject's active consent records by specifying:
|
|
54
|
+
* 1. The subject ID (internal UUID) and an optional domain
|
|
55
|
+
* 2. The external ID and an optional domain
|
|
56
|
+
* 3. The IP address and a required domain (since IP alone is too broad)
|
|
57
|
+
*
|
|
58
|
+
* @endpoint GET /consent/get
|
|
59
|
+
*/
|
|
60
|
+
export const getConsent = createAuthEndpoint(
|
|
61
|
+
'/consent/get',
|
|
62
|
+
{
|
|
63
|
+
method: 'GET',
|
|
64
|
+
query: getConsentSchema,
|
|
65
|
+
},
|
|
66
|
+
async (ctx) => {
|
|
67
|
+
try {
|
|
68
|
+
const validatedData = getConsentSchema.safeParse(ctx.query);
|
|
69
|
+
|
|
70
|
+
if (!validatedData.success) {
|
|
71
|
+
throw new C15TError(
|
|
72
|
+
'The request data is invalid. Please ensure all required fields are correctly filled and formatted.',
|
|
73
|
+
{
|
|
74
|
+
code: BASE_ERROR_CODES.BAD_REQUEST,
|
|
75
|
+
status: 400,
|
|
76
|
+
data: {
|
|
77
|
+
details: validatedData.error.errors,
|
|
78
|
+
},
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const params = validatedData.data;
|
|
84
|
+
const { registry } = ctx.context as C15TContext;
|
|
85
|
+
|
|
86
|
+
if (!registry) {
|
|
87
|
+
throw new C15TError(
|
|
88
|
+
'The registry service is currently unavailable. Please check the service status and try again later.',
|
|
89
|
+
{
|
|
90
|
+
code: BASE_ERROR_CODES.INITIALIZATION_FAILED,
|
|
91
|
+
status: 503,
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Find subject based on identifier type
|
|
97
|
+
let subjects: EntityOutputFields<'subject'>[] = [];
|
|
98
|
+
|
|
99
|
+
// biome-ignore lint/style/useDefaultSwitchClause: <explanation>
|
|
100
|
+
switch (params.identifierType) {
|
|
101
|
+
case 'subjectId': {
|
|
102
|
+
const subjectRecord = await registry.findSubjectById(
|
|
103
|
+
params.subjectId
|
|
104
|
+
);
|
|
105
|
+
if (subjectRecord) {
|
|
106
|
+
subjects = [subjectRecord];
|
|
107
|
+
}
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case 'externalId': {
|
|
111
|
+
const externalSubject = await registry.findSubjectByExternalId(
|
|
112
|
+
params.externalId
|
|
113
|
+
);
|
|
114
|
+
if (externalSubject) {
|
|
115
|
+
subjects = [externalSubject];
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case 'ipAddress': {
|
|
120
|
+
// For IP address lookups, we require a domain
|
|
121
|
+
if (!params.domain) {
|
|
122
|
+
throw new C15TError(
|
|
123
|
+
'A domain must be specified when using an IP address for identification. Please include a valid domain in your request.',
|
|
124
|
+
{
|
|
125
|
+
code: BASE_ERROR_CODES.MISSING_REQUIRED_PARAMETER,
|
|
126
|
+
status: 400,
|
|
127
|
+
data: {
|
|
128
|
+
ipAddress: params.ipAddress,
|
|
129
|
+
},
|
|
130
|
+
}
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// This is a simplification - in a real implementation, we would need
|
|
135
|
+
// a method to look up subjects by IP address, possibly by scanning recent consent records
|
|
136
|
+
// For now, we'll use an empty array as this would require a custom query
|
|
137
|
+
subjects = [];
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (subjects.length === 0) {
|
|
143
|
+
return {
|
|
144
|
+
success: true,
|
|
145
|
+
data: {
|
|
146
|
+
hasActiveConsent: false,
|
|
147
|
+
records: [],
|
|
148
|
+
identifiedBy: params.identifierType,
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Get active consent records for these subjects
|
|
154
|
+
const consentResults: Array<{
|
|
155
|
+
id: string;
|
|
156
|
+
subjectId: string;
|
|
157
|
+
domain: string;
|
|
158
|
+
status: string;
|
|
159
|
+
givenAt: string;
|
|
160
|
+
}> = [];
|
|
161
|
+
|
|
162
|
+
for (const subject of subjects) {
|
|
163
|
+
// Use the adapter to find subject consents
|
|
164
|
+
const subjectConsents = await registry.findConsents({
|
|
165
|
+
subjectId: subject.id,
|
|
166
|
+
domainId: params.domain,
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// Filter for active consents only
|
|
170
|
+
const activeConsents = subjectConsents.filter(
|
|
171
|
+
(consent) => consent.status === 'active'
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
// Include subject identification in the results
|
|
175
|
+
for (const consent of activeConsents) {
|
|
176
|
+
consentResults.push({
|
|
177
|
+
id: consent.id,
|
|
178
|
+
subjectId: subject.id,
|
|
179
|
+
// domain: consent.domainId,
|
|
180
|
+
// status: consent.status,
|
|
181
|
+
givenAt: consent.givenAt.toISOString(),
|
|
182
|
+
// policyId: consent.policyId || '',
|
|
183
|
+
//@ts-expect-error
|
|
184
|
+
preferences: consent.preferences || {},
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return {
|
|
190
|
+
success: true,
|
|
191
|
+
data: {
|
|
192
|
+
hasActiveConsent: consentResults.length > 0,
|
|
193
|
+
records: consentResults,
|
|
194
|
+
identifiedBy: params.identifierType,
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
} catch (error) {
|
|
198
|
+
const context = ctx.context as C15TContext;
|
|
199
|
+
context.logger?.error?.('Error getting consent:', error);
|
|
200
|
+
|
|
201
|
+
if (error instanceof C15TError) {
|
|
202
|
+
throw error;
|
|
203
|
+
}
|
|
204
|
+
if (error instanceof z.ZodError) {
|
|
205
|
+
throw new C15TError(
|
|
206
|
+
'The request data is invalid. Please ensure all required fields are correctly filled and formatted.',
|
|
207
|
+
{
|
|
208
|
+
code: BASE_ERROR_CODES.BAD_REQUEST,
|
|
209
|
+
status: 400,
|
|
210
|
+
data: {
|
|
211
|
+
details: error.errors,
|
|
212
|
+
},
|
|
213
|
+
}
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
throw new C15TError(
|
|
218
|
+
'Failed to retrieve consent information. Please try again later or contact support if the issue persists.',
|
|
219
|
+
{
|
|
220
|
+
code: BASE_ERROR_CODES.FAILED_TO_GET_CONSENT,
|
|
221
|
+
status: 503,
|
|
222
|
+
data: {
|
|
223
|
+
details:
|
|
224
|
+
error instanceof Error ? { message: error.message } : { error },
|
|
225
|
+
},
|
|
226
|
+
}
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { setConsent } from './set-consent';
|
|
2
|
+
import { status } from './status';
|
|
3
|
+
import { showConsentBanner } from './show-consent-banner';
|
|
4
|
+
|
|
5
|
+
export * from './error';
|
|
6
|
+
export * from './ok';
|
|
7
|
+
|
|
8
|
+
export const baseEndpoints = {
|
|
9
|
+
setConsent,
|
|
10
|
+
showConsentBanner,
|
|
11
|
+
status,
|
|
12
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { HIDE_METADATA } from '~/utils/hide-metadata';
|
|
2
|
+
import { createAuthEndpoint } from '../call';
|
|
3
|
+
|
|
4
|
+
export const ok = createAuthEndpoint(
|
|
5
|
+
'/ok',
|
|
6
|
+
{
|
|
7
|
+
method: 'GET',
|
|
8
|
+
metadata: {
|
|
9
|
+
...HIDE_METADATA,
|
|
10
|
+
openapi: {
|
|
11
|
+
description: 'Check if the API is working',
|
|
12
|
+
responses: {
|
|
13
|
+
'200': {
|
|
14
|
+
description: 'Success',
|
|
15
|
+
content: {
|
|
16
|
+
'application/json': {
|
|
17
|
+
schema: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
ok: {
|
|
21
|
+
type: 'boolean',
|
|
22
|
+
},
|
|
23
|
+
version: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
},
|
|
26
|
+
timestamp: {
|
|
27
|
+
type: 'string',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
async (ctx) => {
|
|
39
|
+
return ctx.json({
|
|
40
|
+
ok: true,
|
|
41
|
+
version: process.env.API_VERSION || '1.0.0',
|
|
42
|
+
timestamp: new Date().toISOString(),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
);
|