@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,371 @@
|
|
|
1
|
+
import type { Adapter } from '~/db/adapters/types';
|
|
2
|
+
import { getWithHooks } from '~/db/hooks';
|
|
3
|
+
import { BASE_ERROR_CODES, C15TError } from '~/error';
|
|
4
|
+
import type { GenericEndpointContext, RegistryContext } from '~/types';
|
|
5
|
+
import { validateEntityOutput } from '../definition';
|
|
6
|
+
import type { Subject } from './schema';
|
|
7
|
+
/**
|
|
8
|
+
* Creates and returns a set of subject-related adapter methods to interact with the database.
|
|
9
|
+
*
|
|
10
|
+
* These methods provide a consistent interface for creating, finding, updating, and deleting
|
|
11
|
+
* subject records while applying hooks and enforcing data validation rules.
|
|
12
|
+
*
|
|
13
|
+
* @param adapter - The database adapter used for direct database operations
|
|
14
|
+
* @param ctx - The context object containing the database adapter, hooks, and options
|
|
15
|
+
* @returns An object containing type-safe subject operations
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const subjectAdapter = createSubjectAdapter(
|
|
20
|
+
* databaseAdapter,
|
|
21
|
+
* createWithHooks,
|
|
22
|
+
* updateWithHooks,
|
|
23
|
+
* c15tOptions
|
|
24
|
+
* );
|
|
25
|
+
*
|
|
26
|
+
* // Create a new subject
|
|
27
|
+
* const subject = await subjectAdapter.createSubject({
|
|
28
|
+
* externalId: 'external-123',
|
|
29
|
+
* identityProvider: 'auth0'
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function subjectRegistry({ adapter, ...ctx }: RegistryContext) {
|
|
34
|
+
const { createWithHooks, updateWithHooks } = getWithHooks(adapter, ctx);
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
/**
|
|
38
|
+
* Creates a new subject record in the database.
|
|
39
|
+
*
|
|
40
|
+
* Automatically sets creation and update timestamps and applies any
|
|
41
|
+
* configured hooks during the creation process.
|
|
42
|
+
*
|
|
43
|
+
* @param subject - Subject data to create (without id and timestamps)
|
|
44
|
+
* @param context - Optional endpoint context for hooks
|
|
45
|
+
* @returns The created subject with all fields populated
|
|
46
|
+
*
|
|
47
|
+
* @throws May throw an error if hooks prevent creation or if database operations fail
|
|
48
|
+
*/
|
|
49
|
+
createSubject: async (
|
|
50
|
+
subject: Omit<Subject, 'id' | 'createdAt' | 'updatedAt'> &
|
|
51
|
+
Partial<Subject>,
|
|
52
|
+
context?: GenericEndpointContext
|
|
53
|
+
) => {
|
|
54
|
+
const createdSubject = await createWithHooks({
|
|
55
|
+
data: {
|
|
56
|
+
createdAt: new Date(),
|
|
57
|
+
updatedAt: new Date(),
|
|
58
|
+
...subject,
|
|
59
|
+
},
|
|
60
|
+
model: 'subject',
|
|
61
|
+
customFn: undefined,
|
|
62
|
+
context,
|
|
63
|
+
});
|
|
64
|
+
return createdSubject
|
|
65
|
+
? validateEntityOutput('subject', createdSubject, ctx.options)
|
|
66
|
+
: null;
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Finds an existing subject or creates a new one if needed.
|
|
71
|
+
* If both subjectId and externalSubjectId are provided, validates they match the same subject.
|
|
72
|
+
* Creates a new anonymous subject only if no identifiers are provided.
|
|
73
|
+
*
|
|
74
|
+
* @param params - Parameters for finding or creating the subject
|
|
75
|
+
* @returns The existing or newly created subject
|
|
76
|
+
* @throws APIError if subject validation fails or creation fails
|
|
77
|
+
*/
|
|
78
|
+
findOrCreateSubject: async function ({
|
|
79
|
+
subjectId,
|
|
80
|
+
externalSubjectId,
|
|
81
|
+
ipAddress = 'unknown',
|
|
82
|
+
context,
|
|
83
|
+
}: {
|
|
84
|
+
subjectId?: string;
|
|
85
|
+
externalSubjectId?: string;
|
|
86
|
+
ipAddress?: string;
|
|
87
|
+
context?: GenericEndpointContext;
|
|
88
|
+
}) {
|
|
89
|
+
// If both subjectId and externalSubjectId are provided, validate they match
|
|
90
|
+
if (subjectId && externalSubjectId) {
|
|
91
|
+
const [subjectById, subjectByExternalId] = await Promise.all([
|
|
92
|
+
this.findSubjectById(subjectId),
|
|
93
|
+
this.findSubjectByExternalId(externalSubjectId),
|
|
94
|
+
]);
|
|
95
|
+
|
|
96
|
+
if (!subjectById || !subjectByExternalId) {
|
|
97
|
+
ctx.logger?.info(
|
|
98
|
+
'Subject validation failed: One or both subjects not found',
|
|
99
|
+
{
|
|
100
|
+
providedSubjectId: subjectId,
|
|
101
|
+
providedExternalId: externalSubjectId,
|
|
102
|
+
subjectByIdFound: !!subjectById,
|
|
103
|
+
subjectByExternalIdFound: !!subjectByExternalId,
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
throw new C15TError(
|
|
107
|
+
'The specified subject could not be found. Please verify the subject identifiers and try again.',
|
|
108
|
+
{
|
|
109
|
+
code: BASE_ERROR_CODES.NOT_FOUND,
|
|
110
|
+
status: 404,
|
|
111
|
+
data: {
|
|
112
|
+
providedSubjectId: subjectId,
|
|
113
|
+
providedExternalId: externalSubjectId,
|
|
114
|
+
},
|
|
115
|
+
}
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (subjectById.id !== subjectByExternalId.id) {
|
|
120
|
+
ctx.logger?.warn(
|
|
121
|
+
'Subject validation failed: IDs do not match the same subject',
|
|
122
|
+
{
|
|
123
|
+
providedSubjectId: subjectId,
|
|
124
|
+
providedExternalId: externalSubjectId,
|
|
125
|
+
subjectByIdId: subjectById.id,
|
|
126
|
+
subjectByExternalIdId: subjectByExternalId.id,
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
throw new C15TError(
|
|
130
|
+
'The provided subjectId and externalSubjectId do not match the same subject. Please ensure both identifiers refer to the same subject.',
|
|
131
|
+
{
|
|
132
|
+
code: BASE_ERROR_CODES.CONFLICT,
|
|
133
|
+
status: 409,
|
|
134
|
+
data: {
|
|
135
|
+
providedSubjectId: subjectId,
|
|
136
|
+
providedExternalId: externalSubjectId,
|
|
137
|
+
subjectByIdId: subjectById.id,
|
|
138
|
+
subjectByExternalIdId: subjectByExternalId.id,
|
|
139
|
+
},
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return subjectById;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Try to find subject by subjectId if provided
|
|
148
|
+
if (subjectId) {
|
|
149
|
+
const subject = await this.findSubjectById(subjectId);
|
|
150
|
+
if (subject) {
|
|
151
|
+
return subject;
|
|
152
|
+
}
|
|
153
|
+
throw new C15TError('Subject not found', {
|
|
154
|
+
code: BASE_ERROR_CODES.NOT_FOUND,
|
|
155
|
+
status: 404,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// If externalSubjectId provided, try to find or create with upsert
|
|
160
|
+
if (externalSubjectId) {
|
|
161
|
+
try {
|
|
162
|
+
const subject = await this.findSubjectByExternalId(externalSubjectId);
|
|
163
|
+
if (subject) {
|
|
164
|
+
ctx.logger?.debug('Found existing subject by external ID', {
|
|
165
|
+
externalSubjectId,
|
|
166
|
+
});
|
|
167
|
+
return subject;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
ctx.logger?.info('Creating new subject with external ID', {
|
|
171
|
+
externalSubjectId,
|
|
172
|
+
});
|
|
173
|
+
// Attempt to create with unique constraint on externalId
|
|
174
|
+
return await this.createSubject(
|
|
175
|
+
{
|
|
176
|
+
externalId: externalSubjectId,
|
|
177
|
+
identityProvider: 'external',
|
|
178
|
+
lastIpAddress: ipAddress,
|
|
179
|
+
isIdentified: true,
|
|
180
|
+
},
|
|
181
|
+
context
|
|
182
|
+
);
|
|
183
|
+
} catch (error) {
|
|
184
|
+
// If creation failed due to duplicate, try to find again
|
|
185
|
+
if (
|
|
186
|
+
error instanceof Error &&
|
|
187
|
+
error.message.includes('unique constraint')
|
|
188
|
+
) {
|
|
189
|
+
ctx.logger?.info(
|
|
190
|
+
'Handling duplicate key violation for external ID',
|
|
191
|
+
{ externalSubjectId }
|
|
192
|
+
);
|
|
193
|
+
const subject =
|
|
194
|
+
await this.findSubjectByExternalId(externalSubjectId);
|
|
195
|
+
if (subject) {
|
|
196
|
+
return subject;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
ctx.logger?.error(
|
|
200
|
+
'Failed to create or find subject with external ID',
|
|
201
|
+
{
|
|
202
|
+
externalSubjectId,
|
|
203
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
204
|
+
}
|
|
205
|
+
);
|
|
206
|
+
throw new C15TError(
|
|
207
|
+
'Failed to create or find subject with external ID',
|
|
208
|
+
{
|
|
209
|
+
code: BASE_ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
210
|
+
status: 500,
|
|
211
|
+
data: {
|
|
212
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
213
|
+
},
|
|
214
|
+
}
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// For anonymous subjects, use a transaction to prevent duplicates
|
|
220
|
+
try {
|
|
221
|
+
ctx.logger?.info('Creating new anonymous subject');
|
|
222
|
+
return await this.createSubject(
|
|
223
|
+
{
|
|
224
|
+
externalId: null,
|
|
225
|
+
identityProvider: 'anonymous',
|
|
226
|
+
lastIpAddress: ipAddress,
|
|
227
|
+
isIdentified: false,
|
|
228
|
+
},
|
|
229
|
+
context
|
|
230
|
+
);
|
|
231
|
+
} catch (error) {
|
|
232
|
+
ctx.logger?.error('Failed to create anonymous subject', {
|
|
233
|
+
ipAddress,
|
|
234
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
235
|
+
});
|
|
236
|
+
throw new C15TError('Failed to create anonymous subject', {
|
|
237
|
+
code: BASE_ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
238
|
+
status: 500,
|
|
239
|
+
data: {
|
|
240
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Finds a subject by their unique ID.
|
|
248
|
+
*
|
|
249
|
+
* Returns the subject with processed output fields according to the schema configuration.
|
|
250
|
+
*
|
|
251
|
+
* @param subjectId - The unique identifier of the subject
|
|
252
|
+
* @returns The subject object if found, null otherwise
|
|
253
|
+
*/
|
|
254
|
+
findSubjectById: async (subjectId: string) => {
|
|
255
|
+
const subject = await adapter.findOne({
|
|
256
|
+
model: 'subject',
|
|
257
|
+
where: [
|
|
258
|
+
{
|
|
259
|
+
field: 'id',
|
|
260
|
+
value: subjectId,
|
|
261
|
+
},
|
|
262
|
+
],
|
|
263
|
+
});
|
|
264
|
+
return subject
|
|
265
|
+
? validateEntityOutput('subject', subject, ctx.options)
|
|
266
|
+
: null;
|
|
267
|
+
},
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Finds a subject by their external ID.
|
|
271
|
+
*
|
|
272
|
+
* This is useful when integrating with external authentication systems
|
|
273
|
+
* where subjects are identified by a provider-specific ID.
|
|
274
|
+
*
|
|
275
|
+
* @param externalId - The external identifier of the subject
|
|
276
|
+
* @returns The subject object if found, null otherwise
|
|
277
|
+
*/
|
|
278
|
+
findSubjectByExternalId: async (externalId: string) => {
|
|
279
|
+
const subject = await adapter.findOne({
|
|
280
|
+
model: 'subject',
|
|
281
|
+
where: [
|
|
282
|
+
{
|
|
283
|
+
field: 'externalId',
|
|
284
|
+
value: externalId,
|
|
285
|
+
},
|
|
286
|
+
],
|
|
287
|
+
});
|
|
288
|
+
return subject
|
|
289
|
+
? validateEntityOutput('subject', subject, ctx.options)
|
|
290
|
+
: null;
|
|
291
|
+
},
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Updates an existing subject record by ID.
|
|
295
|
+
*
|
|
296
|
+
* Applies any configured hooks during the update process and
|
|
297
|
+
* processes the output according to schema configuration.
|
|
298
|
+
*
|
|
299
|
+
* @param subjectId - The unique identifier of the subject to update
|
|
300
|
+
* @param data - The fields to update on the subject record
|
|
301
|
+
* @param context - Optional endpoint context for hooks
|
|
302
|
+
* @returns The updated subject if successful, null if subject not found or hooks prevented update
|
|
303
|
+
*/
|
|
304
|
+
updateSubject: async (
|
|
305
|
+
subjectId: string,
|
|
306
|
+
data: Partial<Subject> & Record<string, unknown>,
|
|
307
|
+
context?: GenericEndpointContext
|
|
308
|
+
) => {
|
|
309
|
+
const subject = await updateWithHooks({
|
|
310
|
+
data: {
|
|
311
|
+
...data,
|
|
312
|
+
updatedAt: new Date(),
|
|
313
|
+
},
|
|
314
|
+
where: [
|
|
315
|
+
{
|
|
316
|
+
field: 'id',
|
|
317
|
+
value: subjectId,
|
|
318
|
+
},
|
|
319
|
+
],
|
|
320
|
+
model: 'subject',
|
|
321
|
+
customFn: undefined,
|
|
322
|
+
context,
|
|
323
|
+
});
|
|
324
|
+
return subject
|
|
325
|
+
? validateEntityOutput('subject', subject, ctx.options)
|
|
326
|
+
: null;
|
|
327
|
+
},
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Soft deletes a subject and all associated consents from the database.
|
|
331
|
+
*
|
|
332
|
+
* This is a cascading operation that marks the subject as deleted by setting
|
|
333
|
+
* its status to 'deleted' and removes all associated consent records.
|
|
334
|
+
* The subject record itself remains in the database but is inactive.
|
|
335
|
+
*
|
|
336
|
+
* @param subjectId - The unique identifier of the subject to soft delete
|
|
337
|
+
* @returns A promise that resolves when the soft deletion is complete
|
|
338
|
+
*/
|
|
339
|
+
deleteSubject: async (subjectId: string) => {
|
|
340
|
+
await adapter.transaction({
|
|
341
|
+
callback: async (tx: Adapter) => {
|
|
342
|
+
// Update the subject record
|
|
343
|
+
await tx.update({
|
|
344
|
+
model: 'subject',
|
|
345
|
+
where: [
|
|
346
|
+
{
|
|
347
|
+
field: 'id',
|
|
348
|
+
value: subjectId,
|
|
349
|
+
},
|
|
350
|
+
],
|
|
351
|
+
update: {
|
|
352
|
+
status: 'deleted',
|
|
353
|
+
updatedAt: new Date(),
|
|
354
|
+
},
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
// Delete all related records
|
|
358
|
+
await tx.deleteMany({
|
|
359
|
+
model: 'consent',
|
|
360
|
+
where: [
|
|
361
|
+
{
|
|
362
|
+
field: 'subjectId',
|
|
363
|
+
value: subjectId,
|
|
364
|
+
},
|
|
365
|
+
],
|
|
366
|
+
});
|
|
367
|
+
},
|
|
368
|
+
});
|
|
369
|
+
},
|
|
370
|
+
};
|
|
371
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Zod schema for validating subject entities.
|
|
5
|
+
*
|
|
6
|
+
* This defines the structure and validation rules for subject records:
|
|
7
|
+
* - Requires a valid UUID for the ID field
|
|
8
|
+
* - Default value of false for isIdentified
|
|
9
|
+
* - Optional fields for externalId, identityProvider, and lastIpAddress
|
|
10
|
+
* - Default current date/time for creation and update timestamps
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const subjectData = {
|
|
15
|
+
* id: 'sub_x1pftyoufsm7xgo1kv',
|
|
16
|
+
* externalId: 'ext-123',
|
|
17
|
+
* isIdentified: true
|
|
18
|
+
* };
|
|
19
|
+
*
|
|
20
|
+
* // Validate and parse the subject data
|
|
21
|
+
* const validSubject = subjectSchema.parse(subjectData);
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export const subjectSchema = z.object({
|
|
25
|
+
id: z.string(),
|
|
26
|
+
isIdentified: z.boolean().default(false),
|
|
27
|
+
externalId: z.string().nullable().optional(),
|
|
28
|
+
identityProvider: z.string().optional(),
|
|
29
|
+
lastIpAddress: z.string().optional(),
|
|
30
|
+
createdAt: z.date().default(() => new Date()),
|
|
31
|
+
updatedAt: z.date().default(() => new Date()),
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Type definition for Subject
|
|
36
|
+
*
|
|
37
|
+
* This type represents the structure of a subject record
|
|
38
|
+
* as defined by the subjectSchema. It includes all fields
|
|
39
|
+
* that are part of the subject entity.
|
|
40
|
+
*/
|
|
41
|
+
export type Subject = z.infer<typeof subjectSchema>;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { Field } from '~/db/core/fields';
|
|
2
|
+
import { COMMON_TIMEZONES } from '~/db/core/fields';
|
|
3
|
+
import type { C15TOptions } from '~/types';
|
|
4
|
+
import { subjectSchema } from './schema';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Generates the database table configuration for the subject entity.
|
|
8
|
+
*
|
|
9
|
+
* This function creates a schema definition that includes all standard subject fields
|
|
10
|
+
* and any additional fields from plugins or configuration. The resulting schema is used
|
|
11
|
+
* for database migrations, schema validation, and query building.
|
|
12
|
+
*
|
|
13
|
+
* @param options - C15T configuration options that may contain subject table customizations
|
|
14
|
+
* @param subjectFields - Additional fields from plugins to include in the subject table
|
|
15
|
+
* @returns A complete table schema definition with fields, model name, and metadata
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const subjectTableSchema = getSubjectTable(c15tOptions);
|
|
20
|
+
* // Use the schema for migrations or data access
|
|
21
|
+
* const migrationPlans = generateMigrations(subjectTableSchema);
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function getSubjectTable(
|
|
25
|
+
options: C15TOptions,
|
|
26
|
+
subjectFields?: Record<string, Field>
|
|
27
|
+
) {
|
|
28
|
+
// Get subject config, supporting both the new tables.subject and legacy subject format
|
|
29
|
+
const subjectConfig = options.tables?.subject;
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
/**
|
|
33
|
+
* The name of the subject table in the database, configurable through options
|
|
34
|
+
*/
|
|
35
|
+
entityName: subjectConfig?.entityName || 'subject',
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The ID prefix for the subject table
|
|
39
|
+
* Used to generate unique prefixed IDs for subjects
|
|
40
|
+
*/
|
|
41
|
+
entityPrefix: subjectConfig?.entityPrefix || 'sub',
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The Zod schema for the subject table
|
|
45
|
+
*/
|
|
46
|
+
schema: subjectSchema,
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Field definitions for the subject table
|
|
50
|
+
*/
|
|
51
|
+
fields: {
|
|
52
|
+
/**
|
|
53
|
+
* Whether the subject has been identified/verified
|
|
54
|
+
* Default: false
|
|
55
|
+
*/
|
|
56
|
+
isIdentified: {
|
|
57
|
+
type: 'boolean',
|
|
58
|
+
defaultValue: () => false,
|
|
59
|
+
required: true,
|
|
60
|
+
fieldName: subjectConfig?.fields?.isIdentified || 'isIdentified',
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* External identifier for the subject (from auth providers)
|
|
65
|
+
* Optional field
|
|
66
|
+
*/
|
|
67
|
+
externalId: {
|
|
68
|
+
type: 'string',
|
|
69
|
+
required: false,
|
|
70
|
+
fieldName: subjectConfig?.fields?.externalId || 'externalId',
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The provider that identified this subject (e.g., 'auth0', 'okta')
|
|
75
|
+
* Optional field
|
|
76
|
+
*/
|
|
77
|
+
identityProvider: {
|
|
78
|
+
type: 'string',
|
|
79
|
+
required: false,
|
|
80
|
+
fieldName:
|
|
81
|
+
subjectConfig?.fields?.identityProvider || 'identityProvider',
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Last known IP address of the subject
|
|
86
|
+
* Optional field, useful for security and audit purposes
|
|
87
|
+
*/
|
|
88
|
+
lastIpAddress: {
|
|
89
|
+
type: 'string',
|
|
90
|
+
required: false,
|
|
91
|
+
fieldName: subjectConfig?.fields?.lastIpAddress || 'lastIpAddress',
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* When the subject was created
|
|
96
|
+
* Automatically set to current time by default
|
|
97
|
+
*/
|
|
98
|
+
createdAt: {
|
|
99
|
+
type: 'date',
|
|
100
|
+
defaultValue: () => new Date(),
|
|
101
|
+
required: true,
|
|
102
|
+
fieldName: subjectConfig?.fields?.createdAt || 'createdAt',
|
|
103
|
+
},
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* When the subject was last updated
|
|
107
|
+
* Automatically set to current time on update
|
|
108
|
+
*/
|
|
109
|
+
updatedAt: {
|
|
110
|
+
type: 'date',
|
|
111
|
+
defaultValue: () => new Date(),
|
|
112
|
+
required: true,
|
|
113
|
+
fieldName: subjectConfig?.fields?.updatedAt || 'updatedAt',
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Subject's local timezone, stored as IANA timezone identifier
|
|
118
|
+
*/
|
|
119
|
+
subjectTimezone: {
|
|
120
|
+
type: 'timezone',
|
|
121
|
+
required: false,
|
|
122
|
+
defaultValue: COMMON_TIMEZONES.UTC,
|
|
123
|
+
fieldName: subjectConfig?.fields?.subjectTimezone || 'subjectTimezone',
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
// Include additional fields from plugins
|
|
127
|
+
...(subjectFields || {}),
|
|
128
|
+
|
|
129
|
+
// Include additional fields from configuration
|
|
130
|
+
...(subjectConfig?.additionalFields || {}),
|
|
131
|
+
},
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Execution order during migrations (lower numbers run first)
|
|
135
|
+
* Subject table needs to be created early as other tables reference it
|
|
136
|
+
*/
|
|
137
|
+
order: 1,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subject Entity Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* This module contains type definitions specific to the subject entity.
|
|
5
|
+
*/
|
|
6
|
+
import type { TimestampedEntityConfig } from '../types';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Subject entity configuration
|
|
10
|
+
* @default entityName: "subject", entityPrefix: "sub"
|
|
11
|
+
*/
|
|
12
|
+
export interface SubjectEntityConfig extends TimestampedEntityConfig {
|
|
13
|
+
fields?: Record<string, string> & {
|
|
14
|
+
id?: string;
|
|
15
|
+
isIdentified?: string;
|
|
16
|
+
externalId?: string;
|
|
17
|
+
identityProvider?: string;
|
|
18
|
+
lastIpAddress?: string;
|
|
19
|
+
createdAt?: string;
|
|
20
|
+
updatedAt?: string;
|
|
21
|
+
};
|
|
22
|
+
}
|