@c15t/backend 1.5.0 → 1.6.0

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 (489) hide show
  1. package/.turbo/turbo-build.log +63 -37
  2. package/CHANGELOG.md +4 -209
  3. package/README.md +86 -164
  4. package/dist/contracts/consent/index.d.ts +103 -615
  5. package/dist/contracts/consent/index.d.ts.map +1 -1
  6. package/dist/contracts/consent/post.contract.d.ts +42 -140
  7. package/dist/contracts/consent/post.contract.d.ts.map +1 -1
  8. package/dist/contracts/consent/show-banner.contract.d.ts +28 -376
  9. package/dist/contracts/consent/show-banner.contract.d.ts.map +1 -1
  10. package/dist/contracts/consent/verify.contract.d.ts +33 -99
  11. package/dist/contracts/consent/verify.contract.d.ts.map +1 -1
  12. package/dist/contracts/index.d.ts +222 -1356
  13. package/dist/contracts/index.d.ts.map +1 -1
  14. package/dist/contracts/meta/index.d.ts +8 -63
  15. package/dist/contracts/meta/index.d.ts.map +1 -1
  16. package/dist/contracts/meta/status.contract.d.ts +8 -63
  17. package/dist/contracts/meta/status.contract.d.ts.map +1 -1
  18. package/dist/contracts/shared/jurisdiction.schema.d.ts +21 -9
  19. package/dist/contracts/shared/jurisdiction.schema.d.ts.map +1 -1
  20. package/dist/contracts.cjs +100 -106
  21. package/dist/contracts.js +100 -106
  22. package/dist/core.cjs +681 -681
  23. package/dist/core.d.ts +118 -678
  24. package/dist/core.d.ts.map +1 -1
  25. package/dist/core.js +634 -637
  26. package/dist/handlers/consent/index.d.ts +103 -615
  27. package/dist/handlers/consent/index.d.ts.map +1 -1
  28. package/dist/handlers/consent/post.handler.d.ts +42 -140
  29. package/dist/handlers/consent/post.handler.d.ts.map +1 -1
  30. package/dist/handlers/consent/show-banner/handler.d.ts +28 -376
  31. package/dist/handlers/consent/show-banner/handler.d.ts.map +1 -1
  32. package/dist/handlers/consent/show-banner/translations.d.ts.map +1 -1
  33. package/dist/handlers/consent/verify.handler.d.ts +33 -99
  34. package/dist/handlers/consent/verify.handler.d.ts.map +1 -1
  35. package/dist/handlers/meta/index.d.ts +8 -63
  36. package/dist/handlers/meta/index.d.ts.map +1 -1
  37. package/dist/handlers/meta/status.handler.d.ts +8 -63
  38. package/dist/handlers/meta/status.handler.d.ts.map +1 -1
  39. package/dist/init.d.ts.map +1 -1
  40. package/dist/middleware/openapi/index.d.ts +2 -2
  41. package/dist/middleware/openapi/index.d.ts.map +1 -1
  42. package/dist/pkgs/data-model/fields/index.cjs +14 -26
  43. package/dist/pkgs/data-model/fields/index.d.ts +4 -4
  44. package/dist/pkgs/data-model/fields/index.d.ts.map +1 -1
  45. package/dist/pkgs/data-model/fields/index.js +14 -26
  46. package/dist/pkgs/data-model/fields/zod-fields.d.ts +195 -871
  47. package/dist/pkgs/data-model/fields/zod-fields.d.ts.map +1 -1
  48. package/dist/pkgs/data-model/hooks/index.d.ts +2 -2
  49. package/dist/pkgs/data-model/hooks/index.d.ts.map +1 -1
  50. package/dist/pkgs/data-model/index.cjs +346 -358
  51. package/dist/pkgs/data-model/index.d.ts +1 -1
  52. package/dist/pkgs/data-model/index.d.ts.map +1 -1
  53. package/dist/pkgs/data-model/index.js +345 -357
  54. package/dist/pkgs/data-model/schema/index.cjs +346 -358
  55. package/dist/pkgs/data-model/schema/index.d.ts +1 -1
  56. package/dist/pkgs/data-model/schema/index.d.ts.map +1 -1
  57. package/dist/pkgs/data-model/schema/index.js +345 -357
  58. package/dist/pkgs/data-model/schema/schemas.d.ts +2 -2
  59. package/dist/pkgs/data-model/schema/schemas.d.ts.map +1 -1
  60. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.d.ts +3 -0
  61. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.d.ts.map +1 -1
  62. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.cjs +158 -170
  63. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.js +157 -169
  64. package/dist/pkgs/db-adapters/adapters/index.d.ts +2 -2
  65. package/dist/pkgs/db-adapters/adapters/index.d.ts.map +1 -1
  66. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.cjs +215 -227
  67. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.d.ts +2 -2
  68. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.d.ts.map +1 -1
  69. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.js +213 -225
  70. package/dist/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.d.ts +2 -0
  71. package/dist/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.d.ts.map +1 -1
  72. package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts +1 -1
  73. package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts.map +1 -1
  74. package/dist/pkgs/db-adapters/adapters/memory-adapter/index.cjs +158 -170
  75. package/dist/pkgs/db-adapters/adapters/memory-adapter/index.js +157 -169
  76. package/dist/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.d.ts +3 -0
  77. package/dist/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.d.ts.map +1 -1
  78. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.cjs +243 -255
  79. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.d.ts +1 -1
  80. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.d.ts.map +1 -1
  81. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.js +241 -253
  82. package/dist/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.d.ts +3 -0
  83. package/dist/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.d.ts.map +1 -1
  84. package/dist/pkgs/db-adapters/index.cjs +714 -726
  85. package/dist/pkgs/db-adapters/index.d.ts +6 -6
  86. package/dist/pkgs/db-adapters/index.d.ts.map +1 -1
  87. package/dist/pkgs/db-adapters/index.js +708 -720
  88. package/dist/pkgs/migrations/get-migration.d.ts.map +1 -1
  89. package/dist/pkgs/migrations/get-schema/get-schema.d.ts.map +1 -1
  90. package/dist/pkgs/migrations/get-schema/process-tables.d.ts.map +1 -1
  91. package/dist/pkgs/migrations/index.cjs +236 -248
  92. package/dist/pkgs/migrations/index.d.ts +4 -4
  93. package/dist/pkgs/migrations/index.d.ts.map +1 -1
  94. package/dist/pkgs/migrations/index.js +235 -247
  95. package/dist/pkgs/results/index.cjs +67 -67
  96. package/dist/pkgs/results/index.d.ts +5 -5
  97. package/dist/pkgs/results/index.d.ts.map +1 -1
  98. package/dist/pkgs/results/index.js +67 -67
  99. package/dist/pkgs/results/orpc-error-handler.d.ts +1 -1
  100. package/dist/pkgs/results/orpc-error-handler.d.ts.map +1 -1
  101. package/dist/pkgs/types/index.d.ts +1 -2
  102. package/dist/pkgs/types/index.d.ts.map +1 -1
  103. package/dist/pkgs/types/options.d.ts +9 -2
  104. package/dist/pkgs/types/options.d.ts.map +1 -1
  105. package/dist/pkgs/utils/index.d.ts +1 -1
  106. package/dist/pkgs/utils/index.d.ts.map +1 -1
  107. package/dist/pkgs/utils/logger.d.ts +1 -1
  108. package/dist/pkgs/utils/logger.d.ts.map +1 -1
  109. package/dist/router.cjs +114 -117
  110. package/dist/router.d.ts +111 -678
  111. package/dist/router.d.ts.map +1 -1
  112. package/dist/router.js +114 -117
  113. package/dist/schema/audit-log/schema.d.ts +2 -24
  114. package/dist/schema/audit-log/schema.d.ts.map +1 -1
  115. package/dist/schema/audit-log/table.d.ts +2 -24
  116. package/dist/schema/audit-log/table.d.ts.map +1 -1
  117. package/dist/schema/consent/registry.d.ts +8 -8
  118. package/dist/schema/consent/schema.d.ts +9 -33
  119. package/dist/schema/consent/schema.d.ts.map +1 -1
  120. package/dist/schema/consent/table.d.ts +9 -33
  121. package/dist/schema/consent/table.d.ts.map +1 -1
  122. package/dist/schema/consent-policy/registry.d.ts +20 -20
  123. package/dist/schema/consent-policy/schema.d.ts +22 -30
  124. package/dist/schema/consent-policy/schema.d.ts.map +1 -1
  125. package/dist/schema/consent-policy/table.d.ts +13 -29
  126. package/dist/schema/consent-policy/table.d.ts.map +1 -1
  127. package/dist/schema/consent-purpose/registry.d.ts +6 -6
  128. package/dist/schema/consent-purpose/schema.d.ts +5 -27
  129. package/dist/schema/consent-purpose/schema.d.ts.map +1 -1
  130. package/dist/schema/consent-purpose/table.d.ts +5 -27
  131. package/dist/schema/consent-purpose/table.d.ts.map +1 -1
  132. package/dist/schema/consent-record/schema.d.ts +3 -19
  133. package/dist/schema/consent-record/schema.d.ts.map +1 -1
  134. package/dist/schema/consent-record/table.d.ts +3 -19
  135. package/dist/schema/consent-record/table.d.ts.map +1 -1
  136. package/dist/schema/create-registry.d.ts +58 -58
  137. package/dist/schema/definition.d.ts +42 -176
  138. package/dist/schema/definition.d.ts.map +1 -1
  139. package/dist/schema/domain/registry.d.ts +20 -20
  140. package/dist/schema/domain/schema.d.ts +6 -24
  141. package/dist/schema/domain/schema.d.ts.map +1 -1
  142. package/dist/schema/domain/table.d.ts +6 -24
  143. package/dist/schema/domain/table.d.ts.map +1 -1
  144. package/dist/schema/index.cjs +426 -438
  145. package/dist/schema/index.d.ts +12 -12
  146. package/dist/schema/index.d.ts.map +1 -1
  147. package/dist/schema/index.js +426 -438
  148. package/dist/schema/schemas.d.ts +42 -176
  149. package/dist/schema/schemas.d.ts.map +1 -1
  150. package/dist/schema/subject/registry.d.ts +4 -4
  151. package/dist/schema/subject/schema.d.ts +4 -20
  152. package/dist/schema/subject/schema.d.ts.map +1 -1
  153. package/dist/schema/subject/table.d.ts +4 -20
  154. package/dist/schema/subject/table.d.ts.map +1 -1
  155. package/dist/schema/types.d.ts +1 -1
  156. package/dist/schema/types.d.ts.map +1 -1
  157. package/dist/testing/contract-testing.d.ts +3 -2
  158. package/dist/testing/contract-testing.d.ts.map +1 -1
  159. package/dist/types/index.d.ts +5 -4
  160. package/dist/types/index.d.ts.map +1 -1
  161. package/dist/types/options.d.ts +2 -2
  162. package/dist/types/options.d.ts.map +1 -1
  163. package/dist/v2/contracts/consent/index.d.ts +260 -0
  164. package/dist/v2/contracts/consent/index.d.ts.map +1 -0
  165. package/dist/v2/contracts/consent/index.test.d.ts +2 -0
  166. package/dist/v2/contracts/consent/index.test.d.ts.map +1 -0
  167. package/dist/v2/contracts/consent/post.contract.d.ts +114 -0
  168. package/dist/v2/contracts/consent/post.contract.d.ts.map +1 -0
  169. package/dist/v2/contracts/consent/post.contract.test.d.ts +2 -0
  170. package/dist/v2/contracts/consent/post.contract.test.d.ts.map +1 -0
  171. package/dist/v2/contracts/consent/show-banner.contract.d.ts +68 -0
  172. package/dist/v2/contracts/consent/show-banner.contract.d.ts.map +1 -0
  173. package/dist/v2/contracts/consent/show-banner.contract.test.d.ts +2 -0
  174. package/dist/v2/contracts/consent/show-banner.contract.test.d.ts.map +1 -0
  175. package/dist/v2/contracts/consent/verify.contract.d.ts +81 -0
  176. package/dist/v2/contracts/consent/verify.contract.d.ts.map +1 -0
  177. package/dist/v2/contracts/consent/verify.contract.test.d.ts +2 -0
  178. package/dist/v2/contracts/consent/verify.contract.test.d.ts.map +1 -0
  179. package/dist/v2/contracts/index.cjs +644 -0
  180. package/dist/v2/contracts/index.d.ts +563 -0
  181. package/dist/v2/contracts/index.d.ts.map +1 -0
  182. package/dist/v2/contracts/index.js +607 -0
  183. package/dist/v2/contracts/meta/index.d.ts +19 -0
  184. package/dist/v2/contracts/meta/index.d.ts.map +1 -0
  185. package/dist/v2/contracts/meta/index.test.d.ts +2 -0
  186. package/dist/v2/contracts/meta/index.test.d.ts.map +1 -0
  187. package/dist/v2/contracts/meta/status.contract.d.ts +18 -0
  188. package/dist/v2/contracts/meta/status.contract.d.ts.map +1 -0
  189. package/dist/v2/contracts/meta/status.contract.test.d.ts +2 -0
  190. package/dist/v2/contracts/meta/status.contract.test.d.ts.map +1 -0
  191. package/dist/v2/contracts/shared/jurisdiction.schema.d.ts +36 -0
  192. package/dist/v2/contracts/shared/jurisdiction.schema.d.ts.map +1 -0
  193. package/dist/v2/contracts/test.utils.d.ts +38 -0
  194. package/dist/v2/contracts/test.utils.d.ts.map +1 -0
  195. package/dist/v2/core.cjs +2181 -0
  196. package/dist/v2/core.d.ts +364 -0
  197. package/dist/v2/core.d.ts.map +1 -0
  198. package/dist/v2/core.js +2130 -0
  199. package/dist/v2/db/adapters/drizzle.cjs +36 -0
  200. package/dist/v2/db/adapters/drizzle.d.ts +2 -0
  201. package/dist/v2/db/adapters/drizzle.d.ts.map +1 -0
  202. package/dist/v2/db/adapters/drizzle.js +3 -0
  203. package/dist/v2/db/adapters/index.cjs +18 -0
  204. package/dist/v2/db/adapters/index.d.ts +2 -0
  205. package/dist/v2/db/adapters/index.d.ts.map +1 -0
  206. package/dist/v2/db/adapters/index.js +0 -0
  207. package/dist/v2/db/adapters/kysely.cjs +36 -0
  208. package/dist/v2/db/adapters/kysely.d.ts +2 -0
  209. package/dist/v2/db/adapters/kysely.d.ts.map +1 -0
  210. package/dist/v2/db/adapters/kysely.js +3 -0
  211. package/dist/v2/db/adapters/mongo.cjs +36 -0
  212. package/dist/v2/db/adapters/mongo.d.ts +2 -0
  213. package/dist/v2/db/adapters/mongo.d.ts.map +1 -0
  214. package/dist/v2/db/adapters/mongo.js +3 -0
  215. package/dist/v2/db/adapters/prisma.cjs +36 -0
  216. package/dist/v2/db/adapters/prisma.d.ts +2 -0
  217. package/dist/v2/db/adapters/prisma.d.ts.map +1 -0
  218. package/dist/v2/db/adapters/prisma.js +3 -0
  219. package/dist/v2/db/adapters/typeorm.cjs +36 -0
  220. package/dist/v2/db/adapters/typeorm.d.ts +2 -0
  221. package/dist/v2/db/adapters/typeorm.d.ts.map +1 -0
  222. package/dist/v2/db/adapters/typeorm.js +3 -0
  223. package/dist/v2/db/migrator/index.cjs +61 -0
  224. package/dist/v2/db/migrator/index.d.ts +29 -0
  225. package/dist/v2/db/migrator/index.d.ts.map +1 -0
  226. package/dist/v2/db/migrator/index.js +27 -0
  227. package/dist/v2/db/registry/audit-log.d.ts +21 -0
  228. package/dist/v2/db/registry/audit-log.d.ts.map +1 -0
  229. package/dist/v2/db/registry/audit-log.test.d.ts +2 -0
  230. package/dist/v2/db/registry/audit-log.test.d.ts.map +1 -0
  231. package/dist/v2/db/registry/consent-policy.d.ts +29 -0
  232. package/dist/v2/db/registry/consent-policy.d.ts.map +1 -0
  233. package/dist/v2/db/registry/consent-policy.test.d.ts +2 -0
  234. package/dist/v2/db/registry/consent-policy.test.d.ts.map +1 -0
  235. package/dist/v2/db/registry/consent-purpose.d.ts +16 -0
  236. package/dist/v2/db/registry/consent-purpose.d.ts.map +1 -0
  237. package/dist/v2/db/registry/consent-purpose.test.d.ts +2 -0
  238. package/dist/v2/db/registry/consent-purpose.test.d.ts.map +1 -0
  239. package/dist/v2/db/registry/consent.d.ts +20 -0
  240. package/dist/v2/db/registry/consent.d.ts.map +1 -0
  241. package/dist/v2/db/registry/consent.test.d.ts +2 -0
  242. package/dist/v2/db/registry/consent.test.d.ts.map +1 -0
  243. package/dist/v2/db/registry/domain.d.ts +24 -0
  244. package/dist/v2/db/registry/domain.d.ts.map +1 -0
  245. package/dist/v2/db/registry/domain.test.d.ts +2 -0
  246. package/dist/v2/db/registry/domain.test.d.ts.map +1 -0
  247. package/dist/v2/db/registry/index.d.ts +102 -0
  248. package/dist/v2/db/registry/index.d.ts.map +1 -0
  249. package/dist/v2/db/registry/subject.d.ts +18 -0
  250. package/dist/v2/db/registry/subject.d.ts.map +1 -0
  251. package/dist/v2/db/registry/subject.test.d.ts +2 -0
  252. package/dist/v2/db/registry/subject.test.d.ts.map +1 -0
  253. package/dist/v2/db/registry/types.d.ts +10 -0
  254. package/dist/v2/db/registry/types.d.ts.map +1 -0
  255. package/dist/v2/db/registry/utils/generate-id.d.ts +25 -0
  256. package/dist/v2/db/registry/utils/generate-id.d.ts.map +1 -0
  257. package/dist/v2/db/registry/utils/generate-id.test.d.ts +2 -0
  258. package/dist/v2/db/registry/utils/generate-id.test.d.ts.map +1 -0
  259. package/dist/v2/db/registry/utils.d.ts +25 -0
  260. package/dist/v2/db/registry/utils.d.ts.map +1 -0
  261. package/dist/v2/db/schema/1.0.0/audit-log.d.ts +29 -0
  262. package/dist/v2/db/schema/1.0.0/audit-log.d.ts.map +1 -0
  263. package/dist/v2/db/schema/1.0.0/consent-policy.d.ts +45 -0
  264. package/dist/v2/db/schema/1.0.0/consent-policy.d.ts.map +1 -0
  265. package/dist/v2/db/schema/1.0.0/consent-purpose.d.ts +27 -0
  266. package/dist/v2/db/schema/1.0.0/consent-purpose.d.ts.map +1 -0
  267. package/dist/v2/db/schema/1.0.0/consent-record.d.ts +19 -0
  268. package/dist/v2/db/schema/1.0.0/consent-record.d.ts.map +1 -0
  269. package/dist/v2/db/schema/1.0.0/consent.d.ts +42 -0
  270. package/dist/v2/db/schema/1.0.0/consent.d.ts.map +1 -0
  271. package/dist/v2/db/schema/1.0.0/domain.d.ts +23 -0
  272. package/dist/v2/db/schema/1.0.0/domain.d.ts.map +1 -0
  273. package/dist/v2/db/schema/1.0.0/index.d.ts +1513 -0
  274. package/dist/v2/db/schema/1.0.0/index.d.ts.map +1 -0
  275. package/dist/v2/db/schema/1.0.0/subject.d.ts +23 -0
  276. package/dist/v2/db/schema/1.0.0/subject.d.ts.map +1 -0
  277. package/dist/v2/db/schema/index.cjs +326 -0
  278. package/dist/v2/db/schema/index.d.ts +1507 -0
  279. package/dist/v2/db/schema/index.d.ts.map +1 -0
  280. package/dist/v2/db/schema/index.js +241 -0
  281. package/dist/v2/define-config.cjs +36 -0
  282. package/dist/v2/define-config.d.ts +5 -0
  283. package/dist/v2/define-config.d.ts.map +1 -0
  284. package/dist/v2/define-config.js +2 -0
  285. package/dist/v2/handlers/consent/index.d.ts +260 -0
  286. package/dist/v2/handlers/consent/index.d.ts.map +1 -0
  287. package/dist/v2/handlers/consent/post.handler.d.ts +136 -0
  288. package/dist/v2/handlers/consent/post.handler.d.ts.map +1 -0
  289. package/dist/v2/handlers/consent/show-banner/geo.d.ts +10 -0
  290. package/dist/v2/handlers/consent/show-banner/geo.d.ts.map +1 -0
  291. package/dist/v2/handlers/consent/show-banner/geo.test.d.ts +2 -0
  292. package/dist/v2/handlers/consent/show-banner/geo.test.d.ts.map +1 -0
  293. package/dist/v2/handlers/consent/show-banner/handler.d.ts +71 -0
  294. package/dist/v2/handlers/consent/show-banner/handler.d.ts.map +1 -0
  295. package/dist/v2/handlers/consent/show-banner/handler.test.d.ts +2 -0
  296. package/dist/v2/handlers/consent/show-banner/handler.test.d.ts.map +1 -0
  297. package/dist/v2/handlers/consent/show-banner/translations.d.ts +13 -0
  298. package/dist/v2/handlers/consent/show-banner/translations.d.ts.map +1 -0
  299. package/dist/v2/handlers/consent/show-banner/translations.test.d.ts +2 -0
  300. package/dist/v2/handlers/consent/show-banner/translations.test.d.ts.map +1 -0
  301. package/dist/v2/handlers/consent/verify.handler.d.ts +103 -0
  302. package/dist/v2/handlers/consent/verify.handler.d.ts.map +1 -0
  303. package/dist/v2/handlers/meta/index.d.ts +19 -0
  304. package/dist/v2/handlers/meta/index.d.ts.map +1 -0
  305. package/dist/v2/handlers/meta/status.handler.d.ts +17 -0
  306. package/dist/v2/handlers/meta/status.handler.d.ts.map +1 -0
  307. package/dist/v2/init.d.ts +3 -0
  308. package/dist/v2/init.d.ts.map +1 -0
  309. package/dist/v2/init.test.d.ts +2 -0
  310. package/dist/v2/init.test.d.ts.map +1 -0
  311. package/dist/v2/middleware/cors/cors.d.ts +37 -0
  312. package/dist/v2/middleware/cors/cors.d.ts.map +1 -0
  313. package/dist/v2/middleware/cors/cors.test.d.ts +2 -0
  314. package/dist/v2/middleware/cors/cors.test.d.ts.map +1 -0
  315. package/dist/v2/middleware/cors/index.d.ts +30 -0
  316. package/dist/v2/middleware/cors/index.d.ts.map +1 -0
  317. package/dist/v2/middleware/cors/is-origin-trusted.d.ts +49 -0
  318. package/dist/v2/middleware/cors/is-origin-trusted.d.ts.map +1 -0
  319. package/dist/v2/middleware/cors/is-origin-trusted.test.d.ts +2 -0
  320. package/dist/v2/middleware/cors/is-origin-trusted.test.d.ts.map +1 -0
  321. package/dist/v2/middleware/cors/process-cors.d.ts +31 -0
  322. package/dist/v2/middleware/cors/process-cors.d.ts.map +1 -0
  323. package/dist/v2/middleware/openapi/config.d.ts +28 -0
  324. package/dist/v2/middleware/openapi/config.d.ts.map +1 -0
  325. package/dist/v2/middleware/openapi/handlers.d.ts +29 -0
  326. package/dist/v2/middleware/openapi/handlers.d.ts.map +1 -0
  327. package/dist/v2/middleware/openapi/index.d.ts +11 -0
  328. package/dist/v2/middleware/openapi/index.d.ts.map +1 -0
  329. package/dist/v2/middleware/process-ip/index.d.ts +3 -0
  330. package/dist/v2/middleware/process-ip/index.d.ts.map +1 -0
  331. package/dist/v2/router.cjs +1275 -0
  332. package/dist/v2/router.d.ts +280 -0
  333. package/dist/v2/router.d.ts.map +1 -0
  334. package/dist/v2/router.js +1231 -0
  335. package/dist/v2/types/api.d.ts +27 -0
  336. package/dist/v2/types/api.d.ts.map +1 -0
  337. package/dist/v2/types/index.cjs +40 -0
  338. package/dist/v2/types/index.d.ts +104 -0
  339. package/dist/v2/types/index.d.ts.map +1 -0
  340. package/dist/v2/types/index.js +6 -0
  341. package/dist/v2/utils/create-telemetry-options.d.ts +28 -0
  342. package/dist/v2/utils/create-telemetry-options.d.ts.map +1 -0
  343. package/dist/v2/utils/env.d.ts +60 -0
  344. package/dist/v2/utils/env.d.ts.map +1 -0
  345. package/dist/v2/utils/index.d.ts +3 -0
  346. package/dist/v2/utils/index.d.ts.map +1 -0
  347. package/dist/v2/utils/logger.d.ts +16 -0
  348. package/dist/v2/utils/logger.d.ts.map +1 -0
  349. package/dist/version.d.ts +1 -1
  350. package/package.json +106 -15
  351. package/readme.json +30 -0
  352. package/rslib.config.ts +13 -14
  353. package/src/__tests__/server.test.ts +1 -1
  354. package/src/contracts/consent/post.contract.test.ts +3 -8
  355. package/src/contracts/consent/post.contract.ts +13 -13
  356. package/src/contracts/consent/show-banner.contract.test.ts +9 -0
  357. package/src/contracts/consent/show-banner.contract.ts +2 -0
  358. package/src/contracts/consent/verify.contract.ts +19 -23
  359. package/src/core.ts +7 -0
  360. package/src/handlers/consent/show-banner/handler.ts +12 -9
  361. package/src/handlers/consent/show-banner/translations.ts +2 -2
  362. package/src/init.ts +9 -6
  363. package/src/middleware/openapi/index.ts +2 -2
  364. package/src/pkgs/api-router/hooks/__tests__/processor.test.ts +1 -1
  365. package/src/pkgs/data-model/fields/index.ts +17 -22
  366. package/src/pkgs/data-model/fields/zod-fields.ts +14 -26
  367. package/src/pkgs/data-model/hooks/index.ts +3 -2
  368. package/src/pkgs/data-model/index.ts +2 -4
  369. package/src/pkgs/data-model/schema/index.ts +6 -7
  370. package/src/pkgs/data-model/schema/schemas.ts +3 -3
  371. package/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts +4 -1
  372. package/src/pkgs/db-adapters/adapters/index.ts +2 -2
  373. package/src/pkgs/db-adapters/adapters/kysely-adapter/index.ts +4 -4
  374. package/src/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.ts +4 -5
  375. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/postgres.test.ts +2 -4
  376. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/sqlite.test.ts +2 -3
  377. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts +1 -6
  378. package/src/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.ts +4 -1
  379. package/src/pkgs/db-adapters/adapters/prisma-adapter/index.ts +1 -1
  380. package/src/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.ts +5 -2
  381. package/src/pkgs/db-adapters/index.ts +12 -13
  382. package/src/pkgs/migrations/get-migration.ts +4 -2
  383. package/src/pkgs/migrations/get-schema/get-schema.ts +0 -1
  384. package/src/pkgs/migrations/get-schema/process-fields.ts +1 -1
  385. package/src/pkgs/migrations/get-schema/process-tables.ts +0 -2
  386. package/src/pkgs/migrations/index.ts +7 -8
  387. package/src/pkgs/results/__tests__/error-codes.test.ts +2 -2
  388. package/src/pkgs/results/index.ts +22 -27
  389. package/src/pkgs/results/orpc-error-handler.ts +1 -1
  390. package/src/pkgs/results/results/result-helpers.ts +1 -1
  391. package/src/pkgs/types/index.ts +4 -4
  392. package/src/pkgs/types/options.ts +10 -3
  393. package/src/pkgs/utils/index.ts +1 -1
  394. package/src/pkgs/utils/logger.ts +1 -1
  395. package/src/schema/audit-log/schema.ts +3 -3
  396. package/src/schema/consent/schema.ts +4 -4
  397. package/src/schema/consent-policy/schema.ts +3 -3
  398. package/src/schema/consent-purpose/schema.ts +4 -4
  399. package/src/schema/consent-record/schema.ts +3 -3
  400. package/src/schema/definition.ts +1 -1
  401. package/src/schema/domain/schema.ts +5 -5
  402. package/src/schema/index.ts +14 -17
  403. package/src/schema/subject/schema.ts +3 -3
  404. package/src/schema/types.ts +1 -1
  405. package/src/testing/contract-testing.ts +15 -52
  406. package/src/types/index.ts +8 -8
  407. package/src/types/options.ts +2 -3
  408. package/src/v2/contracts/consent/index.test.ts +5 -0
  409. package/src/v2/contracts/consent/index.ts +9 -0
  410. package/src/v2/contracts/consent/post.contract.test.ts +521 -0
  411. package/src/v2/contracts/consent/post.contract.ts +155 -0
  412. package/src/v2/contracts/consent/show-banner.contract.test.ts +252 -0
  413. package/src/v2/contracts/consent/show-banner.contract.ts +73 -0
  414. package/src/v2/contracts/consent/verify.contract.test.ts +185 -0
  415. package/src/v2/contracts/consent/verify.contract.ts +122 -0
  416. package/src/v2/contracts/index.ts +20 -0
  417. package/src/v2/contracts/meta/index.test.ts +5 -0
  418. package/src/v2/contracts/meta/index.ts +5 -0
  419. package/src/v2/contracts/meta/status.contract.test.ts +226 -0
  420. package/src/v2/contracts/meta/status.contract.ts +34 -0
  421. package/src/v2/contracts/shared/jurisdiction.schema.ts +30 -0
  422. package/src/v2/contracts/test.utils.ts +400 -0
  423. package/src/v2/core.ts +379 -0
  424. package/src/v2/db/adapters/drizzle.ts +1 -0
  425. package/src/v2/db/adapters/index.ts +1 -0
  426. package/src/v2/db/adapters/kysely.ts +1 -0
  427. package/src/v2/db/adapters/mongo.ts +1 -0
  428. package/src/v2/db/adapters/prisma.ts +1 -0
  429. package/src/v2/db/adapters/typeorm.ts +1 -0
  430. package/src/v2/db/migrator/index.ts +80 -0
  431. package/src/v2/db/registry/audit-log.test.ts +77 -0
  432. package/src/v2/db/registry/audit-log.ts +46 -0
  433. package/src/v2/db/registry/consent-policy.test.ts +778 -0
  434. package/src/v2/db/registry/consent-policy.ts +74 -0
  435. package/src/v2/db/registry/consent-purpose.test.ts +485 -0
  436. package/src/v2/db/registry/consent-purpose.ts +41 -0
  437. package/src/v2/db/registry/consent.test.ts +843 -0
  438. package/src/v2/db/registry/consent.ts +42 -0
  439. package/src/v2/db/registry/domain.test.ts +463 -0
  440. package/src/v2/db/registry/domain.ts +51 -0
  441. package/src/v2/db/registry/index.ts +18 -0
  442. package/src/v2/db/registry/subject.test.ts +497 -0
  443. package/src/v2/db/registry/subject.ts +101 -0
  444. package/src/v2/db/registry/types.ts +10 -0
  445. package/src/v2/db/registry/utils/generate-id.test.ts +217 -0
  446. package/src/v2/db/registry/utils/generate-id.ts +134 -0
  447. package/src/v2/db/registry/utils.ts +134 -0
  448. package/src/v2/db/schema/1.0.0/audit-log.ts +32 -0
  449. package/src/v2/db/schema/1.0.0/consent-policy.ts +41 -0
  450. package/src/v2/db/schema/1.0.0/consent-purpose.ts +30 -0
  451. package/src/v2/db/schema/1.0.0/consent-record.ts +22 -0
  452. package/src/v2/db/schema/1.0.0/consent.ts +38 -0
  453. package/src/v2/db/schema/1.0.0/domain.ts +26 -0
  454. package/src/v2/db/schema/1.0.0/index.ts +56 -0
  455. package/src/v2/db/schema/1.0.0/subject.ts +26 -0
  456. package/src/v2/db/schema/index.ts +9 -0
  457. package/src/v2/define-config.ts +5 -0
  458. package/src/v2/handlers/consent/index.ts +9 -0
  459. package/src/v2/handlers/consent/post.handler.ts +254 -0
  460. package/src/v2/handlers/consent/show-banner/geo.test.ts +281 -0
  461. package/src/v2/handlers/consent/show-banner/geo.ts +96 -0
  462. package/src/v2/handlers/consent/show-banner/handler.test.ts +374 -0
  463. package/src/v2/handlers/consent/show-banner/handler.ts +123 -0
  464. package/src/v2/handlers/consent/show-banner/translations.test.ts +121 -0
  465. package/src/v2/handlers/consent/show-banner/translations.ts +79 -0
  466. package/src/v2/handlers/consent/verify.handler.ts +288 -0
  467. package/src/v2/handlers/meta/index.ts +5 -0
  468. package/src/v2/handlers/meta/status.handler.ts +43 -0
  469. package/src/v2/init.test.ts +114 -0
  470. package/src/v2/init.ts +126 -0
  471. package/src/v2/middleware/cors/cors.test.ts +111 -0
  472. package/src/v2/middleware/cors/cors.ts +192 -0
  473. package/src/v2/middleware/cors/index.ts +30 -0
  474. package/src/v2/middleware/cors/is-origin-trusted.test.ts +104 -0
  475. package/src/v2/middleware/cors/is-origin-trusted.ts +126 -0
  476. package/src/v2/middleware/cors/process-cors.ts +91 -0
  477. package/src/v2/middleware/openapi/config.ts +27 -0
  478. package/src/v2/middleware/openapi/handlers.ts +132 -0
  479. package/src/v2/middleware/openapi/index.ts +11 -0
  480. package/src/v2/middleware/process-ip/index.ts +39 -0
  481. package/src/v2/router.ts +8 -0
  482. package/src/v2/types/api.ts +32 -0
  483. package/src/v2/types/index.ts +121 -0
  484. package/src/v2/utils/create-telemetry-options.ts +115 -0
  485. package/src/v2/utils/env.ts +84 -0
  486. package/src/v2/utils/index.ts +2 -0
  487. package/src/v2/utils/logger.ts +38 -0
  488. package/src/version.ts +1 -1
  489. package/vitest.config.ts +11 -2
@@ -0,0 +1,1231 @@
1
+ import * as __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__ from "@orpc/server";
2
+ import * as __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__ from "@orpc/contract";
3
+ import * as __WEBPACK_EXTERNAL_MODULE_zod__ from "zod";
4
+ import * as __WEBPACK_EXTERNAL_MODULE_fumadb__ from "fumadb";
5
+ import * as __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__ from "fumadb/schema";
6
+ import * as __WEBPACK_EXTERNAL_MODULE_base_x_aeb88370__ from "base-x";
7
+ import * as __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__ from "@c15t/translations";
8
+ const auditLogTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('auditLog', {
9
+ id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
10
+ entityType: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('entityType', 'string'),
11
+ entityId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('entityId', 'string'),
12
+ actionType: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('actionType', 'string'),
13
+ subjectId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectId', 'string').nullable(),
14
+ ipAddress: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('ipAddress', 'string').nullable(),
15
+ userAgent: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('userAgent', 'string').nullable(),
16
+ changes: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('changes', 'json').nullable(),
17
+ metadata: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('metadata', 'json').nullable(),
18
+ createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
19
+ eventTimezone: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('eventTimezone', 'string').defaultTo$(()=>'UTC')
20
+ });
21
+ __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
22
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
23
+ entityType: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
24
+ entityId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
25
+ actionType: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
26
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
27
+ ipAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
28
+ userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
29
+ changes: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
30
+ metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
31
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
32
+ eventTimezone: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().prefault('UTC')
33
+ });
34
+ const consentTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consent', {
35
+ id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
36
+ subjectId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectId', 'string'),
37
+ domainId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('domainId', 'string'),
38
+ policyId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('policyId', 'string').nullable(),
39
+ purposeIds: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('purposeIds', 'json'),
40
+ metadata: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('metadata', 'json').nullable(),
41
+ ipAddress: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('ipAddress', 'string').nullable(),
42
+ userAgent: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('userAgent', 'string').nullable(),
43
+ status: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('status', 'string').defaultTo$(()=>'active'),
44
+ withdrawalReason: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('withdrawalReason', 'string').nullable(),
45
+ givenAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('givenAt', 'timestamp').defaultTo$('now'),
46
+ validUntil: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('validUntil', 'timestamp').nullable(),
47
+ isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true)
48
+ });
49
+ const consentStatusSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
50
+ 'active',
51
+ 'withdrawn',
52
+ 'expired'
53
+ ]);
54
+ __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
55
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
56
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
57
+ domainId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
58
+ purposeIds: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
59
+ metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).nullish(),
60
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
61
+ ipAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
62
+ userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
63
+ status: consentStatusSchema.prefault('active'),
64
+ withdrawalReason: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
65
+ givenAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
66
+ validUntil: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().nullish(),
67
+ isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true)
68
+ });
69
+ const consentPolicyTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consentPolicy', {
70
+ id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
71
+ version: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('version', 'string'),
72
+ type: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('type', 'string'),
73
+ name: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('name', 'string'),
74
+ effectiveDate: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('effectiveDate', 'timestamp'),
75
+ expirationDate: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('expirationDate', 'timestamp').nullable(),
76
+ content: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('content', 'string'),
77
+ contentHash: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('contentHash', 'string'),
78
+ isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true),
79
+ createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now')
80
+ });
81
+ const PolicyTypeSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
82
+ 'cookie_banner',
83
+ 'privacy_policy',
84
+ 'dpa',
85
+ 'terms_and_conditions',
86
+ 'marketing_communications',
87
+ 'age_verification',
88
+ 'other'
89
+ ]);
90
+ __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
91
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
92
+ version: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
93
+ type: PolicyTypeSchema,
94
+ name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
95
+ effectiveDate: __WEBPACK_EXTERNAL_MODULE_zod__.z.date(),
96
+ expirationDate: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().nullish(),
97
+ content: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
98
+ contentHash: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
99
+ isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
100
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
101
+ });
102
+ const consentPurposeTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consentPurpose', {
103
+ id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
104
+ code: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('code', 'string'),
105
+ name: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('name', 'string'),
106
+ description: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)("description", 'string'),
107
+ isEssential: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isEssential', 'bool'),
108
+ dataCategory: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('dataCategory', 'string').nullable(),
109
+ legalBasis: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('legalBasis', 'string').nullable(),
110
+ isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true),
111
+ createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
112
+ updatedAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('updatedAt', 'timestamp').defaultTo$('now')
113
+ });
114
+ __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
115
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
116
+ code: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
117
+ name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
118
+ description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
119
+ isEssential: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean(),
120
+ dataCategory: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
121
+ legalBasis: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
122
+ isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
123
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
124
+ updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
125
+ });
126
+ const consentRecordTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consentRecord', {
127
+ id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
128
+ subjectId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectId', 'string'),
129
+ consentId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('consentId', 'string').nullable(),
130
+ actionType: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('actionType', 'string'),
131
+ details: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('details', 'json').nullable(),
132
+ createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now')
133
+ });
134
+ __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
135
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
136
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
137
+ consentId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
138
+ actionType: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
139
+ details: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).nullish(),
140
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
141
+ });
142
+ const domainTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('domain', {
143
+ id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
144
+ name: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('name', 'string').unique(),
145
+ description: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)("description", 'string').nullable(),
146
+ allowedOrigins: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('allowedOrigins', 'json').nullable(),
147
+ isVerified: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isVerified', 'bool').defaultTo$(()=>true),
148
+ isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true),
149
+ createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
150
+ updatedAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('updatedAt', 'timestamp').defaultTo$('now')
151
+ });
152
+ __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
153
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
154
+ name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
155
+ description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
156
+ allowedOrigins: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).nullish(),
157
+ isVerified: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
158
+ isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
159
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
160
+ updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
161
+ });
162
+ const subjectTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('subject', {
163
+ id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
164
+ isIdentified: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isIdentified', 'bool').defaultTo$(()=>false),
165
+ externalId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('externalId', 'string').nullable(),
166
+ identityProvider: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('identityProvider', 'string').nullable(),
167
+ lastIpAddress: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('lastIpAddress', 'string').nullable(),
168
+ subjectTimezone: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectTimezone', 'string').nullable(),
169
+ createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
170
+ updatedAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('updatedAt', 'timestamp').defaultTo$('now')
171
+ });
172
+ __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
173
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
174
+ isIdentified: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(false),
175
+ externalId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
176
+ identityProvider: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
177
+ lastIpAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
178
+ subjectTimezone: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
179
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
180
+ updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
181
+ });
182
+ const v1 = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.schema)({
183
+ version: '1.0.0',
184
+ tables: {
185
+ subject: subjectTable,
186
+ domain: domainTable,
187
+ consentPolicy: consentPolicyTable,
188
+ consentPurpose: consentPurposeTable,
189
+ consent: consentTable,
190
+ auditLog: auditLogTable,
191
+ consentRecord: consentRecordTable
192
+ },
193
+ relations: {
194
+ subject: ({ many })=>({
195
+ consents: many('consent'),
196
+ consentRecords: many('consentRecord'),
197
+ auditLogs: many('auditLog')
198
+ }),
199
+ domain: ({ many })=>({
200
+ consents: many('consent')
201
+ }),
202
+ consentPolicy: ({ many })=>({
203
+ consents: many('consent')
204
+ }),
205
+ consentPurpose: ()=>({}),
206
+ consent: ({ one, many })=>({
207
+ subject: one('subject', [
208
+ 'subjectId',
209
+ 'id'
210
+ ]).foreignKey(),
211
+ domain: one('domain', [
212
+ 'domainId',
213
+ 'id'
214
+ ]).foreignKey(),
215
+ policy: one('consentPolicy', [
216
+ 'policyId',
217
+ 'id'
218
+ ]).foreignKey(),
219
+ consentRecords: many('consentRecord')
220
+ }),
221
+ consentRecord: ({ one })=>({
222
+ subject: one('subject', [
223
+ 'subjectId',
224
+ 'id'
225
+ ]).foreignKey(),
226
+ consent: one('consent', [
227
+ 'consentId',
228
+ 'id'
229
+ ]).foreignKey()
230
+ }),
231
+ auditLog: ({ one })=>({
232
+ subject: one('subject', [
233
+ 'subjectId',
234
+ 'id'
235
+ ]).foreignKey()
236
+ })
237
+ }
238
+ });
239
+ (0, __WEBPACK_EXTERNAL_MODULE_fumadb__.fumadb)({
240
+ namespace: 'c15t',
241
+ schemas: [
242
+ v1
243
+ ]
244
+ });
245
+ const baseConsentSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
246
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
247
+ externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
248
+ domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
249
+ type: PolicyTypeSchema,
250
+ metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional()
251
+ });
252
+ const cookieBannerSchema = baseConsentSchema.extend({
253
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z.literal('cookie_banner'),
254
+ preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean())
255
+ });
256
+ const policyBasedSchema = baseConsentSchema.extend({
257
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
258
+ 'privacy_policy',
259
+ 'dpa',
260
+ 'terms_and_conditions'
261
+ ]),
262
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
263
+ preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean()).optional()
264
+ });
265
+ const otherConsentSchema = baseConsentSchema.extend({
266
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
267
+ 'marketing_communications',
268
+ 'age_verification',
269
+ 'other'
270
+ ]),
271
+ preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean()).optional()
272
+ });
273
+ const postConsentContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
274
+ method: 'POST',
275
+ path: '/consent/set',
276
+ description: `Records a user's consent preferences and creates necessary consent records.
277
+ This endpoint handles various types of consent submissions:
278
+
279
+ 1. Cookie Banner Consent:
280
+ - Records granular cookie preferences
281
+ - Supports multiple consent purposes
282
+ - Creates audit trail for compliance
283
+
284
+ 2. Policy-Based Consent:
285
+ - Privacy Policy acceptance
286
+ - Data Processing Agreement (DPA) consent
287
+ - Terms and Conditions acceptance
288
+ - Links consent to specific policy versions
289
+
290
+ 3. Other Consent Types:
291
+ - Marketing communications preferences
292
+ - Age verification consent
293
+ - Custom consent types
294
+
295
+ The endpoint performs the following operations:
296
+ - Creates or retrieves subject records
297
+ - Validates domain and policy information
298
+ - Creates consent records with audit trails
299
+ - Records consent purposes and preferences
300
+ - Generates audit logs for compliance
301
+
302
+ Use this endpoint to record user consent and maintain a compliant consent management system.`,
303
+ tags: [
304
+ 'consent',
305
+ 'cookie-banner'
306
+ ]
307
+ }).errors({
308
+ INPUT_VALIDATION_FAILED: {
309
+ status: 422,
310
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
311
+ formErrors: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
312
+ fieldErrors: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()))
313
+ }),
314
+ error: 'Invalid input parameters'
315
+ },
316
+ SUBJECT_CREATION_FAILED: {
317
+ status: 400,
318
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
319
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
320
+ externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional()
321
+ }),
322
+ error: 'Failed to create or find subject'
323
+ },
324
+ DOMAIN_CREATION_FAILED: {
325
+ status: 500,
326
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
327
+ domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
328
+ }),
329
+ error: 'Failed to create or find domain'
330
+ },
331
+ POLICY_NOT_FOUND: {
332
+ status: 404,
333
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
334
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
335
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
336
+ }),
337
+ error: 'Policy not found'
338
+ },
339
+ POLICY_INACTIVE: {
340
+ status: 409,
341
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
342
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
343
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
344
+ }),
345
+ error: 'Policy is not active'
346
+ },
347
+ POLICY_CREATION_FAILED: {
348
+ status: 500,
349
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
350
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
351
+ }),
352
+ error: 'Failed to create or find policy'
353
+ },
354
+ PURPOSE_CREATION_FAILED: {
355
+ status: 500,
356
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
357
+ purposeCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
358
+ }),
359
+ error: 'Failed to create consent purpose'
360
+ },
361
+ CONSENT_CREATION_FAILED: {
362
+ status: 500,
363
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
364
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
365
+ domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
366
+ }),
367
+ error: 'Failed to create consent record'
368
+ }
369
+ }).input(__WEBPACK_EXTERNAL_MODULE_zod__.z.discriminatedUnion('type', [
370
+ cookieBannerSchema,
371
+ policyBasedSchema,
372
+ otherConsentSchema
373
+ ])).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
374
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
375
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
376
+ externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
377
+ domainId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
378
+ domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
379
+ type: PolicyTypeSchema,
380
+ status: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
381
+ recordId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
382
+ metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
383
+ givenAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date()
384
+ }));
385
+ const types_branding = [
386
+ 'c15t',
387
+ 'consent',
388
+ 'none'
389
+ ];
390
+ const JurisdictionMessages = {
391
+ GDPR: 'GDPR or equivalent regulations require a cookie banner.',
392
+ CH: 'Switzerland requires similar data protection measures.',
393
+ BR: "Brazil's LGPD requires consent for cookies.",
394
+ PIPEDA: 'PIPEDA requires consent for data collection.',
395
+ AU: "Australia's Privacy Act mandates transparency about data collection.",
396
+ APPI: "Japan's APPI requires consent for data collection.",
397
+ PIPA: "South Korea's PIPA requires consent for data collection.",
398
+ NONE: 'No specific requirements'
399
+ };
400
+ const JurisdictionCodeSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
401
+ 'GDPR',
402
+ 'CH',
403
+ 'BR',
404
+ 'PIPEDA',
405
+ 'AU',
406
+ 'APPI',
407
+ 'PIPA',
408
+ 'NONE'
409
+ ]);
410
+ const JurisdictionInfoSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
411
+ code: JurisdictionCodeSchema,
412
+ message: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
413
+ });
414
+ const TitleDescriptionSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
415
+ title: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
416
+ description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
417
+ });
418
+ const TranslationsSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
419
+ common: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
420
+ acceptAll: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
421
+ rejectAll: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
422
+ customize: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
423
+ save: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
424
+ }),
425
+ cookieBanner: TitleDescriptionSchema,
426
+ consentManagerDialog: TitleDescriptionSchema,
427
+ consentTypes: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
428
+ experience: TitleDescriptionSchema,
429
+ functionality: TitleDescriptionSchema,
430
+ marketing: TitleDescriptionSchema,
431
+ measurement: TitleDescriptionSchema,
432
+ necessary: TitleDescriptionSchema
433
+ })
434
+ });
435
+ const showConsentBannerContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
436
+ method: 'GET',
437
+ path: '/show-consent-banner',
438
+ description: `Determines if a user should see a consent banner based on their location and applicable privacy regulations.
439
+ This endpoint performs the following checks:
440
+
441
+ 1. Detects the user's location using various header information:
442
+ - Cloudflare country headers
443
+ - Vercel IP country headers
444
+ - AWS CloudFront headers
445
+ - Custom country code headers
446
+
447
+ 2. Determines the applicable jurisdiction based on the location:
448
+ - GDPR (EU/EEA/UK)
449
+ - Swiss Data Protection Act
450
+ - LGPD (Brazil)
451
+ - PIPEDA (Canada)
452
+ - Australian Privacy Principles
453
+ - APPI (Japan)
454
+ - PIPA (South Korea)
455
+
456
+ 3. Returns detailed information about:
457
+ - Whether to show the consent banner
458
+ - The applicable jurisdiction and its requirements
459
+ - The user's detected location (country and region)
460
+
461
+ Use this endpoint to implement geo-targeted consent banners and ensure compliance with regional privacy regulations.`,
462
+ tags: [
463
+ 'cookie-banner'
464
+ ]
465
+ }).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
466
+ showConsentBanner: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean(),
467
+ jurisdiction: JurisdictionInfoSchema,
468
+ location: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
469
+ countryCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
470
+ regionCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable()
471
+ }),
472
+ translations: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
473
+ language: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
474
+ translations: TranslationsSchema
475
+ }),
476
+ branding: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"](types_branding)
477
+ }));
478
+ const verifyConsentInputSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.strictObject({
479
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
480
+ externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
481
+ domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
482
+ type: PolicyTypeSchema,
483
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
484
+ preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).optional()
485
+ });
486
+ const verify_contract_consentSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.looseObject({
487
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
488
+ purposeIds: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string())
489
+ });
490
+ const verifyConsentContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
491
+ method: 'POST',
492
+ path: '/consent/verify',
493
+ description: `Verifies if a user has given valid consent for a specific policy and domain.
494
+ This endpoint performs comprehensive consent verification by:
495
+
496
+ 1. Validating the subject's identity (using subjectId or externalSubjectId)
497
+ 2. Verifying the domain's existence and validity
498
+ 3. Checking if the specified policy exists and is active
499
+ 4. Validating that all required purposes have been consented to
500
+ 5. Ensuring the consent record is current and valid
501
+
502
+ The endpoint supports different types of consent verification:
503
+ - Cookie banner consent verification
504
+ - Privacy policy consent verification
505
+ - Terms and conditions verification
506
+ - Marketing communications consent verification
507
+ - Age verification
508
+ - Custom consent types
509
+
510
+ Use this endpoint to ensure compliance with privacy regulations and to verify user consent before processing personal data.`,
511
+ tags: [
512
+ 'consent'
513
+ ]
514
+ }).errors({
515
+ INPUT_VALIDATION_FAILED: {
516
+ status: 422,
517
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
518
+ formErrors: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
519
+ fieldErrors: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).optional())
520
+ }),
521
+ error: 'Invalid input parameters'
522
+ },
523
+ SUBJECT_NOT_FOUND: {
524
+ status: 404,
525
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
526
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
527
+ externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional()
528
+ }),
529
+ error: 'Subject not found'
530
+ },
531
+ DOMAIN_NOT_FOUND: {
532
+ status: 404,
533
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
534
+ domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
535
+ }),
536
+ error: 'Domain not found'
537
+ },
538
+ POLICY_NOT_FOUND: {
539
+ status: 404,
540
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
541
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
542
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
543
+ }),
544
+ error: 'Policy not found or invalid'
545
+ },
546
+ PURPOSES_NOT_FOUND: {
547
+ status: 404,
548
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
549
+ preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
550
+ foundPurposes: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string())
551
+ }),
552
+ error: 'Could not find all specified purposes'
553
+ },
554
+ COOKIE_BANNER_PREFERENCES_REQUIRED: {
555
+ status: 400,
556
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
557
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z.literal('cookie_banner')
558
+ }),
559
+ error: 'Preferences are required for cookie banner consent'
560
+ },
561
+ NO_CONSENT_FOUND: {
562
+ status: 404,
563
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
564
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
565
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
566
+ domainId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
567
+ }),
568
+ error: 'No consent found for the given policy'
569
+ }
570
+ }).input(verifyConsentInputSchema).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
571
+ isValid: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean(),
572
+ reasons: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).optional(),
573
+ consent: verify_contract_consentSchema.optional()
574
+ }));
575
+ const consentContracts = {
576
+ post: postConsentContract,
577
+ showBanner: showConsentBannerContract,
578
+ verify: verifyConsentContract
579
+ };
580
+ const statusContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
581
+ method: 'GET',
582
+ path: '/status',
583
+ description: `Returns the current operational status and health metrics of the service.
584
+ This endpoint provides real-time information about:
585
+ - Overall service status (ok/error)
586
+ - Current API version
587
+ - Server timestamp
588
+ - Storage system status and availability
589
+ - Client information (IP, User Agent, Region)
590
+
591
+ Use this endpoint for health checks, monitoring, and service status verification.`,
592
+ tags: [
593
+ 'meta'
594
+ ]
595
+ }).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
596
+ status: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
597
+ 'ok',
598
+ 'error'
599
+ ]),
600
+ version: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
601
+ timestamp: __WEBPACK_EXTERNAL_MODULE_zod__.z.date(),
602
+ client: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
603
+ ip: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
604
+ userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
605
+ region: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
606
+ countryCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
607
+ regionCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable()
608
+ })
609
+ })
610
+ }));
611
+ const metaContracts = {
612
+ status: statusContract
613
+ };
614
+ const config = {
615
+ consent: consentContracts,
616
+ meta: metaContracts
617
+ };
618
+ const os = (0, __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.implement)(config);
619
+ const prefixes = {
620
+ auditLog: 'log',
621
+ consent: 'cns',
622
+ consentPolicy: 'pol',
623
+ consentPurpose: 'pur',
624
+ consentRecord: 'rec',
625
+ domain: 'dom',
626
+ subject: 'sub'
627
+ };
628
+ const b58 = (0, __WEBPACK_EXTERNAL_MODULE_base_x_aeb88370__["default"])('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
629
+ function generateId(model) {
630
+ const buf = crypto.getRandomValues(new Uint8Array(20));
631
+ const prefix = prefixes[model];
632
+ const EPOCH_TIMESTAMP = 1700000000000;
633
+ const t = Date.now() - EPOCH_TIMESTAMP;
634
+ const high = Math.floor(t / 0x100000000);
635
+ const low = t >>> 0;
636
+ buf[0] = high >>> 24 & 255;
637
+ buf[1] = high >>> 16 & 255;
638
+ buf[2] = high >>> 8 & 255;
639
+ buf[3] = 255 & high;
640
+ buf[4] = low >>> 24 & 255;
641
+ buf[5] = low >>> 16 & 255;
642
+ buf[6] = low >>> 8 & 255;
643
+ buf[7] = 255 & low;
644
+ return `${prefix}_${b58.encode(buf)}`;
645
+ }
646
+ async function generateUniqueId(db, model, ctx, options = {}) {
647
+ const { maxRetries = 10, attempt = 0, baseDelay = 5 } = options;
648
+ if (attempt >= maxRetries) {
649
+ const error = new Error(`Failed to generate unique ID for ${model} after ${maxRetries} attempts`);
650
+ ctx?.logger?.error?.('ID generation failed', {
651
+ model,
652
+ maxRetries
653
+ });
654
+ throw error;
655
+ }
656
+ const id = generateId(model);
657
+ try {
658
+ const existing = await db.findFirst(model, {
659
+ where: (b)=>b('id', '=', id)
660
+ });
661
+ if (existing) {
662
+ ctx?.logger?.debug?.('ID conflict detected', {
663
+ id,
664
+ model,
665
+ attempt: attempt + 1,
666
+ maxRetries
667
+ });
668
+ const delay = Math.min(baseDelay * 2 ** attempt, 1000);
669
+ await new Promise((resolve)=>setTimeout(resolve, delay));
670
+ return generateUniqueId(db, model, ctx, {
671
+ maxRetries,
672
+ attempt: attempt + 1,
673
+ baseDelay
674
+ });
675
+ }
676
+ return id;
677
+ } catch (error) {
678
+ ctx?.logger?.error?.('Error checking ID uniqueness', {
679
+ error: error.message,
680
+ model,
681
+ attempt
682
+ });
683
+ if (attempt < maxRetries - 1) {
684
+ const delay = Math.min(baseDelay * 2 ** attempt, 2000);
685
+ await new Promise((resolve)=>setTimeout(resolve, delay));
686
+ return generateUniqueId(db, model, ctx, {
687
+ maxRetries,
688
+ attempt: attempt + 1,
689
+ baseDelay
690
+ });
691
+ }
692
+ throw error;
693
+ }
694
+ }
695
+ const postConsent = os.consent.post.handler(async ({ input, context })=>{
696
+ const typedContext = context;
697
+ const logger = typedContext.logger;
698
+ logger.info('Handling post-consent request');
699
+ const { db, registry } = typedContext;
700
+ const { type, subjectId, externalSubjectId, domain, metadata, preferences } = input;
701
+ logger.debug('Request parameters', {
702
+ type,
703
+ subjectId,
704
+ externalSubjectId,
705
+ domain
706
+ });
707
+ try {
708
+ const subject = await registry.findOrCreateSubject({
709
+ subjectId,
710
+ externalSubjectId,
711
+ ipAddress: typedContext.ipAddress
712
+ });
713
+ if (!subject) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('SUBJECT_CREATION_FAILED', {
714
+ data: {
715
+ subjectId,
716
+ externalSubjectId
717
+ }
718
+ });
719
+ logger.debug('Subject found/created', {
720
+ subjectId: subject.id
721
+ });
722
+ const domainRecord = await typedContext.registry.findOrCreateDomain(domain);
723
+ if (!domainRecord) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('DOMAIN_CREATION_FAILED', {
724
+ data: {
725
+ domain
726
+ }
727
+ });
728
+ let policyId;
729
+ let purposeIds = [];
730
+ if ('policyId' in input && input.policyId) {
731
+ policyId = input.policyId;
732
+ const policy = await typedContext.registry.findConsentPolicyById(policyId);
733
+ if (!policy) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_NOT_FOUND', {
734
+ data: {
735
+ policyId,
736
+ type
737
+ }
738
+ });
739
+ if (!policy.isActive) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_INACTIVE', {
740
+ data: {
741
+ policyId,
742
+ type
743
+ }
744
+ });
745
+ } else {
746
+ const policy = await typedContext.registry.findOrCreatePolicy(type);
747
+ if (!policy) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_CREATION_FAILED', {
748
+ data: {
749
+ type
750
+ }
751
+ });
752
+ policyId = policy.id;
753
+ }
754
+ if (preferences) {
755
+ const consentedPurposes = Object.entries(preferences).filter(([_, isConsented])=>isConsented).map(([purposeCode])=>purposeCode);
756
+ logger.debug('Consented purposes', {
757
+ consentedPurposes
758
+ });
759
+ const purposesRaw = await Promise.all(consentedPurposes.map((purposeCode)=>typedContext.registry.findOrCreateConsentPurposeByCode(purposeCode)));
760
+ const purposes = purposesRaw.map((purpose)=>purpose?.id);
761
+ logger.debug('Purposes: ', {
762
+ purposes
763
+ });
764
+ purposeIds = purposes;
765
+ }
766
+ const result = await db.transaction(async (tx)=>{
767
+ logger.debug('Creating consent record', {
768
+ subjectId: subject.id,
769
+ domainId: domainRecord.id,
770
+ policyId,
771
+ purposeIds
772
+ });
773
+ const consentRecord = await tx.create('consent', {
774
+ id: await generateUniqueId(tx, 'consent', typedContext),
775
+ subjectId: subject.id,
776
+ domainId: domainRecord.id,
777
+ policyId,
778
+ purposeIds: {
779
+ json: purposeIds
780
+ },
781
+ status: 'active',
782
+ isActive: true,
783
+ ipAddress: typedContext.ipAddress || null,
784
+ userAgent: typedContext.userAgent || null
785
+ });
786
+ logger.debug('Created consent', {
787
+ consentRecord: consentRecord.id
788
+ });
789
+ logger.debug('Creating consentRecord entry', {
790
+ subjectId: subject.id,
791
+ consentId: consentRecord.id,
792
+ actionType: 'consent_given',
793
+ details: metadata
794
+ });
795
+ const record = await tx.create('consentRecord', {
796
+ id: await generateUniqueId(tx, 'consentRecord', typedContext),
797
+ subjectId: subject.id,
798
+ consentId: consentRecord.id,
799
+ actionType: 'consent_given',
800
+ details: metadata
801
+ });
802
+ logger.debug('Created record entry', {
803
+ record: record.id
804
+ });
805
+ logger.debug('Creating audit log', {
806
+ subjectId: subject.id,
807
+ entityType: 'consent',
808
+ entityId: consentRecord.id,
809
+ actionType: 'consent_given',
810
+ metadata: metadata
811
+ });
812
+ await tx.create('auditLog', {
813
+ id: await generateUniqueId(tx, 'auditLog', typedContext),
814
+ subjectId: subject.id,
815
+ entityType: 'consent',
816
+ entityId: consentRecord.id,
817
+ actionType: 'consent_given',
818
+ metadata: {
819
+ consentId: consentRecord.id,
820
+ type
821
+ },
822
+ ipAddress: typedContext.ipAddress || null,
823
+ userAgent: typedContext.userAgent || null,
824
+ eventTimezone: 'UTC'
825
+ });
826
+ logger.debug('Created audit log');
827
+ if (!consentRecord || !record) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('CONSENT_CREATION_FAILED', {
828
+ data: {
829
+ subjectId: subject.id,
830
+ domain
831
+ }
832
+ });
833
+ return {
834
+ consent: consentRecord,
835
+ record
836
+ };
837
+ });
838
+ return {
839
+ id: result.consent.id,
840
+ subjectId: subject.id,
841
+ externalSubjectId: subject.externalId ?? void 0,
842
+ domainId: domainRecord.id,
843
+ domain: domainRecord.name,
844
+ type,
845
+ status: result.consent.status,
846
+ recordId: result.record.id,
847
+ metadata,
848
+ givenAt: result.consent.givenAt
849
+ };
850
+ } catch (error) {
851
+ logger.error('Error in post-consent handler', {
852
+ error: error instanceof Error ? error.message : String(error),
853
+ errorType: error instanceof Error ? error.constructor.name : typeof error
854
+ });
855
+ if (error instanceof __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError) throw error;
856
+ throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('INTERNAL_SERVER_ERROR', {
857
+ message: error instanceof Error ? error.message : String(error)
858
+ });
859
+ }
860
+ });
861
+ function checkJurisdiction(countryCode) {
862
+ const jurisdictions = {
863
+ EU: new Set([
864
+ 'AT',
865
+ 'BE',
866
+ 'BG',
867
+ 'HR',
868
+ 'CY',
869
+ 'CZ',
870
+ 'DK',
871
+ 'EE',
872
+ 'FI',
873
+ 'FR',
874
+ 'DE',
875
+ 'GR',
876
+ 'HU',
877
+ 'IE',
878
+ 'IT',
879
+ 'LV',
880
+ 'LT',
881
+ 'LU',
882
+ 'MT',
883
+ 'NL',
884
+ 'PL',
885
+ 'PT',
886
+ 'RO',
887
+ 'SK',
888
+ 'SI',
889
+ 'ES',
890
+ 'SE'
891
+ ]),
892
+ EEA: new Set([
893
+ 'IS',
894
+ 'NO',
895
+ 'LI'
896
+ ]),
897
+ UK: new Set([
898
+ 'GB'
899
+ ]),
900
+ CH: new Set([
901
+ 'CH'
902
+ ]),
903
+ BR: new Set([
904
+ 'BR'
905
+ ]),
906
+ CA: new Set([
907
+ 'CA'
908
+ ]),
909
+ AU: new Set([
910
+ 'AU'
911
+ ]),
912
+ JP: new Set([
913
+ 'JP'
914
+ ]),
915
+ KR: new Set([
916
+ 'KR'
917
+ ])
918
+ };
919
+ let showConsentBanner = true;
920
+ let jurisdictionCode = 'NONE';
921
+ if (countryCode) {
922
+ const normalizedCountryCode = countryCode.toUpperCase();
923
+ showConsentBanner = false;
924
+ const jurisdictionMap = [
925
+ {
926
+ sets: [
927
+ jurisdictions.EU,
928
+ jurisdictions.EEA,
929
+ jurisdictions.UK
930
+ ],
931
+ code: 'GDPR'
932
+ },
933
+ {
934
+ sets: [
935
+ jurisdictions.CH
936
+ ],
937
+ code: 'CH'
938
+ },
939
+ {
940
+ sets: [
941
+ jurisdictions.BR
942
+ ],
943
+ code: 'BR'
944
+ },
945
+ {
946
+ sets: [
947
+ jurisdictions.CA
948
+ ],
949
+ code: 'PIPEDA'
950
+ },
951
+ {
952
+ sets: [
953
+ jurisdictions.AU
954
+ ],
955
+ code: 'AU'
956
+ },
957
+ {
958
+ sets: [
959
+ jurisdictions.JP
960
+ ],
961
+ code: 'APPI'
962
+ },
963
+ {
964
+ sets: [
965
+ jurisdictions.KR
966
+ ],
967
+ code: 'PIPA'
968
+ }
969
+ ];
970
+ for (const { sets, code } of jurisdictionMap)if (sets.some((set)=>set.has(normalizedCountryCode))) {
971
+ jurisdictionCode = code;
972
+ showConsentBanner = true;
973
+ break;
974
+ }
975
+ }
976
+ const message = JurisdictionMessages[jurisdictionCode];
977
+ return {
978
+ showConsentBanner,
979
+ jurisdictionCode,
980
+ message
981
+ };
982
+ }
983
+ function isSupportedBaseLanguage(lang) {
984
+ return lang in __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations;
985
+ }
986
+ function getPreferredLanguage(acceptLanguage, supportedLanguages) {
987
+ if (!acceptLanguage) return 'en';
988
+ const primaryLang = acceptLanguage.split(',')[0]?.split(';')[0]?.split('-')[0]?.toLowerCase();
989
+ if (primaryLang && supportedLanguages.includes(primaryLang)) return primaryLang;
990
+ return 'en';
991
+ }
992
+ function getTranslations(acceptLanguage, customTranslations) {
993
+ const supportedDefaultLanguages = Object.keys(__WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations);
994
+ const supportedCustomLanguages = Object.keys(customTranslations || {});
995
+ const supportedLanguages = [
996
+ ...supportedDefaultLanguages,
997
+ ...supportedCustomLanguages
998
+ ];
999
+ const preferredLanguage = getPreferredLanguage(acceptLanguage, supportedLanguages);
1000
+ const base = isSupportedBaseLanguage(preferredLanguage) ? __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations[preferredLanguage] : __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations.en;
1001
+ const custom = supportedCustomLanguages.includes(preferredLanguage) ? customTranslations?.[preferredLanguage] : {};
1002
+ const translations = custom ? (0, __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.deepMergeTranslations)(base, custom) : base;
1003
+ return {
1004
+ translations: translations,
1005
+ language: preferredLanguage
1006
+ };
1007
+ }
1008
+ function getHeaders(headers) {
1009
+ if (!headers) return {
1010
+ countryCode: null,
1011
+ regionCode: null,
1012
+ acceptLanguage: null
1013
+ };
1014
+ const normalizeHeader = (value)=>{
1015
+ if (!value) return null;
1016
+ return Array.isArray(value) ? value[0] ?? null : value;
1017
+ };
1018
+ const countryCode = normalizeHeader(headers.get('x-c15t-country')) ?? normalizeHeader(headers.get('cf-ipcountry')) ?? normalizeHeader(headers.get('x-vercel-ip-country')) ?? normalizeHeader(headers.get('x-amz-cf-ipcountry')) ?? normalizeHeader(headers.get('x-country-code'));
1019
+ const regionCode = normalizeHeader(headers.get('x-c15t-region')) ?? normalizeHeader(headers.get('x-vercel-ip-country-region')) ?? normalizeHeader(headers.get('x-region-code'));
1020
+ const acceptLanguage = normalizeHeader(headers.get('accept-language'));
1021
+ return {
1022
+ countryCode,
1023
+ regionCode,
1024
+ acceptLanguage
1025
+ };
1026
+ }
1027
+ function buildResponse({ shouldShowBanner, jurisdiction, location, acceptLanguage, customTranslations, branding = 'c15t' }) {
1028
+ return {
1029
+ showConsentBanner: shouldShowBanner,
1030
+ jurisdiction,
1031
+ location,
1032
+ translations: getTranslations(acceptLanguage, customTranslations),
1033
+ branding: branding
1034
+ };
1035
+ }
1036
+ const handler_showConsentBanner = os.consent.showBanner.handler(({ context })=>{
1037
+ const typedContext = context;
1038
+ const { customTranslations, disableGeoLocation, branding } = typedContext.advanced ?? {};
1039
+ const { countryCode, regionCode, acceptLanguage } = getHeaders(typedContext.headers);
1040
+ if (disableGeoLocation) return buildResponse({
1041
+ shouldShowBanner: true,
1042
+ jurisdiction: {
1043
+ code: 'NONE',
1044
+ message: JurisdictionMessages.NONE
1045
+ },
1046
+ location: {
1047
+ countryCode: null,
1048
+ regionCode: null
1049
+ },
1050
+ acceptLanguage,
1051
+ customTranslations,
1052
+ branding
1053
+ });
1054
+ const { showConsentBanner, jurisdictionCode, message } = checkJurisdiction(countryCode);
1055
+ return buildResponse({
1056
+ shouldShowBanner: showConsentBanner,
1057
+ jurisdiction: {
1058
+ code: jurisdictionCode,
1059
+ message
1060
+ },
1061
+ location: {
1062
+ countryCode,
1063
+ regionCode
1064
+ },
1065
+ acceptLanguage,
1066
+ customTranslations,
1067
+ branding
1068
+ });
1069
+ });
1070
+ const verifyConsent = os.consent.verify.handler(async ({ input, context })=>{
1071
+ const typedContext = context;
1072
+ const logger = typedContext.logger;
1073
+ logger.info('Handling verify-consent request');
1074
+ const { type, subjectId, externalSubjectId, domain, policyId, preferences } = input;
1075
+ logger.debug('Request parameters', {
1076
+ type,
1077
+ subjectId,
1078
+ externalSubjectId,
1079
+ domain,
1080
+ policyId,
1081
+ preferences
1082
+ });
1083
+ try {
1084
+ const domainRecord = await typedContext.registry.findDomainByName(domain);
1085
+ if (!domainRecord) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('DOMAIN_NOT_FOUND', {
1086
+ data: {
1087
+ domain
1088
+ }
1089
+ });
1090
+ const subject = await typedContext.registry.findOrCreateSubject({
1091
+ subjectId,
1092
+ externalSubjectId,
1093
+ ipAddress: typedContext.ipAddress ?? 'unknown'
1094
+ });
1095
+ if (!subject) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('SUBJECT_NOT_FOUND', {
1096
+ data: {
1097
+ subjectId,
1098
+ externalSubjectId
1099
+ }
1100
+ });
1101
+ if ('cookie_banner' === type && (!preferences || 0 === preferences.length)) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('COOKIE_BANNER_PREFERENCES_REQUIRED', {
1102
+ data: {
1103
+ type: 'cookie_banner'
1104
+ }
1105
+ });
1106
+ const purposePromises = preferences?.map((purpose)=>typedContext.registry.findOrCreateConsentPurposeByCode(purpose));
1107
+ const rawPurposes = await Promise.all(purposePromises ?? []);
1108
+ const purposeIds = rawPurposes.filter((purpose)=>null !== purpose).map((purpose)=>purpose.id);
1109
+ if (purposeIds.length !== (preferences?.length ?? 0)) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('PURPOSES_NOT_FOUND', {
1110
+ data: {
1111
+ preferences: preferences ?? [],
1112
+ foundPurposes: rawPurposes.filter((p)=>null !== p).map((p)=>p.code)
1113
+ }
1114
+ });
1115
+ if (policyId) {
1116
+ const policy = await typedContext.registry.findConsentPolicyById(policyId);
1117
+ if (!policy || policy.type !== type) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_NOT_FOUND', {
1118
+ data: {
1119
+ policyId,
1120
+ type
1121
+ }
1122
+ });
1123
+ return await checkPolicyConsent({
1124
+ policyId: policy.id,
1125
+ subjectId: subject.id,
1126
+ domainId: domainRecord.id,
1127
+ purposeIds,
1128
+ type,
1129
+ context: typedContext
1130
+ });
1131
+ }
1132
+ const latestPolicy = await typedContext.registry.findOrCreatePolicy(type);
1133
+ if (!latestPolicy) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_NOT_FOUND', {
1134
+ data: {
1135
+ policyId: 'latest',
1136
+ type
1137
+ }
1138
+ });
1139
+ return await checkPolicyConsent({
1140
+ policyId: latestPolicy.id,
1141
+ subjectId: subject.id,
1142
+ domainId: domainRecord.id,
1143
+ purposeIds,
1144
+ type,
1145
+ context: typedContext
1146
+ });
1147
+ } catch (error) {
1148
+ logger.error('Error in verify-consent handler', {
1149
+ error: error instanceof Error ? error.message : String(error),
1150
+ errorType: error instanceof Error ? error.constructor.name : typeof error
1151
+ });
1152
+ if (error instanceof __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError) throw error;
1153
+ throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('INTERNAL_SERVER_ERROR', {
1154
+ message: error instanceof Error ? error.message : String(error)
1155
+ });
1156
+ }
1157
+ });
1158
+ async function checkPolicyConsent({ policyId, subjectId, domainId, purposeIds, type, context }) {
1159
+ const { registry, db } = context;
1160
+ const rawConsents = await db.findMany('consent', {
1161
+ where: (b)=>b.and(b('subjectId', '=', subjectId), b('policyId', '=', policyId), b('domainId', '=', domainId)),
1162
+ orderBy: [
1163
+ 'givenAt',
1164
+ 'desc'
1165
+ ]
1166
+ });
1167
+ const filteredConsents = rawConsents.filter((consent)=>{
1168
+ if (!purposeIds) return true;
1169
+ return purposeIds.every((id)=>consent.purposeIds.some((purposeId)=>purposeId === id));
1170
+ });
1171
+ await registry.createAuditLog({
1172
+ subjectId,
1173
+ entityType: 'consent_policy',
1174
+ entityId: policyId,
1175
+ actionType: 'verify_consent',
1176
+ metadata: {
1177
+ type,
1178
+ policyId,
1179
+ purposeIds,
1180
+ success: 0 !== filteredConsents.length,
1181
+ ...filteredConsents.length > 0 ? {
1182
+ consentId: filteredConsents[0]?.id
1183
+ } : {}
1184
+ },
1185
+ eventTimezone: 'UTC'
1186
+ });
1187
+ if (0 === rawConsents.length || 0 === filteredConsents.length) return {
1188
+ isValid: false
1189
+ };
1190
+ return {
1191
+ isValid: true,
1192
+ consent: filteredConsents[0]
1193
+ };
1194
+ }
1195
+ const consentHandlers = {
1196
+ post: postConsent,
1197
+ showBanner: handler_showConsentBanner,
1198
+ verify: verifyConsent
1199
+ };
1200
+ const version = '1.6.0';
1201
+ const statusHandler = os.meta.status.handler(({ context })=>{
1202
+ const typedContext = context;
1203
+ const headers = typedContext.headers;
1204
+ const normalizeHeader = (value)=>{
1205
+ if (!value) return null;
1206
+ return Array.isArray(value) ? value[0] ?? null : value;
1207
+ };
1208
+ const countryCode = normalizeHeader(headers?.get('cf-ipcountry')) ?? normalizeHeader(headers?.get('x-vercel-ip-country')) ?? normalizeHeader(headers?.get('x-amz-cf-ipcountry')) ?? normalizeHeader(headers?.get('x-country-code'));
1209
+ const regionCode = normalizeHeader(headers?.get('x-vercel-ip-country-region')) ?? normalizeHeader(headers?.get('x-region-code'));
1210
+ return {
1211
+ status: 'ok',
1212
+ version: version,
1213
+ timestamp: new Date(),
1214
+ client: {
1215
+ ip: typedContext.ipAddress ?? null,
1216
+ userAgent: typedContext.userAgent ?? null,
1217
+ region: {
1218
+ countryCode,
1219
+ regionCode
1220
+ }
1221
+ }
1222
+ };
1223
+ });
1224
+ const metaHandlers = {
1225
+ status: statusHandler
1226
+ };
1227
+ const router = os.router({
1228
+ consent: consentHandlers,
1229
+ meta: metaHandlers
1230
+ });
1231
+ export { router };