@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,185 @@
|
|
|
1
|
+
import { COMMON_TIMEZONES, type Field } from '~/db/core/fields';
|
|
2
|
+
import type { C15TOptions } from '~/types';
|
|
3
|
+
import { auditLogSchema } from './schema';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Generates the database table configuration for the consent audit log entity.
|
|
7
|
+
*
|
|
8
|
+
* This function creates a schema definition that includes all standard audit log fields
|
|
9
|
+
* and any additional fields from plugins or configuration. The resulting schema is used
|
|
10
|
+
* for database migrations, schema validation, and query building.
|
|
11
|
+
*
|
|
12
|
+
* @param options - C15T configuration options that may contain audit log table customizations
|
|
13
|
+
* @param auditLogFields - Additional fields from plugins to include in the audit log table
|
|
14
|
+
* @returns A complete table schema definition with fields, model name, and metadata
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const auditLogTableSchema = getAuditLogTable(c15tOptions);
|
|
19
|
+
* // Use the schema for migrations or data access
|
|
20
|
+
* const migrationPlans = generateMigrations(auditLogTableSchema);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function getAuditLogTable(
|
|
24
|
+
options: C15TOptions,
|
|
25
|
+
auditLogFields?: Record<string, Field>
|
|
26
|
+
) {
|
|
27
|
+
const auditLogConfig = options.tables?.auditLog;
|
|
28
|
+
const subjectConfig = options.tables?.subject;
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
/**
|
|
32
|
+
* The name of the audit log table in the database, configurable through options
|
|
33
|
+
*/
|
|
34
|
+
entityName: auditLogConfig?.entityName || 'auditLog',
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The ID prefix for the audit log table
|
|
38
|
+
* Used to generate unique prefixed IDs
|
|
39
|
+
*/
|
|
40
|
+
entityPrefix: auditLogConfig?.entityPrefix || 'log',
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The schema for the audit log table
|
|
44
|
+
*/
|
|
45
|
+
schema: auditLogSchema,
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Field definitions for the consent audit log table
|
|
49
|
+
*/
|
|
50
|
+
fields: {
|
|
51
|
+
/**
|
|
52
|
+
* Type of entity this audit log entry is about (e.g., 'consent', 'subject', 'consentPurpose')
|
|
53
|
+
*/
|
|
54
|
+
entityType: {
|
|
55
|
+
type: 'string',
|
|
56
|
+
required: true,
|
|
57
|
+
fieldName: auditLogConfig?.fields?.entityType || 'entityType',
|
|
58
|
+
},
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* ID of the entity this audit log entry is about
|
|
62
|
+
*/
|
|
63
|
+
entityId: {
|
|
64
|
+
type: 'string',
|
|
65
|
+
required: true,
|
|
66
|
+
fieldName: auditLogConfig?.fields?.entityId || 'entityId',
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Type of action that was performed on the entity
|
|
71
|
+
* Common values: 'create', 'update', 'delete', 'view'
|
|
72
|
+
*/
|
|
73
|
+
actionType: {
|
|
74
|
+
type: 'string',
|
|
75
|
+
required: true,
|
|
76
|
+
fieldName: auditLogConfig?.fields?.actionType || 'actionType',
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Optional ID of the subject who performed the action
|
|
81
|
+
*/
|
|
82
|
+
subjectId: {
|
|
83
|
+
type: 'string',
|
|
84
|
+
required: false,
|
|
85
|
+
fieldName: auditLogConfig?.fields?.subjectId || 'subjectId',
|
|
86
|
+
references: {
|
|
87
|
+
model: subjectConfig?.entityName || 'subject',
|
|
88
|
+
field: 'id',
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* IP address from which the action was performed
|
|
94
|
+
*/
|
|
95
|
+
ipAddress: {
|
|
96
|
+
type: 'string',
|
|
97
|
+
required: false,
|
|
98
|
+
fieldName: auditLogConfig?.fields?.ipAddress || 'ipAddress',
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Subject agent (browser/device) from which the action was performed
|
|
103
|
+
*/
|
|
104
|
+
userAgent: {
|
|
105
|
+
type: 'string',
|
|
106
|
+
required: false,
|
|
107
|
+
fieldName: auditLogConfig?.fields?.userAgent || 'userAgent',
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Detailed changes made to the entity
|
|
112
|
+
* For updates, this typically contains before/after values
|
|
113
|
+
*/
|
|
114
|
+
changes: {
|
|
115
|
+
type: 'json',
|
|
116
|
+
required: false,
|
|
117
|
+
fieldName: auditLogConfig?.fields?.changes || 'changes',
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Additional metadata about the action
|
|
122
|
+
*/
|
|
123
|
+
metadata: {
|
|
124
|
+
type: 'json',
|
|
125
|
+
required: false,
|
|
126
|
+
fieldName: auditLogConfig?.fields?.metadata || 'metadata',
|
|
127
|
+
},
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* When the audit log entry was created
|
|
131
|
+
* Automatically set to current time by default
|
|
132
|
+
*/
|
|
133
|
+
createdAt: {
|
|
134
|
+
type: 'date',
|
|
135
|
+
defaultValue: () => new Date(),
|
|
136
|
+
required: true,
|
|
137
|
+
fieldName: auditLogConfig?.fields?.createdAt || 'createdAt',
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Timezone where the audit event occurred
|
|
142
|
+
*/
|
|
143
|
+
eventTimezone: {
|
|
144
|
+
type: 'timezone',
|
|
145
|
+
required: true,
|
|
146
|
+
defaultValue: COMMON_TIMEZONES.UTC,
|
|
147
|
+
fieldName: auditLogConfig?.fields?.eventTimezone || 'eventTimezone',
|
|
148
|
+
},
|
|
149
|
+
|
|
150
|
+
// Include additional fields from plugins
|
|
151
|
+
...(auditLogFields || {}),
|
|
152
|
+
|
|
153
|
+
// Include additional fields from configuration
|
|
154
|
+
...(auditLogConfig?.additionalFields || {}),
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Add indexes for better query performance
|
|
159
|
+
*/
|
|
160
|
+
indexes: [
|
|
161
|
+
{
|
|
162
|
+
name: 'entity_index',
|
|
163
|
+
fields: ['entityType', 'entityId'],
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: 'action_type_index',
|
|
167
|
+
fields: ['actionType'],
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
name: 'subject_id_index',
|
|
171
|
+
fields: ['subjectId'],
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
name: 'created_at_index',
|
|
175
|
+
fields: ['createdAt'],
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Execution order during migrations (lower numbers run first)
|
|
181
|
+
* Audit log table needs to be created after the subject table it references
|
|
182
|
+
*/
|
|
183
|
+
order: 5,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Log Entity Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* This module contains type definitions specific to the audit log entity.
|
|
5
|
+
*/
|
|
6
|
+
import type { BaseEntityConfig } from '../types';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Audit log entity configuration
|
|
10
|
+
* @default {entityName: "auditLog", entityPrefix: "log"}
|
|
11
|
+
*
|
|
12
|
+
* These defaults are applied when creating an audit log entity if not explicitly specified.
|
|
13
|
+
* See the entity creation utilities for implementation details.
|
|
14
|
+
*/
|
|
15
|
+
export interface AuditLogEntityConfig extends BaseEntityConfig {
|
|
16
|
+
fields?: Record<string, string> & {
|
|
17
|
+
id?: string;
|
|
18
|
+
timestamp: string;
|
|
19
|
+
action: string;
|
|
20
|
+
subjectId?: string;
|
|
21
|
+
resourceType: string;
|
|
22
|
+
resourceId?: string;
|
|
23
|
+
actor?: string;
|
|
24
|
+
changes?: string;
|
|
25
|
+
deviceInfo?: string;
|
|
26
|
+
ipAddress?: string;
|
|
27
|
+
createdAt?: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
import type { Where } from '~/db/adapters/types';
|
|
2
|
+
import { getWithHooks } from '~/db/hooks';
|
|
3
|
+
import type { GenericEndpointContext, RegistryContext } from '~/types';
|
|
4
|
+
import { validateEntityOutput } from '../definition';
|
|
5
|
+
import type { Consent } from './schema';
|
|
6
|
+
|
|
7
|
+
export interface FindConsentsParams {
|
|
8
|
+
subjectId?: string;
|
|
9
|
+
domainId?: string;
|
|
10
|
+
status?: string;
|
|
11
|
+
purposeIds?: string[];
|
|
12
|
+
includeInactive?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface RevokeConsentParams {
|
|
16
|
+
consentId: string;
|
|
17
|
+
reason: string;
|
|
18
|
+
actor: string;
|
|
19
|
+
metadata?: Record<string, unknown>;
|
|
20
|
+
context?: GenericEndpointContext;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Creates and returns a set of consent-related adapter methods to interact with the database.
|
|
25
|
+
* These methods provide a consistent interface for creating, finding, and updating
|
|
26
|
+
* consent records while applying hooks and enforcing data validation rules.
|
|
27
|
+
*
|
|
28
|
+
* @param adapter - The database adapter used for direct database operations
|
|
29
|
+
* @param ctx - The context object containing the database adapter, hooks, and options
|
|
30
|
+
* @returns An object containing type-safe consent operations
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const consentAdapter = createConsentAdapter(
|
|
35
|
+
* databaseAdapter,
|
|
36
|
+
* createWithHooks,
|
|
37
|
+
* updateWithHooks,
|
|
38
|
+
* c15tOptions
|
|
39
|
+
* );
|
|
40
|
+
*
|
|
41
|
+
* // Create a new consent record
|
|
42
|
+
* const consent = await consentAdapter.createConsent({
|
|
43
|
+
* subjectId: 'sub_x1pftyoufsm7xgo1kv',
|
|
44
|
+
* domainId: 'dom_x1pftyoufsm7xgo1kv',
|
|
45
|
+
* purposeIds: ['pur_e8zyhgozr3im7xj59it'],
|
|
46
|
+
* status: 'active'
|
|
47
|
+
* });
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export function consentRegistry({ adapter, ...ctx }: RegistryContext) {
|
|
51
|
+
const { createWithHooks, updateWithHooks } = getWithHooks(adapter, ctx);
|
|
52
|
+
const registry = {
|
|
53
|
+
/**
|
|
54
|
+
* Creates a new consent record in the database.
|
|
55
|
+
* Automatically sets creation timestamp and applies any
|
|
56
|
+
* configured hooks during the creation process.
|
|
57
|
+
*
|
|
58
|
+
* @param consent - Consent data to create (without id and timestamp)
|
|
59
|
+
* @param context - Optional endpoint context for hooks
|
|
60
|
+
* @returns The created consent with all fields populated
|
|
61
|
+
* @throws May throw an error if hooks prevent creation or if database operations fail
|
|
62
|
+
*/
|
|
63
|
+
createConsent: async (
|
|
64
|
+
consent: Omit<Consent, 'id' | 'createdAt'> & Partial<Consent>,
|
|
65
|
+
context?: GenericEndpointContext
|
|
66
|
+
) => {
|
|
67
|
+
const createdConsent = await createWithHooks({
|
|
68
|
+
data: {
|
|
69
|
+
createdAt: new Date(),
|
|
70
|
+
...consent,
|
|
71
|
+
},
|
|
72
|
+
model: 'consent',
|
|
73
|
+
context,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
if (!createdConsent) {
|
|
77
|
+
throw new Error('Failed to create consent - operation returned null');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return createdConsent as Consent;
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Finds all consents matching specified filters.
|
|
85
|
+
* Returns consents with processed output fields according to the schema configuration.
|
|
86
|
+
*
|
|
87
|
+
* @param params - Filter parameters
|
|
88
|
+
* @returns Array of consents matching the criteria
|
|
89
|
+
*/
|
|
90
|
+
findConsents: async (params: FindConsentsParams = {}) => {
|
|
91
|
+
const whereConditions: Where<'consent'> = [];
|
|
92
|
+
|
|
93
|
+
if (!params.includeInactive) {
|
|
94
|
+
whereConditions.push({
|
|
95
|
+
field: 'isActive',
|
|
96
|
+
value: true,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (params.subjectId) {
|
|
101
|
+
whereConditions.push({
|
|
102
|
+
field: 'subjectId',
|
|
103
|
+
value: params.subjectId,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (params.domainId) {
|
|
108
|
+
whereConditions.push({
|
|
109
|
+
field: 'domainId',
|
|
110
|
+
value: params.domainId,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (params.status) {
|
|
115
|
+
whereConditions.push({
|
|
116
|
+
field: 'status',
|
|
117
|
+
value: params.status,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (params.purposeIds && params.purposeIds.length > 0) {
|
|
122
|
+
whereConditions.push({
|
|
123
|
+
field: 'purposeIds',
|
|
124
|
+
operator: 'contains',
|
|
125
|
+
value: params.purposeIds,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const consents = await adapter.findMany({
|
|
130
|
+
model: 'consent',
|
|
131
|
+
where: whereConditions,
|
|
132
|
+
sortBy: {
|
|
133
|
+
field: 'givenAt',
|
|
134
|
+
direction: 'desc',
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
return consents.map((consent) =>
|
|
139
|
+
validateEntityOutput('consent', consent, ctx.options)
|
|
140
|
+
);
|
|
141
|
+
},
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Finds a consent by its unique ID.
|
|
145
|
+
* Returns the consent with processed output fields according to the schema configuration.
|
|
146
|
+
*
|
|
147
|
+
* @param consentId - The unique identifier of the consent
|
|
148
|
+
* @returns The consent object if found, null otherwise
|
|
149
|
+
*/
|
|
150
|
+
findConsentById: async (consentId: string) => {
|
|
151
|
+
const consent = await adapter.findOne({
|
|
152
|
+
model: 'consent',
|
|
153
|
+
where: [
|
|
154
|
+
{
|
|
155
|
+
field: 'id',
|
|
156
|
+
value: consentId,
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
});
|
|
160
|
+
return consent
|
|
161
|
+
? validateEntityOutput('consent', consent, ctx.options)
|
|
162
|
+
: null;
|
|
163
|
+
},
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Finds all consents for a specific subject.
|
|
167
|
+
* Returns consents with processed output fields according to the schema configuration.
|
|
168
|
+
*
|
|
169
|
+
* @param subjectId - The subject ID to find consents for
|
|
170
|
+
* @returns Array of consents associated with the subject
|
|
171
|
+
*/
|
|
172
|
+
findConsentsBySubjectId: async (subjectId: string) => {
|
|
173
|
+
const consents = await adapter.findMany({
|
|
174
|
+
model: 'consent',
|
|
175
|
+
where: [
|
|
176
|
+
{
|
|
177
|
+
field: 'subjectId',
|
|
178
|
+
value: subjectId,
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
sortBy: {
|
|
182
|
+
field: 'givenAt',
|
|
183
|
+
direction: 'desc',
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
return consents.map((consent) =>
|
|
187
|
+
validateEntityOutput('consent', consent, ctx.options)
|
|
188
|
+
);
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Finds all consents for a specific domain.
|
|
193
|
+
* Returns consents with processed output fields according to the schema configuration.
|
|
194
|
+
*
|
|
195
|
+
* @param domainId - The domain ID to find consents for
|
|
196
|
+
* @returns Array of consents associated with the domain
|
|
197
|
+
*/
|
|
198
|
+
findConsentsByDomainId: async (domainId: string) => {
|
|
199
|
+
const consents = await adapter.findMany({
|
|
200
|
+
model: 'consent',
|
|
201
|
+
where: [
|
|
202
|
+
{
|
|
203
|
+
field: 'domainId',
|
|
204
|
+
value: domainId,
|
|
205
|
+
},
|
|
206
|
+
],
|
|
207
|
+
sortBy: {
|
|
208
|
+
field: 'givenAt',
|
|
209
|
+
direction: 'desc',
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
return consents.map((consent) =>
|
|
213
|
+
validateEntityOutput('consent', consent, ctx.options)
|
|
214
|
+
);
|
|
215
|
+
},
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Updates an existing consent record by ID.
|
|
219
|
+
* Applies any configured hooks during the update process and
|
|
220
|
+
* processes the output according to schema configuration.
|
|
221
|
+
*
|
|
222
|
+
* @param consentId - The unique identifier of the consent to update
|
|
223
|
+
* @param data - The fields to update on the consent record
|
|
224
|
+
* @param context - Optional endpoint context for hooks
|
|
225
|
+
* @returns The updated consent if successful, null if not found or hooks prevented update
|
|
226
|
+
*/
|
|
227
|
+
updateConsent: async (
|
|
228
|
+
consentId: string,
|
|
229
|
+
data: Partial<Consent>,
|
|
230
|
+
context?: GenericEndpointContext
|
|
231
|
+
) => {
|
|
232
|
+
const consent = await updateWithHooks<Consent>({
|
|
233
|
+
data: {
|
|
234
|
+
...data,
|
|
235
|
+
},
|
|
236
|
+
where: [
|
|
237
|
+
{
|
|
238
|
+
field: 'id',
|
|
239
|
+
value: consentId,
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
model: 'consent',
|
|
243
|
+
context,
|
|
244
|
+
});
|
|
245
|
+
return consent
|
|
246
|
+
? validateEntityOutput('consent', consent, ctx.options)
|
|
247
|
+
: null;
|
|
248
|
+
},
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Updates consent status to withdrawn.
|
|
252
|
+
* Also records the withdrawal reason if provided.
|
|
253
|
+
*
|
|
254
|
+
* @param consentId - The unique identifier of the consent to update
|
|
255
|
+
* @param withdrawalReason - Optional reason for consentWithdrawal
|
|
256
|
+
* @param context - Optional endpoint context for hooks
|
|
257
|
+
* @returns The updated consent with withdrawn status
|
|
258
|
+
*/
|
|
259
|
+
updateWithdrawal: async (
|
|
260
|
+
consentId: string,
|
|
261
|
+
withdrawalReason?: string,
|
|
262
|
+
context?: GenericEndpointContext
|
|
263
|
+
) => {
|
|
264
|
+
const updateData: Partial<Consent> = {
|
|
265
|
+
status: 'withdrawn',
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
if (withdrawalReason) {
|
|
269
|
+
updateData.withdrawalReason = withdrawalReason;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const consent = await updateWithHooks<Consent>({
|
|
273
|
+
data: updateData,
|
|
274
|
+
where: [
|
|
275
|
+
{
|
|
276
|
+
field: 'id',
|
|
277
|
+
value: consentId,
|
|
278
|
+
},
|
|
279
|
+
],
|
|
280
|
+
model: 'consent',
|
|
281
|
+
context,
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
return consent
|
|
285
|
+
? validateEntityOutput('consent', consent, ctx.options)
|
|
286
|
+
: null;
|
|
287
|
+
},
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Revokes a consent and records the revocation details.
|
|
291
|
+
*
|
|
292
|
+
* @param params - Revocation parameters including reason and actor
|
|
293
|
+
* @returns The updated consent with revocation details
|
|
294
|
+
*/
|
|
295
|
+
revokeConsent: async ({
|
|
296
|
+
consentId,
|
|
297
|
+
reason,
|
|
298
|
+
actor,
|
|
299
|
+
metadata,
|
|
300
|
+
context,
|
|
301
|
+
}: RevokeConsentParams) => {
|
|
302
|
+
const consent = await registry.findConsentById(consentId);
|
|
303
|
+
if (!consent) {
|
|
304
|
+
throw new Error('Consent not found');
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const updateData: Partial<Consent> = {
|
|
308
|
+
status: 'withdrawn',
|
|
309
|
+
withdrawalReason: reason,
|
|
310
|
+
metadata: {
|
|
311
|
+
...(consent.metadata as Record<string, unknown>),
|
|
312
|
+
consentWithdrawal: {
|
|
313
|
+
actor,
|
|
314
|
+
timestamp: new Date().toISOString(),
|
|
315
|
+
...metadata,
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
return registry.updateConsent(consentId, updateData, context);
|
|
321
|
+
},
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Gets all records associated with a consent.
|
|
325
|
+
*
|
|
326
|
+
* @param consentId - The ID of the consent
|
|
327
|
+
* @returns Array of records associated with the consent
|
|
328
|
+
*/
|
|
329
|
+
getRecords: async (consentId: string) => {
|
|
330
|
+
const records = await adapter.findMany({
|
|
331
|
+
model: 'consentRecord',
|
|
332
|
+
where: [
|
|
333
|
+
{
|
|
334
|
+
field: 'consentId',
|
|
335
|
+
value: consentId,
|
|
336
|
+
},
|
|
337
|
+
],
|
|
338
|
+
sortBy: {
|
|
339
|
+
field: 'createdAt',
|
|
340
|
+
direction: 'desc',
|
|
341
|
+
},
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
return records.map((record) =>
|
|
345
|
+
validateEntityOutput('consentRecord', record, ctx.options)
|
|
346
|
+
);
|
|
347
|
+
},
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Gets all consentWithdrawals associated with a consent.
|
|
351
|
+
*
|
|
352
|
+
* @param consentId - The ID of the consent
|
|
353
|
+
* @returns Array of consentWithdrawals associated with the consent
|
|
354
|
+
*/
|
|
355
|
+
getWithdrawals: async (consentId: string) => {
|
|
356
|
+
const consentWithdrawals = await adapter.findMany({
|
|
357
|
+
model: 'consentWithdrawal',
|
|
358
|
+
where: [
|
|
359
|
+
{
|
|
360
|
+
field: 'consentId',
|
|
361
|
+
value: consentId,
|
|
362
|
+
},
|
|
363
|
+
],
|
|
364
|
+
sortBy: {
|
|
365
|
+
field: 'createdAt',
|
|
366
|
+
direction: 'desc',
|
|
367
|
+
},
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
return consentWithdrawals.map((consentWithdrawal) =>
|
|
371
|
+
validateEntityOutput(
|
|
372
|
+
'consentWithdrawal',
|
|
373
|
+
consentWithdrawal,
|
|
374
|
+
ctx.options
|
|
375
|
+
)
|
|
376
|
+
);
|
|
377
|
+
},
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
return registry;
|
|
381
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Zod schema for validating consent entities.
|
|
5
|
+
*
|
|
6
|
+
* This defines the structure and validation rules for consent records:
|
|
7
|
+
* - Required fields: subjectId, domainId, purposeIds
|
|
8
|
+
* - Default value of 'active' for status
|
|
9
|
+
* - Default current date/time for creation timestamp
|
|
10
|
+
* - Includes audit trail of all changes
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const consentData = {
|
|
15
|
+
* id: 'cns_w5qufx2a66m7xkn3ty',
|
|
16
|
+
* subjectId: 'sub_x1pftyoufsm7xgo1kv',
|
|
17
|
+
* domainId: 'dom_x1pftyoufsm7xgo1kv',
|
|
18
|
+
* purposeIds: ['pur_e8zyhgozr3im7xj59it'],
|
|
19
|
+
* status: 'active',
|
|
20
|
+
* givenAt: new Date(),
|
|
21
|
+
* isActive: true,
|
|
22
|
+
* history: [
|
|
23
|
+
* {
|
|
24
|
+
* actionType: 'given',
|
|
25
|
+
* timestamp: new Date(),
|
|
26
|
+
* details: { ip: '192.168.1.1' }
|
|
27
|
+
* }
|
|
28
|
+
* ]
|
|
29
|
+
* };
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export const consentHistorySchema = z.object({
|
|
33
|
+
actionType: z.enum(['given', 'withdrawn', 'updated', 'expired']),
|
|
34
|
+
timestamp: z.date(),
|
|
35
|
+
details: z.record(z.unknown()).optional(),
|
|
36
|
+
previousState: z.record(z.unknown()).optional(),
|
|
37
|
+
newState: z.record(z.unknown()).optional(),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
export const consentSchema = z.object({
|
|
41
|
+
id: z.string(),
|
|
42
|
+
subjectId: z.string(),
|
|
43
|
+
domainId: z.string(),
|
|
44
|
+
purposeIds: z.array(z.string()),
|
|
45
|
+
metadata: z.record(z.unknown()).optional(),
|
|
46
|
+
policyId: z.string().optional(),
|
|
47
|
+
ipAddress: z.string().optional(),
|
|
48
|
+
userAgent: z.string().optional(),
|
|
49
|
+
status: z.enum(['active', 'withdrawn', 'expired']).default('active'),
|
|
50
|
+
withdrawalReason: z.string().optional(),
|
|
51
|
+
givenAt: z.date().default(() => new Date()),
|
|
52
|
+
validUntil: z.date().optional(),
|
|
53
|
+
isActive: z.boolean().default(true),
|
|
54
|
+
history: z.array(consentHistorySchema).default([]),
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Type definition for Consent
|
|
59
|
+
*
|
|
60
|
+
* This type represents the structure of a consent record
|
|
61
|
+
* as defined by the consentSchema. It includes all fields
|
|
62
|
+
* that are part of the consent entity and its history.
|
|
63
|
+
*/
|
|
64
|
+
export type Consent = z.infer<typeof consentSchema>;
|
|
65
|
+
export type ConsentHistory = z.infer<typeof consentHistorySchema>;
|