@shizuoka-its/core 2.1.2 → 3.0.0-rc.1

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 (524) hide show
  1. package/README.md +45 -25
  2. package/dist/_virtual/_rolldown/runtime.cjs +13 -0
  3. package/dist/_virtual/_rolldown/runtime.mjs +13 -0
  4. package/dist/application/exceptions/ApplicationExceptions.cjs +124 -0
  5. package/dist/application/exceptions/ApplicationExceptions.cjs.map +1 -0
  6. package/dist/application/exceptions/ApplicationExceptions.mjs +115 -0
  7. package/dist/application/exceptions/ApplicationExceptions.mjs.map +1 -0
  8. package/dist/application/index.cjs +39 -0
  9. package/dist/application/index.mjs +40 -0
  10. package/dist/application/usecase/base.cjs +11 -0
  11. package/dist/application/usecase/base.cjs.map +1 -0
  12. package/dist/application/usecase/base.d.cts +12 -0
  13. package/dist/application/usecase/base.d.mts +12 -0
  14. package/dist/application/usecase/base.mjs +11 -0
  15. package/dist/application/usecase/base.mjs.map +1 -0
  16. package/dist/application/usecase/event/AddExhibitToEvent.cjs +27 -0
  17. package/dist/application/usecase/event/AddExhibitToEvent.cjs.map +1 -0
  18. package/dist/application/usecase/event/AddExhibitToEvent.d.cts +32 -0
  19. package/dist/application/usecase/event/AddExhibitToEvent.d.mts +32 -0
  20. package/dist/application/usecase/event/AddExhibitToEvent.mjs +27 -0
  21. package/dist/application/usecase/event/AddExhibitToEvent.mjs.map +1 -0
  22. package/dist/application/usecase/event/ChangeExhibitDescription.cjs +23 -0
  23. package/dist/application/usecase/event/ChangeExhibitDescription.cjs.map +1 -0
  24. package/dist/application/usecase/event/ChangeExhibitDescription.d.cts +26 -0
  25. package/dist/application/usecase/event/ChangeExhibitDescription.d.mts +26 -0
  26. package/dist/application/usecase/event/ChangeExhibitDescription.mjs +23 -0
  27. package/dist/application/usecase/event/ChangeExhibitDescription.mjs.map +1 -0
  28. package/dist/application/usecase/event/ChangeExhibitMarkdownContent.cjs +23 -0
  29. package/dist/application/usecase/event/ChangeExhibitMarkdownContent.cjs.map +1 -0
  30. package/dist/application/usecase/event/ChangeExhibitMarkdownContent.d.cts +26 -0
  31. package/dist/application/usecase/event/ChangeExhibitMarkdownContent.d.mts +26 -0
  32. package/dist/application/usecase/event/ChangeExhibitMarkdownContent.mjs +23 -0
  33. package/dist/application/usecase/event/ChangeExhibitMarkdownContent.mjs.map +1 -0
  34. package/dist/application/usecase/event/ChangeExhibitName.cjs +23 -0
  35. package/dist/application/usecase/event/ChangeExhibitName.cjs.map +1 -0
  36. package/dist/application/usecase/event/ChangeExhibitName.d.cts +26 -0
  37. package/dist/application/usecase/event/ChangeExhibitName.d.mts +26 -0
  38. package/dist/application/usecase/event/ChangeExhibitName.mjs +23 -0
  39. package/dist/application/usecase/event/ChangeExhibitName.mjs.map +1 -0
  40. package/dist/application/usecase/event/ChangeExhibitUrl.cjs +23 -0
  41. package/dist/application/usecase/event/ChangeExhibitUrl.cjs.map +1 -0
  42. package/dist/application/usecase/event/ChangeExhibitUrl.d.cts +27 -0
  43. package/dist/application/usecase/event/ChangeExhibitUrl.d.mts +27 -0
  44. package/dist/application/usecase/event/ChangeExhibitUrl.mjs +23 -0
  45. package/dist/application/usecase/event/ChangeExhibitUrl.mjs.map +1 -0
  46. package/dist/application/usecase/event/ChangeLightningTalkDuration.cjs +23 -0
  47. package/dist/application/usecase/event/ChangeLightningTalkDuration.cjs.map +1 -0
  48. package/dist/application/usecase/event/ChangeLightningTalkDuration.d.cts +27 -0
  49. package/dist/application/usecase/event/ChangeLightningTalkDuration.d.mts +27 -0
  50. package/dist/application/usecase/event/ChangeLightningTalkDuration.mjs +23 -0
  51. package/dist/application/usecase/event/ChangeLightningTalkDuration.mjs.map +1 -0
  52. package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.cjs +23 -0
  53. package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.cjs.map +1 -0
  54. package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.d.cts +27 -0
  55. package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.d.mts +27 -0
  56. package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.mjs +23 -0
  57. package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.mjs.map +1 -0
  58. package/dist/application/usecase/event/ChangeLightningTalkStartTime.cjs +23 -0
  59. package/dist/application/usecase/event/ChangeLightningTalkStartTime.cjs.map +1 -0
  60. package/dist/application/usecase/event/ChangeLightningTalkStartTime.d.cts +26 -0
  61. package/dist/application/usecase/event/ChangeLightningTalkStartTime.d.mts +26 -0
  62. package/dist/application/usecase/event/ChangeLightningTalkStartTime.mjs +23 -0
  63. package/dist/application/usecase/event/ChangeLightningTalkStartTime.mjs.map +1 -0
  64. package/dist/application/usecase/event/CreateEvent.cjs +23 -0
  65. package/dist/application/usecase/event/CreateEvent.cjs.map +1 -0
  66. package/dist/application/usecase/event/CreateEvent.d.cts +25 -0
  67. package/dist/application/usecase/event/CreateEvent.d.mts +25 -0
  68. package/dist/application/usecase/event/CreateEvent.mjs +23 -0
  69. package/dist/application/usecase/event/CreateEvent.mjs.map +1 -0
  70. package/dist/application/usecase/event/DeleteEvent.cjs +22 -0
  71. package/dist/application/usecase/event/DeleteEvent.cjs.map +1 -0
  72. package/dist/application/usecase/event/DeleteEvent.d.cts +23 -0
  73. package/dist/application/usecase/event/DeleteEvent.d.mts +23 -0
  74. package/dist/application/usecase/event/DeleteEvent.mjs +22 -0
  75. package/dist/application/usecase/event/DeleteEvent.mjs.map +1 -0
  76. package/dist/application/usecase/event/GetEvent.cjs +18 -0
  77. package/dist/application/usecase/event/GetEvent.cjs.map +1 -0
  78. package/dist/application/usecase/event/GetEvent.d.cts +23 -0
  79. package/dist/application/usecase/event/GetEvent.d.mts +23 -0
  80. package/dist/application/usecase/event/GetEvent.mjs +18 -0
  81. package/dist/application/usecase/event/GetEvent.mjs.map +1 -0
  82. package/dist/application/usecase/event/GetEventList.cjs +15 -0
  83. package/dist/application/usecase/event/GetEventList.cjs.map +1 -0
  84. package/dist/application/usecase/event/GetEventList.d.cts +17 -0
  85. package/dist/application/usecase/event/GetEventList.d.mts +17 -0
  86. package/dist/application/usecase/event/GetEventList.mjs +15 -0
  87. package/dist/application/usecase/event/GetEventList.mjs.map +1 -0
  88. package/dist/application/usecase/event/RemoveExhibitFromEvent.cjs +23 -0
  89. package/dist/application/usecase/event/RemoveExhibitFromEvent.cjs.map +1 -0
  90. package/dist/application/usecase/event/RemoveExhibitFromEvent.d.cts +25 -0
  91. package/dist/application/usecase/event/RemoveExhibitFromEvent.d.mts +25 -0
  92. package/dist/application/usecase/event/RemoveExhibitFromEvent.mjs +23 -0
  93. package/dist/application/usecase/event/RemoveExhibitFromEvent.mjs.map +1 -0
  94. package/dist/application/usecase/event/UpdateEvent.cjs +21 -0
  95. package/dist/application/usecase/event/UpdateEvent.cjs.map +1 -0
  96. package/dist/application/usecase/event/UpdateEvent.d.cts +22 -0
  97. package/dist/application/usecase/event/UpdateEvent.d.mts +22 -0
  98. package/dist/application/usecase/event/UpdateEvent.mjs +21 -0
  99. package/dist/application/usecase/event/UpdateEvent.mjs.map +1 -0
  100. package/dist/application/usecase/event/index.cjs +14 -0
  101. package/dist/application/usecase/event/index.mjs +15 -0
  102. package/dist/application/usecase/eventParticipation/GetEventsByMember.cjs +15 -0
  103. package/dist/application/usecase/eventParticipation/GetEventsByMember.cjs.map +1 -0
  104. package/dist/application/usecase/eventParticipation/GetEventsByMember.d.cts +20 -0
  105. package/dist/application/usecase/eventParticipation/GetEventsByMember.d.mts +20 -0
  106. package/dist/application/usecase/eventParticipation/GetEventsByMember.mjs +15 -0
  107. package/dist/application/usecase/eventParticipation/GetEventsByMember.mjs.map +1 -0
  108. package/dist/application/usecase/eventParticipation/GetExhibitsByMember.cjs +18 -0
  109. package/dist/application/usecase/eventParticipation/GetExhibitsByMember.cjs.map +1 -0
  110. package/dist/application/usecase/eventParticipation/GetExhibitsByMember.d.cts +20 -0
  111. package/dist/application/usecase/eventParticipation/GetExhibitsByMember.d.mts +20 -0
  112. package/dist/application/usecase/eventParticipation/GetExhibitsByMember.mjs +18 -0
  113. package/dist/application/usecase/eventParticipation/GetExhibitsByMember.mjs.map +1 -0
  114. package/dist/application/usecase/eventParticipation/GetMembersByEvent.cjs +19 -0
  115. package/dist/application/usecase/eventParticipation/GetMembersByEvent.cjs.map +1 -0
  116. package/dist/application/usecase/eventParticipation/GetMembersByEvent.d.cts +22 -0
  117. package/dist/application/usecase/eventParticipation/GetMembersByEvent.d.mts +22 -0
  118. package/dist/application/usecase/eventParticipation/GetMembersByEvent.mjs +19 -0
  119. package/dist/application/usecase/eventParticipation/GetMembersByEvent.mjs.map +1 -0
  120. package/dist/application/usecase/eventParticipation/GetMembersByExhibit.cjs +19 -0
  121. package/dist/application/usecase/eventParticipation/GetMembersByExhibit.cjs.map +1 -0
  122. package/dist/application/usecase/eventParticipation/GetMembersByExhibit.d.cts +22 -0
  123. package/dist/application/usecase/eventParticipation/GetMembersByExhibit.d.mts +22 -0
  124. package/dist/application/usecase/eventParticipation/GetMembersByExhibit.mjs +19 -0
  125. package/dist/application/usecase/eventParticipation/GetMembersByExhibit.mjs.map +1 -0
  126. package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.cjs +22 -0
  127. package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.cjs.map +1 -0
  128. package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.d.cts +24 -0
  129. package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.d.mts +24 -0
  130. package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.mjs +22 -0
  131. package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.mjs.map +1 -0
  132. package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.cjs +22 -0
  133. package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.cjs.map +1 -0
  134. package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.d.cts +24 -0
  135. package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.d.mts +24 -0
  136. package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.mjs +22 -0
  137. package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.mjs.map +1 -0
  138. package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.cjs +21 -0
  139. package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.cjs.map +1 -0
  140. package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.d.cts +24 -0
  141. package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.d.mts +24 -0
  142. package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.mjs +21 -0
  143. package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.mjs.map +1 -0
  144. package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.cjs +21 -0
  145. package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.cjs.map +1 -0
  146. package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.d.cts +24 -0
  147. package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.d.mts +24 -0
  148. package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.mjs +21 -0
  149. package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.mjs.map +1 -0
  150. package/dist/application/usecase/karte/CorrectKarte.cjs +20 -0
  151. package/dist/application/usecase/karte/CorrectKarte.cjs.map +1 -0
  152. package/dist/application/usecase/karte/CorrectKarte.d.cts +20 -0
  153. package/dist/application/usecase/karte/CorrectKarte.d.mts +20 -0
  154. package/dist/application/usecase/karte/CorrectKarte.mjs +20 -0
  155. package/dist/application/usecase/karte/CorrectKarte.mjs.map +1 -0
  156. package/dist/application/usecase/karte/CreateKarte.cjs +19 -0
  157. package/dist/application/usecase/karte/CreateKarte.cjs.map +1 -0
  158. package/dist/application/usecase/karte/CreateKarte.d.cts +20 -0
  159. package/dist/application/usecase/karte/CreateKarte.d.mts +20 -0
  160. package/dist/application/usecase/karte/CreateKarte.mjs +19 -0
  161. package/dist/application/usecase/karte/CreateKarte.mjs.map +1 -0
  162. package/dist/application/usecase/karte/GetKarte.cjs +18 -0
  163. package/dist/application/usecase/karte/GetKarte.cjs.map +1 -0
  164. package/dist/application/usecase/karte/GetKarte.d.cts +20 -0
  165. package/dist/application/usecase/karte/GetKarte.d.mts +20 -0
  166. package/dist/application/usecase/karte/GetKarte.mjs +18 -0
  167. package/dist/application/usecase/karte/GetKarte.mjs.map +1 -0
  168. package/dist/application/usecase/karte/ImportKarte.cjs +19 -0
  169. package/dist/application/usecase/karte/ImportKarte.cjs.map +1 -0
  170. package/dist/application/usecase/karte/ImportKarte.d.cts +39 -0
  171. package/dist/application/usecase/karte/ImportKarte.d.mts +39 -0
  172. package/dist/application/usecase/karte/ImportKarte.mjs +19 -0
  173. package/dist/application/usecase/karte/ImportKarte.mjs.map +1 -0
  174. package/dist/application/usecase/karte/ListKartes.cjs +15 -0
  175. package/dist/application/usecase/karte/ListKartes.cjs.map +1 -0
  176. package/dist/application/usecase/karte/ListKartes.d.cts +17 -0
  177. package/dist/application/usecase/karte/ListKartes.d.mts +17 -0
  178. package/dist/application/usecase/karte/ListKartes.mjs +15 -0
  179. package/dist/application/usecase/karte/ListKartes.mjs.map +1 -0
  180. package/dist/application/usecase/karte/index.cjs +5 -0
  181. package/dist/application/usecase/karte/index.mjs +6 -0
  182. package/dist/application/usecase/member/ChangeDiscordNickName.cjs +20 -0
  183. package/dist/application/usecase/member/ChangeDiscordNickName.cjs.map +1 -0
  184. package/dist/application/usecase/member/ChangeDiscordNickName.d.cts +21 -0
  185. package/dist/application/usecase/member/ChangeDiscordNickName.d.mts +21 -0
  186. package/dist/application/usecase/member/ChangeDiscordNickName.mjs +20 -0
  187. package/dist/application/usecase/member/ChangeDiscordNickName.mjs.map +1 -0
  188. package/dist/application/usecase/member/ConnectDiscordAccount.cjs +27 -0
  189. package/dist/application/usecase/member/ConnectDiscordAccount.cjs.map +1 -0
  190. package/dist/application/usecase/member/ConnectDiscordAccount.d.cts +25 -0
  191. package/dist/application/usecase/member/ConnectDiscordAccount.d.mts +25 -0
  192. package/dist/application/usecase/member/ConnectDiscordAccount.mjs +27 -0
  193. package/dist/application/usecase/member/ConnectDiscordAccount.mjs.map +1 -0
  194. package/dist/application/usecase/member/GetMember.cjs +15 -0
  195. package/dist/application/usecase/member/GetMember.cjs.map +1 -0
  196. package/dist/application/usecase/member/GetMember.d.cts +20 -0
  197. package/dist/application/usecase/member/GetMember.d.mts +20 -0
  198. package/dist/application/usecase/member/GetMember.mjs +15 -0
  199. package/dist/application/usecase/member/GetMember.mjs.map +1 -0
  200. package/dist/application/usecase/member/GetMemberByDiscordId.cjs +18 -0
  201. package/dist/application/usecase/member/GetMemberByDiscordId.cjs.map +1 -0
  202. package/dist/application/usecase/member/GetMemberByDiscordId.d.cts +22 -0
  203. package/dist/application/usecase/member/GetMemberByDiscordId.d.mts +22 -0
  204. package/dist/application/usecase/member/GetMemberByDiscordId.mjs +18 -0
  205. package/dist/application/usecase/member/GetMemberByDiscordId.mjs.map +1 -0
  206. package/dist/application/usecase/member/GetMemberByEmail.cjs +15 -0
  207. package/dist/application/usecase/member/GetMemberByEmail.cjs.map +1 -0
  208. package/dist/application/usecase/member/GetMemberByEmail.d.cts +20 -0
  209. package/dist/application/usecase/member/GetMemberByEmail.d.mts +20 -0
  210. package/dist/application/usecase/member/GetMemberByEmail.mjs +15 -0
  211. package/dist/application/usecase/member/GetMemberByEmail.mjs.map +1 -0
  212. package/dist/application/usecase/member/GetMemberList.cjs +15 -0
  213. package/dist/application/usecase/member/GetMemberList.cjs.map +1 -0
  214. package/dist/application/usecase/member/GetMemberList.d.cts +17 -0
  215. package/dist/application/usecase/member/GetMemberList.d.mts +17 -0
  216. package/dist/application/usecase/member/GetMemberList.mjs +15 -0
  217. package/dist/application/usecase/member/GetMemberList.mjs.map +1 -0
  218. package/dist/application/usecase/member/RegisterMember.cjs +30 -0
  219. package/dist/application/usecase/member/RegisterMember.cjs.map +1 -0
  220. package/dist/application/usecase/member/RegisterMember.d.cts +28 -0
  221. package/dist/application/usecase/member/RegisterMember.d.mts +28 -0
  222. package/dist/application/usecase/member/RegisterMember.mjs +30 -0
  223. package/dist/application/usecase/member/RegisterMember.mjs.map +1 -0
  224. package/dist/application/usecase/member/UpdateMember.cjs +24 -0
  225. package/dist/application/usecase/member/UpdateMember.cjs.map +1 -0
  226. package/dist/application/usecase/member/UpdateMember.d.cts +26 -0
  227. package/dist/application/usecase/member/UpdateMember.d.mts +26 -0
  228. package/dist/application/usecase/member/UpdateMember.mjs +24 -0
  229. package/dist/application/usecase/member/UpdateMember.mjs.map +1 -0
  230. package/dist/application/usecase/member/index.cjs +8 -0
  231. package/dist/application/usecase/member/index.mjs +9 -0
  232. package/dist/domain/aggregates/discord-account/DiscordAccount.cjs +47 -0
  233. package/dist/domain/aggregates/discord-account/DiscordAccount.cjs.map +1 -0
  234. package/dist/domain/aggregates/discord-account/DiscordAccount.d.cts +43 -0
  235. package/dist/domain/aggregates/discord-account/DiscordAccount.d.mts +43 -0
  236. package/dist/domain/aggregates/discord-account/DiscordAccount.mjs +46 -0
  237. package/dist/domain/aggregates/discord-account/DiscordAccount.mjs.map +1 -0
  238. package/dist/domain/aggregates/discord-account/DiscordAccountRepository.d.cts +14 -0
  239. package/dist/domain/aggregates/discord-account/DiscordAccountRepository.d.mts +14 -0
  240. package/dist/domain/aggregates/discord-account/DiscordId.cjs +8 -0
  241. package/dist/domain/aggregates/discord-account/DiscordId.cjs.map +1 -0
  242. package/dist/domain/aggregates/discord-account/DiscordId.d.cts +9 -0
  243. package/dist/domain/aggregates/discord-account/DiscordId.d.mts +9 -0
  244. package/dist/domain/aggregates/discord-account/DiscordId.mjs +8 -0
  245. package/dist/domain/aggregates/discord-account/DiscordId.mjs.map +1 -0
  246. package/dist/domain/aggregates/event/Event.cjs +91 -0
  247. package/dist/domain/aggregates/event/Event.cjs.map +1 -0
  248. package/dist/domain/aggregates/event/Event.d.cts +59 -0
  249. package/dist/domain/aggregates/event/Event.d.mts +59 -0
  250. package/dist/domain/aggregates/event/Event.mjs +91 -0
  251. package/dist/domain/aggregates/event/Event.mjs.map +1 -0
  252. package/dist/domain/aggregates/event/EventId.cjs +8 -0
  253. package/dist/domain/aggregates/event/EventId.cjs.map +1 -0
  254. package/dist/domain/aggregates/event/EventId.d.cts +9 -0
  255. package/dist/domain/aggregates/event/EventId.d.mts +9 -0
  256. package/dist/domain/aggregates/event/EventId.mjs +8 -0
  257. package/dist/domain/aggregates/event/EventId.mjs.map +1 -0
  258. package/dist/domain/aggregates/event/EventRepository.d.cts +17 -0
  259. package/dist/domain/aggregates/event/EventRepository.d.mts +17 -0
  260. package/dist/domain/aggregates/event/Exhibit.cjs +86 -0
  261. package/dist/domain/aggregates/event/Exhibit.cjs.map +1 -0
  262. package/dist/domain/aggregates/event/Exhibit.d.cts +52 -0
  263. package/dist/domain/aggregates/event/Exhibit.d.mts +52 -0
  264. package/dist/domain/aggregates/event/Exhibit.mjs +86 -0
  265. package/dist/domain/aggregates/event/Exhibit.mjs.map +1 -0
  266. package/dist/domain/aggregates/event/ExhibitId.cjs +8 -0
  267. package/dist/domain/aggregates/event/ExhibitId.cjs.map +1 -0
  268. package/dist/domain/aggregates/event/ExhibitId.d.cts +9 -0
  269. package/dist/domain/aggregates/event/ExhibitId.d.mts +9 -0
  270. package/dist/domain/aggregates/event/ExhibitId.mjs +8 -0
  271. package/dist/domain/aggregates/event/ExhibitId.mjs.map +1 -0
  272. package/dist/domain/aggregates/event/LightningTalk.cjs +39 -0
  273. package/dist/domain/aggregates/event/LightningTalk.cjs.map +1 -0
  274. package/dist/domain/aggregates/event/LightningTalk.d.cts +27 -0
  275. package/dist/domain/aggregates/event/LightningTalk.d.mts +27 -0
  276. package/dist/domain/aggregates/event/LightningTalk.mjs +39 -0
  277. package/dist/domain/aggregates/event/LightningTalk.mjs.map +1 -0
  278. package/dist/domain/aggregates/event/LightningTalkDuration.cjs +12 -0
  279. package/dist/domain/aggregates/event/LightningTalkDuration.cjs.map +1 -0
  280. package/dist/domain/aggregates/event/LightningTalkDuration.d.cts +9 -0
  281. package/dist/domain/aggregates/event/LightningTalkDuration.d.mts +9 -0
  282. package/dist/domain/aggregates/event/LightningTalkDuration.mjs +12 -0
  283. package/dist/domain/aggregates/event/LightningTalkDuration.mjs.map +1 -0
  284. package/dist/domain/aggregates/event/Url.cjs +19 -0
  285. package/dist/domain/aggregates/event/Url.cjs.map +1 -0
  286. package/dist/domain/aggregates/event/Url.d.cts +9 -0
  287. package/dist/domain/aggregates/event/Url.d.mts +9 -0
  288. package/dist/domain/aggregates/event/Url.mjs +19 -0
  289. package/dist/domain/aggregates/event/Url.mjs.map +1 -0
  290. package/dist/domain/aggregates/index.cjs +25 -0
  291. package/dist/domain/aggregates/index.mjs +26 -0
  292. package/dist/domain/aggregates/karte/Assignee.cjs +7 -0
  293. package/dist/domain/aggregates/karte/Assignee.cjs.map +1 -0
  294. package/dist/domain/aggregates/karte/Assignee.d.cts +20 -0
  295. package/dist/domain/aggregates/karte/Assignee.d.mts +20 -0
  296. package/dist/domain/aggregates/karte/Assignee.mjs +7 -0
  297. package/dist/domain/aggregates/karte/Assignee.mjs.map +1 -0
  298. package/dist/domain/aggregates/karte/Client.cjs +20 -0
  299. package/dist/domain/aggregates/karte/Client.cjs.map +1 -0
  300. package/dist/domain/aggregates/karte/Client.d.cts +42 -0
  301. package/dist/domain/aggregates/karte/Client.d.mts +42 -0
  302. package/dist/domain/aggregates/karte/Client.mjs +19 -0
  303. package/dist/domain/aggregates/karte/Client.mjs.map +1 -0
  304. package/dist/domain/aggregates/karte/Consent.d.cts +14 -0
  305. package/dist/domain/aggregates/karte/Consent.d.mts +14 -0
  306. package/dist/domain/aggregates/karte/Consultation.d.cts +19 -0
  307. package/dist/domain/aggregates/karte/Consultation.d.mts +19 -0
  308. package/dist/domain/aggregates/karte/ConsultationCategory.cjs +89 -0
  309. package/dist/domain/aggregates/karte/ConsultationCategory.cjs.map +1 -0
  310. package/dist/domain/aggregates/karte/ConsultationCategory.d.cts +75 -0
  311. package/dist/domain/aggregates/karte/ConsultationCategory.d.mts +75 -0
  312. package/dist/domain/aggregates/karte/ConsultationCategory.mjs +89 -0
  313. package/dist/domain/aggregates/karte/ConsultationCategory.mjs.map +1 -0
  314. package/dist/domain/aggregates/karte/ConsultedAt.cjs +90 -0
  315. package/dist/domain/aggregates/karte/ConsultedAt.cjs.map +1 -0
  316. package/dist/domain/aggregates/karte/ConsultedAt.d.cts +49 -0
  317. package/dist/domain/aggregates/karte/ConsultedAt.d.mts +49 -0
  318. package/dist/domain/aggregates/karte/ConsultedAt.mjs +85 -0
  319. package/dist/domain/aggregates/karte/ConsultedAt.mjs.map +1 -0
  320. package/dist/domain/aggregates/karte/FollowUp.cjs +13 -0
  321. package/dist/domain/aggregates/karte/FollowUp.cjs.map +1 -0
  322. package/dist/domain/aggregates/karte/FollowUp.d.cts +8 -0
  323. package/dist/domain/aggregates/karte/FollowUp.d.mts +8 -0
  324. package/dist/domain/aggregates/karte/FollowUp.mjs +13 -0
  325. package/dist/domain/aggregates/karte/FollowUp.mjs.map +1 -0
  326. package/dist/domain/aggregates/karte/Karte.cjs +94 -0
  327. package/dist/domain/aggregates/karte/Karte.cjs.map +1 -0
  328. package/dist/domain/aggregates/karte/Karte.d.cts +131 -0
  329. package/dist/domain/aggregates/karte/Karte.d.mts +131 -0
  330. package/dist/domain/aggregates/karte/Karte.mjs +94 -0
  331. package/dist/domain/aggregates/karte/Karte.mjs.map +1 -0
  332. package/dist/domain/aggregates/karte/KarteId.cjs +8 -0
  333. package/dist/domain/aggregates/karte/KarteId.cjs.map +1 -0
  334. package/dist/domain/aggregates/karte/KarteId.d.cts +9 -0
  335. package/dist/domain/aggregates/karte/KarteId.d.mts +9 -0
  336. package/dist/domain/aggregates/karte/KarteId.mjs +8 -0
  337. package/dist/domain/aggregates/karte/KarteId.mjs.map +1 -0
  338. package/dist/domain/aggregates/karte/KarteRepository.d.cts +12 -0
  339. package/dist/domain/aggregates/karte/KarteRepository.d.mts +12 -0
  340. package/dist/domain/aggregates/karte/Resolution.cjs +7 -0
  341. package/dist/domain/aggregates/karte/Resolution.cjs.map +1 -0
  342. package/dist/domain/aggregates/karte/Resolution.d.cts +21 -0
  343. package/dist/domain/aggregates/karte/Resolution.d.mts +21 -0
  344. package/dist/domain/aggregates/karte/Resolution.mjs +7 -0
  345. package/dist/domain/aggregates/karte/Resolution.mjs.map +1 -0
  346. package/dist/domain/aggregates/karte/SupportRecord.d.cts +22 -0
  347. package/dist/domain/aggregates/karte/SupportRecord.d.mts +22 -0
  348. package/dist/domain/aggregates/karte/WorkDuration.cjs +11 -0
  349. package/dist/domain/aggregates/karte/WorkDuration.cjs.map +1 -0
  350. package/dist/domain/aggregates/karte/WorkDuration.d.cts +10 -0
  351. package/dist/domain/aggregates/karte/WorkDuration.d.mts +10 -0
  352. package/dist/domain/aggregates/karte/WorkDuration.mjs +11 -0
  353. package/dist/domain/aggregates/karte/WorkDuration.mjs.map +1 -0
  354. package/dist/domain/aggregates/karte/index.cjs +9 -0
  355. package/dist/domain/aggregates/karte/index.mjs +10 -0
  356. package/dist/domain/aggregates/member/Email.cjs +12 -0
  357. package/dist/domain/aggregates/member/Email.cjs.map +1 -0
  358. package/dist/domain/aggregates/member/Email.d.cts +9 -0
  359. package/dist/domain/aggregates/member/Email.d.mts +9 -0
  360. package/dist/domain/aggregates/member/Email.mjs +12 -0
  361. package/dist/domain/aggregates/member/Email.mjs.map +1 -0
  362. package/dist/domain/aggregates/member/Member.cjs +247 -0
  363. package/dist/domain/aggregates/member/Member.cjs.map +1 -0
  364. package/dist/domain/aggregates/member/Member.d.cts +91 -0
  365. package/dist/domain/aggregates/member/Member.d.mts +91 -0
  366. package/dist/domain/aggregates/member/Member.mjs +245 -0
  367. package/dist/domain/aggregates/member/Member.mjs.map +1 -0
  368. package/dist/domain/aggregates/member/MemberEvent.cjs +20 -0
  369. package/dist/domain/aggregates/member/MemberEvent.cjs.map +1 -0
  370. package/dist/domain/aggregates/member/MemberEvent.d.cts +115 -0
  371. package/dist/domain/aggregates/member/MemberEvent.d.mts +115 -0
  372. package/dist/domain/aggregates/member/MemberEvent.mjs +20 -0
  373. package/dist/domain/aggregates/member/MemberEvent.mjs.map +1 -0
  374. package/dist/domain/aggregates/member/MemberId.cjs +8 -0
  375. package/dist/domain/aggregates/member/MemberId.cjs.map +1 -0
  376. package/dist/domain/aggregates/member/MemberId.d.cts +9 -0
  377. package/dist/domain/aggregates/member/MemberId.d.mts +9 -0
  378. package/dist/domain/aggregates/member/MemberId.mjs +8 -0
  379. package/dist/domain/aggregates/member/MemberId.mjs.map +1 -0
  380. package/dist/domain/aggregates/member/MemberRepository.d.cts +14 -0
  381. package/dist/domain/aggregates/member/MemberRepository.d.mts +14 -0
  382. package/dist/domain/aggregates/member/UniversityEmail.cjs +14 -0
  383. package/dist/domain/aggregates/member/UniversityEmail.cjs.map +1 -0
  384. package/dist/domain/aggregates/member/UniversityEmail.d.cts +9 -0
  385. package/dist/domain/aggregates/member/UniversityEmail.d.mts +9 -0
  386. package/dist/domain/aggregates/member/UniversityEmail.mjs +14 -0
  387. package/dist/domain/aggregates/member/UniversityEmail.mjs.map +1 -0
  388. package/dist/domain/aggregates/member/index.cjs +5 -0
  389. package/dist/domain/aggregates/member/index.mjs +6 -0
  390. package/dist/domain/base/DomainEvent.d.cts +9 -0
  391. package/dist/domain/base/DomainEvent.d.mts +9 -0
  392. package/dist/domain/base/NonEmptyArray.d.cts +10 -0
  393. package/dist/domain/base/NonEmptyArray.d.mts +10 -0
  394. package/dist/domain/base/NonEmptyString.cjs +12 -0
  395. package/dist/domain/base/NonEmptyString.cjs.map +1 -0
  396. package/dist/domain/base/NonEmptyString.d.cts +12 -0
  397. package/dist/domain/base/NonEmptyString.d.mts +12 -0
  398. package/dist/domain/base/NonEmptyString.mjs +12 -0
  399. package/dist/domain/base/NonEmptyString.mjs.map +1 -0
  400. package/dist/domain/base/ValueObject.cjs +21 -0
  401. package/dist/domain/base/ValueObject.cjs.map +1 -0
  402. package/dist/domain/base/ValueObject.d.cts +12 -0
  403. package/dist/domain/base/ValueObject.d.mts +12 -0
  404. package/dist/domain/base/ValueObject.mjs +21 -0
  405. package/dist/domain/base/ValueObject.mjs.map +1 -0
  406. package/dist/domain/exceptions/DomainExceptions.cjs +196 -0
  407. package/dist/domain/exceptions/DomainExceptions.cjs.map +1 -0
  408. package/dist/domain/exceptions/DomainExceptions.d.cts +192 -0
  409. package/dist/domain/exceptions/DomainExceptions.d.mts +192 -0
  410. package/dist/domain/exceptions/DomainExceptions.mjs +181 -0
  411. package/dist/domain/exceptions/DomainExceptions.mjs.map +1 -0
  412. package/dist/domain/index.cjs +32 -0
  413. package/dist/domain/index.mjs +33 -0
  414. package/dist/domain/shared/Recorded.cjs +17 -0
  415. package/dist/domain/shared/Recorded.cjs.map +1 -0
  416. package/dist/domain/shared/Recorded.d.cts +20 -0
  417. package/dist/domain/shared/Recorded.d.mts +20 -0
  418. package/dist/domain/shared/Recorded.mjs +16 -0
  419. package/dist/domain/shared/Recorded.mjs.map +1 -0
  420. package/dist/domain/shared/StudentId.cjs +35 -0
  421. package/dist/domain/shared/StudentId.cjs.map +1 -0
  422. package/dist/domain/shared/StudentId.d.cts +25 -0
  423. package/dist/domain/shared/StudentId.d.mts +25 -0
  424. package/dist/domain/shared/StudentId.mjs +35 -0
  425. package/dist/domain/shared/StudentId.mjs.map +1 -0
  426. package/dist/domain/shared/affiliation/Affiliation.cjs +12 -0
  427. package/dist/domain/shared/affiliation/Affiliation.cjs.map +1 -0
  428. package/dist/domain/shared/affiliation/Affiliation.d.cts +59 -0
  429. package/dist/domain/shared/affiliation/Affiliation.d.mts +59 -0
  430. package/dist/domain/shared/affiliation/Affiliation.mjs +12 -0
  431. package/dist/domain/shared/affiliation/Affiliation.mjs.map +1 -0
  432. package/dist/domain/shared/affiliation/index.cjs +2 -0
  433. package/dist/domain/shared/affiliation/index.mjs +3 -0
  434. package/dist/domain/shared/affiliation/universityStructure.cjs +444 -0
  435. package/dist/domain/shared/affiliation/universityStructure.cjs.map +1 -0
  436. package/dist/domain/shared/affiliation/universityStructure.d.cts +262 -0
  437. package/dist/domain/shared/affiliation/universityStructure.d.mts +262 -0
  438. package/dist/domain/shared/affiliation/universityStructure.mjs +439 -0
  439. package/dist/domain/shared/affiliation/universityStructure.mjs.map +1 -0
  440. package/dist/domain/shared/index.cjs +5 -0
  441. package/dist/domain/shared/index.mjs +6 -0
  442. package/dist/executable/event.cjs +63 -0
  443. package/dist/executable/event.cjs.map +1 -0
  444. package/dist/executable/event.d.cts +56 -0
  445. package/dist/executable/event.d.mts +56 -0
  446. package/dist/executable/event.mjs +63 -0
  447. package/dist/executable/event.mjs.map +1 -0
  448. package/dist/executable/eventService.cjs +146 -0
  449. package/dist/executable/eventService.cjs.map +1 -0
  450. package/dist/executable/eventService.d.cts +143 -0
  451. package/dist/executable/eventService.d.mts +143 -0
  452. package/dist/executable/eventService.mjs +146 -0
  453. package/dist/executable/eventService.mjs.map +1 -0
  454. package/dist/executable/index.cjs +6 -0
  455. package/dist/executable/index.mjs +7 -0
  456. package/dist/executable/karte.cjs +24 -0
  457. package/dist/executable/karte.cjs.map +1 -0
  458. package/dist/executable/karte.d.cts +19 -0
  459. package/dist/executable/karte.d.mts +19 -0
  460. package/dist/executable/karte.mjs +24 -0
  461. package/dist/executable/karte.mjs.map +1 -0
  462. package/dist/executable/karteService.cjs +79 -0
  463. package/dist/executable/karteService.cjs.map +1 -0
  464. package/dist/executable/karteService.d.cts +87 -0
  465. package/dist/executable/karteService.d.mts +87 -0
  466. package/dist/executable/karteService.mjs +79 -0
  467. package/dist/executable/karteService.mjs.map +1 -0
  468. package/dist/executable/member.cjs +32 -0
  469. package/dist/executable/member.cjs.map +1 -0
  470. package/dist/executable/member.d.cts +25 -0
  471. package/dist/executable/member.d.mts +25 -0
  472. package/dist/executable/member.mjs +32 -0
  473. package/dist/executable/member.mjs.map +1 -0
  474. package/dist/executable/memberService.cjs +63 -0
  475. package/dist/executable/memberService.cjs.map +1 -0
  476. package/dist/executable/memberService.d.cts +59 -0
  477. package/dist/executable/memberService.d.mts +59 -0
  478. package/dist/executable/memberService.mjs +63 -0
  479. package/dist/executable/memberService.mjs.map +1 -0
  480. package/dist/index.cjs +105 -1914
  481. package/dist/index.d.cts +46 -754
  482. package/dist/index.d.mts +46 -0
  483. package/dist/index.mjs +39 -0
  484. package/dist/infrastructure/drizzle/DrizzleDiscordAccountRepository.cjs +57 -0
  485. package/dist/infrastructure/drizzle/DrizzleDiscordAccountRepository.cjs.map +1 -0
  486. package/dist/infrastructure/drizzle/DrizzleDiscordAccountRepository.mjs +57 -0
  487. package/dist/infrastructure/drizzle/DrizzleDiscordAccountRepository.mjs.map +1 -0
  488. package/dist/infrastructure/drizzle/DrizzleEventRepository.cjs +196 -0
  489. package/dist/infrastructure/drizzle/DrizzleEventRepository.cjs.map +1 -0
  490. package/dist/infrastructure/drizzle/DrizzleEventRepository.mjs +196 -0
  491. package/dist/infrastructure/drizzle/DrizzleEventRepository.mjs.map +1 -0
  492. package/dist/infrastructure/drizzle/DrizzleKarteRepository.cjs +241 -0
  493. package/dist/infrastructure/drizzle/DrizzleKarteRepository.cjs.map +1 -0
  494. package/dist/infrastructure/drizzle/DrizzleKarteRepository.mjs +241 -0
  495. package/dist/infrastructure/drizzle/DrizzleKarteRepository.mjs.map +1 -0
  496. package/dist/infrastructure/drizzle/DrizzleMemberRepository.cjs +112 -0
  497. package/dist/infrastructure/drizzle/DrizzleMemberRepository.cjs.map +1 -0
  498. package/dist/infrastructure/drizzle/DrizzleMemberRepository.mjs +112 -0
  499. package/dist/infrastructure/drizzle/DrizzleMemberRepository.mjs.map +1 -0
  500. package/dist/infrastructure/drizzle/client.cjs +20 -0
  501. package/dist/infrastructure/drizzle/client.cjs.map +1 -0
  502. package/dist/infrastructure/drizzle/client.mjs +20 -0
  503. package/dist/infrastructure/drizzle/client.mjs.map +1 -0
  504. package/dist/infrastructure/drizzle/index.cjs +4 -0
  505. package/dist/infrastructure/drizzle/index.mjs +5 -0
  506. package/dist/infrastructure/drizzle/schema.cjs +353 -0
  507. package/dist/infrastructure/drizzle/schema.cjs.map +1 -0
  508. package/dist/infrastructure/drizzle/schema.mjs +337 -0
  509. package/dist/infrastructure/drizzle/schema.mjs.map +1 -0
  510. package/dist/infrastructure/drizzle/serializeDiscordAccountEvent.cjs +14 -0
  511. package/dist/infrastructure/drizzle/serializeDiscordAccountEvent.cjs.map +1 -0
  512. package/dist/infrastructure/drizzle/serializeDiscordAccountEvent.mjs +14 -0
  513. package/dist/infrastructure/drizzle/serializeDiscordAccountEvent.mjs.map +1 -0
  514. package/dist/infrastructure/drizzle/serializeMemberEvent.cjs +61 -0
  515. package/dist/infrastructure/drizzle/serializeMemberEvent.cjs.map +1 -0
  516. package/dist/infrastructure/drizzle/serializeMemberEvent.mjs +61 -0
  517. package/dist/infrastructure/drizzle/serializeMemberEvent.mjs.map +1 -0
  518. package/dist/infrastructure/index.cjs +5 -0
  519. package/dist/infrastructure/index.mjs +6 -0
  520. package/package.json +67 -60
  521. package/dist/index.cjs.map +0 -1
  522. package/dist/index.d.ts +0 -754
  523. package/dist/index.js +0 -1875
  524. package/dist/index.js.map +0 -1
@@ -0,0 +1,196 @@
1
+ import { Event } from "../../domain/aggregates/event/Event.mjs";
2
+ import { eventId } from "../../domain/aggregates/event/EventId.mjs";
3
+ import { Exhibit } from "../../domain/aggregates/event/Exhibit.mjs";
4
+ import { exhibitId } from "../../domain/aggregates/event/ExhibitId.mjs";
5
+ import { LightningTalk } from "../../domain/aggregates/event/LightningTalk.mjs";
6
+ import { LightningTalkDuration } from "../../domain/aggregates/event/LightningTalkDuration.mjs";
7
+ import { Url } from "../../domain/aggregates/event/Url.mjs";
8
+ import { memberId } from "../../domain/aggregates/member/MemberId.mjs";
9
+ import "../../domain/index.mjs";
10
+ import { events, exhibits, lightningTalks, memberEvents, memberExhibits } from "./schema.mjs";
11
+ import { getDb } from "./client.mjs";
12
+ import { eq, inArray } from "drizzle-orm";
13
+ import { randomUUID } from "node:crypto";
14
+ //#region src/infrastructure/drizzle/DrizzleEventRepository.ts
15
+ var DrizzleEventRepository = class {
16
+ /**
17
+ * Converts a database record to a domain Event entity.
18
+ */
19
+ toDomain(record) {
20
+ const event = new Event(eventId(record.id), record.name, new Date(record.date));
21
+ for (const memberEvent of record.memberEvents) event.addMemberId(memberId(memberEvent.memberId));
22
+ for (const exhibitRecord of record.exhibits) {
23
+ const exhibit = this.createExhibitFromRecord(exhibitRecord);
24
+ for (const memberExhibit of exhibitRecord.memberExhibits) exhibit.addMemberId(memberId(memberExhibit.memberId));
25
+ event.addExhibit(exhibit);
26
+ }
27
+ return event;
28
+ }
29
+ /**
30
+ * Creates an Exhibit domain entity from a database record.
31
+ */
32
+ createExhibitFromRecord(record) {
33
+ if (record.lightningTalk) {
34
+ const lt = record.lightningTalk;
35
+ const lightningTalk = new LightningTalk(exhibitId(lt.exhibitId), new Date(lt.startTime), new LightningTalkDuration(lt.duration), lt.slideUrl ? new Url(lt.slideUrl) : void 0);
36
+ return Exhibit.createWithLightningTalk(exhibitId(record.id), record.name, lightningTalk, record.description ?? void 0, record.markdownContent ?? void 0, record.url ? new Url(record.url) : void 0);
37
+ }
38
+ return new Exhibit(exhibitId(record.id), record.name, record.description ?? void 0, record.markdownContent ?? void 0, record.url ? new Url(record.url) : void 0);
39
+ }
40
+ async persistEvent(event) {
41
+ const db = getDb();
42
+ const snapshot = event.toSnapshot();
43
+ const now = (/* @__PURE__ */ new Date()).toISOString();
44
+ const dateStr = snapshot.date instanceof Date ? snapshot.date.toISOString() : snapshot.date;
45
+ await db.insert(events).values({
46
+ id: snapshot.id,
47
+ name: snapshot.name,
48
+ date: dateStr,
49
+ updatedAt: now
50
+ }).onConflictDoUpdate({
51
+ target: events.id,
52
+ set: {
53
+ name: snapshot.name,
54
+ date: dateStr,
55
+ updatedAt: now
56
+ }
57
+ });
58
+ const snapshotExhibitIds = snapshot.exhibits.map((ex) => ex.id);
59
+ await this.deleteObsoleteExhibits(db, snapshot.id, snapshotExhibitIds);
60
+ for (const ex of snapshot.exhibits) await this.upsertExhibit(db, snapshot.id, ex);
61
+ await this.syncMemberEvents(db, snapshot.id, event.getMemberIds());
62
+ for (const exhibitDomain of event.getExhibits()) await this.syncMemberExhibits(db, exhibitDomain.id, exhibitDomain.getMemberIds());
63
+ }
64
+ async deleteObsoleteExhibits(db, eventId, keptExhibitIds) {
65
+ const existingExhibits = await db.select({ id: exhibits.id }).from(exhibits).where(eq(exhibits.eventId, eventId));
66
+ const existingIdSet = new Set(existingExhibits.map((r) => exhibitId(r.id)));
67
+ const keptIdSet = new Set(keptExhibitIds);
68
+ const obsoleteIds = [...existingIdSet].filter((id) => !keptIdSet.has(id));
69
+ if (obsoleteIds.length > 0) {
70
+ await db.delete(lightningTalks).where(inArray(lightningTalks.exhibitId, obsoleteIds));
71
+ await db.delete(memberExhibits).where(inArray(memberExhibits.exhibitId, obsoleteIds));
72
+ await db.delete(exhibits).where(inArray(exhibits.id, obsoleteIds));
73
+ }
74
+ }
75
+ async upsertExhibit(db, eventId, ex) {
76
+ const now = (/* @__PURE__ */ new Date()).toISOString();
77
+ await db.insert(exhibits).values({
78
+ id: ex.id,
79
+ name: ex.name,
80
+ description: ex.description ?? null,
81
+ markdownContent: ex.markdownContent ?? null,
82
+ url: ex.url?.getValue() ?? null,
83
+ eventId,
84
+ updatedAt: now
85
+ }).onConflictDoUpdate({
86
+ target: exhibits.id,
87
+ set: {
88
+ name: ex.name,
89
+ description: ex.description ?? null,
90
+ markdownContent: ex.markdownContent ?? null,
91
+ url: ex.url?.getValue() ?? null,
92
+ updatedAt: now
93
+ }
94
+ });
95
+ if (ex.lightningTalk) {
96
+ const startTimeStr = ex.lightningTalk.startTime instanceof Date ? ex.lightningTalk.startTime.toISOString() : ex.lightningTalk.startTime;
97
+ await db.insert(lightningTalks).values({
98
+ exhibitId: ex.id,
99
+ startTime: startTimeStr,
100
+ duration: ex.lightningTalk.durationMinutes.getValue(),
101
+ slideUrl: ex.lightningTalk.slideUrl?.getValue() ?? null,
102
+ updatedAt: now
103
+ }).onConflictDoUpdate({
104
+ target: lightningTalks.exhibitId,
105
+ set: {
106
+ startTime: startTimeStr,
107
+ duration: ex.lightningTalk.durationMinutes.getValue(),
108
+ slideUrl: ex.lightningTalk.slideUrl?.getValue() ?? null,
109
+ updatedAt: now
110
+ }
111
+ });
112
+ } else await db.delete(lightningTalks).where(eq(lightningTalks.exhibitId, ex.id));
113
+ }
114
+ async syncMemberEvents(db, eventId, memberIds) {
115
+ await db.delete(memberEvents).where(eq(memberEvents.eventId, eventId));
116
+ const now = (/* @__PURE__ */ new Date()).toISOString();
117
+ for (const memberId of memberIds) await db.insert(memberEvents).values({
118
+ id: randomUUID(),
119
+ memberId,
120
+ eventId,
121
+ updatedAt: now
122
+ }).onConflictDoNothing();
123
+ }
124
+ async syncMemberExhibits(db, exhibitId, memberIds) {
125
+ await db.delete(memberExhibits).where(eq(memberExhibits.exhibitId, exhibitId));
126
+ const now = (/* @__PURE__ */ new Date()).toISOString();
127
+ for (const memberId of memberIds) await db.insert(memberExhibits).values({
128
+ id: randomUUID(),
129
+ memberId,
130
+ exhibitId,
131
+ updatedAt: now
132
+ }).onConflictDoNothing();
133
+ }
134
+ async findById(id) {
135
+ const record = await getDb().query.events.findFirst({
136
+ where: eq(events.id, id),
137
+ with: {
138
+ memberEvents: true,
139
+ exhibits: { with: {
140
+ lightningTalk: true,
141
+ memberExhibits: true
142
+ } }
143
+ }
144
+ });
145
+ if (!record) return null;
146
+ return this.toDomain(record);
147
+ }
148
+ async findByParticipantMemberId(memberId) {
149
+ const db = getDb();
150
+ const participations = await db.select({ eventId: memberEvents.eventId }).from(memberEvents).where(eq(memberEvents.memberId, memberId));
151
+ if (participations.length === 0) return [];
152
+ const eventIds = participations.map((p) => p.eventId);
153
+ return (await db.query.events.findMany({
154
+ where: inArray(events.id, eventIds),
155
+ with: {
156
+ memberEvents: true,
157
+ exhibits: { with: {
158
+ lightningTalk: true,
159
+ memberExhibits: true
160
+ } }
161
+ }
162
+ })).map((r) => this.toDomain(r));
163
+ }
164
+ async findByExhibitId(exhibitId) {
165
+ const exhibit = await getDb().select({ eventId: exhibits.eventId }).from(exhibits).where(eq(exhibits.id, exhibitId)).limit(1);
166
+ if (exhibit.length === 0) return null;
167
+ return this.findById(eventId(exhibit[0].eventId));
168
+ }
169
+ async findAll() {
170
+ return (await getDb().query.events.findMany({ with: {
171
+ memberEvents: true,
172
+ exhibits: { with: {
173
+ lightningTalk: true,
174
+ memberExhibits: true
175
+ } }
176
+ } })).map((r) => this.toDomain(r));
177
+ }
178
+ async save(event) {
179
+ await this.persistEvent(event);
180
+ }
181
+ async delete(eventId) {
182
+ const db = getDb();
183
+ const exhibitIds = (await db.select({ id: exhibits.id }).from(exhibits).where(eq(exhibits.eventId, eventId))).map((ex) => ex.id);
184
+ if (exhibitIds.length > 0) {
185
+ await db.delete(lightningTalks).where(inArray(lightningTalks.exhibitId, exhibitIds));
186
+ await db.delete(memberExhibits).where(inArray(memberExhibits.exhibitId, exhibitIds));
187
+ }
188
+ await db.delete(memberEvents).where(eq(memberEvents.eventId, eventId));
189
+ await db.delete(exhibits).where(eq(exhibits.eventId, eventId));
190
+ await db.delete(events).where(eq(events.id, eventId));
191
+ }
192
+ };
193
+ //#endregion
194
+ export { DrizzleEventRepository };
195
+
196
+ //# sourceMappingURL=DrizzleEventRepository.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DrizzleEventRepository.mjs","names":[],"sources":["../../../src/infrastructure/drizzle/DrizzleEventRepository.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { eq, inArray } from \"drizzle-orm\";\nimport {\n\tEvent,\n\ttype EventId,\n\ttype EventRepository,\n\tExhibit,\n\ttype ExhibitId,\n\tLightningTalk,\n\tLightningTalkDuration,\n\ttype MemberId,\n\tUrl,\n\teventId,\n\texhibitId,\n\tmemberId,\n} from \"#domain\";\nimport { type DrizzleDb, getDb } from \"./client\";\nimport { events, exhibits, lightningTalks, memberEvents, memberExhibits } from \"./schema\";\n\n// ============================================================================\n// Type Definitions - Using $inferSelect for schema-derived types\n// ============================================================================\n\n/** Exhibit with related data - matches Drizzle's relational query result */\ntype ExhibitWithRelations = typeof exhibits.$inferSelect & {\n\tlightningTalk: typeof lightningTalks.$inferSelect | null;\n\tmemberExhibits: (typeof memberExhibits.$inferSelect)[];\n};\n\n/** Event with all related data - matches Drizzle's relational query result */\ntype EventWithRelations = typeof events.$inferSelect & {\n\texhibits: ExhibitWithRelations[];\n\tmemberEvents: (typeof memberEvents.$inferSelect)[];\n};\n\n// ============================================================================\n// Repository Implementation\n// ============================================================================\n\nexport class DrizzleEventRepository implements EventRepository {\n\t/**\n\t * Converts a database record to a domain Event entity.\n\t */\n\tprivate toDomain(record: EventWithRelations): Event {\n\t\tconst event = new Event(eventId(record.id), record.name, new Date(record.date));\n\n\t\t// Load event member IDs\n\t\tfor (const memberEvent of record.memberEvents) {\n\t\t\tevent.addMemberId(memberId(memberEvent.memberId));\n\t\t}\n\n\t\t// Load exhibits\n\t\tfor (const exhibitRecord of record.exhibits) {\n\t\t\tconst exhibit = this.createExhibitFromRecord(exhibitRecord);\n\n\t\t\t// Load exhibit member IDs\n\t\t\tfor (const memberExhibit of exhibitRecord.memberExhibits) {\n\t\t\t\texhibit.addMemberId(memberId(memberExhibit.memberId));\n\t\t\t}\n\n\t\t\tevent.addExhibit(exhibit);\n\t\t}\n\n\t\treturn event;\n\t}\n\n\t/**\n\t * Creates an Exhibit domain entity from a database record.\n\t */\n\tprivate createExhibitFromRecord(record: ExhibitWithRelations): Exhibit {\n\t\tif (record.lightningTalk) {\n\t\t\tconst lt = record.lightningTalk;\n\t\t\tconst lightningTalk = new LightningTalk(\n\t\t\t\texhibitId(lt.exhibitId),\n\t\t\t\tnew Date(lt.startTime),\n\t\t\t\tnew LightningTalkDuration(lt.duration),\n\t\t\t\tlt.slideUrl ? new Url(lt.slideUrl) : undefined,\n\t\t\t);\n\n\t\t\treturn Exhibit.createWithLightningTalk(\n\t\t\t\texhibitId(record.id),\n\t\t\t\trecord.name,\n\t\t\t\tlightningTalk,\n\t\t\t\trecord.description ?? undefined,\n\t\t\t\trecord.markdownContent ?? undefined,\n\t\t\t\trecord.url ? new Url(record.url) : undefined,\n\t\t\t);\n\t\t}\n\n\t\treturn new Exhibit(\n\t\t\texhibitId(record.id),\n\t\t\trecord.name,\n\t\t\trecord.description ?? undefined,\n\t\t\trecord.markdownContent ?? undefined,\n\t\t\trecord.url ? new Url(record.url) : undefined,\n\t\t);\n\t}\n\n\t// ==========================================================================\n\t// Persistence Methods\n\t// ==========================================================================\n\n\tprivate async persistEvent(event: Event): Promise<void> {\n\t\tconst db = getDb();\n\t\tconst snapshot = event.toSnapshot();\n\t\tconst now = new Date().toISOString();\n\t\tconst dateStr = snapshot.date instanceof Date ? snapshot.date.toISOString() : snapshot.date;\n\n\t\t// 1) Event upsert\n\t\tawait db\n\t\t\t.insert(events)\n\t\t\t.values({\n\t\t\t\tid: snapshot.id,\n\t\t\t\tname: snapshot.name,\n\t\t\t\tdate: dateStr,\n\t\t\t\tupdatedAt: now,\n\t\t\t})\n\t\t\t.onConflictDoUpdate({\n\t\t\t\ttarget: events.id,\n\t\t\t\tset: {\n\t\t\t\t\tname: snapshot.name,\n\t\t\t\t\tdate: dateStr,\n\t\t\t\t\tupdatedAt: now,\n\t\t\t\t},\n\t\t\t});\n\n\t\t// 2) Find obsolete exhibits and clean up\n\t\tconst snapshotExhibitIds = snapshot.exhibits.map((ex) => ex.id);\n\t\tawait this.deleteObsoleteExhibits(db, snapshot.id, snapshotExhibitIds);\n\n\t\t// 3) Upsert exhibits\n\t\tfor (const ex of snapshot.exhibits) {\n\t\t\tawait this.upsertExhibit(db, snapshot.id, ex);\n\t\t}\n\n\t\t// 4) Sync member events\n\t\tawait this.syncMemberEvents(db, snapshot.id, event.getMemberIds());\n\n\t\t// 5) Sync member exhibits\n\t\tfor (const exhibitDomain of event.getExhibits()) {\n\t\t\tawait this.syncMemberExhibits(db, exhibitDomain.id, exhibitDomain.getMemberIds());\n\t\t}\n\t}\n\n\tprivate async deleteObsoleteExhibits(\n\t\tdb: DrizzleDb,\n\t\teventId: EventId,\n\t\tkeptExhibitIds: ExhibitId[],\n\t): Promise<void> {\n\t\tconst existingExhibits = await db\n\t\t\t.select({ id: exhibits.id })\n\t\t\t.from(exhibits)\n\t\t\t.where(eq(exhibits.eventId, eventId));\n\n\t\tconst existingIdSet = new Set(existingExhibits.map((r) => exhibitId(r.id)));\n\t\tconst keptIdSet = new Set(keptExhibitIds);\n\t\tconst obsoleteIds = [...existingIdSet].filter((id) => !keptIdSet.has(id));\n\n\t\tif (obsoleteIds.length > 0) {\n\t\t\tawait db.delete(lightningTalks).where(inArray(lightningTalks.exhibitId, obsoleteIds));\n\t\t\tawait db.delete(memberExhibits).where(inArray(memberExhibits.exhibitId, obsoleteIds));\n\t\t\tawait db.delete(exhibits).where(inArray(exhibits.id, obsoleteIds));\n\t\t}\n\t}\n\n\tprivate async upsertExhibit(\n\t\tdb: DrizzleDb,\n\t\teventId: EventId,\n\t\tex: ReturnType<Event[\"toSnapshot\"]>[\"exhibits\"][number],\n\t): Promise<void> {\n\t\tconst now = new Date().toISOString();\n\t\tawait db\n\t\t\t.insert(exhibits)\n\t\t\t.values({\n\t\t\t\tid: ex.id,\n\t\t\t\tname: ex.name,\n\t\t\t\tdescription: ex.description ?? null,\n\t\t\t\tmarkdownContent: ex.markdownContent ?? null,\n\t\t\t\turl: ex.url?.getValue() ?? null,\n\t\t\t\teventId: eventId,\n\t\t\t\tupdatedAt: now,\n\t\t\t})\n\t\t\t.onConflictDoUpdate({\n\t\t\t\ttarget: exhibits.id,\n\t\t\t\tset: {\n\t\t\t\t\tname: ex.name,\n\t\t\t\t\tdescription: ex.description ?? null,\n\t\t\t\t\tmarkdownContent: ex.markdownContent ?? null,\n\t\t\t\t\turl: ex.url?.getValue() ?? null,\n\t\t\t\t\tupdatedAt: now,\n\t\t\t\t},\n\t\t\t});\n\n\t\tif (ex.lightningTalk) {\n\t\t\tconst startTimeStr =\n\t\t\t\tex.lightningTalk.startTime instanceof Date\n\t\t\t\t\t? ex.lightningTalk.startTime.toISOString()\n\t\t\t\t\t: ex.lightningTalk.startTime;\n\t\t\tawait db\n\t\t\t\t.insert(lightningTalks)\n\t\t\t\t.values({\n\t\t\t\t\texhibitId: ex.id,\n\t\t\t\t\tstartTime: startTimeStr,\n\t\t\t\t\tduration: ex.lightningTalk.durationMinutes.getValue(),\n\t\t\t\t\tslideUrl: ex.lightningTalk.slideUrl?.getValue() ?? null,\n\t\t\t\t\tupdatedAt: now,\n\t\t\t\t})\n\t\t\t\t.onConflictDoUpdate({\n\t\t\t\t\ttarget: lightningTalks.exhibitId,\n\t\t\t\t\tset: {\n\t\t\t\t\t\tstartTime: startTimeStr,\n\t\t\t\t\t\tduration: ex.lightningTalk.durationMinutes.getValue(),\n\t\t\t\t\t\tslideUrl: ex.lightningTalk.slideUrl?.getValue() ?? null,\n\t\t\t\t\t\tupdatedAt: now,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t} else {\n\t\t\tawait db.delete(lightningTalks).where(eq(lightningTalks.exhibitId, ex.id));\n\t\t}\n\t}\n\n\tprivate async syncMemberEvents(\n\t\tdb: DrizzleDb,\n\t\teventId: EventId,\n\t\tmemberIds: MemberId[],\n\t): Promise<void> {\n\t\tawait db.delete(memberEvents).where(eq(memberEvents.eventId, eventId));\n\n\t\tconst now = new Date().toISOString();\n\t\tfor (const memberId of memberIds) {\n\t\t\tawait db\n\t\t\t\t.insert(memberEvents)\n\t\t\t\t.values({\n\t\t\t\t\tid: randomUUID(),\n\t\t\t\t\tmemberId,\n\t\t\t\t\teventId,\n\t\t\t\t\tupdatedAt: now,\n\t\t\t\t})\n\t\t\t\t.onConflictDoNothing();\n\t\t}\n\t}\n\n\tprivate async syncMemberExhibits(\n\t\tdb: DrizzleDb,\n\t\texhibitId: ExhibitId,\n\t\tmemberIds: MemberId[],\n\t): Promise<void> {\n\t\tawait db.delete(memberExhibits).where(eq(memberExhibits.exhibitId, exhibitId));\n\n\t\tconst now = new Date().toISOString();\n\t\tfor (const memberId of memberIds) {\n\t\t\tawait db\n\t\t\t\t.insert(memberExhibits)\n\t\t\t\t.values({\n\t\t\t\t\tid: randomUUID(),\n\t\t\t\t\tmemberId,\n\t\t\t\t\texhibitId,\n\t\t\t\t\tupdatedAt: now,\n\t\t\t\t})\n\t\t\t\t.onConflictDoNothing();\n\t\t}\n\t}\n\n\t// ==========================================================================\n\t// Query Methods\n\t// ==========================================================================\n\n\tasync findById(id: EventId): Promise<Event | null> {\n\t\tconst db = getDb();\n\t\tconst record = await db.query.events.findFirst({\n\t\t\twhere: eq(events.id, id),\n\t\t\twith: {\n\t\t\t\tmemberEvents: true,\n\t\t\t\texhibits: {\n\t\t\t\t\twith: {\n\t\t\t\t\t\tlightningTalk: true,\n\t\t\t\t\t\tmemberExhibits: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tif (!record) return null;\n\t\treturn this.toDomain(record);\n\t}\n\n\tasync findByParticipantMemberId(memberId: MemberId): Promise<Event[]> {\n\t\tconst db = getDb();\n\n\t\tconst participations = await db\n\t\t\t.select({ eventId: memberEvents.eventId })\n\t\t\t.from(memberEvents)\n\t\t\t.where(eq(memberEvents.memberId, memberId));\n\n\t\tif (participations.length === 0) return [];\n\n\t\tconst eventIds = participations.map((p) => p.eventId);\n\t\tconst records = await db.query.events.findMany({\n\t\t\twhere: inArray(events.id, eventIds),\n\t\t\twith: {\n\t\t\t\tmemberEvents: true,\n\t\t\t\texhibits: {\n\t\t\t\t\twith: {\n\t\t\t\t\t\tlightningTalk: true,\n\t\t\t\t\t\tmemberExhibits: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn records.map((r) => this.toDomain(r));\n\t}\n\n\tasync findByExhibitId(exhibitId: ExhibitId): Promise<Event | null> {\n\t\tconst db = getDb();\n\n\t\tconst exhibit = await db\n\t\t\t.select({ eventId: exhibits.eventId })\n\t\t\t.from(exhibits)\n\t\t\t.where(eq(exhibits.id, exhibitId))\n\t\t\t.limit(1);\n\n\t\tif (exhibit.length === 0) return null;\n\t\treturn this.findById(eventId(exhibit[0].eventId));\n\t}\n\n\tasync findAll(): Promise<Event[]> {\n\t\tconst db = getDb();\n\t\tconst records = await db.query.events.findMany({\n\t\t\twith: {\n\t\t\t\tmemberEvents: true,\n\t\t\t\texhibits: {\n\t\t\t\t\twith: {\n\t\t\t\t\t\tlightningTalk: true,\n\t\t\t\t\t\tmemberExhibits: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn records.map((r) => this.toDomain(r));\n\t}\n\n\tasync save(event: Event): Promise<void> {\n\t\tawait this.persistEvent(event);\n\t}\n\n\tasync delete(eventId: EventId): Promise<void> {\n\t\tconst db = getDb();\n\n\t\tconst exhibitRecords = await db\n\t\t\t.select({ id: exhibits.id })\n\t\t\t.from(exhibits)\n\t\t\t.where(eq(exhibits.eventId, eventId));\n\t\tconst exhibitIds = exhibitRecords.map((ex) => ex.id);\n\n\t\tif (exhibitIds.length > 0) {\n\t\t\tawait db.delete(lightningTalks).where(inArray(lightningTalks.exhibitId, exhibitIds));\n\t\t\tawait db.delete(memberExhibits).where(inArray(memberExhibits.exhibitId, exhibitIds));\n\t\t}\n\n\t\tawait db.delete(memberEvents).where(eq(memberEvents.eventId, eventId));\n\t\tawait db.delete(exhibits).where(eq(exhibits.eventId, eventId));\n\t\tawait db.delete(events).where(eq(events.id, eventId));\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,241 @@
1
+ const require_Recorded = require("../../domain/shared/Recorded.cjs");
2
+ const require_StudentId = require("../../domain/shared/StudentId.cjs");
3
+ const require_Karte = require("../../domain/aggregates/karte/Karte.cjs");
4
+ const require_KarteId = require("../../domain/aggregates/karte/KarteId.cjs");
5
+ const require_ConsultationCategory = require("../../domain/aggregates/karte/ConsultationCategory.cjs");
6
+ const require_WorkDuration = require("../../domain/aggregates/karte/WorkDuration.cjs");
7
+ const require_MemberId = require("../../domain/aggregates/member/MemberId.cjs");
8
+ require("../../domain/index.cjs");
9
+ const require_schema = require("./schema.cjs");
10
+ const require_client = require("./client.cjs");
11
+ let drizzle_orm = require("drizzle-orm");
12
+ //#region src/infrastructure/drizzle/DrizzleKarteRepository.ts
13
+ function toRecordedClient(row) {
14
+ if (row.clientType === null) return require_Recorded.notRecorded();
15
+ if (row.clientName === null) throw new Error(`データ不整合: clientType=${row.clientType} だが clientName が null`);
16
+ const name = row.clientName;
17
+ switch (row.clientType) {
18
+ case "student":
19
+ if (row.clientStudentId === null || row.clientAffiliation === null) throw new Error("データ不整合: student だが studentId または affiliation が null");
20
+ return require_Recorded.recorded({
21
+ type: "student",
22
+ name,
23
+ studentId: require_StudentId.StudentId.fromString(row.clientStudentId),
24
+ affiliation: row.clientAffiliation
25
+ });
26
+ case "teacher": return require_Recorded.recorded({
27
+ type: "teacher",
28
+ name
29
+ });
30
+ case "staff": return require_Recorded.recorded({
31
+ type: "staff",
32
+ name
33
+ });
34
+ case "other": return require_Recorded.recorded({
35
+ type: "other",
36
+ name
37
+ });
38
+ }
39
+ }
40
+ /**
41
+ * 配列をNonEmptyArrayに変換する。
42
+ * 要素が1つ以上あることを実行時に検証し、型を正しく導出する。
43
+ */
44
+ function toNonEmptyArray(arr) {
45
+ const [first, ...rest] = arr;
46
+ if (first === void 0) throw new Error("Expected non-empty array");
47
+ return [first, ...rest];
48
+ }
49
+ function toConsultation(row) {
50
+ return {
51
+ categories: row.categoryIds.length > 0 ? require_Recorded.recorded(toNonEmptyArray(row.categoryIds.map((id) => {
52
+ const categoryId = id;
53
+ return {
54
+ id: categoryId,
55
+ displayName: require_ConsultationCategory.CONSULTATION_CATEGORIES.find((c) => c.id === categoryId)?.displayName ?? id
56
+ };
57
+ }))) : require_Recorded.notRecorded(),
58
+ targetDevice: row.targetDevice !== null ? require_Recorded.recorded(row.targetDevice) : require_Recorded.notRecorded(),
59
+ troubleDetails: row.troubleDetails !== null ? require_Recorded.recorded(row.troubleDetails) : require_Recorded.notRecorded()
60
+ };
61
+ }
62
+ function toResolution(row) {
63
+ if (row.resolutionType === null) return require_Recorded.notRecorded();
64
+ switch (row.resolutionType) {
65
+ case "resolved": return require_Recorded.recorded({ type: "resolved" });
66
+ case "unresolved": return require_Recorded.recorded({
67
+ type: "unresolved",
68
+ followUp: row.followUp !== null ? require_Recorded.recorded(row.followUp) : require_Recorded.notRecorded()
69
+ });
70
+ }
71
+ }
72
+ function toAssignee(row) {
73
+ if (row.assigneeType === "resolved") {
74
+ if (row.memberId === null) throw new Error("データ不整合: assigneeType=resolved だが memberId が null");
75
+ return {
76
+ type: "resolved",
77
+ memberId: require_MemberId.memberId(row.memberId)
78
+ };
79
+ }
80
+ if (row.assigneeName === null) throw new Error("データ不整合: assigneeType=unresolved だが assigneeName が null");
81
+ return {
82
+ type: "unresolved",
83
+ name: row.assigneeName
84
+ };
85
+ }
86
+ function toSupportRecord(row) {
87
+ return {
88
+ assignees: row.karteAssignees.length > 0 ? require_Recorded.recorded(toNonEmptyArray(row.karteAssignees.map(toAssignee))) : require_Recorded.notRecorded(),
89
+ content: row.supportContent !== null ? require_Recorded.recorded(row.supportContent) : require_Recorded.notRecorded(),
90
+ resolution: toResolution(row),
91
+ workDuration: row.workDurationMinutes !== null ? require_Recorded.recorded(require_WorkDuration.workDuration(row.workDurationMinutes)) : require_Recorded.notRecorded()
92
+ };
93
+ }
94
+ function toDomain(row) {
95
+ return require_Karte.Karte.reconstruct({
96
+ id: require_KarteId.karteId(row.id),
97
+ recordedAt: row.recordedAt,
98
+ consultedAt: deserializeConsultedAt(row.consultedAt, row.consultedAtPrecision),
99
+ lastUpdatedAt: row.lastUpdatedAt,
100
+ client: toRecordedClient(row),
101
+ consent: {
102
+ liabilityConsent: row.liabilityConsent,
103
+ disclosureConsent: row.disclosureConsent
104
+ },
105
+ consultation: toConsultation(row),
106
+ supportRecord: toSupportRecord(row)
107
+ });
108
+ }
109
+ function clientToColumns(client) {
110
+ if (client.type === "notRecorded") return {
111
+ clientType: null,
112
+ clientName: null,
113
+ clientStudentId: null,
114
+ clientAffiliation: null
115
+ };
116
+ const c = client.value;
117
+ return {
118
+ clientType: c.type,
119
+ clientName: c.name,
120
+ clientStudentId: c.type === "student" ? c.studentId.getValue() : null,
121
+ clientAffiliation: c.type === "student" ? c.affiliation : null
122
+ };
123
+ }
124
+ function resolutionToColumns(resolution) {
125
+ if (resolution.type === "notRecorded") return {
126
+ resolutionType: null,
127
+ followUp: null
128
+ };
129
+ const r = resolution.value;
130
+ if (r.type === "resolved") return {
131
+ resolutionType: "resolved",
132
+ followUp: null
133
+ };
134
+ return {
135
+ resolutionType: "unresolved",
136
+ followUp: r.followUp.type === "recorded" ? r.followUp.value : null
137
+ };
138
+ }
139
+ function recordedToNullable(r) {
140
+ return r.type === "recorded" ? r.value : null;
141
+ }
142
+ /** DB → ConsultedAt の復元(精度情報を使って正確に復元する) */
143
+ function deserializeConsultedAt(date, precision) {
144
+ if (date === null || precision === null) return require_Recorded.notRecorded();
145
+ switch (precision) {
146
+ case "year": return require_Recorded.recorded({
147
+ precision: "year",
148
+ year: date.getFullYear()
149
+ });
150
+ case "yearMonth": return require_Recorded.recorded({
151
+ precision: "yearMonth",
152
+ year: date.getFullYear(),
153
+ month: date.getMonth() + 1
154
+ });
155
+ case "date": return require_Recorded.recorded({
156
+ precision: "date",
157
+ value: new Date(date)
158
+ });
159
+ case "datetime": return require_Recorded.recorded({
160
+ precision: "datetime",
161
+ value: new Date(date)
162
+ });
163
+ }
164
+ }
165
+ /** ConsultedAt → DBのtimestampカラム用Date | null */
166
+ function consultedAtToDate(r) {
167
+ if (r.type === "notRecorded") return null;
168
+ const ca = r.value;
169
+ switch (ca.precision) {
170
+ case "datetime":
171
+ case "date": return ca.value;
172
+ case "yearMonth": return new Date(ca.year, ca.month - 1, 1);
173
+ case "year": return new Date(ca.year, 0, 1);
174
+ }
175
+ }
176
+ /** ConsultedAt → 精度enum値 | null */
177
+ function consultedAtToPrecision(r) {
178
+ return r.type === "recorded" ? r.value.precision : null;
179
+ }
180
+ var DrizzleKarteRepository = class {
181
+ async findById(id) {
182
+ const row = await require_client.getDb().query.kartes.findFirst({
183
+ where: (0, drizzle_orm.eq)(require_schema.kartes.id, id),
184
+ with: { karteAssignees: true }
185
+ });
186
+ if (!row) return null;
187
+ return toDomain(row);
188
+ }
189
+ async findAll() {
190
+ return (await require_client.getDb().query.kartes.findMany({
191
+ with: { karteAssignees: true },
192
+ orderBy: (kartes, { desc }) => [desc(kartes.recordedAt)]
193
+ })).map(toDomain);
194
+ }
195
+ async save(karte) {
196
+ const db = require_client.getDb();
197
+ const clientCols = clientToColumns(karte.client);
198
+ const resCols = resolutionToColumns(karte.supportRecord.resolution);
199
+ const values = {
200
+ id: karte.id,
201
+ recordedAt: karte.recordedAt,
202
+ consultedAt: consultedAtToDate(karte.consultedAt),
203
+ consultedAtPrecision: consultedAtToPrecision(karte.consultedAt),
204
+ lastUpdatedAt: karte.lastUpdatedAt,
205
+ clientType: clientCols.clientType,
206
+ clientName: clientCols.clientName,
207
+ clientStudentId: clientCols.clientStudentId,
208
+ clientAffiliation: clientCols.clientAffiliation,
209
+ liabilityConsent: karte.consent.liabilityConsent,
210
+ disclosureConsent: karte.consent.disclosureConsent,
211
+ categoryIds: karte.consultation.categories.type === "recorded" ? karte.consultation.categories.value.map((c) => c.id) : [],
212
+ troubleDetails: recordedToNullable(karte.consultation.troubleDetails),
213
+ targetDevice: recordedToNullable(karte.consultation.targetDevice),
214
+ supportContent: recordedToNullable(karte.supportRecord.content),
215
+ resolutionType: resCols.resolutionType,
216
+ followUp: resCols.followUp,
217
+ workDurationMinutes: recordedToNullable(karte.supportRecord.workDuration)
218
+ };
219
+ const { id: _, ...updateValues } = values;
220
+ await db.transaction(async (tx) => {
221
+ await tx.insert(require_schema.kartes).values(values).onConflictDoUpdate({
222
+ target: require_schema.kartes.id,
223
+ set: updateValues
224
+ });
225
+ await tx.delete(require_schema.karteAssignees).where((0, drizzle_orm.eq)(require_schema.karteAssignees.karteId, karte.id));
226
+ if (karte.supportRecord.assignees.type === "recorded") {
227
+ const assigneeRows = karte.supportRecord.assignees.value.map((assignee) => ({
228
+ karteId: karte.id,
229
+ assigneeType: assignee.type,
230
+ memberId: assignee.type === "resolved" ? assignee.memberId : null,
231
+ assigneeName: assignee.type === "unresolved" ? assignee.name : null
232
+ }));
233
+ await tx.insert(require_schema.karteAssignees).values(assigneeRows);
234
+ }
235
+ });
236
+ }
237
+ };
238
+ //#endregion
239
+ exports.DrizzleKarteRepository = DrizzleKarteRepository;
240
+
241
+ //# sourceMappingURL=DrizzleKarteRepository.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DrizzleKarteRepository.cjs","names":["notRecorded","recorded","StudentId","CONSULTATION_CATEGORIES","memberId","workDuration","Karte","karteId","getDb","kartes","karteAssignees"],"sources":["../../../src/infrastructure/drizzle/DrizzleKarteRepository.ts"],"sourcesContent":["import { eq } from \"drizzle-orm\";\nimport {\n\tCONSULTATION_CATEGORIES,\n\tKarte,\n\tStudentId,\n\tkarteId,\n\tmemberId,\n\tnotRecorded,\n\trecorded,\n\tworkDuration,\n\ttype Assignee,\n\ttype Client,\n\ttype Consultation,\n\ttype ConsultationCategoryId,\n\ttype ConsultedAt,\n\ttype FollowUp,\n\ttype KarteId,\n\ttype KarteRepository,\n\ttype NonEmptyArray,\n\ttype Recorded,\n\ttype Resolution,\n\ttype SupportRecord,\n} from \"#domain\";\nimport { getDb } from \"./client\";\nimport { karteAssignees, kartes } from \"./schema\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\ntype KarteRow = typeof kartes.$inferSelect;\n\ntype KarteWithRelations = KarteRow & {\n\tkarteAssignees: (typeof karteAssignees.$inferSelect)[];\n};\n\n// ============================================================================\n// Domain ↔ DB Mapping\n// ============================================================================\n\nfunction toRecordedClient(row: KarteRow): Recorded<Client> {\n\tif (row.clientType === null) return notRecorded();\n\n\tif (row.clientName === null) {\n\t\tthrow new Error(`データ不整合: clientType=${row.clientType} だが clientName が null`);\n\t}\n\tconst name = row.clientName;\n\n\tswitch (row.clientType) {\n\t\tcase \"student\": {\n\t\t\tif (row.clientStudentId === null || row.clientAffiliation === null) {\n\t\t\t\tthrow new Error(\"データ不整合: student だが studentId または affiliation が null\");\n\t\t\t}\n\t\t\treturn recorded({\n\t\t\t\ttype: \"student\",\n\t\t\t\tname,\n\t\t\t\tstudentId: StudentId.fromString(row.clientStudentId),\n\t\t\t\taffiliation: row.clientAffiliation,\n\t\t\t} as Client);\n\t\t}\n\t\tcase \"teacher\":\n\t\t\treturn recorded({ type: \"teacher\", name });\n\t\tcase \"staff\":\n\t\t\treturn recorded({ type: \"staff\", name });\n\t\tcase \"other\":\n\t\t\treturn recorded({ type: \"other\", name });\n\t}\n}\n\n/**\n * 配列をNonEmptyArrayに変換する。\n * 要素が1つ以上あることを実行時に検証し、型を正しく導出する。\n */\nfunction toNonEmptyArray<T>(arr: T[]): NonEmptyArray<T> {\n\tconst [first, ...rest] = arr;\n\tif (first === undefined) {\n\t\tthrow new Error(\"Expected non-empty array\");\n\t}\n\treturn [first, ...rest];\n}\n\nfunction toConsultation(row: KarteRow): Consultation {\n\treturn {\n\t\tcategories:\n\t\t\trow.categoryIds.length > 0\n\t\t\t\t? recorded(\n\t\t\t\t\t\ttoNonEmptyArray(\n\t\t\t\t\t\t\trow.categoryIds.map((id) => {\n\t\t\t\t\t\t\t\tconst categoryId = id as ConsultationCategoryId;\n\t\t\t\t\t\t\t\tconst master = CONSULTATION_CATEGORIES.find((c) => c.id === categoryId);\n\t\t\t\t\t\t\t\treturn { id: categoryId, displayName: master?.displayName ?? id };\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t: notRecorded(),\n\t\ttargetDevice: row.targetDevice !== null ? recorded(row.targetDevice) : notRecorded(),\n\t\ttroubleDetails: row.troubleDetails !== null ? recorded(row.troubleDetails) : notRecorded(),\n\t};\n}\n\nfunction toResolution(row: KarteRow): Recorded<Resolution> {\n\tif (row.resolutionType === null) return notRecorded();\n\n\tswitch (row.resolutionType) {\n\t\tcase \"resolved\":\n\t\t\treturn recorded({ type: \"resolved\" });\n\t\tcase \"unresolved\":\n\t\t\treturn recorded({\n\t\t\t\ttype: \"unresolved\",\n\t\t\t\tfollowUp: row.followUp !== null ? recorded(row.followUp as FollowUp) : notRecorded(),\n\t\t\t});\n\t}\n}\n\nfunction toAssignee(row: typeof karteAssignees.$inferSelect): Assignee {\n\tif (row.assigneeType === \"resolved\") {\n\t\tif (row.memberId === null) {\n\t\t\tthrow new Error(\"データ不整合: assigneeType=resolved だが memberId が null\");\n\t\t}\n\t\treturn { type: \"resolved\", memberId: memberId(row.memberId) };\n\t}\n\tif (row.assigneeName === null) {\n\t\tthrow new Error(\"データ不整合: assigneeType=unresolved だが assigneeName が null\");\n\t}\n\treturn { type: \"unresolved\", name: row.assigneeName };\n}\n\nfunction toSupportRecord(row: KarteWithRelations): SupportRecord {\n\treturn {\n\t\tassignees:\n\t\t\trow.karteAssignees.length > 0\n\t\t\t\t? recorded(toNonEmptyArray(row.karteAssignees.map(toAssignee)))\n\t\t\t\t: notRecorded(),\n\t\tcontent: row.supportContent !== null ? recorded(row.supportContent) : notRecorded(),\n\t\tresolution: toResolution(row),\n\t\tworkDuration:\n\t\t\trow.workDurationMinutes !== null\n\t\t\t\t? recorded(workDuration(row.workDurationMinutes))\n\t\t\t\t: notRecorded(),\n\t};\n}\n\nfunction toDomain(row: KarteWithRelations): Karte {\n\treturn Karte.reconstruct({\n\t\tid: karteId(row.id),\n\t\trecordedAt: row.recordedAt,\n\t\tconsultedAt: deserializeConsultedAt(row.consultedAt, row.consultedAtPrecision),\n\t\tlastUpdatedAt: row.lastUpdatedAt,\n\t\tclient: toRecordedClient(row),\n\t\tconsent: {\n\t\t\tliabilityConsent: row.liabilityConsent,\n\t\t\tdisclosureConsent: row.disclosureConsent,\n\t\t},\n\t\tconsultation: toConsultation(row),\n\t\tsupportRecord: toSupportRecord(row),\n\t});\n}\n\n// ============================================================================\n// Persistence Helpers\n// ============================================================================\n\ntype KarteInsert = typeof kartes.$inferInsert;\n\nfunction clientToColumns(\n\tclient: Recorded<Client>,\n): Pick<KarteInsert, \"clientType\" | \"clientName\" | \"clientStudentId\" | \"clientAffiliation\"> {\n\tif (client.type === \"notRecorded\") {\n\t\treturn {\n\t\t\tclientType: null,\n\t\t\tclientName: null,\n\t\t\tclientStudentId: null,\n\t\t\tclientAffiliation: null,\n\t\t};\n\t}\n\tconst c = client.value;\n\treturn {\n\t\tclientType: c.type,\n\t\tclientName: c.name,\n\t\tclientStudentId: c.type === \"student\" ? c.studentId.getValue() : null,\n\t\tclientAffiliation: c.type === \"student\" ? c.affiliation : null,\n\t};\n}\n\nfunction resolutionToColumns(\n\tresolution: Recorded<Resolution>,\n): Pick<KarteInsert, \"resolutionType\" | \"followUp\"> {\n\tif (resolution.type === \"notRecorded\") {\n\t\treturn { resolutionType: null, followUp: null };\n\t}\n\tconst r = resolution.value;\n\tif (r.type === \"resolved\") {\n\t\treturn { resolutionType: \"resolved\", followUp: null };\n\t}\n\treturn {\n\t\tresolutionType: \"unresolved\",\n\t\tfollowUp: r.followUp.type === \"recorded\" ? r.followUp.value : null,\n\t};\n}\n\nfunction recordedToNullable<T>(r: Recorded<T>): T | null {\n\treturn r.type === \"recorded\" ? r.value : null;\n}\n\n/** DB → ConsultedAt の復元(精度情報を使って正確に復元する) */\nfunction deserializeConsultedAt(\n\tdate: Date | null,\n\tprecision: ConsultedAt[\"precision\"] | null,\n): Recorded<ConsultedAt> {\n\tif (date === null || precision === null) return notRecorded();\n\tswitch (precision) {\n\t\tcase \"year\":\n\t\t\treturn recorded({ precision: \"year\", year: date.getFullYear() });\n\t\tcase \"yearMonth\":\n\t\t\treturn recorded({\n\t\t\t\tprecision: \"yearMonth\",\n\t\t\t\tyear: date.getFullYear(),\n\t\t\t\tmonth: date.getMonth() + 1,\n\t\t\t});\n\t\tcase \"date\":\n\t\t\treturn recorded({ precision: \"date\", value: new Date(date) });\n\t\tcase \"datetime\":\n\t\t\treturn recorded({ precision: \"datetime\", value: new Date(date) });\n\t}\n}\n\n/** ConsultedAt → DBのtimestampカラム用Date | null */\nfunction consultedAtToDate(r: Recorded<ConsultedAt>): Date | null {\n\tif (r.type === \"notRecorded\") return null;\n\tconst ca = r.value;\n\tswitch (ca.precision) {\n\t\tcase \"datetime\":\n\t\tcase \"date\":\n\t\t\treturn ca.value;\n\t\tcase \"yearMonth\":\n\t\t\treturn new Date(ca.year, ca.month - 1, 1);\n\t\tcase \"year\":\n\t\t\treturn new Date(ca.year, 0, 1);\n\t}\n}\n\n/** ConsultedAt → 精度enum値 | null */\nfunction consultedAtToPrecision(r: Recorded<ConsultedAt>): ConsultedAt[\"precision\"] | null {\n\treturn r.type === \"recorded\" ? r.value.precision : null;\n}\n\n// ============================================================================\n// Repository Implementation\n// ============================================================================\n\nexport class DrizzleKarteRepository implements KarteRepository {\n\tasync findById(id: KarteId): Promise<Karte | null> {\n\t\tconst db = getDb();\n\t\tconst row = await db.query.kartes.findFirst({\n\t\t\twhere: eq(kartes.id, id as string),\n\t\t\twith: {\n\t\t\t\tkarteAssignees: true,\n\t\t\t},\n\t\t});\n\n\t\tif (!row) return null;\n\t\treturn toDomain(row);\n\t}\n\n\tasync findAll(): Promise<Karte[]> {\n\t\tconst db = getDb();\n\t\tconst rows = await db.query.kartes.findMany({\n\t\t\twith: {\n\t\t\t\tkarteAssignees: true,\n\t\t\t},\n\t\t\torderBy: (kartes, { desc }) => [desc(kartes.recordedAt)],\n\t\t});\n\t\treturn rows.map(toDomain);\n\t}\n\n\tasync save(karte: Karte): Promise<void> {\n\t\tconst db = getDb();\n\n\t\tconst clientCols = clientToColumns(karte.client);\n\t\tconst resCols = resolutionToColumns(karte.supportRecord.resolution);\n\n\t\tconst values = {\n\t\t\tid: karte.id as string,\n\t\t\trecordedAt: karte.recordedAt,\n\t\t\tconsultedAt: consultedAtToDate(karte.consultedAt),\n\t\t\tconsultedAtPrecision: consultedAtToPrecision(karte.consultedAt),\n\t\t\tlastUpdatedAt: karte.lastUpdatedAt,\n\t\t\tclientType: clientCols.clientType,\n\t\t\tclientName: clientCols.clientName,\n\t\t\tclientStudentId: clientCols.clientStudentId,\n\t\t\tclientAffiliation: clientCols.clientAffiliation,\n\t\t\tliabilityConsent: karte.consent.liabilityConsent,\n\t\t\tdisclosureConsent: karte.consent.disclosureConsent,\n\t\t\tcategoryIds:\n\t\t\t\tkarte.consultation.categories.type === \"recorded\"\n\t\t\t\t\t? karte.consultation.categories.value.map((c) => c.id)\n\t\t\t\t\t: [],\n\t\t\ttroubleDetails: recordedToNullable(karte.consultation.troubleDetails),\n\t\t\ttargetDevice: recordedToNullable(karte.consultation.targetDevice),\n\t\t\tsupportContent: recordedToNullable(karte.supportRecord.content),\n\t\t\tresolutionType: resCols.resolutionType,\n\t\t\tfollowUp: resCols.followUp,\n\t\t\tworkDurationMinutes: recordedToNullable(karte.supportRecord.workDuration),\n\t\t};\n\n\t\tconst { id: _, ...updateValues } = values;\n\n\t\tawait db.transaction(async (tx) => {\n\t\t\t// Upsert karte\n\t\t\tawait tx.insert(kartes).values(values).onConflictDoUpdate({\n\t\t\t\ttarget: kartes.id,\n\t\t\t\tset: updateValues,\n\t\t\t});\n\n\t\t\t// Sync assignees (delete-all-then-insert)\n\t\t\tawait tx.delete(karteAssignees).where(eq(karteAssignees.karteId, karte.id as string));\n\n\t\t\tif (karte.supportRecord.assignees.type === \"recorded\") {\n\t\t\t\tconst assigneeRows = karte.supportRecord.assignees.value.map((assignee) => ({\n\t\t\t\t\tkarteId: karte.id as string,\n\t\t\t\t\tassigneeType: assignee.type as Assignee[\"type\"],\n\t\t\t\t\tmemberId: assignee.type === \"resolved\" ? (assignee.memberId as string) : null,\n\t\t\t\t\tassigneeName: assignee.type === \"unresolved\" ? assignee.name : null,\n\t\t\t\t}));\n\t\t\t\tawait tx.insert(karteAssignees).values(assigneeRows);\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":"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"}