@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.
Files changed (521) hide show
  1. package/.turbo/turbo-build.log +11 -0
  2. package/.turbo/turbo-check-types.log +5 -0
  3. package/.turbo/turbo-fmt.log +7 -0
  4. package/.turbo/turbo-lint.log +6 -0
  5. package/.turbo/turbo-test.log +26 -0
  6. package/README-next.md +223 -0
  7. package/README.md +164 -0
  8. package/dist/api/call.d.ts +176 -0
  9. package/dist/api/call.d.ts.map +1 -0
  10. package/dist/api/index.d.ts +935 -0
  11. package/dist/api/index.d.ts.map +1 -0
  12. package/dist/api/middlewares/index.d.ts +39 -0
  13. package/dist/api/middlewares/index.d.ts.map +1 -0
  14. package/dist/api/middlewares/origin-check.d.ts +82 -0
  15. package/dist/api/middlewares/origin-check.d.ts.map +1 -0
  16. package/dist/api/middlewares/validate-context.d.ts +38 -0
  17. package/dist/api/middlewares/validate-context.d.ts.map +1 -0
  18. package/dist/api/routes/__tests__/consent.test.d.ts +2 -0
  19. package/dist/api/routes/__tests__/consent.test.d.ts.map +1 -0
  20. package/dist/api/routes/__tests__/status.test.d.ts +2 -0
  21. package/dist/api/routes/__tests__/status.test.d.ts.map +1 -0
  22. package/dist/api/routes/error.d.ts +57 -0
  23. package/dist/api/routes/error.d.ts.map +1 -0
  24. package/dist/api/routes/generate-consent-receipt.d.ts +130 -0
  25. package/dist/api/routes/generate-consent-receipt.d.ts.map +1 -0
  26. package/dist/api/routes/get-consent-history.d.ts +133 -0
  27. package/dist/api/routes/get-consent-history.d.ts.map +1 -0
  28. package/dist/api/routes/get-consent-policy.d.ts +164 -0
  29. package/dist/api/routes/get-consent-policy.d.ts.map +1 -0
  30. package/dist/api/routes/get-consent.d.ts +148 -0
  31. package/dist/api/routes/get-consent.d.ts.map +1 -0
  32. package/dist/api/routes/index.d.ts +339 -0
  33. package/dist/api/routes/index.d.ts.map +1 -0
  34. package/dist/api/routes/ok.d.ts +87 -0
  35. package/dist/api/routes/ok.d.ts.map +1 -0
  36. package/dist/api/routes/set-consent.d.ts +245 -0
  37. package/dist/api/routes/set-consent.d.ts.map +1 -0
  38. package/dist/api/routes/show-consent-banner.d.ts +127 -0
  39. package/dist/api/routes/show-consent-banner.d.ts.map +1 -0
  40. package/dist/api/routes/status.d.ts +61 -0
  41. package/dist/api/routes/status.d.ts.map +1 -0
  42. package/dist/api/routes/verify-consent.d.ts +179 -0
  43. package/dist/api/routes/verify-consent.d.ts.map +1 -0
  44. package/dist/api/routes/withdraw-consent.d.ts +194 -0
  45. package/dist/api/routes/withdraw-consent.d.ts.map +1 -0
  46. package/dist/api/to-endpoints.d.ts +35 -0
  47. package/dist/api/to-endpoints.d.ts.map +1 -0
  48. package/dist/client/index.cjs +139 -0
  49. package/dist/client/index.d.ts +203 -0
  50. package/dist/client/index.d.ts.map +1 -0
  51. package/dist/client/index.js +106 -0
  52. package/dist/client/types.d.ts +431 -0
  53. package/dist/client/types.d.ts.map +1 -0
  54. package/dist/core.d.ts +124 -0
  55. package/dist/core.d.ts.map +1 -0
  56. package/dist/core.test.d.ts +2 -0
  57. package/dist/core.test.d.ts.map +1 -0
  58. package/dist/db/adapters/drizzle-adapter/drizzle-adapter.d.ts +122 -0
  59. package/dist/db/adapters/drizzle-adapter/drizzle-adapter.d.ts.map +1 -0
  60. package/dist/db/adapters/drizzle-adapter/index.d.ts +2 -0
  61. package/dist/db/adapters/drizzle-adapter/index.d.ts.map +1 -0
  62. package/dist/db/adapters/drizzle.cjs +1531 -0
  63. package/dist/db/adapters/drizzle.js +1489 -0
  64. package/dist/db/adapters/kysely-adapter/dialect.d.ts +72 -0
  65. package/dist/db/adapters/kysely-adapter/dialect.d.ts.map +1 -0
  66. package/dist/db/adapters/kysely-adapter/index.d.ts +4 -0
  67. package/dist/db/adapters/kysely-adapter/index.d.ts.map +1 -0
  68. package/dist/db/adapters/kysely-adapter/kysely-adapter.d.ts +98 -0
  69. package/dist/db/adapters/kysely-adapter/kysely-adapter.d.ts.map +1 -0
  70. package/dist/db/adapters/kysely-adapter/types.d.ts +281 -0
  71. package/dist/db/adapters/kysely-adapter/types.d.ts.map +1 -0
  72. package/dist/db/adapters/kysely.cjs +1551 -0
  73. package/dist/db/adapters/kysely.js +1508 -0
  74. package/dist/db/adapters/memory-adapter/index.d.ts +2 -0
  75. package/dist/db/adapters/memory-adapter/index.d.ts.map +1 -0
  76. package/dist/db/adapters/memory-adapter/memory-adapter.d.ts +56 -0
  77. package/dist/db/adapters/memory-adapter/memory-adapter.d.ts.map +1 -0
  78. package/dist/db/adapters/memory.cjs +1391 -0
  79. package/dist/db/adapters/memory.js +1349 -0
  80. package/dist/db/adapters/prisma-adapter/index.d.ts +2 -0
  81. package/dist/db/adapters/prisma-adapter/index.d.ts.map +1 -0
  82. package/dist/db/adapters/prisma-adapter/prisma-adapter.d.ts +143 -0
  83. package/dist/db/adapters/prisma-adapter/prisma-adapter.d.ts.map +1 -0
  84. package/dist/db/adapters/prisma.cjs +1503 -0
  85. package/dist/db/adapters/prisma.js +1461 -0
  86. package/dist/db/adapters/types.d.ts +154 -0
  87. package/dist/db/adapters/types.d.ts.map +1 -0
  88. package/dist/db/adapters/utils.d.ts +36 -0
  89. package/dist/db/adapters/utils.d.ts.map +1 -0
  90. package/dist/db/core/fields/field-factory.d.ts +383 -0
  91. package/dist/db/core/fields/field-factory.d.ts.map +1 -0
  92. package/dist/db/core/fields/field-inference.d.ts +218 -0
  93. package/dist/db/core/fields/field-inference.d.ts.map +1 -0
  94. package/dist/db/core/fields/field-options-integration.d.ts +90 -0
  95. package/dist/db/core/fields/field-options-integration.d.ts.map +1 -0
  96. package/dist/db/core/fields/field-types.d.ts +182 -0
  97. package/dist/db/core/fields/field-types.d.ts.map +1 -0
  98. package/dist/db/core/fields/id-generator.d.ts +19 -0
  99. package/dist/db/core/fields/id-generator.d.ts.map +1 -0
  100. package/dist/db/core/fields/index.d.ts +8 -0
  101. package/dist/db/core/fields/index.d.ts.map +1 -0
  102. package/dist/db/core/fields/superjson-utils.d.ts +34 -0
  103. package/dist/db/core/fields/superjson-utils.d.ts.map +1 -0
  104. package/dist/db/core/fields/zod-fields.d.ts +1011 -0
  105. package/dist/db/core/fields/zod-fields.d.ts.map +1 -0
  106. package/dist/db/core/get-schema.d.ts +36 -0
  107. package/dist/db/core/get-schema.d.ts.map +1 -0
  108. package/dist/db/core/types.d.ts +41 -0
  109. package/dist/db/core/types.d.ts.map +1 -0
  110. package/dist/db/create-registry.d.ts +760 -0
  111. package/dist/db/create-registry.d.ts.map +1 -0
  112. package/dist/db/hooks/create-hooks.d.ts +32 -0
  113. package/dist/db/hooks/create-hooks.d.ts.map +1 -0
  114. package/dist/db/hooks/index.d.ts +40 -0
  115. package/dist/db/hooks/index.d.ts.map +1 -0
  116. package/dist/db/hooks/types.d.ts +133 -0
  117. package/dist/db/hooks/types.d.ts.map +1 -0
  118. package/dist/db/hooks/update-hooks.d.ts +33 -0
  119. package/dist/db/hooks/update-hooks.d.ts.map +1 -0
  120. package/dist/db/hooks/update-many-hooks.d.ts +55 -0
  121. package/dist/db/hooks/update-many-hooks.d.ts.map +1 -0
  122. package/dist/db/hooks/utils.d.ts +62 -0
  123. package/dist/db/hooks/utils.d.ts.map +1 -0
  124. package/dist/db/hooks/with-hooks-factory.d.ts +33 -0
  125. package/dist/db/hooks/with-hooks-factory.d.ts.map +1 -0
  126. package/dist/db/index.cjs +2458 -0
  127. package/dist/db/index.d.ts +11 -0
  128. package/dist/db/index.d.ts.map +1 -0
  129. package/dist/db/index.js +2404 -0
  130. package/dist/db/migration/get-migration.d.ts +32 -0
  131. package/dist/db/migration/get-migration.d.ts.map +1 -0
  132. package/dist/db/migration/get-schema/get-schema.d.ts +27 -0
  133. package/dist/db/migration/get-schema/get-schema.d.ts.map +1 -0
  134. package/dist/db/migration/get-schema/index.d.ts +21 -0
  135. package/dist/db/migration/get-schema/index.d.ts.map +1 -0
  136. package/dist/db/migration/get-schema/process-fields.d.ts +16 -0
  137. package/dist/db/migration/get-schema/process-fields.d.ts.map +1 -0
  138. package/dist/db/migration/get-schema/process-tables.d.ts +13 -0
  139. package/dist/db/migration/get-schema/process-tables.d.ts.map +1 -0
  140. package/dist/db/migration/get-schema/types.d.ts +17 -0
  141. package/dist/db/migration/get-schema/types.d.ts.map +1 -0
  142. package/dist/db/migration/index.cjs +1613 -0
  143. package/dist/db/migration/index.d.ts +14 -0
  144. package/dist/db/migration/index.d.ts.map +1 -0
  145. package/dist/db/migration/index.js +1571 -0
  146. package/dist/db/migration/migration-builders.d.ts +28 -0
  147. package/dist/db/migration/migration-builders.d.ts.map +1 -0
  148. package/dist/db/migration/migration-execution.d.ts +12 -0
  149. package/dist/db/migration/migration-execution.d.ts.map +1 -0
  150. package/dist/db/migration/schema-comparison.d.ts +54 -0
  151. package/dist/db/migration/schema-comparison.d.ts.map +1 -0
  152. package/dist/db/migration/type-mapping.d.ts +86 -0
  153. package/dist/db/migration/type-mapping.d.ts.map +1 -0
  154. package/dist/db/migration/types.d.ts +37 -0
  155. package/dist/db/migration/types.d.ts.map +1 -0
  156. package/dist/db/schema/audit-log/index.d.ts +4 -0
  157. package/dist/db/schema/audit-log/index.d.ts.map +1 -0
  158. package/dist/db/schema/audit-log/registry.d.ts +128 -0
  159. package/dist/db/schema/audit-log/registry.d.ts.map +1 -0
  160. package/dist/db/schema/audit-log/schema.d.ts +67 -0
  161. package/dist/db/schema/audit-log/schema.d.ts.map +1 -0
  162. package/dist/db/schema/audit-log/table.d.ts +175 -0
  163. package/dist/db/schema/audit-log/table.d.ts.map +1 -0
  164. package/dist/db/schema/audit-log/types.d.ts +29 -0
  165. package/dist/db/schema/audit-log/types.d.ts.map +1 -0
  166. package/dist/db/schema/consent/index.d.ts +4 -0
  167. package/dist/db/schema/consent/index.d.ts.map +1 -0
  168. package/dist/db/schema/consent/registry.d.ts +318 -0
  169. package/dist/db/schema/consent/registry.d.ts.map +1 -0
  170. package/dist/db/schema/consent/schema.d.ts +135 -0
  171. package/dist/db/schema/consent/schema.d.ts.map +1 -0
  172. package/dist/db/schema/consent/table.d.ts +245 -0
  173. package/dist/db/schema/consent/table.d.ts.map +1 -0
  174. package/dist/db/schema/consent/types.d.ts +37 -0
  175. package/dist/db/schema/consent/types.d.ts.map +1 -0
  176. package/dist/db/schema/consent-geo-location/index.d.ts +4 -0
  177. package/dist/db/schema/consent-geo-location/index.d.ts.map +1 -0
  178. package/dist/db/schema/consent-geo-location/registry.d.ts +96 -0
  179. package/dist/db/schema/consent-geo-location/registry.d.ts.map +1 -0
  180. package/dist/db/schema/consent-geo-location/schema.d.ts +71 -0
  181. package/dist/db/schema/consent-geo-location/schema.d.ts.map +1 -0
  182. package/dist/db/schema/consent-geo-location/table.d.ts +167 -0
  183. package/dist/db/schema/consent-geo-location/table.d.ts.map +1 -0
  184. package/dist/db/schema/consent-geo-location/types.d.ts +21 -0
  185. package/dist/db/schema/consent-geo-location/types.d.ts.map +1 -0
  186. package/dist/db/schema/consent-policy/index.d.ts +4 -0
  187. package/dist/db/schema/consent-policy/index.d.ts.map +1 -0
  188. package/dist/db/schema/consent-policy/registry.d.ts +186 -0
  189. package/dist/db/schema/consent-policy/registry.d.ts.map +1 -0
  190. package/dist/db/schema/consent-policy/schema.d.ts +68 -0
  191. package/dist/db/schema/consent-policy/schema.d.ts.map +1 -0
  192. package/dist/db/schema/consent-policy/table.d.ts +147 -0
  193. package/dist/db/schema/consent-policy/table.d.ts.map +1 -0
  194. package/dist/db/schema/consent-policy/types.d.ts +28 -0
  195. package/dist/db/schema/consent-policy/types.d.ts.map +1 -0
  196. package/dist/db/schema/consent-purpose/index.d.ts +4 -0
  197. package/dist/db/schema/consent-purpose/index.d.ts.map +1 -0
  198. package/dist/db/schema/consent-purpose/registry.d.ts +136 -0
  199. package/dist/db/schema/consent-purpose/registry.d.ts.map +1 -0
  200. package/dist/db/schema/consent-purpose/schema.d.ts +79 -0
  201. package/dist/db/schema/consent-purpose/schema.d.ts.map +1 -0
  202. package/dist/db/schema/consent-purpose/table.d.ts +161 -0
  203. package/dist/db/schema/consent-purpose/table.d.ts.map +1 -0
  204. package/dist/db/schema/consent-purpose/types.d.ts +16 -0
  205. package/dist/db/schema/consent-purpose/types.d.ts.map +1 -0
  206. package/dist/db/schema/consent-purpose-junction/index.d.ts +4 -0
  207. package/dist/db/schema/consent-purpose-junction/index.d.ts.map +1 -0
  208. package/dist/db/schema/consent-purpose-junction/registry.d.ts +109 -0
  209. package/dist/db/schema/consent-purpose-junction/registry.d.ts.map +1 -0
  210. package/dist/db/schema/consent-purpose-junction/schema.d.ts +57 -0
  211. package/dist/db/schema/consent-purpose-junction/schema.d.ts.map +1 -0
  212. package/dist/db/schema/consent-purpose-junction/table.d.ts +138 -0
  213. package/dist/db/schema/consent-purpose-junction/table.d.ts.map +1 -0
  214. package/dist/db/schema/consent-purpose-junction/types.d.ts +14 -0
  215. package/dist/db/schema/consent-purpose-junction/types.d.ts.map +1 -0
  216. package/dist/db/schema/consent-record/index.d.ts +4 -0
  217. package/dist/db/schema/consent-record/index.d.ts.map +1 -0
  218. package/dist/db/schema/consent-record/registry.d.ts +119 -0
  219. package/dist/db/schema/consent-record/registry.d.ts.map +1 -0
  220. package/dist/db/schema/consent-record/schema.d.ts +57 -0
  221. package/dist/db/schema/consent-record/schema.d.ts.map +1 -0
  222. package/dist/db/schema/consent-record/table.d.ts +123 -0
  223. package/dist/db/schema/consent-record/table.d.ts.map +1 -0
  224. package/dist/db/schema/consent-record/types.d.ts +21 -0
  225. package/dist/db/schema/consent-record/types.d.ts.map +1 -0
  226. package/dist/db/schema/consent-withdrawal/index.d.ts +4 -0
  227. package/dist/db/schema/consent-withdrawal/index.d.ts.map +1 -0
  228. package/dist/db/schema/consent-withdrawal/registry.d.ts +134 -0
  229. package/dist/db/schema/consent-withdrawal/registry.d.ts.map +1 -0
  230. package/dist/db/schema/consent-withdrawal/schema.d.ts +67 -0
  231. package/dist/db/schema/consent-withdrawal/schema.d.ts.map +1 -0
  232. package/dist/db/schema/consent-withdrawal/table.d.ts +170 -0
  233. package/dist/db/schema/consent-withdrawal/table.d.ts.map +1 -0
  234. package/dist/db/schema/consent-withdrawal/types.d.ts +28 -0
  235. package/dist/db/schema/consent-withdrawal/types.d.ts.map +1 -0
  236. package/dist/db/schema/definition.d.ts +1100 -0
  237. package/dist/db/schema/definition.d.ts.map +1 -0
  238. package/dist/db/schema/domain/index.d.ts +4 -0
  239. package/dist/db/schema/domain/index.d.ts.map +1 -0
  240. package/dist/db/schema/domain/registry.d.ts +169 -0
  241. package/dist/db/schema/domain/registry.d.ts.map +1 -0
  242. package/dist/db/schema/domain/schema.d.ts +60 -0
  243. package/dist/db/schema/domain/schema.d.ts.map +1 -0
  244. package/dist/db/schema/domain/table.d.ts +140 -0
  245. package/dist/db/schema/domain/table.d.ts.map +1 -0
  246. package/dist/db/schema/domain/types.d.ts +27 -0
  247. package/dist/db/schema/domain/types.d.ts.map +1 -0
  248. package/dist/db/schema/geo-location/index.d.ts +4 -0
  249. package/dist/db/schema/geo-location/index.d.ts.map +1 -0
  250. package/dist/db/schema/geo-location/registry.d.ts +114 -0
  251. package/dist/db/schema/geo-location/registry.d.ts.map +1 -0
  252. package/dist/db/schema/geo-location/schema.d.ts +58 -0
  253. package/dist/db/schema/geo-location/schema.d.ts.map +1 -0
  254. package/dist/db/schema/geo-location/table.d.ts +132 -0
  255. package/dist/db/schema/geo-location/table.d.ts.map +1 -0
  256. package/dist/db/schema/geo-location/types.d.ts +17 -0
  257. package/dist/db/schema/geo-location/types.d.ts.map +1 -0
  258. package/dist/db/schema/index.d.ts +85 -0
  259. package/dist/db/schema/index.d.ts.map +1 -0
  260. package/dist/db/schema/parser.d.ts +183 -0
  261. package/dist/db/schema/parser.d.ts.map +1 -0
  262. package/dist/db/schema/schemas.d.ts +383 -0
  263. package/dist/db/schema/schemas.d.ts.map +1 -0
  264. package/dist/db/schema/subject/index.d.ts +4 -0
  265. package/dist/db/schema/subject/index.d.ts.map +1 -0
  266. package/dist/db/schema/subject/registry.d.ts +141 -0
  267. package/dist/db/schema/subject/registry.d.ts.map +1 -0
  268. package/dist/db/schema/subject/schema.d.ts +56 -0
  269. package/dist/db/schema/subject/schema.d.ts.map +1 -0
  270. package/dist/db/schema/subject/table.d.ts +136 -0
  271. package/dist/db/schema/subject/table.d.ts.map +1 -0
  272. package/dist/db/schema/subject/types.d.ts +22 -0
  273. package/dist/db/schema/subject/types.d.ts.map +1 -0
  274. package/dist/db/schema/types.d.ts +136 -0
  275. package/dist/db/schema/types.d.ts.map +1 -0
  276. package/dist/db/utils/adapter-factory.d.ts +21 -0
  277. package/dist/db/utils/adapter-factory.d.ts.map +1 -0
  278. package/dist/db/utils/index.d.ts +10 -0
  279. package/dist/db/utils/index.d.ts.map +1 -0
  280. package/dist/db/utils.d.ts +4 -0
  281. package/dist/db/utils.d.ts.map +1 -0
  282. package/dist/error/codes.cjs +68 -0
  283. package/dist/error/codes.d.ts +175 -0
  284. package/dist/error/codes.d.ts.map +1 -0
  285. package/dist/error/codes.js +35 -0
  286. package/dist/error/error.d.ts +79 -0
  287. package/dist/error/error.d.ts.map +1 -0
  288. package/dist/error/index.cjs +172 -0
  289. package/dist/error/index.d.ts +9 -0
  290. package/dist/error/index.d.ts.map +1 -0
  291. package/dist/error/index.js +129 -0
  292. package/dist/error/logging.d.ts +25 -0
  293. package/dist/error/logging.d.ts.map +1 -0
  294. package/dist/error/pipeline.d.ts +19 -0
  295. package/dist/error/pipeline.d.ts.map +1 -0
  296. package/dist/error/recovery.d.ts +22 -0
  297. package/dist/error/recovery.d.ts.map +1 -0
  298. package/dist/error/results.d.ts +56 -0
  299. package/dist/error/results.d.ts.map +1 -0
  300. package/dist/index.cjs +4777 -0
  301. package/dist/index.d.ts +46 -0
  302. package/dist/index.d.ts.map +1 -0
  303. package/dist/index.js +4708 -0
  304. package/dist/init.d.ts +52 -0
  305. package/dist/init.d.ts.map +1 -0
  306. package/dist/init.test.d.ts +2 -0
  307. package/dist/init.test.d.ts.map +1 -0
  308. package/dist/integrations/index.cjs +281 -0
  309. package/dist/integrations/index.d.ts +7 -0
  310. package/dist/integrations/index.d.ts.map +1 -0
  311. package/dist/integrations/index.js +248 -0
  312. package/dist/integrations/next.cjs +131 -0
  313. package/dist/integrations/next.d.ts +29 -0
  314. package/dist/integrations/next.d.ts.map +1 -0
  315. package/dist/integrations/next.js +99 -0
  316. package/dist/integrations/react.cjs +182 -0
  317. package/dist/integrations/react.d.ts +257 -0
  318. package/dist/integrations/react.d.ts.map +1 -0
  319. package/dist/integrations/react.js +150 -0
  320. package/dist/plugins/geo/index.d.ts +2 -0
  321. package/dist/plugins/geo/index.d.ts.map +1 -0
  322. package/dist/test/utils.d.ts +65 -0
  323. package/dist/test/utils.d.ts.map +1 -0
  324. package/dist/types/api.d.ts +89 -0
  325. package/dist/types/api.d.ts.map +1 -0
  326. package/dist/types/context.d.ts +205 -0
  327. package/dist/types/context.d.ts.map +1 -0
  328. package/dist/types/helper.d.ts +78 -0
  329. package/dist/types/helper.d.ts.map +1 -0
  330. package/dist/types/index.cjs +19 -0
  331. package/dist/types/index.d.ts +6 -0
  332. package/dist/types/index.d.ts.map +1 -0
  333. package/dist/types/index.js +0 -0
  334. package/dist/types/options.d.ts +172 -0
  335. package/dist/types/options.d.ts.map +1 -0
  336. package/dist/types/plugins.d.ts +442 -0
  337. package/dist/types/plugins.d.ts.map +1 -0
  338. package/dist/utils/env.d.ts +77 -0
  339. package/dist/utils/env.d.ts.map +1 -0
  340. package/dist/utils/hide-metadata.d.ts +22 -0
  341. package/dist/utils/hide-metadata.d.ts.map +1 -0
  342. package/dist/utils/index.cjs +268 -0
  343. package/dist/utils/index.d.ts +18 -0
  344. package/dist/utils/index.d.ts.map +1 -0
  345. package/dist/utils/index.js +210 -0
  346. package/dist/utils/ip.d.ts +10 -0
  347. package/dist/utils/ip.d.ts.map +1 -0
  348. package/dist/utils/json.d.ts +14 -0
  349. package/dist/utils/json.d.ts.map +1 -0
  350. package/dist/utils/logger.d.ts +108 -0
  351. package/dist/utils/logger.d.ts.map +1 -0
  352. package/dist/utils/url.d.ts +87 -0
  353. package/dist/utils/url.d.ts.map +1 -0
  354. package/dist/utils/wildcard.d.ts +46 -0
  355. package/dist/utils/wildcard.d.ts.map +1 -0
  356. package/knip.json +37 -0
  357. package/package.json +146 -0
  358. package/rslib.config.ts +104 -0
  359. package/src/api/call.ts +177 -0
  360. package/src/api/index.ts +303 -0
  361. package/src/api/middlewares/index.ts +38 -0
  362. package/src/api/middlewares/origin-check.ts +260 -0
  363. package/src/api/middlewares/validate-context.ts +175 -0
  364. package/src/api/routes/__tests__/consent.test.ts +270 -0
  365. package/src/api/routes/__tests__/status.test.ts +36 -0
  366. package/src/api/routes/error.ts +130 -0
  367. package/src/api/routes/generate-consent-receipt.ts +244 -0
  368. package/src/api/routes/get-consent-history.ts +128 -0
  369. package/src/api/routes/get-consent-policy.ts +327 -0
  370. package/src/api/routes/get-consent.ts +230 -0
  371. package/src/api/routes/index.ts +12 -0
  372. package/src/api/routes/ok.ts +45 -0
  373. package/src/api/routes/set-consent.ts +328 -0
  374. package/src/api/routes/show-consent-banner.ts +149 -0
  375. package/src/api/routes/status.ts +62 -0
  376. package/src/api/routes/verify-consent.ts +272 -0
  377. package/src/api/routes/withdraw-consent.ts +293 -0
  378. package/src/api/to-endpoints.ts +371 -0
  379. package/src/client/index.ts +471 -0
  380. package/src/client/types.ts +458 -0
  381. package/src/core.test.ts +303 -0
  382. package/src/core.ts +267 -0
  383. package/src/db/adapters/drizzle-adapter/drizzle-adapter.ts +711 -0
  384. package/src/db/adapters/drizzle-adapter/index.ts +1 -0
  385. package/src/db/adapters/kysely-adapter/dialect.ts +192 -0
  386. package/src/db/adapters/kysely-adapter/index.ts +3 -0
  387. package/src/db/adapters/kysely-adapter/kysely-adapter.ts +1168 -0
  388. package/src/db/adapters/kysely-adapter/types.ts +307 -0
  389. package/src/db/adapters/memory-adapter/index.ts +1 -0
  390. package/src/db/adapters/memory-adapter/memory-adapter.ts +648 -0
  391. package/src/db/adapters/prisma-adapter/index.ts +1 -0
  392. package/src/db/adapters/prisma-adapter/prisma-adapter.ts +586 -0
  393. package/src/db/adapters/types.ts +203 -0
  394. package/src/db/adapters/utils.ts +51 -0
  395. package/src/db/core/fields/field-factory.ts +804 -0
  396. package/src/db/core/fields/field-inference.ts +298 -0
  397. package/src/db/core/fields/field-options-integration.ts +135 -0
  398. package/src/db/core/fields/field-types.ts +233 -0
  399. package/src/db/core/fields/id-generator.ts +57 -0
  400. package/src/db/core/fields/index.ts +56 -0
  401. package/src/db/core/fields/superjson-utils.ts +155 -0
  402. package/src/db/core/fields/zod-fields.ts +269 -0
  403. package/src/db/core/get-schema.ts +102 -0
  404. package/src/db/core/types.ts +52 -0
  405. package/src/db/create-registry.ts +31 -0
  406. package/src/db/hooks/create-hooks.ts +88 -0
  407. package/src/db/hooks/index.ts +39 -0
  408. package/src/db/hooks/types.ts +164 -0
  409. package/src/db/hooks/update-hooks.ts +91 -0
  410. package/src/db/hooks/update-many-hooks.ts +176 -0
  411. package/src/db/hooks/utils.ts +151 -0
  412. package/src/db/hooks/with-hooks-factory.ts +68 -0
  413. package/src/db/index.ts +32 -0
  414. package/src/db/migration/get-migration.ts +89 -0
  415. package/src/db/migration/get-schema/get-schema.ts +44 -0
  416. package/src/db/migration/get-schema/index.ts +20 -0
  417. package/src/db/migration/get-schema/process-fields.ts +66 -0
  418. package/src/db/migration/get-schema/process-tables.ts +68 -0
  419. package/src/db/migration/get-schema/types.ts +18 -0
  420. package/src/db/migration/index.ts +18 -0
  421. package/src/db/migration/migration-builders.ts +170 -0
  422. package/src/db/migration/migration-execution.ts +79 -0
  423. package/src/db/migration/schema-comparison.ts +216 -0
  424. package/src/db/migration/type-mapping.ts +255 -0
  425. package/src/db/migration/types.ts +46 -0
  426. package/src/db/schema/audit-log/index.ts +3 -0
  427. package/src/db/schema/audit-log/registry.ts +228 -0
  428. package/src/db/schema/audit-log/schema.ts +46 -0
  429. package/src/db/schema/audit-log/table.ts +185 -0
  430. package/src/db/schema/audit-log/types.ts +29 -0
  431. package/src/db/schema/consent/index.ts +3 -0
  432. package/src/db/schema/consent/registry.ts +381 -0
  433. package/src/db/schema/consent/schema.ts +65 -0
  434. package/src/db/schema/consent/table.ts +220 -0
  435. package/src/db/schema/consent/types.ts +39 -0
  436. package/src/db/schema/consent-geo-location/index.ts +3 -0
  437. package/src/db/schema/consent-geo-location/registry.ts +124 -0
  438. package/src/db/schema/consent-geo-location/schema.ts +51 -0
  439. package/src/db/schema/consent-geo-location/table.ts +169 -0
  440. package/src/db/schema/consent-geo-location/types.ts +21 -0
  441. package/src/db/schema/consent-policy/index.ts +3 -0
  442. package/src/db/schema/consent-policy/registry.ts +313 -0
  443. package/src/db/schema/consent-policy/schema.ts +47 -0
  444. package/src/db/schema/consent-policy/table.ts +141 -0
  445. package/src/db/schema/consent-policy/types.ts +28 -0
  446. package/src/db/schema/consent-purpose/index.ts +3 -0
  447. package/src/db/schema/consent-purpose/registry.ts +188 -0
  448. package/src/db/schema/consent-purpose/schema.ts +58 -0
  449. package/src/db/schema/consent-purpose/table.ts +154 -0
  450. package/src/db/schema/consent-purpose/types.ts +16 -0
  451. package/src/db/schema/consent-purpose-junction/index.ts +3 -0
  452. package/src/db/schema/consent-purpose-junction/registry.ts +189 -0
  453. package/src/db/schema/consent-purpose-junction/schema.ts +49 -0
  454. package/src/db/schema/consent-purpose-junction/table.ts +142 -0
  455. package/src/db/schema/consent-purpose-junction/types.ts +14 -0
  456. package/src/db/schema/consent-record/index.ts +3 -0
  457. package/src/db/schema/consent-record/registry.ts +209 -0
  458. package/src/db/schema/consent-record/schema.ts +42 -0
  459. package/src/db/schema/consent-record/table.ts +124 -0
  460. package/src/db/schema/consent-record/types.ts +21 -0
  461. package/src/db/schema/consent-withdrawal/index.ts +3 -0
  462. package/src/db/schema/consent-withdrawal/registry.ts +219 -0
  463. package/src/db/schema/consent-withdrawal/schema.ts +48 -0
  464. package/src/db/schema/consent-withdrawal/table.ts +181 -0
  465. package/src/db/schema/consent-withdrawal/types.ts +29 -0
  466. package/src/db/schema/definition.ts +196 -0
  467. package/src/db/schema/domain/index.ts +3 -0
  468. package/src/db/schema/domain/registry.ts +272 -0
  469. package/src/db/schema/domain/schema.ts +43 -0
  470. package/src/db/schema/domain/table.ts +137 -0
  471. package/src/db/schema/domain/types.ts +27 -0
  472. package/src/db/schema/geo-location/index.ts +3 -0
  473. package/src/db/schema/geo-location/registry.ts +159 -0
  474. package/src/db/schema/geo-location/schema.ts +45 -0
  475. package/src/db/schema/geo-location/table.ts +148 -0
  476. package/src/db/schema/geo-location/types.ts +18 -0
  477. package/src/db/schema/index.ts +96 -0
  478. package/src/db/schema/parser.ts +417 -0
  479. package/src/db/schema/schemas.ts +35 -0
  480. package/src/db/schema/subject/index.ts +3 -0
  481. package/src/db/schema/subject/registry.ts +371 -0
  482. package/src/db/schema/subject/schema.ts +41 -0
  483. package/src/db/schema/subject/table.ts +139 -0
  484. package/src/db/schema/subject/types.ts +22 -0
  485. package/src/db/schema/types.ts +154 -0
  486. package/src/db/utils/adapter-factory.ts +64 -0
  487. package/src/db/utils/index.ts +10 -0
  488. package/src/db/utils.ts +42 -0
  489. package/src/docs/ADVANCED_JSON_HANDLING.md +99 -0
  490. package/src/docs/neverthrow.md +171 -0
  491. package/src/error/codes.ts +201 -0
  492. package/src/error/error.ts +145 -0
  493. package/src/error/index.ts +23 -0
  494. package/src/error/logging.ts +52 -0
  495. package/src/error/pipeline.ts +57 -0
  496. package/src/error/recovery.ts +45 -0
  497. package/src/error/results.ts +100 -0
  498. package/src/index.ts +79 -0
  499. package/src/init.test.ts +235 -0
  500. package/src/init.ts +261 -0
  501. package/src/integrations/index.ts +10 -0
  502. package/src/integrations/next.ts +136 -0
  503. package/src/integrations/react.ts +567 -0
  504. package/src/plugins/geo/index.ts +563 -0
  505. package/src/test/utils.ts +244 -0
  506. package/src/types/api.ts +101 -0
  507. package/src/types/context.ts +235 -0
  508. package/src/types/helper.ts +87 -0
  509. package/src/types/index.ts +5 -0
  510. package/src/types/options.ts +189 -0
  511. package/src/types/plugins.ts +538 -0
  512. package/src/utils/env.ts +103 -0
  513. package/src/utils/hide-metadata.ts +21 -0
  514. package/src/utils/index.ts +17 -0
  515. package/src/utils/ip.ts +45 -0
  516. package/src/utils/json.ts +19 -0
  517. package/src/utils/logger.ts +252 -0
  518. package/src/utils/url.ts +194 -0
  519. package/src/utils/wildcard.ts +253 -0
  520. package/tsconfig.json +12 -0
  521. package/vitest.config.ts +14 -0
@@ -0,0 +1,272 @@
1
+ import { z } from 'zod';
2
+ import type { EntityOutputFields } from '~/db/schema/definition';
3
+ import { BASE_ERROR_CODES, C15TError } from '~/error';
4
+ import type { C15TContext } from '../../types';
5
+ import { createAuthEndpoint } from '../call';
6
+
7
+ // Schema for the base verification criteria (at least domain is required)
8
+ const baseVerificationSchema = z.object({
9
+ domain: z.string(),
10
+ requiredPreferences: z.record(z.string().datetime().nullable()).optional(),
11
+ requireExactMatch: z.boolean().optional().default(false),
12
+ policyVersion: z.string().optional(),
13
+ });
14
+
15
+ // Define schemas for the different identification methods
16
+ // At least one identifier must be provided
17
+ const identifierSchema = z
18
+ .object({
19
+ subjectId: z.string().optional(),
20
+ externalId: z.string().optional(),
21
+ ipAddress: z.string().optional(),
22
+ })
23
+ .refine(
24
+ (data) =>
25
+ data.subjectId !== undefined ||
26
+ data.externalId !== undefined ||
27
+ data.ipAddress !== undefined,
28
+ {
29
+ message:
30
+ 'At least one identifier (subjectId, externalId, or ipAddress) must be provided',
31
+ }
32
+ );
33
+
34
+ // Combine the schemas
35
+ const verifyConsentSchema = baseVerificationSchema.and(identifierSchema);
36
+
37
+ export interface VerifyConsentResponse {
38
+ success: boolean;
39
+ data: {
40
+ verified: boolean;
41
+ consentDetails: {
42
+ id: string;
43
+ givenAt: string;
44
+ policyVersion: string;
45
+ preferences: Record<string, string | null>;
46
+ } | null;
47
+ identifiedBy: string | null;
48
+ verificationResults: {
49
+ hasActiveConsent: boolean;
50
+ meetsPreferenceRequirements: boolean;
51
+ matchesPolicyVersion: boolean;
52
+ };
53
+ };
54
+ }
55
+
56
+ /**
57
+ * Endpoint for verifying if a subject has given consent.
58
+ *
59
+ * This endpoint allows checking if a subject has provided consent for a specific domain
60
+ * and verifies if the consent meets specific criteria (required preferences, policy version).
61
+ * Subjects can be identified by subjectId, externalId, or ipAddress.
62
+ *
63
+ * @endpoint GET /consent/verify
64
+ */
65
+ export const verifyConsent = createAuthEndpoint(
66
+ '/consent/verify',
67
+ {
68
+ method: 'GET',
69
+ query: verifyConsentSchema,
70
+ },
71
+ async (ctx) => {
72
+ try {
73
+ const validatedData = verifyConsentSchema.safeParse(ctx.query);
74
+
75
+ if (!validatedData.success) {
76
+ throw new C15TError(
77
+ 'The request data is invalid. Please ensure all required fields are correctly filled and formatted.',
78
+ {
79
+ code: BASE_ERROR_CODES.BAD_REQUEST,
80
+ status: 400,
81
+ data: {
82
+ details: validatedData.error.errors,
83
+ },
84
+ }
85
+ );
86
+ }
87
+
88
+ const params = validatedData.data;
89
+ const { registry } = ctx.context as C15TContext;
90
+
91
+ if (!registry) {
92
+ throw new C15TError(
93
+ 'The registry service is currently unavailable. Please check the service status and try again later.',
94
+ {
95
+ code: BASE_ERROR_CODES.INITIALIZATION_FAILED,
96
+ status: 503,
97
+ }
98
+ );
99
+ }
100
+
101
+ // Find subject based on provided identifiers
102
+ let subjectRecord: EntityOutputFields<'subject'> | null = null;
103
+ let identifierUsed: string | null = null;
104
+
105
+ // Try to find subject by subjectId (most precise)
106
+ if (params.subjectId) {
107
+ subjectRecord = await registry.findSubjectById(params.subjectId);
108
+ if (subjectRecord) {
109
+ identifierUsed = 'subjectId';
110
+ }
111
+ }
112
+
113
+ // If not found and externalId provided, try that
114
+ if (!subjectRecord && params.externalId) {
115
+ subjectRecord = await registry.findSubjectByExternalId(
116
+ params.externalId
117
+ );
118
+ if (subjectRecord) {
119
+ identifierUsed = 'externalId';
120
+ }
121
+ }
122
+
123
+ // If no subject found, return negative verification
124
+ if (!subjectRecord) {
125
+ return {
126
+ success: true,
127
+ data: {
128
+ verified: false,
129
+ consentDetails: null,
130
+ identifiedBy: null,
131
+ verificationResults: {
132
+ hasActiveConsent: false,
133
+ meetsPreferenceRequirements: false,
134
+ matchesPolicyVersion: false,
135
+ },
136
+ },
137
+ };
138
+ }
139
+
140
+ // Find active consents for this subject
141
+ const subjectConsents = await registry.findConsents({
142
+ subjectId: subjectRecord.id,
143
+ });
144
+
145
+ // Filter for active consents that match the domain
146
+ const activeConsents = subjectConsents.filter(
147
+ (consent) =>
148
+ consent.status === 'active' && consent.domainId === params.domain
149
+ );
150
+
151
+ // Sort consents by givenAt date, most recent first
152
+ activeConsents.sort(
153
+ (a, b) => new Date(b.givenAt).getTime() - new Date(a.givenAt).getTime()
154
+ );
155
+
156
+ // Get the most recent active consent for this domain, if any
157
+ const record = activeConsents.length > 0 ? activeConsents[0] : null;
158
+
159
+ // If no consent found, return negative verification
160
+ if (!record) {
161
+ return {
162
+ success: true,
163
+ data: {
164
+ verified: false,
165
+ consentDetails: null,
166
+ identifiedBy: identifierUsed,
167
+ verificationResults: {
168
+ hasActiveConsent: false,
169
+ meetsPreferenceRequirements: false,
170
+ matchesPolicyVersion: false,
171
+ },
172
+ },
173
+ };
174
+ }
175
+
176
+ // Verify consent meets criteria if specified
177
+ let meetsPreferenceRequirements = true;
178
+ if (params.requiredPreferences) {
179
+ const preferences =
180
+ (record.metadata as Record<string, unknown>)?.preferences || {};
181
+
182
+ // Check if all required preferences are present and have the correct values
183
+ for (const [key, requiredValue] of Object.entries(
184
+ params.requiredPreferences
185
+ )) {
186
+ //@ts-expect-error
187
+ const hasPreference = key in preferences;
188
+ //@ts-expect-error
189
+ const preferenceEnabled = hasPreference && preferences[key] !== null;
190
+
191
+ if (params.requireExactMatch) {
192
+ // Exact match requires preference to exist and match value exactly
193
+ if (
194
+ !hasPreference ||
195
+ preferenceEnabled !== (requiredValue !== null)
196
+ ) {
197
+ meetsPreferenceRequirements = false;
198
+ break;
199
+ }
200
+ } else if (requiredValue !== null && !preferenceEnabled) {
201
+ // Non-exact match only checks if required trues are true
202
+ meetsPreferenceRequirements = false;
203
+ break;
204
+ }
205
+ }
206
+ }
207
+
208
+ // Verify policy version if specified
209
+ const matchesPolicyVersion = params.policyVersion
210
+ ? record.policyId === params.policyVersion
211
+ : true;
212
+
213
+ // Determine overall verification result
214
+ const verified =
215
+ record.status === 'active' &&
216
+ meetsPreferenceRequirements &&
217
+ matchesPolicyVersion;
218
+
219
+ // Return verification result
220
+ return {
221
+ success: true,
222
+ data: {
223
+ verified,
224
+ consentDetails: {
225
+ id: record.id,
226
+ givenAt: record.givenAt.toISOString(),
227
+ policyVersion: record.policyId || '',
228
+ preferences:
229
+ (record.metadata as Record<string, unknown>)?.preferences || {},
230
+ },
231
+ identifiedBy: identifierUsed,
232
+ verificationResults: {
233
+ hasActiveConsent: record.status === 'active',
234
+ meetsPreferenceRequirements,
235
+ matchesPolicyVersion,
236
+ },
237
+ },
238
+ };
239
+ } catch (error) {
240
+ const context = ctx.context as C15TContext;
241
+ context.logger?.error?.('Error verifying consent:', error);
242
+
243
+ if (error instanceof C15TError) {
244
+ throw error;
245
+ }
246
+ if (error instanceof z.ZodError) {
247
+ throw new C15TError(
248
+ 'The request data is invalid. Please ensure all required fields are correctly filled and formatted.',
249
+ {
250
+ code: BASE_ERROR_CODES.BAD_REQUEST,
251
+ status: 400,
252
+ data: {
253
+ details: error.errors,
254
+ },
255
+ }
256
+ );
257
+ }
258
+
259
+ throw new C15TError(
260
+ 'Failed to verify consent. Please try again later or contact support if the issue persists.',
261
+ {
262
+ code: BASE_ERROR_CODES.INTERNAL_SERVER_ERROR,
263
+ status: 503,
264
+ data: {
265
+ details:
266
+ error instanceof Error ? { message: error.message } : { error },
267
+ },
268
+ }
269
+ );
270
+ }
271
+ }
272
+ );
@@ -0,0 +1,293 @@
1
+ import { z } from 'zod';
2
+ import type { EntityOutputFields } from '~/db/schema/definition';
3
+ import { BASE_ERROR_CODES, C15TError } from '~/error';
4
+ import type { C15TContext } from '../../types';
5
+ import { createAuthEndpoint } from '../call';
6
+
7
+ // Define the schemas for validating request body
8
+ // We'll have three different schemas for the three identification methods
9
+ const withdrawByConsentIdSchema = z.object({
10
+ consentId: z.string(),
11
+ identifierType: z.literal('consentId'),
12
+ reason: z.string().optional(),
13
+ method: z.string().min(1).max(50),
14
+ actor: z.string().optional(),
15
+ metadata: z.record(z.any()).optional(),
16
+ });
17
+
18
+ const withdrawBySubjectIdSchema = z.object({
19
+ subjectId: z.string(),
20
+ domain: z.string(),
21
+ identifierType: z.literal('subjectId'),
22
+ reason: z.string().optional(),
23
+ method: z.string().min(1).max(50),
24
+ actor: z.string().optional(),
25
+ metadata: z.record(z.any()).optional(),
26
+ });
27
+
28
+ const withdrawByExternalIdSchema = z.object({
29
+ externalId: z.string(),
30
+ domain: z.string(),
31
+ identifierType: z.literal('externalId'),
32
+ reason: z.string().optional(),
33
+ method: z.string().min(1).max(50),
34
+ actor: z.string().optional(),
35
+ metadata: z.record(z.any()).optional(),
36
+ });
37
+
38
+ // Combined schema using discriminated union
39
+ const withdrawConsentSchema = z.discriminatedUnion('identifierType', [
40
+ withdrawByConsentIdSchema,
41
+ withdrawBySubjectIdSchema,
42
+ withdrawByExternalIdSchema,
43
+ ]);
44
+
45
+ export interface WithdrawConsentResponse {
46
+ success: boolean;
47
+ data: {
48
+ withdrawalIds: string[];
49
+ consentIds: string[];
50
+ revokedAt: string;
51
+ };
52
+ }
53
+
54
+ /**
55
+ * Endpoint for withdrawing previously given consent.
56
+ *
57
+ * This endpoint allows clients to revoke a subject's consent by specifying either:
58
+ * 1. The specific consent ID to withdraw
59
+ * 2. The subject ID and domain to withdraw all active consents for that subject on that domain
60
+ * 3. The external subject ID and domain to withdraw all active consents for that subject on that domain
61
+ *
62
+ * @endpoint POST /consent/withdraw
63
+ */
64
+ export const withdrawConsent = createAuthEndpoint(
65
+ '/consent/withdraw',
66
+ {
67
+ method: 'POST',
68
+ body: withdrawConsentSchema,
69
+ },
70
+ async (ctx) => {
71
+ try {
72
+ const validatedData = withdrawConsentSchema.safeParse(ctx.body);
73
+
74
+ if (!validatedData.success) {
75
+ throw new C15TError(
76
+ 'The request data is invalid. Please ensure all required fields are correctly filled and formatted.',
77
+ {
78
+ code: BASE_ERROR_CODES.BAD_REQUEST,
79
+ status: 400,
80
+ data: { details: validatedData.error.errors },
81
+ }
82
+ );
83
+ }
84
+
85
+ const params = validatedData.data;
86
+ const { registry } = ctx.context as C15TContext;
87
+
88
+ if (!registry) {
89
+ throw new C15TError(
90
+ 'The registry service is currently unavailable. Please check the service status and try again later.',
91
+ {
92
+ code: BASE_ERROR_CODES.INITIALIZATION_FAILED,
93
+ status: 503,
94
+ }
95
+ );
96
+ }
97
+
98
+ // Find the consent records to withdraw based on the identifier type
99
+ let recordsToWithdraw: EntityOutputFields<'consent'>[] = [];
100
+
101
+ if (params.identifierType === 'consentId') {
102
+ // Find by consent ID
103
+ const record = await registry.findConsentById(params.consentId);
104
+
105
+ if (!record) {
106
+ throw new C15TError(
107
+ 'The specified consent record could not be found. Please verify the consent ID and try again.',
108
+ {
109
+ code: BASE_ERROR_CODES.CONSENT_NOT_FOUND,
110
+ status: 404,
111
+ data: { consentId: params.consentId },
112
+ }
113
+ );
114
+ }
115
+
116
+ if (record.status !== 'active') {
117
+ throw new C15TError(
118
+ 'The consent has already been withdrawn. No further action is required.',
119
+ {
120
+ code: BASE_ERROR_CODES.CONFLICT,
121
+ status: 409,
122
+ data: {
123
+ consentId: params.consentId,
124
+ currentStatus: record.status,
125
+ },
126
+ }
127
+ );
128
+ }
129
+
130
+ recordsToWithdraw = [record];
131
+ } else if (
132
+ params.identifierType === 'subjectId' ||
133
+ params.identifierType === 'externalId'
134
+ ) {
135
+ // Find subject
136
+ let subjectRecord: EntityOutputFields<'subject'> | null = null;
137
+ if (params.identifierType === 'subjectId') {
138
+ subjectRecord = await registry.findSubjectById(params.subjectId);
139
+ } else {
140
+ subjectRecord = await registry.findSubjectByExternalId(
141
+ params.externalId
142
+ );
143
+ }
144
+
145
+ if (!subjectRecord) {
146
+ throw new C15TError(
147
+ 'The specified subject could not be found. Please verify the subject ID or external ID and try again.',
148
+ {
149
+ code: BASE_ERROR_CODES.NOT_FOUND,
150
+ status: 404,
151
+ data:
152
+ params.identifierType === 'subjectId'
153
+ ? { subjectId: params.subjectId }
154
+ : { externalId: params.externalId },
155
+ }
156
+ );
157
+ }
158
+
159
+ // Find all active consents for this subject and domain
160
+ const subjectConsents = await registry.findConsents({
161
+ subjectId: subjectRecord.id,
162
+ });
163
+
164
+ // Filter for active consents with matching domain
165
+ recordsToWithdraw = subjectConsents.filter(
166
+ (consent) =>
167
+ consent.status === 'active' && consent.domainId === params.domain
168
+ );
169
+
170
+ if (recordsToWithdraw.length === 0) {
171
+ throw new C15TError(
172
+ 'No active consent records were found for this subject and domain. Please ensure the subject and domain are correct.',
173
+ {
174
+ code: BASE_ERROR_CODES.CONSENT_NOT_FOUND,
175
+ status: 404,
176
+ data: {
177
+ domain: params.domain,
178
+ ...(params.identifierType === 'subjectId'
179
+ ? { subjectId: params.subjectId }
180
+ : { externalId: params.externalId }),
181
+ },
182
+ }
183
+ );
184
+ }
185
+ }
186
+
187
+ // Get device info from request
188
+ const requestHeaders = ctx.request?.headers as
189
+ | Record<string, string>
190
+ | undefined;
191
+ const deviceInfo = requestHeaders?.['user-agent'] || '';
192
+ // @ts-expect-error
193
+ const ipAddress = ctx.request?.ip || '';
194
+
195
+ // Process each consent record to withdraw
196
+ const withdrawalResults: Array<{
197
+ id: string;
198
+ consentId: string;
199
+ revokedAt: string;
200
+ }> = [];
201
+
202
+ const currentTime = new Date();
203
+
204
+ for (const record of recordsToWithdraw) {
205
+ // Use the revokeConsent method from the internal adapter
206
+ const withdrawalResult = await registry.revokeConsent({
207
+ consentId: record.id,
208
+ reason: params.reason || '',
209
+ actor: params.actor || 'system',
210
+ metadata: params.metadata || {},
211
+ });
212
+
213
+ // Add consent record for the consentWithdrawal
214
+ await registry.createConsentRecord({
215
+ subjectId: record.subjectId,
216
+ consentId: record.id,
217
+ actionType: 'withdraw_consent',
218
+ details: {
219
+ reason: params.reason,
220
+ method: params.method,
221
+ identifierType: params.identifierType,
222
+ withdrawnAt: currentTime.toISOString(),
223
+ },
224
+ createdAt: currentTime,
225
+ updatedAt: currentTime,
226
+ });
227
+
228
+ // Log the action in the audit log
229
+ await registry.createAuditLog({
230
+ subjectId: record.subjectId,
231
+ entityType: 'consent',
232
+ entityId: record.id,
233
+ actionType: 'withdraw_consent',
234
+ changes: {
235
+ policyVersion: record.policyId,
236
+ },
237
+ metadata: {
238
+ source: 'api',
239
+ ...params.metadata,
240
+ },
241
+ ipAddress,
242
+ userAgent: deviceInfo,
243
+ createdAt: currentTime,
244
+ });
245
+
246
+ withdrawalResults.push({
247
+ id: withdrawalResult?.id || `wdr_${record.id}`,
248
+ consentId: record.id,
249
+ revokedAt: currentTime.toISOString(),
250
+ });
251
+ }
252
+
253
+ // Return success response with consentWithdrawal details
254
+ return {
255
+ success: true,
256
+ data: {
257
+ withdrawalIds: withdrawalResults.map((wr) => wr.id),
258
+ consentIds: withdrawalResults.map((wr) => wr.consentId),
259
+ revokedAt:
260
+ withdrawalResults[0]?.revokedAt || currentTime.toISOString(),
261
+ },
262
+ };
263
+ } catch (error) {
264
+ const context = ctx.context as C15TContext;
265
+ context.logger?.error?.('Error withdrawing consent:', error);
266
+
267
+ if (error instanceof C15TError) {
268
+ throw error;
269
+ }
270
+ if (error instanceof z.ZodError) {
271
+ throw new C15TError(
272
+ 'The request data is invalid. Please ensure all required fields are correctly filled and formatted.',
273
+ {
274
+ code: BASE_ERROR_CODES.BAD_REQUEST,
275
+ status: 400,
276
+ data: { details: error.errors },
277
+ }
278
+ );
279
+ }
280
+
281
+ throw new C15TError(
282
+ 'Failed to withdraw consent. Please try again later or contact support if the issue persists.',
283
+ {
284
+ code: BASE_ERROR_CODES.INTERNAL_SERVER_ERROR,
285
+ status: 503,
286
+ data: {
287
+ error: error instanceof Error ? error.message : String(error),
288
+ },
289
+ }
290
+ );
291
+ }
292
+ }
293
+ );