@coursebuilder/adapter-drizzle 2.1.1 → 3.0.0-canary.0.0c9beb2ae

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 (296) hide show
  1. package/dist/{chunk-KIQLUFJX.js → chunk-2GW3BJE2.js} +2 -2
  2. package/dist/{chunk-M3WM5Q7W.js → chunk-33ZN7FN7.js} +2 -2
  3. package/dist/chunk-4VZJQAPV.js +74 -0
  4. package/dist/chunk-5FLS4ZBX.js +109 -0
  5. package/dist/chunk-5YR5M22S.js +147 -0
  6. package/dist/chunk-6XQ6C3IX.js +18 -0
  7. package/dist/chunk-AIDM2CH6.js +146 -0
  8. package/dist/chunk-ALTODDUX.js +173 -0
  9. package/dist/chunk-AZY2VRAE.js +63 -0
  10. package/dist/chunk-BS7T27VL.js +239 -0
  11. package/dist/chunk-CN3FCRLR.js +55 -0
  12. package/dist/chunk-EAXC4CQD.js +245 -0
  13. package/dist/chunk-EDDG2YFS.js +249 -0
  14. package/dist/chunk-EDKWCMA7.js +210 -0
  15. package/dist/{chunk-7FBSP3VD.js → chunk-EDM6DKA5.js} +2 -2
  16. package/dist/{chunk-EZEQQJNH.js → chunk-EIQBTF5J.js} +2 -2
  17. package/dist/chunk-FYT7RTVW.js +248 -0
  18. package/dist/{chunk-F56AI52P.js → chunk-INZTF6QV.js} +2 -2
  19. package/dist/{chunk-AP5HBIV4.js → chunk-JVHX4JHA.js} +2 -2
  20. package/dist/chunk-LWEKWDLC.js +300 -0
  21. package/dist/chunk-OJPEBGGE.js +139 -0
  22. package/dist/chunk-QKOSV34V.js +16268 -0
  23. package/dist/chunk-QO3QE3LE.js +330 -0
  24. package/dist/chunk-QQKNNFFB.js +399 -0
  25. package/dist/chunk-RBHCV3UW.js +20 -0
  26. package/dist/chunk-TNH2C27F.js +252 -0
  27. package/dist/chunk-TNWNW666.js +133 -0
  28. package/dist/chunk-VBEXYQ6L.js +156 -0
  29. package/dist/chunk-W3ILNMLD.js +265 -0
  30. package/dist/chunk-WJ2ZUXL3.js +71 -0
  31. package/dist/{chunk-PJORQUQP.js → chunk-WUMDFFN3.js} +2 -2
  32. package/dist/{chunk-2AW5KYAK.js → chunk-X7DRYXB7.js} +2 -2
  33. package/dist/{chunk-PNPTKVJ4.js → chunk-XUBZKYH6.js} +24 -15
  34. package/dist/{chunk-WWBSNLRC.js → chunk-ZY4AFKUQ.js} +2 -2
  35. package/dist/index.d.ts +5 -11
  36. package/dist/index.js +41 -18
  37. package/dist/lib/mysql/cms-resource-actions.cjs +15912 -4127
  38. package/dist/lib/mysql/cms-resource-actions.cjs.map +1 -1
  39. package/dist/lib/mysql/cms-resource-actions.d.cts +8 -38
  40. package/dist/lib/mysql/cms-resource-actions.d.ts +8 -38
  41. package/dist/lib/mysql/cms-resource-actions.js +2 -1
  42. package/dist/lib/mysql/context.cjs +3380 -0
  43. package/dist/lib/mysql/context.cjs.map +1 -0
  44. package/dist/lib/mysql/context.d.cts +15 -0
  45. package/dist/lib/mysql/context.d.ts +15 -0
  46. package/dist/lib/mysql/context.js +34 -0
  47. package/dist/lib/mysql/context.js.map +1 -0
  48. package/dist/lib/mysql/index.cjs +21875 -15261
  49. package/dist/lib/mysql/index.cjs.map +1 -1
  50. package/dist/lib/mysql/index.d.cts +24 -14300
  51. package/dist/lib/mysql/index.d.ts +24 -14300
  52. package/dist/lib/mysql/index.js +46 -22
  53. package/dist/lib/mysql/ports/auth-storage.cjs +84 -0
  54. package/dist/lib/mysql/ports/auth-storage.cjs.map +1 -0
  55. package/dist/lib/mysql/ports/auth-storage.d.cts +22 -0
  56. package/dist/lib/mysql/ports/auth-storage.d.ts +22 -0
  57. package/dist/lib/mysql/ports/auth-storage.js +8 -0
  58. package/dist/lib/mysql/ports/auth-storage.js.map +1 -0
  59. package/dist/lib/mysql/ports/catalog.cjs +16688 -0
  60. package/dist/lib/mysql/ports/catalog.cjs.map +1 -0
  61. package/dist/lib/mysql/ports/catalog.d.cts +24 -0
  62. package/dist/lib/mysql/ports/catalog.d.ts +24 -0
  63. package/dist/lib/mysql/ports/catalog.js +9 -0
  64. package/dist/lib/mysql/ports/catalog.js.map +1 -0
  65. package/dist/lib/mysql/ports/content-resource.cjs +321 -0
  66. package/dist/lib/mysql/ports/content-resource.cjs.map +1 -0
  67. package/dist/lib/mysql/ports/content-resource.d.cts +23 -0
  68. package/dist/lib/mysql/ports/content-resource.d.ts +23 -0
  69. package/dist/lib/mysql/ports/content-resource.js +8 -0
  70. package/dist/lib/mysql/ports/content-resource.js.map +1 -0
  71. package/dist/lib/mysql/ports/coupon.cjs +16524 -0
  72. package/dist/lib/mysql/ports/coupon.cjs.map +1 -0
  73. package/dist/lib/mysql/ports/coupon.d.cts +22 -0
  74. package/dist/lib/mysql/ports/coupon.d.ts +22 -0
  75. package/dist/lib/mysql/ports/coupon.js +9 -0
  76. package/dist/lib/mysql/ports/coupon.js.map +1 -0
  77. package/dist/lib/mysql/ports/entitlement.cjs +16350 -0
  78. package/dist/lib/mysql/ports/entitlement.cjs.map +1 -0
  79. package/dist/lib/mysql/ports/entitlement.d.cts +22 -0
  80. package/dist/lib/mysql/ports/entitlement.d.ts +22 -0
  81. package/dist/lib/mysql/ports/entitlement.js +9 -0
  82. package/dist/lib/mysql/ports/entitlement.js.map +1 -0
  83. package/dist/lib/mysql/ports/identity.cjs +154 -0
  84. package/dist/lib/mysql/ports/identity.cjs.map +1 -0
  85. package/dist/lib/mysql/ports/identity.d.cts +22 -0
  86. package/dist/lib/mysql/ports/identity.d.ts +22 -0
  87. package/dist/lib/mysql/ports/identity.js +8 -0
  88. package/dist/lib/mysql/ports/identity.js.map +1 -0
  89. package/dist/lib/mysql/ports/merchant.cjs +194 -0
  90. package/dist/lib/mysql/ports/merchant.cjs.map +1 -0
  91. package/dist/lib/mysql/ports/merchant.d.cts +22 -0
  92. package/dist/lib/mysql/ports/merchant.d.ts +22 -0
  93. package/dist/lib/mysql/ports/merchant.js +8 -0
  94. package/dist/lib/mysql/ports/merchant.js.map +1 -0
  95. package/dist/lib/mysql/ports/organization.cjs +16426 -0
  96. package/dist/lib/mysql/ports/organization.cjs.map +1 -0
  97. package/dist/lib/mysql/ports/organization.d.cts +22 -0
  98. package/dist/lib/mysql/ports/organization.d.ts +22 -0
  99. package/dist/lib/mysql/ports/organization.js +9 -0
  100. package/dist/lib/mysql/ports/organization.js.map +1 -0
  101. package/dist/lib/mysql/ports/progress.cjs +16544 -0
  102. package/dist/lib/mysql/ports/progress.cjs.map +1 -0
  103. package/dist/lib/mysql/ports/progress.d.cts +22 -0
  104. package/dist/lib/mysql/ports/progress.d.ts +22 -0
  105. package/dist/lib/mysql/ports/progress.js +9 -0
  106. package/dist/lib/mysql/ports/progress.js.map +1 -0
  107. package/dist/lib/mysql/ports/purchase.cjs +16609 -0
  108. package/dist/lib/mysql/ports/purchase.cjs.map +1 -0
  109. package/dist/lib/mysql/ports/purchase.d.cts +23 -0
  110. package/dist/lib/mysql/ports/purchase.d.ts +23 -0
  111. package/dist/lib/mysql/ports/purchase.js +9 -0
  112. package/dist/lib/mysql/ports/purchase.js.map +1 -0
  113. package/dist/lib/mysql/ports/subscription.cjs +76 -0
  114. package/dist/lib/mysql/ports/subscription.cjs.map +1 -0
  115. package/dist/lib/mysql/ports/subscription.d.cts +22 -0
  116. package/dist/lib/mysql/ports/subscription.d.ts +22 -0
  117. package/dist/lib/mysql/ports/subscription.js +8 -0
  118. package/dist/lib/mysql/ports/subscription.js.map +1 -0
  119. package/dist/lib/mysql/schema.cjs +3373 -0
  120. package/dist/lib/mysql/schema.cjs.map +1 -0
  121. package/dist/lib/mysql/schema.d.cts +14385 -0
  122. package/dist/lib/mysql/schema.d.ts +14385 -0
  123. package/dist/lib/mysql/schema.js +35 -0
  124. package/dist/lib/mysql/schema.js.map +1 -0
  125. package/dist/lib/mysql/schemas/auth/accounts.cjs.map +1 -1
  126. package/dist/lib/mysql/schemas/auth/accounts.js +4 -4
  127. package/dist/lib/mysql/schemas/auth/device-access-token.cjs.map +1 -1
  128. package/dist/lib/mysql/schemas/auth/device-access-token.js +5 -5
  129. package/dist/lib/mysql/schemas/auth/device-verification.cjs.map +1 -1
  130. package/dist/lib/mysql/schemas/auth/device-verification.js +5 -5
  131. package/dist/lib/mysql/schemas/auth/personal-access-token.cjs.map +1 -1
  132. package/dist/lib/mysql/schemas/auth/personal-access-token.js +5 -5
  133. package/dist/lib/mysql/schemas/auth/profiles.cjs.map +1 -1
  134. package/dist/lib/mysql/schemas/auth/profiles.js +4 -4
  135. package/dist/lib/mysql/schemas/auth/role-permissions.cjs.map +1 -1
  136. package/dist/lib/mysql/schemas/auth/role-permissions.js +5 -5
  137. package/dist/lib/mysql/schemas/auth/roles.cjs.map +1 -1
  138. package/dist/lib/mysql/schemas/auth/roles.js +4 -4
  139. package/dist/lib/mysql/schemas/auth/sessions.cjs.map +1 -1
  140. package/dist/lib/mysql/schemas/auth/sessions.js +5 -5
  141. package/dist/lib/mysql/schemas/auth/user-permissions.cjs.map +1 -1
  142. package/dist/lib/mysql/schemas/auth/user-permissions.js +4 -4
  143. package/dist/lib/mysql/schemas/auth/user-prefs.cjs.map +1 -1
  144. package/dist/lib/mysql/schemas/auth/user-prefs.js +4 -4
  145. package/dist/lib/mysql/schemas/auth/user-roles.cjs.map +1 -1
  146. package/dist/lib/mysql/schemas/auth/user-roles.js +4 -4
  147. package/dist/lib/mysql/schemas/auth/users.cjs +5 -1
  148. package/dist/lib/mysql/schemas/auth/users.cjs.map +1 -1
  149. package/dist/lib/mysql/schemas/auth/users.js +4 -4
  150. package/dist/lib/mysql/schemas/commerce/coupon.cjs.map +1 -1
  151. package/dist/lib/mysql/schemas/commerce/coupon.js +4 -4
  152. package/dist/lib/mysql/schemas/commerce/merchant-charge.cjs.map +1 -1
  153. package/dist/lib/mysql/schemas/commerce/merchant-charge.js +4 -4
  154. package/dist/lib/mysql/schemas/commerce/merchant-subscription.cjs.map +1 -1
  155. package/dist/lib/mysql/schemas/commerce/merchant-subscription.js +4 -4
  156. package/dist/lib/mysql/schemas/commerce/price.cjs.map +1 -1
  157. package/dist/lib/mysql/schemas/commerce/price.js +4 -4
  158. package/dist/lib/mysql/schemas/commerce/product.cjs.map +1 -1
  159. package/dist/lib/mysql/schemas/commerce/product.js +4 -4
  160. package/dist/lib/mysql/schemas/commerce/purchase-user-transfer.cjs.map +1 -1
  161. package/dist/lib/mysql/schemas/commerce/purchase-user-transfer.js +5 -5
  162. package/dist/lib/mysql/schemas/commerce/purchase.cjs +11 -2
  163. package/dist/lib/mysql/schemas/commerce/purchase.cjs.map +1 -1
  164. package/dist/lib/mysql/schemas/commerce/purchase.js +4 -4
  165. package/dist/lib/mysql/schemas/commerce/subscription.cjs +6 -1
  166. package/dist/lib/mysql/schemas/commerce/subscription.cjs.map +1 -1
  167. package/dist/lib/mysql/schemas/commerce/subscription.js +4 -4
  168. package/dist/lib/mysql/schemas/commerce/upgradable-products.cjs.map +1 -1
  169. package/dist/lib/mysql/schemas/commerce/upgradable-products.js +5 -5
  170. package/dist/lib/mysql/schemas/communication/comment.cjs +5 -1
  171. package/dist/lib/mysql/schemas/communication/comment.cjs.map +1 -1
  172. package/dist/lib/mysql/schemas/communication/comment.js +4 -4
  173. package/dist/lib/mysql/schemas/communication/communication-preferences.cjs +5 -1
  174. package/dist/lib/mysql/schemas/communication/communication-preferences.cjs.map +1 -1
  175. package/dist/lib/mysql/schemas/communication/communication-preferences.js +4 -4
  176. package/dist/lib/mysql/schemas/communication/question-response.cjs.map +1 -1
  177. package/dist/lib/mysql/schemas/communication/question-response.js +5 -5
  178. package/dist/lib/mysql/schemas/content/content-contributions.cjs +5 -1
  179. package/dist/lib/mysql/schemas/content/content-contributions.cjs.map +1 -1
  180. package/dist/lib/mysql/schemas/content/content-contributions.js +4 -4
  181. package/dist/lib/mysql/schemas/content/content-resource-product.cjs.map +1 -1
  182. package/dist/lib/mysql/schemas/content/content-resource-product.js +4 -4
  183. package/dist/lib/mysql/schemas/content/content-resource-resource.cjs.map +1 -1
  184. package/dist/lib/mysql/schemas/content/content-resource-resource.js +4 -4
  185. package/dist/lib/mysql/schemas/content/content-resource-tag.cjs.map +1 -1
  186. package/dist/lib/mysql/schemas/content/content-resource-tag.js +4 -4
  187. package/dist/lib/mysql/schemas/content/content-resource-version.cjs.map +1 -1
  188. package/dist/lib/mysql/schemas/content/content-resource-version.js +4 -4
  189. package/dist/lib/mysql/schemas/content/content-resource.cjs +5 -1
  190. package/dist/lib/mysql/schemas/content/content-resource.cjs.map +1 -1
  191. package/dist/lib/mysql/schemas/content/content-resource.js +4 -4
  192. package/dist/lib/mysql/schemas/content/tag-tag.cjs.map +1 -1
  193. package/dist/lib/mysql/schemas/content/tag-tag.js +4 -4
  194. package/dist/lib/mysql/schemas/content/tag.cjs.map +1 -1
  195. package/dist/lib/mysql/schemas/content/tag.js +4 -4
  196. package/dist/lib/mysql/schemas/entitlements/entitlement.cjs +11 -2
  197. package/dist/lib/mysql/schemas/entitlements/entitlement.cjs.map +1 -1
  198. package/dist/lib/mysql/schemas/entitlements/entitlement.js +5 -5
  199. package/dist/lib/mysql/schemas/org/organization-membership-roles.cjs +11 -2
  200. package/dist/lib/mysql/schemas/org/organization-membership-roles.cjs.map +1 -1
  201. package/dist/lib/mysql/schemas/org/organization-membership-roles.js +4 -4
  202. package/dist/lib/mysql/schemas/org/organization-memberships.cjs +11 -2
  203. package/dist/lib/mysql/schemas/org/organization-memberships.cjs.map +1 -1
  204. package/dist/lib/mysql/schemas/org/organization-memberships.d.cts +16 -0
  205. package/dist/lib/mysql/schemas/org/organization-memberships.d.ts +16 -0
  206. package/dist/lib/mysql/schemas/org/organization-memberships.js +4 -4
  207. package/dist/lib/mysql/schemas/org/organizations.cjs +11 -2
  208. package/dist/lib/mysql/schemas/org/organizations.cjs.map +1 -1
  209. package/dist/lib/mysql/schemas/org/organizations.d.cts +16 -0
  210. package/dist/lib/mysql/schemas/org/organizations.d.ts +16 -0
  211. package/dist/lib/mysql/schemas/org/organizations.js +4 -4
  212. package/dist/lib/mysql/workflows/content-resource-workflow-utils.cjs +40 -0
  213. package/dist/lib/mysql/workflows/content-resource-workflow-utils.cjs.map +1 -0
  214. package/dist/lib/mysql/workflows/content-resource-workflow-utils.d.cts +4 -0
  215. package/dist/lib/mysql/workflows/content-resource-workflow-utils.d.ts +4 -0
  216. package/dist/lib/mysql/workflows/content-resource-workflow-utils.js +10 -0
  217. package/dist/lib/mysql/workflows/content-resource-workflow-utils.js.map +1 -0
  218. package/dist/lib/mysql/workflows/create-cohort.cjs +184 -0
  219. package/dist/lib/mysql/workflows/create-cohort.cjs.map +1 -0
  220. package/dist/lib/mysql/workflows/create-cohort.d.cts +24 -0
  221. package/dist/lib/mysql/workflows/create-cohort.d.ts +24 -0
  222. package/dist/lib/mysql/workflows/create-cohort.js +9 -0
  223. package/dist/lib/mysql/workflows/create-cohort.js.map +1 -0
  224. package/dist/lib/mysql/workflows/create-event-series.cjs +283 -0
  225. package/dist/lib/mysql/workflows/create-event-series.cjs.map +1 -0
  226. package/dist/lib/mysql/workflows/create-event-series.d.cts +24 -0
  227. package/dist/lib/mysql/workflows/create-event-series.d.ts +24 -0
  228. package/dist/lib/mysql/workflows/create-event-series.js +9 -0
  229. package/dist/lib/mysql/workflows/create-event-series.js.map +1 -0
  230. package/dist/lib/mysql/workflows/create-event.cjs +194 -0
  231. package/dist/lib/mysql/workflows/create-event.cjs.map +1 -0
  232. package/dist/lib/mysql/workflows/create-event.d.cts +24 -0
  233. package/dist/lib/mysql/workflows/create-event.d.ts +24 -0
  234. package/dist/lib/mysql/workflows/create-event.js +9 -0
  235. package/dist/lib/mysql/workflows/create-event.js.map +1 -0
  236. package/dist/lib/mysql/workflows/create-merchant-charge-and-purchase.cjs +231 -0
  237. package/dist/lib/mysql/workflows/create-merchant-charge-and-purchase.cjs.map +1 -0
  238. package/dist/lib/mysql/workflows/create-merchant-charge-and-purchase.d.cts +22 -0
  239. package/dist/lib/mysql/workflows/create-merchant-charge-and-purchase.d.ts +22 -0
  240. package/dist/lib/mysql/workflows/create-merchant-charge-and-purchase.js +8 -0
  241. package/dist/lib/mysql/workflows/create-merchant-charge-and-purchase.js.map +1 -0
  242. package/dist/lib/mysql/workflows/create-workshop.cjs +286 -0
  243. package/dist/lib/mysql/workflows/create-workshop.cjs.map +1 -0
  244. package/dist/lib/mysql/workflows/create-workshop.d.cts +24 -0
  245. package/dist/lib/mysql/workflows/create-workshop.d.ts +24 -0
  246. package/dist/lib/mysql/workflows/create-workshop.js +9 -0
  247. package/dist/lib/mysql/workflows/create-workshop.js.map +1 -0
  248. package/dist/lib/mysql/workflows/redeem-full-price-coupon.cjs +130 -0
  249. package/dist/lib/mysql/workflows/redeem-full-price-coupon.cjs.map +1 -0
  250. package/dist/lib/mysql/workflows/redeem-full-price-coupon.d.cts +24 -0
  251. package/dist/lib/mysql/workflows/redeem-full-price-coupon.d.ts +24 -0
  252. package/dist/lib/mysql/workflows/redeem-full-price-coupon.js +8 -0
  253. package/dist/lib/mysql/workflows/redeem-full-price-coupon.js.map +1 -0
  254. package/dist/lib/mysql/workflows/transfer-purchase-to-user.cjs +95 -0
  255. package/dist/lib/mysql/workflows/transfer-purchase-to-user.cjs.map +1 -0
  256. package/dist/lib/mysql/workflows/transfer-purchase-to-user.d.cts +30 -0
  257. package/dist/lib/mysql/workflows/transfer-purchase-to-user.d.ts +30 -0
  258. package/dist/lib/mysql/workflows/transfer-purchase-to-user.js +8 -0
  259. package/dist/lib/mysql/workflows/transfer-purchase-to-user.js.map +1 -0
  260. package/dist/lib/utils.d.cts +1 -10
  261. package/dist/lib/utils.d.ts +1 -10
  262. package/dist/types.d.ts +14 -0
  263. package/dist/types.js +1 -0
  264. package/package.json +9 -5
  265. package/src/index.ts +3 -2
  266. package/src/lib/mysql/context.ts +20 -0
  267. package/src/lib/mysql/index.ts +118 -4873
  268. package/src/lib/mysql/ports/auth-storage.ts +139 -0
  269. package/src/lib/mysql/ports/catalog.ts +610 -0
  270. package/src/lib/mysql/ports/content-resource.ts +442 -0
  271. package/src/lib/mysql/ports/coupon.ts +387 -0
  272. package/src/lib/mysql/ports/entitlement.ts +96 -0
  273. package/src/lib/mysql/ports/identity.ts +160 -0
  274. package/src/lib/mysql/ports/merchant.ts +274 -0
  275. package/src/lib/mysql/ports/organization.ts +216 -0
  276. package/src/lib/mysql/ports/progress.ts +366 -0
  277. package/src/lib/mysql/ports/purchase.ts +517 -0
  278. package/src/lib/mysql/ports/subscription.ts +93 -0
  279. package/src/lib/mysql/schema.ts +374 -0
  280. package/src/lib/mysql/schemas/org/organization-memberships.ts +7 -0
  281. package/src/lib/mysql/schemas/org/organizations.ts +8 -0
  282. package/src/lib/mysql/workflows/content-resource-workflow-utils.ts +22 -0
  283. package/src/lib/mysql/workflows/create-cohort.ts +239 -0
  284. package/src/lib/mysql/workflows/create-event-series.ts +384 -0
  285. package/src/lib/mysql/workflows/create-event.ts +232 -0
  286. package/src/lib/mysql/workflows/create-merchant-charge-and-purchase.ts +365 -0
  287. package/src/lib/mysql/workflows/create-workshop.ts +372 -0
  288. package/src/lib/mysql/workflows/redeem-full-price-coupon.ts +179 -0
  289. package/src/lib/mysql/workflows/transfer-purchase-to-user.ts +142 -0
  290. package/src/types.ts +33 -0
  291. package/dist/authjs.d.ts +0 -27
  292. package/dist/authjs.js +0 -1
  293. package/dist/chunk-62VSIVME.js +0 -4714
  294. package/dist/chunk-RVXF3JZ7.js +0 -8732
  295. package/dist/chunk-WEJL5OFI.js +0 -8732
  296. package/src/authjs.ts +0 -34
@@ -0,0 +1,442 @@
1
+ import { and, asc, eq, or, sql } from 'drizzle-orm'
2
+
3
+ import type { ContentResourcePort } from '@coursebuilder/core/ports'
4
+ import {
5
+ ContentResourceResourceSchema,
6
+ ContentResourceSchema,
7
+ type ContentResource,
8
+ } from '@coursebuilder/core/schemas/content-resource-schema'
9
+ import { VideoResourceSchema } from '@coursebuilder/core/schemas/video-resource'
10
+ import { logger as baseLogger } from '@coursebuilder/utils/logger'
11
+
12
+ import type { MySqlContext } from '../context.js'
13
+
14
+ type OrdinaryContentResourcePort = Omit<
15
+ ContentResourcePort,
16
+ 'createEvent' | 'createEventSeries' | 'createCohort' | 'createWorkshop'
17
+ >
18
+
19
+ function toError(error: unknown) {
20
+ return error instanceof Error ? error : new Error(String(error))
21
+ }
22
+
23
+ const logger = baseLogger as unknown as {
24
+ error: (error: Error, attrs?: Record<string, unknown>) => void
25
+ debug: (message: string, attrs?: Record<string, unknown>) => void
26
+ }
27
+
28
+ /**
29
+ * Creates the MySQL implementation of ordinary content resource persistence.
30
+ *
31
+ * @param context - The shared MySQL client and table set.
32
+ * @returns The eight content resource operations without composition creators.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * const contentResourcePort = createContentResourcePort(context)
37
+ * ```
38
+ */
39
+ export function createContentResourcePort({
40
+ client,
41
+ tables,
42
+ }: MySqlContext): OrdinaryContentResourcePort {
43
+ const { contentResource, contentResourceResource, contentResourceTag } =
44
+ tables
45
+
46
+ return {
47
+ addResourceToResource: async function (options) {
48
+ const { parentResourceId, childResourceId } = options
49
+
50
+ const parentResourceData = await client.query.contentResource.findFirst({
51
+ where: or(
52
+ eq(
53
+ sql`JSON_EXTRACT (${contentResource.fields}, "$.slug")`,
54
+ parentResourceId,
55
+ ),
56
+ eq(contentResource.id, parentResourceId),
57
+ ),
58
+ with: {
59
+ resources: true,
60
+ },
61
+ })
62
+
63
+ const parsedParentResource =
64
+ ContentResourceSchema.safeParse(parentResourceData)
65
+ if (!parsedParentResource.success) {
66
+ return null
67
+ }
68
+
69
+ const parentResource = parsedParentResource.data
70
+
71
+ await client.insert(contentResourceResource).values({
72
+ resourceOfId: parentResource.id,
73
+ resourceId: childResourceId,
74
+ position: parentResource.resources?.length || 0,
75
+ })
76
+
77
+ const resourceJoin = await client.query.contentResourceResource.findFirst(
78
+ {
79
+ where: and(
80
+ eq(contentResourceResource.resourceOfId, parentResource.id),
81
+ eq(contentResourceResource.resourceId, childResourceId),
82
+ ),
83
+ with: {
84
+ resource: true,
85
+ },
86
+ },
87
+ )
88
+
89
+ const parsedResourceJoin =
90
+ ContentResourceResourceSchema.safeParse(resourceJoin)
91
+ if (!parsedResourceJoin.success) {
92
+ return null
93
+ }
94
+
95
+ return parsedResourceJoin.data
96
+ },
97
+ async removeResourceFromResource(options) {
98
+ const { childResourceId, parentResourceId } = options
99
+
100
+ const parentResourceData = await client.query.contentResource.findFirst({
101
+ where: or(
102
+ eq(
103
+ sql`JSON_EXTRACT (${contentResource.fields}, "$.slug")`,
104
+ parentResourceId,
105
+ ),
106
+ eq(contentResource.id, parentResourceId),
107
+ ),
108
+ })
109
+
110
+ const parsedParentResource =
111
+ ContentResourceSchema.safeParse(parentResourceData)
112
+ if (!parsedParentResource.success) {
113
+ return null
114
+ }
115
+
116
+ const parentResource = parsedParentResource.data
117
+
118
+ const resourceJoin = await client.query.contentResourceResource.findFirst(
119
+ {
120
+ where: and(
121
+ eq(contentResourceResource.resourceOfId, parentResource.id),
122
+ eq(contentResourceResource.resourceId, childResourceId),
123
+ ),
124
+ with: {
125
+ resource: true,
126
+ },
127
+ },
128
+ )
129
+
130
+ const parsedResourceJoin =
131
+ ContentResourceResourceSchema.safeParse(resourceJoin)
132
+ if (!parsedResourceJoin.success) {
133
+ return null
134
+ }
135
+
136
+ await client
137
+ .delete(contentResourceResource)
138
+ .where(
139
+ and(
140
+ eq(contentResourceResource.resourceOfId, parentResource.id),
141
+ eq(contentResourceResource.resourceId, childResourceId),
142
+ ),
143
+ )
144
+
145
+ return parsedResourceJoin.data.resource
146
+ },
147
+ async updateContentResourceFields(options) {
148
+ if (!options.id) {
149
+ throw new Error('No content resource id.')
150
+ }
151
+
152
+ const currentResource = await client
153
+ .select()
154
+ .from(contentResource)
155
+ .where(eq(contentResource.id, options.id))
156
+ .then((res) => res[0])
157
+
158
+ await client
159
+ .update(contentResource)
160
+ .set({ fields: { ...currentResource.fields, ...options.fields } })
161
+ .where(eq(contentResource.id, options.id))
162
+
163
+ const resource = await client.query.contentResource.findFirst({
164
+ where: eq(contentResource.id, options.id),
165
+ with: {
166
+ resources: {
167
+ with: {
168
+ resource: {
169
+ with: {
170
+ resources: {
171
+ with: {
172
+ resource: true,
173
+ },
174
+ orderBy: asc(contentResourceResource.position),
175
+ },
176
+ },
177
+ },
178
+ },
179
+ orderBy: asc(contentResourceResource.position),
180
+ },
181
+ },
182
+ })
183
+
184
+ const parsedResource = ContentResourceSchema.safeParse(resource)
185
+
186
+ if (!parsedResource.success) {
187
+ logger.error(parsedResource.error, {
188
+ event: 'adapter.contentResource.parse_failed',
189
+ resourceId: options.id,
190
+ })
191
+ return null
192
+ }
193
+
194
+ return parsedResource.data
195
+ },
196
+ async getVideoResource(id) {
197
+ if (!id) {
198
+ return null
199
+ }
200
+
201
+ const query = sql`
202
+ SELECT
203
+ id as id,
204
+ CAST(updatedAt AS DATETIME) as updatedAt,
205
+ CAST(createdAt AS DATETIME) as createdAt,
206
+ JSON_EXTRACT (${contentResource.fields}, "$.state") AS state,
207
+ JSON_EXTRACT (${contentResource.fields}, "$.duration") AS duration,
208
+ JSON_UNQUOTE(JSON_EXTRACT (${contentResource.fields}, "$.resolution")) AS resolution,
209
+ JSON_EXTRACT (${contentResource.fields}, "$.muxPlaybackId") AS muxPlaybackId,
210
+ JSON_EXTRACT (${contentResource.fields}, "$.muxAssetId") AS muxAssetId,
211
+ JSON_EXTRACT (${contentResource.fields}, "$.transcript") AS transcript,
212
+ JSON_EXTRACT (${contentResource.fields}, "$.chapters") AS chapters
213
+ FROM
214
+ ${contentResource}
215
+ WHERE
216
+ type = 'videoResource'
217
+ AND (id = ${id});
218
+
219
+ `
220
+ return client
221
+ .execute(query)
222
+ .then((result: any) => {
223
+ const rows = Array.isArray(result) ? result[0] : result.rows
224
+ const parsedResource = VideoResourceSchema.safeParse(rows?.[0])
225
+ return parsedResource.success ? parsedResource.data : null
226
+ })
227
+ .catch((error) => {
228
+ logger.error(toError(error), {
229
+ event: 'adapter.videoResource.lookup.failed',
230
+ resourceId: id,
231
+ })
232
+ throw error
233
+ })
234
+ },
235
+ async getParentResourceOfVideoResource(
236
+ videoResourceId: string,
237
+ ): Promise<ContentResource | null> {
238
+ if (!videoResourceId) {
239
+ return null
240
+ }
241
+
242
+ // Use a SQL query to find the parent post or lesson of this video resource
243
+ const results = await client
244
+ .select()
245
+ .from(contentResource)
246
+ .innerJoin(
247
+ contentResourceResource,
248
+ eq(contentResourceResource.resourceOfId, contentResource.id),
249
+ )
250
+ .where(
251
+ and(
252
+ eq(contentResourceResource.resourceId, videoResourceId),
253
+ or(
254
+ eq(contentResource.type, 'post'),
255
+ eq(contentResource.type, 'lesson'),
256
+ ),
257
+ ),
258
+ )
259
+ .limit(1)
260
+
261
+ if (!results || results.length === 0) {
262
+ return null
263
+ }
264
+
265
+ const resourceData = results[0]?.ContentResource
266
+
267
+ if (!resourceData) {
268
+ return null
269
+ }
270
+
271
+ // Fetch the full resource with relationships
272
+ const fullResource = await client.query.contentResource.findFirst({
273
+ where: eq(contentResource.id, resourceData.id),
274
+ with: {
275
+ resources: true,
276
+ },
277
+ })
278
+
279
+ if (!fullResource) {
280
+ return null
281
+ }
282
+
283
+ return ContentResourceSchema.parse(fullResource)
284
+ },
285
+ async createContentResource(data) {
286
+ const id = data.id || crypto.randomUUID()
287
+
288
+ await client.insert(contentResource).values({ ...data, id })
289
+
290
+ const resource = await client.query.contentResource.findFirst({
291
+ where: eq(contentResource.id, id),
292
+ with: {
293
+ resources: {
294
+ with: {
295
+ resource: {
296
+ with: {
297
+ resources: {
298
+ with: {
299
+ resource: true,
300
+ },
301
+ orderBy: asc(contentResourceResource.position),
302
+ },
303
+ },
304
+ },
305
+ },
306
+ orderBy: asc(contentResourceResource.position),
307
+ },
308
+ },
309
+ })
310
+
311
+ const parsedResource = ContentResourceSchema.safeParse(resource)
312
+
313
+ if (!parsedResource.success) {
314
+ logger.error(parsedResource.error, {
315
+ event: 'adapter.contentResource.parse_failed',
316
+ resourceId: id,
317
+ resourceType: data.type,
318
+ })
319
+ throw new Error('Error parsing resource')
320
+ }
321
+
322
+ return parsedResource.data
323
+ },
324
+ async getContentResource(data) {
325
+ const resource = await client.query.contentResource.findFirst({
326
+ where: or(
327
+ eq(contentResource.id, data),
328
+ eq(
329
+ sql`JSON_EXTRACT (${contentResource.fields}, "$.slug")`,
330
+ `${data}`,
331
+ ),
332
+ ),
333
+ with: {
334
+ resources: {
335
+ with: {
336
+ resource: {
337
+ with: {
338
+ resources: {
339
+ with: {
340
+ resource: {
341
+ with: {
342
+ resources: {
343
+ with: {
344
+ resource: true,
345
+ },
346
+ },
347
+ },
348
+ },
349
+ },
350
+ orderBy: asc(contentResourceResource.position),
351
+ },
352
+ },
353
+ },
354
+ },
355
+ orderBy: asc(contentResourceResource.position),
356
+ },
357
+ },
358
+ })
359
+
360
+ const parsedResource = ContentResourceSchema.safeParse(resource)
361
+
362
+ if (!parsedResource.success) {
363
+ logger.error(parsedResource.error, {
364
+ event: 'adapter.contentResource.parse_failed',
365
+ resourceId: resource?.id,
366
+ resourceIdOrSlug: data,
367
+ })
368
+ return null
369
+ }
370
+
371
+ return parsedResource.data
372
+ },
373
+ async getEvent(
374
+ eventIdOrSlug: string,
375
+ options?: {
376
+ withResources?: boolean
377
+ withTags?: boolean
378
+ withProducts?: boolean
379
+ withPricing?: boolean
380
+ },
381
+ ): Promise<ContentResource | null> {
382
+ const {
383
+ withResources = false,
384
+ withTags = false,
385
+ withProducts = false,
386
+ withPricing = false,
387
+ } = options || {}
388
+
389
+ const eventQuery = await client.query.contentResource.findFirst({
390
+ where: and(
391
+ or(
392
+ eq(contentResource.type, 'event'),
393
+ eq(contentResource.type, 'event-series'),
394
+ ),
395
+ or(
396
+ eq(contentResource.id, eventIdOrSlug),
397
+ eq(
398
+ sql`JSON_EXTRACT (${contentResource.fields}, "$.slug")`,
399
+ eventIdOrSlug,
400
+ ),
401
+ ),
402
+ ),
403
+ with: {
404
+ ...(withResources && {
405
+ resources: {
406
+ with: { resource: true },
407
+ orderBy: asc(contentResourceResource.position),
408
+ },
409
+ }),
410
+ ...(withTags && {
411
+ tags: {
412
+ with: { tag: true },
413
+ orderBy: asc(contentResourceTag.position),
414
+ },
415
+ }),
416
+ ...(withProducts && {
417
+ resourceProducts: {
418
+ with: {
419
+ product: {
420
+ ...(withPricing && {
421
+ with: { price: true },
422
+ }),
423
+ },
424
+ },
425
+ },
426
+ }),
427
+ },
428
+ })
429
+
430
+ const parsedEvent = ContentResourceSchema.safeParse(eventQuery)
431
+ if (!parsedEvent.success) {
432
+ logger.debug('Error parsing event', {
433
+ eventQuery,
434
+ error: parsedEvent.error,
435
+ })
436
+ return null
437
+ }
438
+
439
+ return parsedEvent.data
440
+ },
441
+ }
442
+ }