@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.
- package/README.md +45 -25
- package/dist/_virtual/_rolldown/runtime.cjs +13 -0
- package/dist/_virtual/_rolldown/runtime.mjs +13 -0
- package/dist/application/exceptions/ApplicationExceptions.cjs +124 -0
- package/dist/application/exceptions/ApplicationExceptions.cjs.map +1 -0
- package/dist/application/exceptions/ApplicationExceptions.mjs +115 -0
- package/dist/application/exceptions/ApplicationExceptions.mjs.map +1 -0
- package/dist/application/index.cjs +39 -0
- package/dist/application/index.mjs +40 -0
- package/dist/application/usecase/base.cjs +11 -0
- package/dist/application/usecase/base.cjs.map +1 -0
- package/dist/application/usecase/base.d.cts +12 -0
- package/dist/application/usecase/base.d.mts +12 -0
- package/dist/application/usecase/base.mjs +11 -0
- package/dist/application/usecase/base.mjs.map +1 -0
- package/dist/application/usecase/event/AddExhibitToEvent.cjs +27 -0
- package/dist/application/usecase/event/AddExhibitToEvent.cjs.map +1 -0
- package/dist/application/usecase/event/AddExhibitToEvent.d.cts +32 -0
- package/dist/application/usecase/event/AddExhibitToEvent.d.mts +32 -0
- package/dist/application/usecase/event/AddExhibitToEvent.mjs +27 -0
- package/dist/application/usecase/event/AddExhibitToEvent.mjs.map +1 -0
- package/dist/application/usecase/event/ChangeExhibitDescription.cjs +23 -0
- package/dist/application/usecase/event/ChangeExhibitDescription.cjs.map +1 -0
- package/dist/application/usecase/event/ChangeExhibitDescription.d.cts +26 -0
- package/dist/application/usecase/event/ChangeExhibitDescription.d.mts +26 -0
- package/dist/application/usecase/event/ChangeExhibitDescription.mjs +23 -0
- package/dist/application/usecase/event/ChangeExhibitDescription.mjs.map +1 -0
- package/dist/application/usecase/event/ChangeExhibitMarkdownContent.cjs +23 -0
- package/dist/application/usecase/event/ChangeExhibitMarkdownContent.cjs.map +1 -0
- package/dist/application/usecase/event/ChangeExhibitMarkdownContent.d.cts +26 -0
- package/dist/application/usecase/event/ChangeExhibitMarkdownContent.d.mts +26 -0
- package/dist/application/usecase/event/ChangeExhibitMarkdownContent.mjs +23 -0
- package/dist/application/usecase/event/ChangeExhibitMarkdownContent.mjs.map +1 -0
- package/dist/application/usecase/event/ChangeExhibitName.cjs +23 -0
- package/dist/application/usecase/event/ChangeExhibitName.cjs.map +1 -0
- package/dist/application/usecase/event/ChangeExhibitName.d.cts +26 -0
- package/dist/application/usecase/event/ChangeExhibitName.d.mts +26 -0
- package/dist/application/usecase/event/ChangeExhibitName.mjs +23 -0
- package/dist/application/usecase/event/ChangeExhibitName.mjs.map +1 -0
- package/dist/application/usecase/event/ChangeExhibitUrl.cjs +23 -0
- package/dist/application/usecase/event/ChangeExhibitUrl.cjs.map +1 -0
- package/dist/application/usecase/event/ChangeExhibitUrl.d.cts +27 -0
- package/dist/application/usecase/event/ChangeExhibitUrl.d.mts +27 -0
- package/dist/application/usecase/event/ChangeExhibitUrl.mjs +23 -0
- package/dist/application/usecase/event/ChangeExhibitUrl.mjs.map +1 -0
- package/dist/application/usecase/event/ChangeLightningTalkDuration.cjs +23 -0
- package/dist/application/usecase/event/ChangeLightningTalkDuration.cjs.map +1 -0
- package/dist/application/usecase/event/ChangeLightningTalkDuration.d.cts +27 -0
- package/dist/application/usecase/event/ChangeLightningTalkDuration.d.mts +27 -0
- package/dist/application/usecase/event/ChangeLightningTalkDuration.mjs +23 -0
- package/dist/application/usecase/event/ChangeLightningTalkDuration.mjs.map +1 -0
- package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.cjs +23 -0
- package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.cjs.map +1 -0
- package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.d.cts +27 -0
- package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.d.mts +27 -0
- package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.mjs +23 -0
- package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.mjs.map +1 -0
- package/dist/application/usecase/event/ChangeLightningTalkStartTime.cjs +23 -0
- package/dist/application/usecase/event/ChangeLightningTalkStartTime.cjs.map +1 -0
- package/dist/application/usecase/event/ChangeLightningTalkStartTime.d.cts +26 -0
- package/dist/application/usecase/event/ChangeLightningTalkStartTime.d.mts +26 -0
- package/dist/application/usecase/event/ChangeLightningTalkStartTime.mjs +23 -0
- package/dist/application/usecase/event/ChangeLightningTalkStartTime.mjs.map +1 -0
- package/dist/application/usecase/event/CreateEvent.cjs +23 -0
- package/dist/application/usecase/event/CreateEvent.cjs.map +1 -0
- package/dist/application/usecase/event/CreateEvent.d.cts +25 -0
- package/dist/application/usecase/event/CreateEvent.d.mts +25 -0
- package/dist/application/usecase/event/CreateEvent.mjs +23 -0
- package/dist/application/usecase/event/CreateEvent.mjs.map +1 -0
- package/dist/application/usecase/event/DeleteEvent.cjs +22 -0
- package/dist/application/usecase/event/DeleteEvent.cjs.map +1 -0
- package/dist/application/usecase/event/DeleteEvent.d.cts +23 -0
- package/dist/application/usecase/event/DeleteEvent.d.mts +23 -0
- package/dist/application/usecase/event/DeleteEvent.mjs +22 -0
- package/dist/application/usecase/event/DeleteEvent.mjs.map +1 -0
- package/dist/application/usecase/event/GetEvent.cjs +18 -0
- package/dist/application/usecase/event/GetEvent.cjs.map +1 -0
- package/dist/application/usecase/event/GetEvent.d.cts +23 -0
- package/dist/application/usecase/event/GetEvent.d.mts +23 -0
- package/dist/application/usecase/event/GetEvent.mjs +18 -0
- package/dist/application/usecase/event/GetEvent.mjs.map +1 -0
- package/dist/application/usecase/event/GetEventList.cjs +15 -0
- package/dist/application/usecase/event/GetEventList.cjs.map +1 -0
- package/dist/application/usecase/event/GetEventList.d.cts +17 -0
- package/dist/application/usecase/event/GetEventList.d.mts +17 -0
- package/dist/application/usecase/event/GetEventList.mjs +15 -0
- package/dist/application/usecase/event/GetEventList.mjs.map +1 -0
- package/dist/application/usecase/event/RemoveExhibitFromEvent.cjs +23 -0
- package/dist/application/usecase/event/RemoveExhibitFromEvent.cjs.map +1 -0
- package/dist/application/usecase/event/RemoveExhibitFromEvent.d.cts +25 -0
- package/dist/application/usecase/event/RemoveExhibitFromEvent.d.mts +25 -0
- package/dist/application/usecase/event/RemoveExhibitFromEvent.mjs +23 -0
- package/dist/application/usecase/event/RemoveExhibitFromEvent.mjs.map +1 -0
- package/dist/application/usecase/event/UpdateEvent.cjs +21 -0
- package/dist/application/usecase/event/UpdateEvent.cjs.map +1 -0
- package/dist/application/usecase/event/UpdateEvent.d.cts +22 -0
- package/dist/application/usecase/event/UpdateEvent.d.mts +22 -0
- package/dist/application/usecase/event/UpdateEvent.mjs +21 -0
- package/dist/application/usecase/event/UpdateEvent.mjs.map +1 -0
- package/dist/application/usecase/event/index.cjs +14 -0
- package/dist/application/usecase/event/index.mjs +15 -0
- package/dist/application/usecase/eventParticipation/GetEventsByMember.cjs +15 -0
- package/dist/application/usecase/eventParticipation/GetEventsByMember.cjs.map +1 -0
- package/dist/application/usecase/eventParticipation/GetEventsByMember.d.cts +20 -0
- package/dist/application/usecase/eventParticipation/GetEventsByMember.d.mts +20 -0
- package/dist/application/usecase/eventParticipation/GetEventsByMember.mjs +15 -0
- package/dist/application/usecase/eventParticipation/GetEventsByMember.mjs.map +1 -0
- package/dist/application/usecase/eventParticipation/GetExhibitsByMember.cjs +18 -0
- package/dist/application/usecase/eventParticipation/GetExhibitsByMember.cjs.map +1 -0
- package/dist/application/usecase/eventParticipation/GetExhibitsByMember.d.cts +20 -0
- package/dist/application/usecase/eventParticipation/GetExhibitsByMember.d.mts +20 -0
- package/dist/application/usecase/eventParticipation/GetExhibitsByMember.mjs +18 -0
- package/dist/application/usecase/eventParticipation/GetExhibitsByMember.mjs.map +1 -0
- package/dist/application/usecase/eventParticipation/GetMembersByEvent.cjs +19 -0
- package/dist/application/usecase/eventParticipation/GetMembersByEvent.cjs.map +1 -0
- package/dist/application/usecase/eventParticipation/GetMembersByEvent.d.cts +22 -0
- package/dist/application/usecase/eventParticipation/GetMembersByEvent.d.mts +22 -0
- package/dist/application/usecase/eventParticipation/GetMembersByEvent.mjs +19 -0
- package/dist/application/usecase/eventParticipation/GetMembersByEvent.mjs.map +1 -0
- package/dist/application/usecase/eventParticipation/GetMembersByExhibit.cjs +19 -0
- package/dist/application/usecase/eventParticipation/GetMembersByExhibit.cjs.map +1 -0
- package/dist/application/usecase/eventParticipation/GetMembersByExhibit.d.cts +22 -0
- package/dist/application/usecase/eventParticipation/GetMembersByExhibit.d.mts +22 -0
- package/dist/application/usecase/eventParticipation/GetMembersByExhibit.mjs +19 -0
- package/dist/application/usecase/eventParticipation/GetMembersByExhibit.mjs.map +1 -0
- package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.cjs +22 -0
- package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.cjs.map +1 -0
- package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.d.cts +24 -0
- package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.d.mts +24 -0
- package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.mjs +22 -0
- package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.mjs.map +1 -0
- package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.cjs +22 -0
- package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.cjs.map +1 -0
- package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.d.cts +24 -0
- package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.d.mts +24 -0
- package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.mjs +22 -0
- package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.mjs.map +1 -0
- package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.cjs +21 -0
- package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.cjs.map +1 -0
- package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.d.cts +24 -0
- package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.d.mts +24 -0
- package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.mjs +21 -0
- package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.mjs.map +1 -0
- package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.cjs +21 -0
- package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.cjs.map +1 -0
- package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.d.cts +24 -0
- package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.d.mts +24 -0
- package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.mjs +21 -0
- package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.mjs.map +1 -0
- package/dist/application/usecase/karte/CorrectKarte.cjs +20 -0
- package/dist/application/usecase/karte/CorrectKarte.cjs.map +1 -0
- package/dist/application/usecase/karte/CorrectKarte.d.cts +20 -0
- package/dist/application/usecase/karte/CorrectKarte.d.mts +20 -0
- package/dist/application/usecase/karte/CorrectKarte.mjs +20 -0
- package/dist/application/usecase/karte/CorrectKarte.mjs.map +1 -0
- package/dist/application/usecase/karte/CreateKarte.cjs +19 -0
- package/dist/application/usecase/karte/CreateKarte.cjs.map +1 -0
- package/dist/application/usecase/karte/CreateKarte.d.cts +20 -0
- package/dist/application/usecase/karte/CreateKarte.d.mts +20 -0
- package/dist/application/usecase/karte/CreateKarte.mjs +19 -0
- package/dist/application/usecase/karte/CreateKarte.mjs.map +1 -0
- package/dist/application/usecase/karte/GetKarte.cjs +18 -0
- package/dist/application/usecase/karte/GetKarte.cjs.map +1 -0
- package/dist/application/usecase/karte/GetKarte.d.cts +20 -0
- package/dist/application/usecase/karte/GetKarte.d.mts +20 -0
- package/dist/application/usecase/karte/GetKarte.mjs +18 -0
- package/dist/application/usecase/karte/GetKarte.mjs.map +1 -0
- package/dist/application/usecase/karte/ImportKarte.cjs +19 -0
- package/dist/application/usecase/karte/ImportKarte.cjs.map +1 -0
- package/dist/application/usecase/karte/ImportKarte.d.cts +39 -0
- package/dist/application/usecase/karte/ImportKarte.d.mts +39 -0
- package/dist/application/usecase/karte/ImportKarte.mjs +19 -0
- package/dist/application/usecase/karte/ImportKarte.mjs.map +1 -0
- package/dist/application/usecase/karte/ListKartes.cjs +15 -0
- package/dist/application/usecase/karte/ListKartes.cjs.map +1 -0
- package/dist/application/usecase/karte/ListKartes.d.cts +17 -0
- package/dist/application/usecase/karte/ListKartes.d.mts +17 -0
- package/dist/application/usecase/karte/ListKartes.mjs +15 -0
- package/dist/application/usecase/karte/ListKartes.mjs.map +1 -0
- package/dist/application/usecase/karte/index.cjs +5 -0
- package/dist/application/usecase/karte/index.mjs +6 -0
- package/dist/application/usecase/member/ChangeDiscordNickName.cjs +20 -0
- package/dist/application/usecase/member/ChangeDiscordNickName.cjs.map +1 -0
- package/dist/application/usecase/member/ChangeDiscordNickName.d.cts +21 -0
- package/dist/application/usecase/member/ChangeDiscordNickName.d.mts +21 -0
- package/dist/application/usecase/member/ChangeDiscordNickName.mjs +20 -0
- package/dist/application/usecase/member/ChangeDiscordNickName.mjs.map +1 -0
- package/dist/application/usecase/member/ConnectDiscordAccount.cjs +27 -0
- package/dist/application/usecase/member/ConnectDiscordAccount.cjs.map +1 -0
- package/dist/application/usecase/member/ConnectDiscordAccount.d.cts +25 -0
- package/dist/application/usecase/member/ConnectDiscordAccount.d.mts +25 -0
- package/dist/application/usecase/member/ConnectDiscordAccount.mjs +27 -0
- package/dist/application/usecase/member/ConnectDiscordAccount.mjs.map +1 -0
- package/dist/application/usecase/member/GetMember.cjs +15 -0
- package/dist/application/usecase/member/GetMember.cjs.map +1 -0
- package/dist/application/usecase/member/GetMember.d.cts +20 -0
- package/dist/application/usecase/member/GetMember.d.mts +20 -0
- package/dist/application/usecase/member/GetMember.mjs +15 -0
- package/dist/application/usecase/member/GetMember.mjs.map +1 -0
- package/dist/application/usecase/member/GetMemberByDiscordId.cjs +18 -0
- package/dist/application/usecase/member/GetMemberByDiscordId.cjs.map +1 -0
- package/dist/application/usecase/member/GetMemberByDiscordId.d.cts +22 -0
- package/dist/application/usecase/member/GetMemberByDiscordId.d.mts +22 -0
- package/dist/application/usecase/member/GetMemberByDiscordId.mjs +18 -0
- package/dist/application/usecase/member/GetMemberByDiscordId.mjs.map +1 -0
- package/dist/application/usecase/member/GetMemberByEmail.cjs +15 -0
- package/dist/application/usecase/member/GetMemberByEmail.cjs.map +1 -0
- package/dist/application/usecase/member/GetMemberByEmail.d.cts +20 -0
- package/dist/application/usecase/member/GetMemberByEmail.d.mts +20 -0
- package/dist/application/usecase/member/GetMemberByEmail.mjs +15 -0
- package/dist/application/usecase/member/GetMemberByEmail.mjs.map +1 -0
- package/dist/application/usecase/member/GetMemberList.cjs +15 -0
- package/dist/application/usecase/member/GetMemberList.cjs.map +1 -0
- package/dist/application/usecase/member/GetMemberList.d.cts +17 -0
- package/dist/application/usecase/member/GetMemberList.d.mts +17 -0
- package/dist/application/usecase/member/GetMemberList.mjs +15 -0
- package/dist/application/usecase/member/GetMemberList.mjs.map +1 -0
- package/dist/application/usecase/member/RegisterMember.cjs +30 -0
- package/dist/application/usecase/member/RegisterMember.cjs.map +1 -0
- package/dist/application/usecase/member/RegisterMember.d.cts +28 -0
- package/dist/application/usecase/member/RegisterMember.d.mts +28 -0
- package/dist/application/usecase/member/RegisterMember.mjs +30 -0
- package/dist/application/usecase/member/RegisterMember.mjs.map +1 -0
- package/dist/application/usecase/member/UpdateMember.cjs +24 -0
- package/dist/application/usecase/member/UpdateMember.cjs.map +1 -0
- package/dist/application/usecase/member/UpdateMember.d.cts +26 -0
- package/dist/application/usecase/member/UpdateMember.d.mts +26 -0
- package/dist/application/usecase/member/UpdateMember.mjs +24 -0
- package/dist/application/usecase/member/UpdateMember.mjs.map +1 -0
- package/dist/application/usecase/member/index.cjs +8 -0
- package/dist/application/usecase/member/index.mjs +9 -0
- package/dist/domain/aggregates/discord-account/DiscordAccount.cjs +47 -0
- package/dist/domain/aggregates/discord-account/DiscordAccount.cjs.map +1 -0
- package/dist/domain/aggregates/discord-account/DiscordAccount.d.cts +43 -0
- package/dist/domain/aggregates/discord-account/DiscordAccount.d.mts +43 -0
- package/dist/domain/aggregates/discord-account/DiscordAccount.mjs +46 -0
- package/dist/domain/aggregates/discord-account/DiscordAccount.mjs.map +1 -0
- package/dist/domain/aggregates/discord-account/DiscordAccountRepository.d.cts +14 -0
- package/dist/domain/aggregates/discord-account/DiscordAccountRepository.d.mts +14 -0
- package/dist/domain/aggregates/discord-account/DiscordId.cjs +8 -0
- package/dist/domain/aggregates/discord-account/DiscordId.cjs.map +1 -0
- package/dist/domain/aggregates/discord-account/DiscordId.d.cts +9 -0
- package/dist/domain/aggregates/discord-account/DiscordId.d.mts +9 -0
- package/dist/domain/aggregates/discord-account/DiscordId.mjs +8 -0
- package/dist/domain/aggregates/discord-account/DiscordId.mjs.map +1 -0
- package/dist/domain/aggregates/event/Event.cjs +91 -0
- package/dist/domain/aggregates/event/Event.cjs.map +1 -0
- package/dist/domain/aggregates/event/Event.d.cts +59 -0
- package/dist/domain/aggregates/event/Event.d.mts +59 -0
- package/dist/domain/aggregates/event/Event.mjs +91 -0
- package/dist/domain/aggregates/event/Event.mjs.map +1 -0
- package/dist/domain/aggregates/event/EventId.cjs +8 -0
- package/dist/domain/aggregates/event/EventId.cjs.map +1 -0
- package/dist/domain/aggregates/event/EventId.d.cts +9 -0
- package/dist/domain/aggregates/event/EventId.d.mts +9 -0
- package/dist/domain/aggregates/event/EventId.mjs +8 -0
- package/dist/domain/aggregates/event/EventId.mjs.map +1 -0
- package/dist/domain/aggregates/event/EventRepository.d.cts +17 -0
- package/dist/domain/aggregates/event/EventRepository.d.mts +17 -0
- package/dist/domain/aggregates/event/Exhibit.cjs +86 -0
- package/dist/domain/aggregates/event/Exhibit.cjs.map +1 -0
- package/dist/domain/aggregates/event/Exhibit.d.cts +52 -0
- package/dist/domain/aggregates/event/Exhibit.d.mts +52 -0
- package/dist/domain/aggregates/event/Exhibit.mjs +86 -0
- package/dist/domain/aggregates/event/Exhibit.mjs.map +1 -0
- package/dist/domain/aggregates/event/ExhibitId.cjs +8 -0
- package/dist/domain/aggregates/event/ExhibitId.cjs.map +1 -0
- package/dist/domain/aggregates/event/ExhibitId.d.cts +9 -0
- package/dist/domain/aggregates/event/ExhibitId.d.mts +9 -0
- package/dist/domain/aggregates/event/ExhibitId.mjs +8 -0
- package/dist/domain/aggregates/event/ExhibitId.mjs.map +1 -0
- package/dist/domain/aggregates/event/LightningTalk.cjs +39 -0
- package/dist/domain/aggregates/event/LightningTalk.cjs.map +1 -0
- package/dist/domain/aggregates/event/LightningTalk.d.cts +27 -0
- package/dist/domain/aggregates/event/LightningTalk.d.mts +27 -0
- package/dist/domain/aggregates/event/LightningTalk.mjs +39 -0
- package/dist/domain/aggregates/event/LightningTalk.mjs.map +1 -0
- package/dist/domain/aggregates/event/LightningTalkDuration.cjs +12 -0
- package/dist/domain/aggregates/event/LightningTalkDuration.cjs.map +1 -0
- package/dist/domain/aggregates/event/LightningTalkDuration.d.cts +9 -0
- package/dist/domain/aggregates/event/LightningTalkDuration.d.mts +9 -0
- package/dist/domain/aggregates/event/LightningTalkDuration.mjs +12 -0
- package/dist/domain/aggregates/event/LightningTalkDuration.mjs.map +1 -0
- package/dist/domain/aggregates/event/Url.cjs +19 -0
- package/dist/domain/aggregates/event/Url.cjs.map +1 -0
- package/dist/domain/aggregates/event/Url.d.cts +9 -0
- package/dist/domain/aggregates/event/Url.d.mts +9 -0
- package/dist/domain/aggregates/event/Url.mjs +19 -0
- package/dist/domain/aggregates/event/Url.mjs.map +1 -0
- package/dist/domain/aggregates/index.cjs +25 -0
- package/dist/domain/aggregates/index.mjs +26 -0
- package/dist/domain/aggregates/karte/Assignee.cjs +7 -0
- package/dist/domain/aggregates/karte/Assignee.cjs.map +1 -0
- package/dist/domain/aggregates/karte/Assignee.d.cts +20 -0
- package/dist/domain/aggregates/karte/Assignee.d.mts +20 -0
- package/dist/domain/aggregates/karte/Assignee.mjs +7 -0
- package/dist/domain/aggregates/karte/Assignee.mjs.map +1 -0
- package/dist/domain/aggregates/karte/Client.cjs +20 -0
- package/dist/domain/aggregates/karte/Client.cjs.map +1 -0
- package/dist/domain/aggregates/karte/Client.d.cts +42 -0
- package/dist/domain/aggregates/karte/Client.d.mts +42 -0
- package/dist/domain/aggregates/karte/Client.mjs +19 -0
- package/dist/domain/aggregates/karte/Client.mjs.map +1 -0
- package/dist/domain/aggregates/karte/Consent.d.cts +14 -0
- package/dist/domain/aggregates/karte/Consent.d.mts +14 -0
- package/dist/domain/aggregates/karte/Consultation.d.cts +19 -0
- package/dist/domain/aggregates/karte/Consultation.d.mts +19 -0
- package/dist/domain/aggregates/karte/ConsultationCategory.cjs +89 -0
- package/dist/domain/aggregates/karte/ConsultationCategory.cjs.map +1 -0
- package/dist/domain/aggregates/karte/ConsultationCategory.d.cts +75 -0
- package/dist/domain/aggregates/karte/ConsultationCategory.d.mts +75 -0
- package/dist/domain/aggregates/karte/ConsultationCategory.mjs +89 -0
- package/dist/domain/aggregates/karte/ConsultationCategory.mjs.map +1 -0
- package/dist/domain/aggregates/karte/ConsultedAt.cjs +90 -0
- package/dist/domain/aggregates/karte/ConsultedAt.cjs.map +1 -0
- package/dist/domain/aggregates/karte/ConsultedAt.d.cts +49 -0
- package/dist/domain/aggregates/karte/ConsultedAt.d.mts +49 -0
- package/dist/domain/aggregates/karte/ConsultedAt.mjs +85 -0
- package/dist/domain/aggregates/karte/ConsultedAt.mjs.map +1 -0
- package/dist/domain/aggregates/karte/FollowUp.cjs +13 -0
- package/dist/domain/aggregates/karte/FollowUp.cjs.map +1 -0
- package/dist/domain/aggregates/karte/FollowUp.d.cts +8 -0
- package/dist/domain/aggregates/karte/FollowUp.d.mts +8 -0
- package/dist/domain/aggregates/karte/FollowUp.mjs +13 -0
- package/dist/domain/aggregates/karte/FollowUp.mjs.map +1 -0
- package/dist/domain/aggregates/karte/Karte.cjs +94 -0
- package/dist/domain/aggregates/karte/Karte.cjs.map +1 -0
- package/dist/domain/aggregates/karte/Karte.d.cts +131 -0
- package/dist/domain/aggregates/karte/Karte.d.mts +131 -0
- package/dist/domain/aggregates/karte/Karte.mjs +94 -0
- package/dist/domain/aggregates/karte/Karte.mjs.map +1 -0
- package/dist/domain/aggregates/karte/KarteId.cjs +8 -0
- package/dist/domain/aggregates/karte/KarteId.cjs.map +1 -0
- package/dist/domain/aggregates/karte/KarteId.d.cts +9 -0
- package/dist/domain/aggregates/karte/KarteId.d.mts +9 -0
- package/dist/domain/aggregates/karte/KarteId.mjs +8 -0
- package/dist/domain/aggregates/karte/KarteId.mjs.map +1 -0
- package/dist/domain/aggregates/karte/KarteRepository.d.cts +12 -0
- package/dist/domain/aggregates/karte/KarteRepository.d.mts +12 -0
- package/dist/domain/aggregates/karte/Resolution.cjs +7 -0
- package/dist/domain/aggregates/karte/Resolution.cjs.map +1 -0
- package/dist/domain/aggregates/karte/Resolution.d.cts +21 -0
- package/dist/domain/aggregates/karte/Resolution.d.mts +21 -0
- package/dist/domain/aggregates/karte/Resolution.mjs +7 -0
- package/dist/domain/aggregates/karte/Resolution.mjs.map +1 -0
- package/dist/domain/aggregates/karte/SupportRecord.d.cts +22 -0
- package/dist/domain/aggregates/karte/SupportRecord.d.mts +22 -0
- package/dist/domain/aggregates/karte/WorkDuration.cjs +11 -0
- package/dist/domain/aggregates/karte/WorkDuration.cjs.map +1 -0
- package/dist/domain/aggregates/karte/WorkDuration.d.cts +10 -0
- package/dist/domain/aggregates/karte/WorkDuration.d.mts +10 -0
- package/dist/domain/aggregates/karte/WorkDuration.mjs +11 -0
- package/dist/domain/aggregates/karte/WorkDuration.mjs.map +1 -0
- package/dist/domain/aggregates/karte/index.cjs +9 -0
- package/dist/domain/aggregates/karte/index.mjs +10 -0
- package/dist/domain/aggregates/member/Email.cjs +12 -0
- package/dist/domain/aggregates/member/Email.cjs.map +1 -0
- package/dist/domain/aggregates/member/Email.d.cts +9 -0
- package/dist/domain/aggregates/member/Email.d.mts +9 -0
- package/dist/domain/aggregates/member/Email.mjs +12 -0
- package/dist/domain/aggregates/member/Email.mjs.map +1 -0
- package/dist/domain/aggregates/member/Member.cjs +247 -0
- package/dist/domain/aggregates/member/Member.cjs.map +1 -0
- package/dist/domain/aggregates/member/Member.d.cts +91 -0
- package/dist/domain/aggregates/member/Member.d.mts +91 -0
- package/dist/domain/aggregates/member/Member.mjs +245 -0
- package/dist/domain/aggregates/member/Member.mjs.map +1 -0
- package/dist/domain/aggregates/member/MemberEvent.cjs +20 -0
- package/dist/domain/aggregates/member/MemberEvent.cjs.map +1 -0
- package/dist/domain/aggregates/member/MemberEvent.d.cts +115 -0
- package/dist/domain/aggregates/member/MemberEvent.d.mts +115 -0
- package/dist/domain/aggregates/member/MemberEvent.mjs +20 -0
- package/dist/domain/aggregates/member/MemberEvent.mjs.map +1 -0
- package/dist/domain/aggregates/member/MemberId.cjs +8 -0
- package/dist/domain/aggregates/member/MemberId.cjs.map +1 -0
- package/dist/domain/aggregates/member/MemberId.d.cts +9 -0
- package/dist/domain/aggregates/member/MemberId.d.mts +9 -0
- package/dist/domain/aggregates/member/MemberId.mjs +8 -0
- package/dist/domain/aggregates/member/MemberId.mjs.map +1 -0
- package/dist/domain/aggregates/member/MemberRepository.d.cts +14 -0
- package/dist/domain/aggregates/member/MemberRepository.d.mts +14 -0
- package/dist/domain/aggregates/member/UniversityEmail.cjs +14 -0
- package/dist/domain/aggregates/member/UniversityEmail.cjs.map +1 -0
- package/dist/domain/aggregates/member/UniversityEmail.d.cts +9 -0
- package/dist/domain/aggregates/member/UniversityEmail.d.mts +9 -0
- package/dist/domain/aggregates/member/UniversityEmail.mjs +14 -0
- package/dist/domain/aggregates/member/UniversityEmail.mjs.map +1 -0
- package/dist/domain/aggregates/member/index.cjs +5 -0
- package/dist/domain/aggregates/member/index.mjs +6 -0
- package/dist/domain/base/DomainEvent.d.cts +9 -0
- package/dist/domain/base/DomainEvent.d.mts +9 -0
- package/dist/domain/base/NonEmptyArray.d.cts +10 -0
- package/dist/domain/base/NonEmptyArray.d.mts +10 -0
- package/dist/domain/base/NonEmptyString.cjs +12 -0
- package/dist/domain/base/NonEmptyString.cjs.map +1 -0
- package/dist/domain/base/NonEmptyString.d.cts +12 -0
- package/dist/domain/base/NonEmptyString.d.mts +12 -0
- package/dist/domain/base/NonEmptyString.mjs +12 -0
- package/dist/domain/base/NonEmptyString.mjs.map +1 -0
- package/dist/domain/base/ValueObject.cjs +21 -0
- package/dist/domain/base/ValueObject.cjs.map +1 -0
- package/dist/domain/base/ValueObject.d.cts +12 -0
- package/dist/domain/base/ValueObject.d.mts +12 -0
- package/dist/domain/base/ValueObject.mjs +21 -0
- package/dist/domain/base/ValueObject.mjs.map +1 -0
- package/dist/domain/exceptions/DomainExceptions.cjs +196 -0
- package/dist/domain/exceptions/DomainExceptions.cjs.map +1 -0
- package/dist/domain/exceptions/DomainExceptions.d.cts +192 -0
- package/dist/domain/exceptions/DomainExceptions.d.mts +192 -0
- package/dist/domain/exceptions/DomainExceptions.mjs +181 -0
- package/dist/domain/exceptions/DomainExceptions.mjs.map +1 -0
- package/dist/domain/index.cjs +32 -0
- package/dist/domain/index.mjs +33 -0
- package/dist/domain/shared/Recorded.cjs +17 -0
- package/dist/domain/shared/Recorded.cjs.map +1 -0
- package/dist/domain/shared/Recorded.d.cts +20 -0
- package/dist/domain/shared/Recorded.d.mts +20 -0
- package/dist/domain/shared/Recorded.mjs +16 -0
- package/dist/domain/shared/Recorded.mjs.map +1 -0
- package/dist/domain/shared/StudentId.cjs +35 -0
- package/dist/domain/shared/StudentId.cjs.map +1 -0
- package/dist/domain/shared/StudentId.d.cts +25 -0
- package/dist/domain/shared/StudentId.d.mts +25 -0
- package/dist/domain/shared/StudentId.mjs +35 -0
- package/dist/domain/shared/StudentId.mjs.map +1 -0
- package/dist/domain/shared/affiliation/Affiliation.cjs +12 -0
- package/dist/domain/shared/affiliation/Affiliation.cjs.map +1 -0
- package/dist/domain/shared/affiliation/Affiliation.d.cts +59 -0
- package/dist/domain/shared/affiliation/Affiliation.d.mts +59 -0
- package/dist/domain/shared/affiliation/Affiliation.mjs +12 -0
- package/dist/domain/shared/affiliation/Affiliation.mjs.map +1 -0
- package/dist/domain/shared/affiliation/index.cjs +2 -0
- package/dist/domain/shared/affiliation/index.mjs +3 -0
- package/dist/domain/shared/affiliation/universityStructure.cjs +444 -0
- package/dist/domain/shared/affiliation/universityStructure.cjs.map +1 -0
- package/dist/domain/shared/affiliation/universityStructure.d.cts +262 -0
- package/dist/domain/shared/affiliation/universityStructure.d.mts +262 -0
- package/dist/domain/shared/affiliation/universityStructure.mjs +439 -0
- package/dist/domain/shared/affiliation/universityStructure.mjs.map +1 -0
- package/dist/domain/shared/index.cjs +5 -0
- package/dist/domain/shared/index.mjs +6 -0
- package/dist/executable/event.cjs +63 -0
- package/dist/executable/event.cjs.map +1 -0
- package/dist/executable/event.d.cts +56 -0
- package/dist/executable/event.d.mts +56 -0
- package/dist/executable/event.mjs +63 -0
- package/dist/executable/event.mjs.map +1 -0
- package/dist/executable/eventService.cjs +146 -0
- package/dist/executable/eventService.cjs.map +1 -0
- package/dist/executable/eventService.d.cts +143 -0
- package/dist/executable/eventService.d.mts +143 -0
- package/dist/executable/eventService.mjs +146 -0
- package/dist/executable/eventService.mjs.map +1 -0
- package/dist/executable/index.cjs +6 -0
- package/dist/executable/index.mjs +7 -0
- package/dist/executable/karte.cjs +24 -0
- package/dist/executable/karte.cjs.map +1 -0
- package/dist/executable/karte.d.cts +19 -0
- package/dist/executable/karte.d.mts +19 -0
- package/dist/executable/karte.mjs +24 -0
- package/dist/executable/karte.mjs.map +1 -0
- package/dist/executable/karteService.cjs +79 -0
- package/dist/executable/karteService.cjs.map +1 -0
- package/dist/executable/karteService.d.cts +87 -0
- package/dist/executable/karteService.d.mts +87 -0
- package/dist/executable/karteService.mjs +79 -0
- package/dist/executable/karteService.mjs.map +1 -0
- package/dist/executable/member.cjs +32 -0
- package/dist/executable/member.cjs.map +1 -0
- package/dist/executable/member.d.cts +25 -0
- package/dist/executable/member.d.mts +25 -0
- package/dist/executable/member.mjs +32 -0
- package/dist/executable/member.mjs.map +1 -0
- package/dist/executable/memberService.cjs +63 -0
- package/dist/executable/memberService.cjs.map +1 -0
- package/dist/executable/memberService.d.cts +59 -0
- package/dist/executable/memberService.d.mts +59 -0
- package/dist/executable/memberService.mjs +63 -0
- package/dist/executable/memberService.mjs.map +1 -0
- package/dist/index.cjs +105 -1914
- package/dist/index.d.cts +46 -754
- package/dist/index.d.mts +46 -0
- package/dist/index.mjs +39 -0
- package/dist/infrastructure/drizzle/DrizzleDiscordAccountRepository.cjs +57 -0
- package/dist/infrastructure/drizzle/DrizzleDiscordAccountRepository.cjs.map +1 -0
- package/dist/infrastructure/drizzle/DrizzleDiscordAccountRepository.mjs +57 -0
- package/dist/infrastructure/drizzle/DrizzleDiscordAccountRepository.mjs.map +1 -0
- package/dist/infrastructure/drizzle/DrizzleEventRepository.cjs +196 -0
- package/dist/infrastructure/drizzle/DrizzleEventRepository.cjs.map +1 -0
- package/dist/infrastructure/drizzle/DrizzleEventRepository.mjs +196 -0
- package/dist/infrastructure/drizzle/DrizzleEventRepository.mjs.map +1 -0
- package/dist/infrastructure/drizzle/DrizzleKarteRepository.cjs +241 -0
- package/dist/infrastructure/drizzle/DrizzleKarteRepository.cjs.map +1 -0
- package/dist/infrastructure/drizzle/DrizzleKarteRepository.mjs +241 -0
- package/dist/infrastructure/drizzle/DrizzleKarteRepository.mjs.map +1 -0
- package/dist/infrastructure/drizzle/DrizzleMemberRepository.cjs +112 -0
- package/dist/infrastructure/drizzle/DrizzleMemberRepository.cjs.map +1 -0
- package/dist/infrastructure/drizzle/DrizzleMemberRepository.mjs +112 -0
- package/dist/infrastructure/drizzle/DrizzleMemberRepository.mjs.map +1 -0
- package/dist/infrastructure/drizzle/client.cjs +20 -0
- package/dist/infrastructure/drizzle/client.cjs.map +1 -0
- package/dist/infrastructure/drizzle/client.mjs +20 -0
- package/dist/infrastructure/drizzle/client.mjs.map +1 -0
- package/dist/infrastructure/drizzle/index.cjs +4 -0
- package/dist/infrastructure/drizzle/index.mjs +5 -0
- package/dist/infrastructure/drizzle/schema.cjs +353 -0
- package/dist/infrastructure/drizzle/schema.cjs.map +1 -0
- package/dist/infrastructure/drizzle/schema.mjs +337 -0
- package/dist/infrastructure/drizzle/schema.mjs.map +1 -0
- package/dist/infrastructure/drizzle/serializeDiscordAccountEvent.cjs +14 -0
- package/dist/infrastructure/drizzle/serializeDiscordAccountEvent.cjs.map +1 -0
- package/dist/infrastructure/drizzle/serializeDiscordAccountEvent.mjs +14 -0
- package/dist/infrastructure/drizzle/serializeDiscordAccountEvent.mjs.map +1 -0
- package/dist/infrastructure/drizzle/serializeMemberEvent.cjs +61 -0
- package/dist/infrastructure/drizzle/serializeMemberEvent.cjs.map +1 -0
- package/dist/infrastructure/drizzle/serializeMemberEvent.mjs +61 -0
- package/dist/infrastructure/drizzle/serializeMemberEvent.mjs.map +1 -0
- package/dist/infrastructure/index.cjs +5 -0
- package/dist/infrastructure/index.mjs +6 -0
- package/package.json +67 -60
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts +0 -754
- package/dist/index.js +0 -1875
- 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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"}
|