@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,241 @@
|
|
|
1
|
+
import { notRecorded, recorded } from "../../domain/shared/Recorded.mjs";
|
|
2
|
+
import { StudentId } from "../../domain/shared/StudentId.mjs";
|
|
3
|
+
import { Karte } from "../../domain/aggregates/karte/Karte.mjs";
|
|
4
|
+
import { karteId } from "../../domain/aggregates/karte/KarteId.mjs";
|
|
5
|
+
import { CONSULTATION_CATEGORIES } from "../../domain/aggregates/karte/ConsultationCategory.mjs";
|
|
6
|
+
import { workDuration } from "../../domain/aggregates/karte/WorkDuration.mjs";
|
|
7
|
+
import { memberId } from "../../domain/aggregates/member/MemberId.mjs";
|
|
8
|
+
import "../../domain/index.mjs";
|
|
9
|
+
import { karteAssignees, kartes } from "./schema.mjs";
|
|
10
|
+
import { getDb } from "./client.mjs";
|
|
11
|
+
import { eq } from "drizzle-orm";
|
|
12
|
+
//#region src/infrastructure/drizzle/DrizzleKarteRepository.ts
|
|
13
|
+
function toRecordedClient(row) {
|
|
14
|
+
if (row.clientType === null) return 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 recorded({
|
|
21
|
+
type: "student",
|
|
22
|
+
name,
|
|
23
|
+
studentId: StudentId.fromString(row.clientStudentId),
|
|
24
|
+
affiliation: row.clientAffiliation
|
|
25
|
+
});
|
|
26
|
+
case "teacher": return recorded({
|
|
27
|
+
type: "teacher",
|
|
28
|
+
name
|
|
29
|
+
});
|
|
30
|
+
case "staff": return recorded({
|
|
31
|
+
type: "staff",
|
|
32
|
+
name
|
|
33
|
+
});
|
|
34
|
+
case "other": return 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 ? recorded(toNonEmptyArray(row.categoryIds.map((id) => {
|
|
52
|
+
const categoryId = id;
|
|
53
|
+
return {
|
|
54
|
+
id: categoryId,
|
|
55
|
+
displayName: CONSULTATION_CATEGORIES.find((c) => c.id === categoryId)?.displayName ?? id
|
|
56
|
+
};
|
|
57
|
+
}))) : notRecorded(),
|
|
58
|
+
targetDevice: row.targetDevice !== null ? recorded(row.targetDevice) : notRecorded(),
|
|
59
|
+
troubleDetails: row.troubleDetails !== null ? recorded(row.troubleDetails) : notRecorded()
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function toResolution(row) {
|
|
63
|
+
if (row.resolutionType === null) return notRecorded();
|
|
64
|
+
switch (row.resolutionType) {
|
|
65
|
+
case "resolved": return recorded({ type: "resolved" });
|
|
66
|
+
case "unresolved": return recorded({
|
|
67
|
+
type: "unresolved",
|
|
68
|
+
followUp: row.followUp !== null ? recorded(row.followUp) : 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: 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 ? recorded(toNonEmptyArray(row.karteAssignees.map(toAssignee))) : notRecorded(),
|
|
89
|
+
content: row.supportContent !== null ? recorded(row.supportContent) : notRecorded(),
|
|
90
|
+
resolution: toResolution(row),
|
|
91
|
+
workDuration: row.workDurationMinutes !== null ? recorded(workDuration(row.workDurationMinutes)) : notRecorded()
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function toDomain(row) {
|
|
95
|
+
return Karte.reconstruct({
|
|
96
|
+
id: 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 notRecorded();
|
|
145
|
+
switch (precision) {
|
|
146
|
+
case "year": return recorded({
|
|
147
|
+
precision: "year",
|
|
148
|
+
year: date.getFullYear()
|
|
149
|
+
});
|
|
150
|
+
case "yearMonth": return recorded({
|
|
151
|
+
precision: "yearMonth",
|
|
152
|
+
year: date.getFullYear(),
|
|
153
|
+
month: date.getMonth() + 1
|
|
154
|
+
});
|
|
155
|
+
case "date": return recorded({
|
|
156
|
+
precision: "date",
|
|
157
|
+
value: new Date(date)
|
|
158
|
+
});
|
|
159
|
+
case "datetime": return 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 getDb().query.kartes.findFirst({
|
|
183
|
+
where: eq(kartes.id, id),
|
|
184
|
+
with: { karteAssignees: true }
|
|
185
|
+
});
|
|
186
|
+
if (!row) return null;
|
|
187
|
+
return toDomain(row);
|
|
188
|
+
}
|
|
189
|
+
async findAll() {
|
|
190
|
+
return (await 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 = 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(kartes).values(values).onConflictDoUpdate({
|
|
222
|
+
target: kartes.id,
|
|
223
|
+
set: updateValues
|
|
224
|
+
});
|
|
225
|
+
await tx.delete(karteAssignees).where(eq(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(karteAssignees).values(assigneeRows);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
//#endregion
|
|
239
|
+
export { DrizzleKarteRepository };
|
|
240
|
+
|
|
241
|
+
//# sourceMappingURL=DrizzleKarteRepository.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrizzleKarteRepository.mjs","names":[],"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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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
const require_Recorded = require("../../domain/shared/Recorded.cjs");
|
|
2
|
+
const require_StudentId = require("../../domain/shared/StudentId.cjs");
|
|
3
|
+
const require_Member = require("../../domain/aggregates/member/Member.cjs");
|
|
4
|
+
const require_MemberId = require("../../domain/aggregates/member/MemberId.cjs");
|
|
5
|
+
const require_Email = require("../../domain/aggregates/member/Email.cjs");
|
|
6
|
+
const require_UniversityEmail = require("../../domain/aggregates/member/UniversityEmail.cjs");
|
|
7
|
+
require("../../domain/index.cjs");
|
|
8
|
+
const require_schema = require("./schema.cjs");
|
|
9
|
+
const require_client = require("./client.cjs");
|
|
10
|
+
const require_serializeMemberEvent = require("./serializeMemberEvent.cjs");
|
|
11
|
+
let uuid = require("uuid");
|
|
12
|
+
let drizzle_orm = require("drizzle-orm");
|
|
13
|
+
//#region src/infrastructure/drizzle/DrizzleMemberRepository.ts
|
|
14
|
+
function toDomain(row) {
|
|
15
|
+
const id = require_MemberId.memberId(row.id);
|
|
16
|
+
const email = new require_UniversityEmail.UniversityEmail(row.email);
|
|
17
|
+
const name = row.name;
|
|
18
|
+
const personalEmail = row.personalEmail !== null ? require_Recorded.recorded(new require_Email.Email(row.personalEmail)) : require_Recorded.notRecorded();
|
|
19
|
+
switch (row.status) {
|
|
20
|
+
case "active":
|
|
21
|
+
if (row.affiliation === null || row.studentId === null) throw new Error(`データ不整合: status=active だが affiliation または studentId が null (id=${row.id})`);
|
|
22
|
+
return require_Member.ActiveMember.reconstruct({
|
|
23
|
+
id,
|
|
24
|
+
email,
|
|
25
|
+
name,
|
|
26
|
+
personalEmail,
|
|
27
|
+
studentId: require_StudentId.StudentId.fromString(row.studentId),
|
|
28
|
+
affiliation: row.affiliation
|
|
29
|
+
});
|
|
30
|
+
case "unconfirmed": return require_Member.UnconfirmedMember.reconstruct({
|
|
31
|
+
id,
|
|
32
|
+
email,
|
|
33
|
+
name,
|
|
34
|
+
personalEmail
|
|
35
|
+
});
|
|
36
|
+
case "former": return require_Member.FormerMember.reconstruct({
|
|
37
|
+
id,
|
|
38
|
+
email,
|
|
39
|
+
name,
|
|
40
|
+
personalEmail
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function toInsertValues(member) {
|
|
45
|
+
const base = {
|
|
46
|
+
id: member.id,
|
|
47
|
+
name: member.name,
|
|
48
|
+
email: member.email.getValue(),
|
|
49
|
+
personalEmail: member.personalEmail.type === "recorded" ? member.personalEmail.value.getValue() : null,
|
|
50
|
+
status: member.status,
|
|
51
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
52
|
+
};
|
|
53
|
+
switch (member.status) {
|
|
54
|
+
case "active": return {
|
|
55
|
+
...base,
|
|
56
|
+
studentId: member.studentId.getValue(),
|
|
57
|
+
affiliation: member.affiliation
|
|
58
|
+
};
|
|
59
|
+
case "unconfirmed":
|
|
60
|
+
case "former": return {
|
|
61
|
+
...base,
|
|
62
|
+
studentId: null,
|
|
63
|
+
affiliation: null
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
var DrizzleMemberRepository = class {
|
|
68
|
+
async findById(id) {
|
|
69
|
+
const row = await require_client.getDb().query.members.findFirst({ where: (0, drizzle_orm.eq)(require_schema.members.id, id) });
|
|
70
|
+
if (!row) return null;
|
|
71
|
+
return toDomain(row);
|
|
72
|
+
}
|
|
73
|
+
async findByEmail(email) {
|
|
74
|
+
const row = await require_client.getDb().query.members.findFirst({ where: (0, drizzle_orm.eq)(require_schema.members.email, email.getValue()) });
|
|
75
|
+
if (!row) return null;
|
|
76
|
+
return toDomain(row);
|
|
77
|
+
}
|
|
78
|
+
async findAll() {
|
|
79
|
+
return (await require_client.getDb().query.members.findMany()).map(toDomain);
|
|
80
|
+
}
|
|
81
|
+
async save(member) {
|
|
82
|
+
const db = require_client.getDb();
|
|
83
|
+
const values = toInsertValues(member);
|
|
84
|
+
const events = member.getDomainEvents();
|
|
85
|
+
await db.transaction(async (tx) => {
|
|
86
|
+
await tx.insert(require_schema.members).values(values).onConflictDoUpdate({
|
|
87
|
+
target: require_schema.members.id,
|
|
88
|
+
set: {
|
|
89
|
+
name: values.name,
|
|
90
|
+
email: values.email,
|
|
91
|
+
personalEmail: values.personalEmail,
|
|
92
|
+
status: values.status,
|
|
93
|
+
studentId: values.studentId,
|
|
94
|
+
affiliation: values.affiliation,
|
|
95
|
+
updatedAt: values.updatedAt
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
if (events.length > 0) await tx.insert(require_schema.memberDomainEvents).values(events.map((event) => ({
|
|
99
|
+
id: (0, uuid.v4)(),
|
|
100
|
+
memberId: event.id,
|
|
101
|
+
email: event.email.getValue(),
|
|
102
|
+
eventName: event.eventName,
|
|
103
|
+
payload: require_serializeMemberEvent.serializeMemberEventPayload(event),
|
|
104
|
+
occurredAt: event.occurredAt.toISOString()
|
|
105
|
+
})));
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
//#endregion
|
|
110
|
+
exports.DrizzleMemberRepository = DrizzleMemberRepository;
|
|
111
|
+
|
|
112
|
+
//# sourceMappingURL=DrizzleMemberRepository.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrizzleMemberRepository.cjs","names":["memberId","UniversityEmail","recorded","Email","notRecorded","ActiveMember","StudentId","UnconfirmedMember","FormerMember","getDb","members","memberDomainEvents","serializeMemberEventPayload"],"sources":["../../../src/infrastructure/drizzle/DrizzleMemberRepository.ts"],"sourcesContent":["import { v4 as uuid } from \"uuid\";\nimport { eq } from \"drizzle-orm\";\nimport {\n\tActiveMember,\n\tEmail,\n\tFormerMember,\n\tStudentId,\n\tUnconfirmedMember,\n\tUniversityEmail,\n\tmemberId,\n\tnotRecorded,\n\trecorded,\n\ttype CompleteAffiliation,\n\ttype Member,\n\ttype MemberId,\n\ttype MemberRepository,\n\ttype Recorded,\n} from \"#domain\";\nimport { getDb } from \"./client\";\nimport { memberDomainEvents, members } from \"./schema\";\nimport { serializeMemberEventPayload } from \"./serializeMemberEvent\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\ntype MemberRow = typeof members.$inferSelect;\n\n// ============================================================================\n// Domain ↔ DB Mapping\n// ============================================================================\n\nfunction toDomain(row: MemberRow): Member {\n\tconst id = memberId(row.id);\n\tconst email = new UniversityEmail(row.email);\n\tconst name = row.name;\n\tconst personalEmail: Recorded<Email> =\n\t\trow.personalEmail !== null ? recorded(new Email(row.personalEmail)) : notRecorded();\n\n\tswitch (row.status) {\n\t\tcase \"active\": {\n\t\t\tif (row.affiliation === null || row.studentId === null) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`データ不整合: status=active だが affiliation または studentId が null (id=${row.id})`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn ActiveMember.reconstruct({\n\t\t\t\tid,\n\t\t\t\temail,\n\t\t\t\tname,\n\t\t\t\tpersonalEmail,\n\t\t\t\tstudentId: StudentId.fromString(row.studentId),\n\t\t\t\taffiliation: row.affiliation as CompleteAffiliation,\n\t\t\t});\n\t\t}\n\t\tcase \"unconfirmed\":\n\t\t\treturn UnconfirmedMember.reconstruct({ id, email, name, personalEmail });\n\t\tcase \"former\":\n\t\t\treturn FormerMember.reconstruct({ id, email, name, personalEmail });\n\t}\n}\n\n// ============================================================================\n// Persistence Helpers\n// ============================================================================\n\ntype MemberInsert = typeof members.$inferInsert;\n\nfunction toInsertValues(member: Member): MemberInsert {\n\tconst base = {\n\t\tid: member.id as string,\n\t\tname: member.name,\n\t\temail: member.email.getValue(),\n\t\tpersonalEmail:\n\t\t\tmember.personalEmail.type === \"recorded\" ? member.personalEmail.value.getValue() : null,\n\t\tstatus: member.status,\n\t\tupdatedAt: new Date().toISOString(),\n\t};\n\n\tswitch (member.status) {\n\t\tcase \"active\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tstudentId: member.studentId.getValue(),\n\t\t\t\taffiliation: member.affiliation,\n\t\t\t};\n\t\tcase \"unconfirmed\":\n\t\tcase \"former\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tstudentId: null,\n\t\t\t\taffiliation: null,\n\t\t\t};\n\t}\n}\n\n// ============================================================================\n// Repository Implementation\n// ============================================================================\n\nexport class DrizzleMemberRepository implements MemberRepository {\n\tasync findById(id: MemberId): Promise<Member | null> {\n\t\tconst db = getDb();\n\t\tconst row = await db.query.members.findFirst({\n\t\t\twhere: eq(members.id, id as string),\n\t\t});\n\t\tif (!row) return null;\n\t\treturn toDomain(row);\n\t}\n\n\tasync findByEmail(email: UniversityEmail): Promise<Member | null> {\n\t\tconst db = getDb();\n\t\tconst row = await db.query.members.findFirst({\n\t\t\twhere: eq(members.email, email.getValue()),\n\t\t});\n\t\tif (!row) return null;\n\t\treturn toDomain(row);\n\t}\n\n\tasync findAll(): Promise<Member[]> {\n\t\tconst db = getDb();\n\t\tconst rows = await db.query.members.findMany();\n\t\treturn rows.map(toDomain);\n\t}\n\n\tasync save(member: Member): Promise<void> {\n\t\tconst db = getDb();\n\t\tconst values = toInsertValues(member);\n\t\tconst events = member.getDomainEvents();\n\n\t\tawait db.transaction(async (tx) => {\n\t\t\tawait tx\n\t\t\t\t.insert(members)\n\t\t\t\t.values(values)\n\t\t\t\t.onConflictDoUpdate({\n\t\t\t\t\ttarget: members.id,\n\t\t\t\t\tset: {\n\t\t\t\t\t\tname: values.name,\n\t\t\t\t\t\temail: values.email,\n\t\t\t\t\t\tpersonalEmail: values.personalEmail,\n\t\t\t\t\t\tstatus: values.status,\n\t\t\t\t\t\tstudentId: values.studentId,\n\t\t\t\t\t\taffiliation: values.affiliation,\n\t\t\t\t\t\tupdatedAt: values.updatedAt,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\tif (events.length > 0) {\n\t\t\t\tawait tx.insert(memberDomainEvents).values(\n\t\t\t\t\tevents.map((event) => ({\n\t\t\t\t\t\tid: uuid(),\n\t\t\t\t\t\tmemberId: event.id as string,\n\t\t\t\t\t\temail: event.email.getValue(),\n\t\t\t\t\t\teventName: event.eventName,\n\t\t\t\t\t\tpayload: serializeMemberEventPayload(event),\n\t\t\t\t\t\toccurredAt: event.occurredAt.toISOString(),\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { notRecorded, recorded } from "../../domain/shared/Recorded.mjs";
|
|
2
|
+
import { StudentId } from "../../domain/shared/StudentId.mjs";
|
|
3
|
+
import { ActiveMember, FormerMember, UnconfirmedMember } from "../../domain/aggregates/member/Member.mjs";
|
|
4
|
+
import { memberId } from "../../domain/aggregates/member/MemberId.mjs";
|
|
5
|
+
import { Email } from "../../domain/aggregates/member/Email.mjs";
|
|
6
|
+
import { UniversityEmail } from "../../domain/aggregates/member/UniversityEmail.mjs";
|
|
7
|
+
import "../../domain/index.mjs";
|
|
8
|
+
import { memberDomainEvents, members } from "./schema.mjs";
|
|
9
|
+
import { getDb } from "./client.mjs";
|
|
10
|
+
import { serializeMemberEventPayload } from "./serializeMemberEvent.mjs";
|
|
11
|
+
import { v4 } from "uuid";
|
|
12
|
+
import { eq } from "drizzle-orm";
|
|
13
|
+
//#region src/infrastructure/drizzle/DrizzleMemberRepository.ts
|
|
14
|
+
function toDomain(row) {
|
|
15
|
+
const id = memberId(row.id);
|
|
16
|
+
const email = new UniversityEmail(row.email);
|
|
17
|
+
const name = row.name;
|
|
18
|
+
const personalEmail = row.personalEmail !== null ? recorded(new Email(row.personalEmail)) : notRecorded();
|
|
19
|
+
switch (row.status) {
|
|
20
|
+
case "active":
|
|
21
|
+
if (row.affiliation === null || row.studentId === null) throw new Error(`データ不整合: status=active だが affiliation または studentId が null (id=${row.id})`);
|
|
22
|
+
return ActiveMember.reconstruct({
|
|
23
|
+
id,
|
|
24
|
+
email,
|
|
25
|
+
name,
|
|
26
|
+
personalEmail,
|
|
27
|
+
studentId: StudentId.fromString(row.studentId),
|
|
28
|
+
affiliation: row.affiliation
|
|
29
|
+
});
|
|
30
|
+
case "unconfirmed": return UnconfirmedMember.reconstruct({
|
|
31
|
+
id,
|
|
32
|
+
email,
|
|
33
|
+
name,
|
|
34
|
+
personalEmail
|
|
35
|
+
});
|
|
36
|
+
case "former": return FormerMember.reconstruct({
|
|
37
|
+
id,
|
|
38
|
+
email,
|
|
39
|
+
name,
|
|
40
|
+
personalEmail
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function toInsertValues(member) {
|
|
45
|
+
const base = {
|
|
46
|
+
id: member.id,
|
|
47
|
+
name: member.name,
|
|
48
|
+
email: member.email.getValue(),
|
|
49
|
+
personalEmail: member.personalEmail.type === "recorded" ? member.personalEmail.value.getValue() : null,
|
|
50
|
+
status: member.status,
|
|
51
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
52
|
+
};
|
|
53
|
+
switch (member.status) {
|
|
54
|
+
case "active": return {
|
|
55
|
+
...base,
|
|
56
|
+
studentId: member.studentId.getValue(),
|
|
57
|
+
affiliation: member.affiliation
|
|
58
|
+
};
|
|
59
|
+
case "unconfirmed":
|
|
60
|
+
case "former": return {
|
|
61
|
+
...base,
|
|
62
|
+
studentId: null,
|
|
63
|
+
affiliation: null
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
var DrizzleMemberRepository = class {
|
|
68
|
+
async findById(id) {
|
|
69
|
+
const row = await getDb().query.members.findFirst({ where: eq(members.id, id) });
|
|
70
|
+
if (!row) return null;
|
|
71
|
+
return toDomain(row);
|
|
72
|
+
}
|
|
73
|
+
async findByEmail(email) {
|
|
74
|
+
const row = await getDb().query.members.findFirst({ where: eq(members.email, email.getValue()) });
|
|
75
|
+
if (!row) return null;
|
|
76
|
+
return toDomain(row);
|
|
77
|
+
}
|
|
78
|
+
async findAll() {
|
|
79
|
+
return (await getDb().query.members.findMany()).map(toDomain);
|
|
80
|
+
}
|
|
81
|
+
async save(member) {
|
|
82
|
+
const db = getDb();
|
|
83
|
+
const values = toInsertValues(member);
|
|
84
|
+
const events = member.getDomainEvents();
|
|
85
|
+
await db.transaction(async (tx) => {
|
|
86
|
+
await tx.insert(members).values(values).onConflictDoUpdate({
|
|
87
|
+
target: members.id,
|
|
88
|
+
set: {
|
|
89
|
+
name: values.name,
|
|
90
|
+
email: values.email,
|
|
91
|
+
personalEmail: values.personalEmail,
|
|
92
|
+
status: values.status,
|
|
93
|
+
studentId: values.studentId,
|
|
94
|
+
affiliation: values.affiliation,
|
|
95
|
+
updatedAt: values.updatedAt
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
if (events.length > 0) await tx.insert(memberDomainEvents).values(events.map((event) => ({
|
|
99
|
+
id: v4(),
|
|
100
|
+
memberId: event.id,
|
|
101
|
+
email: event.email.getValue(),
|
|
102
|
+
eventName: event.eventName,
|
|
103
|
+
payload: serializeMemberEventPayload(event),
|
|
104
|
+
occurredAt: event.occurredAt.toISOString()
|
|
105
|
+
})));
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
//#endregion
|
|
110
|
+
export { DrizzleMemberRepository };
|
|
111
|
+
|
|
112
|
+
//# sourceMappingURL=DrizzleMemberRepository.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrizzleMemberRepository.mjs","names":["uuid"],"sources":["../../../src/infrastructure/drizzle/DrizzleMemberRepository.ts"],"sourcesContent":["import { v4 as uuid } from \"uuid\";\nimport { eq } from \"drizzle-orm\";\nimport {\n\tActiveMember,\n\tEmail,\n\tFormerMember,\n\tStudentId,\n\tUnconfirmedMember,\n\tUniversityEmail,\n\tmemberId,\n\tnotRecorded,\n\trecorded,\n\ttype CompleteAffiliation,\n\ttype Member,\n\ttype MemberId,\n\ttype MemberRepository,\n\ttype Recorded,\n} from \"#domain\";\nimport { getDb } from \"./client\";\nimport { memberDomainEvents, members } from \"./schema\";\nimport { serializeMemberEventPayload } from \"./serializeMemberEvent\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\ntype MemberRow = typeof members.$inferSelect;\n\n// ============================================================================\n// Domain ↔ DB Mapping\n// ============================================================================\n\nfunction toDomain(row: MemberRow): Member {\n\tconst id = memberId(row.id);\n\tconst email = new UniversityEmail(row.email);\n\tconst name = row.name;\n\tconst personalEmail: Recorded<Email> =\n\t\trow.personalEmail !== null ? recorded(new Email(row.personalEmail)) : notRecorded();\n\n\tswitch (row.status) {\n\t\tcase \"active\": {\n\t\t\tif (row.affiliation === null || row.studentId === null) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`データ不整合: status=active だが affiliation または studentId が null (id=${row.id})`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn ActiveMember.reconstruct({\n\t\t\t\tid,\n\t\t\t\temail,\n\t\t\t\tname,\n\t\t\t\tpersonalEmail,\n\t\t\t\tstudentId: StudentId.fromString(row.studentId),\n\t\t\t\taffiliation: row.affiliation as CompleteAffiliation,\n\t\t\t});\n\t\t}\n\t\tcase \"unconfirmed\":\n\t\t\treturn UnconfirmedMember.reconstruct({ id, email, name, personalEmail });\n\t\tcase \"former\":\n\t\t\treturn FormerMember.reconstruct({ id, email, name, personalEmail });\n\t}\n}\n\n// ============================================================================\n// Persistence Helpers\n// ============================================================================\n\ntype MemberInsert = typeof members.$inferInsert;\n\nfunction toInsertValues(member: Member): MemberInsert {\n\tconst base = {\n\t\tid: member.id as string,\n\t\tname: member.name,\n\t\temail: member.email.getValue(),\n\t\tpersonalEmail:\n\t\t\tmember.personalEmail.type === \"recorded\" ? member.personalEmail.value.getValue() : null,\n\t\tstatus: member.status,\n\t\tupdatedAt: new Date().toISOString(),\n\t};\n\n\tswitch (member.status) {\n\t\tcase \"active\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tstudentId: member.studentId.getValue(),\n\t\t\t\taffiliation: member.affiliation,\n\t\t\t};\n\t\tcase \"unconfirmed\":\n\t\tcase \"former\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tstudentId: null,\n\t\t\t\taffiliation: null,\n\t\t\t};\n\t}\n}\n\n// ============================================================================\n// Repository Implementation\n// ============================================================================\n\nexport class DrizzleMemberRepository implements MemberRepository {\n\tasync findById(id: MemberId): Promise<Member | null> {\n\t\tconst db = getDb();\n\t\tconst row = await db.query.members.findFirst({\n\t\t\twhere: eq(members.id, id as string),\n\t\t});\n\t\tif (!row) return null;\n\t\treturn toDomain(row);\n\t}\n\n\tasync findByEmail(email: UniversityEmail): Promise<Member | null> {\n\t\tconst db = getDb();\n\t\tconst row = await db.query.members.findFirst({\n\t\t\twhere: eq(members.email, email.getValue()),\n\t\t});\n\t\tif (!row) return null;\n\t\treturn toDomain(row);\n\t}\n\n\tasync findAll(): Promise<Member[]> {\n\t\tconst db = getDb();\n\t\tconst rows = await db.query.members.findMany();\n\t\treturn rows.map(toDomain);\n\t}\n\n\tasync save(member: Member): Promise<void> {\n\t\tconst db = getDb();\n\t\tconst values = toInsertValues(member);\n\t\tconst events = member.getDomainEvents();\n\n\t\tawait db.transaction(async (tx) => {\n\t\t\tawait tx\n\t\t\t\t.insert(members)\n\t\t\t\t.values(values)\n\t\t\t\t.onConflictDoUpdate({\n\t\t\t\t\ttarget: members.id,\n\t\t\t\t\tset: {\n\t\t\t\t\t\tname: values.name,\n\t\t\t\t\t\temail: values.email,\n\t\t\t\t\t\tpersonalEmail: values.personalEmail,\n\t\t\t\t\t\tstatus: values.status,\n\t\t\t\t\t\tstudentId: values.studentId,\n\t\t\t\t\t\taffiliation: values.affiliation,\n\t\t\t\t\t\tupdatedAt: values.updatedAt,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\tif (events.length > 0) {\n\t\t\t\tawait tx.insert(memberDomainEvents).values(\n\t\t\t\t\tevents.map((event) => ({\n\t\t\t\t\t\tid: uuid(),\n\t\t\t\t\t\tmemberId: event.id as string,\n\t\t\t\t\t\temail: event.email.getValue(),\n\t\t\t\t\t\teventName: event.eventName,\n\t\t\t\t\t\tpayload: serializeMemberEventPayload(event),\n\t\t\t\t\t\toccurredAt: event.occurredAt.toISOString(),\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;AAgCA,SAAS,SAAS,KAAwB;CACzC,MAAM,KAAK,SAAS,IAAI,GAAG;CAC3B,MAAM,QAAQ,IAAI,gBAAgB,IAAI,MAAM;CAC5C,MAAM,OAAO,IAAI;CACjB,MAAM,gBACL,IAAI,kBAAkB,OAAO,SAAS,IAAI,MAAM,IAAI,cAAc,CAAC,GAAG,aAAa;AAEpF,SAAQ,IAAI,QAAZ;EACC,KAAK;AACJ,OAAI,IAAI,gBAAgB,QAAQ,IAAI,cAAc,KACjD,OAAM,IAAI,MACT,iEAAiE,IAAI,GAAG,GACxE;AAEF,UAAO,aAAa,YAAY;IAC/B;IACA;IACA;IACA;IACA,WAAW,UAAU,WAAW,IAAI,UAAU;IAC9C,aAAa,IAAI;IACjB,CAAC;EAEH,KAAK,cACJ,QAAO,kBAAkB,YAAY;GAAE;GAAI;GAAO;GAAM;GAAe,CAAC;EACzE,KAAK,SACJ,QAAO,aAAa,YAAY;GAAE;GAAI;GAAO;GAAM;GAAe,CAAC;;;AAUtE,SAAS,eAAe,QAA8B;CACrD,MAAM,OAAO;EACZ,IAAI,OAAO;EACX,MAAM,OAAO;EACb,OAAO,OAAO,MAAM,UAAU;EAC9B,eACC,OAAO,cAAc,SAAS,aAAa,OAAO,cAAc,MAAM,UAAU,GAAG;EACpF,QAAQ,OAAO;EACf,4BAAW,IAAI,MAAM,EAAC,aAAa;EACnC;AAED,SAAQ,OAAO,QAAf;EACC,KAAK,SACJ,QAAO;GACN,GAAG;GACH,WAAW,OAAO,UAAU,UAAU;GACtC,aAAa,OAAO;GACpB;EACF,KAAK;EACL,KAAK,SACJ,QAAO;GACN,GAAG;GACH,WAAW;GACX,aAAa;GACb;;;AAQJ,IAAa,0BAAb,MAAiE;CAChE,MAAM,SAAS,IAAsC;EAEpD,MAAM,MAAM,MADD,OAAO,CACG,MAAM,QAAQ,UAAU,EAC5C,OAAO,GAAG,QAAQ,IAAI,GAAa,EACnC,CAAC;AACF,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,SAAS,IAAI;;CAGrB,MAAM,YAAY,OAAgD;EAEjE,MAAM,MAAM,MADD,OAAO,CACG,MAAM,QAAQ,UAAU,EAC5C,OAAO,GAAG,QAAQ,OAAO,MAAM,UAAU,CAAC,EAC1C,CAAC;AACF,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,SAAS,IAAI;;CAGrB,MAAM,UAA6B;AAGlC,UADa,MADF,OAAO,CACI,MAAM,QAAQ,UAAU,EAClC,IAAI,SAAS;;CAG1B,MAAM,KAAK,QAA+B;EACzC,MAAM,KAAK,OAAO;EAClB,MAAM,SAAS,eAAe,OAAO;EACrC,MAAM,SAAS,OAAO,iBAAiB;AAEvC,QAAM,GAAG,YAAY,OAAO,OAAO;AAClC,SAAM,GACJ,OAAO,QAAQ,CACf,OAAO,OAAO,CACd,mBAAmB;IACnB,QAAQ,QAAQ;IAChB,KAAK;KACJ,MAAM,OAAO;KACb,OAAO,OAAO;KACd,eAAe,OAAO;KACtB,QAAQ,OAAO;KACf,WAAW,OAAO;KAClB,aAAa,OAAO;KACpB,WAAW,OAAO;KAClB;IACD,CAAC;AAEH,OAAI,OAAO,SAAS,EACnB,OAAM,GAAG,OAAO,mBAAmB,CAAC,OACnC,OAAO,KAAK,WAAW;IACtB,IAAIA,IAAM;IACV,UAAU,MAAM;IAChB,OAAO,MAAM,MAAM,UAAU;IAC7B,WAAW,MAAM;IACjB,SAAS,4BAA4B,MAAM;IAC3C,YAAY,MAAM,WAAW,aAAa;IAC1C,EAAE,CACH;IAED"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const require_schema = require("./schema.cjs");
|
|
2
|
+
let drizzle_orm_node_postgres = require("drizzle-orm/node-postgres");
|
|
3
|
+
let pg = require("pg");
|
|
4
|
+
//#region src/infrastructure/drizzle/client.ts
|
|
5
|
+
let pool = null;
|
|
6
|
+
function getPool() {
|
|
7
|
+
if (!pool) {
|
|
8
|
+
const connectionString = process.env.DATABASE_URL;
|
|
9
|
+
if (!connectionString) throw new Error("DATABASE_URL environment variable is not set");
|
|
10
|
+
pool = new pg.Pool({ connectionString });
|
|
11
|
+
}
|
|
12
|
+
return pool;
|
|
13
|
+
}
|
|
14
|
+
function getDb() {
|
|
15
|
+
return (0, drizzle_orm_node_postgres.drizzle)(getPool(), { schema: require_schema.schema_exports });
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
exports.getDb = getDb;
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=client.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.cjs","names":["Pool"],"sources":["../../../src/infrastructure/drizzle/client.ts"],"sourcesContent":["import { drizzle } from \"drizzle-orm/node-postgres\";\nimport { Pool } from \"pg\";\nimport * as schema from \"./schema\";\n\nlet pool: Pool | null = null;\n\nfunction getPool(): Pool {\n\tif (!pool) {\n\t\tconst connectionString = process.env.DATABASE_URL;\n\t\tif (!connectionString) {\n\t\t\tthrow new Error(\"DATABASE_URL environment variable is not set\");\n\t\t}\n\t\tpool = new Pool({ connectionString });\n\t}\n\treturn pool;\n}\n\nexport function getDb() {\n\treturn drizzle(getPool(), { schema });\n}\n\nexport type DrizzleDb = ReturnType<typeof getDb>;\n"],"mappings":";;;;AAIA,IAAI,OAAoB;AAExB,SAAS,UAAgB;AACxB,KAAI,CAAC,MAAM;EACV,MAAM,mBAAmB,QAAQ,IAAI;AACrC,MAAI,CAAC,iBACJ,OAAM,IAAI,MAAM,+CAA+C;AAEhE,SAAO,IAAIA,GAAAA,KAAK,EAAE,kBAAkB,CAAC;;AAEtC,QAAO;;AAGR,SAAgB,QAAQ;AACvB,SAAA,GAAA,0BAAA,SAAe,SAAS,EAAE,EAAE,QAAA,eAAA,gBAAQ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { schema_exports } from "./schema.mjs";
|
|
2
|
+
import { drizzle } from "drizzle-orm/node-postgres";
|
|
3
|
+
import { Pool } from "pg";
|
|
4
|
+
//#region src/infrastructure/drizzle/client.ts
|
|
5
|
+
let pool = null;
|
|
6
|
+
function getPool() {
|
|
7
|
+
if (!pool) {
|
|
8
|
+
const connectionString = process.env.DATABASE_URL;
|
|
9
|
+
if (!connectionString) throw new Error("DATABASE_URL environment variable is not set");
|
|
10
|
+
pool = new Pool({ connectionString });
|
|
11
|
+
}
|
|
12
|
+
return pool;
|
|
13
|
+
}
|
|
14
|
+
function getDb() {
|
|
15
|
+
return drizzle(getPool(), { schema: schema_exports });
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { getDb };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=client.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.mjs","names":[],"sources":["../../../src/infrastructure/drizzle/client.ts"],"sourcesContent":["import { drizzle } from \"drizzle-orm/node-postgres\";\nimport { Pool } from \"pg\";\nimport * as schema from \"./schema\";\n\nlet pool: Pool | null = null;\n\nfunction getPool(): Pool {\n\tif (!pool) {\n\t\tconst connectionString = process.env.DATABASE_URL;\n\t\tif (!connectionString) {\n\t\t\tthrow new Error(\"DATABASE_URL environment variable is not set\");\n\t\t}\n\t\tpool = new Pool({ connectionString });\n\t}\n\treturn pool;\n}\n\nexport function getDb() {\n\treturn drizzle(getPool(), { schema });\n}\n\nexport type DrizzleDb = ReturnType<typeof getDb>;\n"],"mappings":";;;;AAIA,IAAI,OAAoB;AAExB,SAAS,UAAgB;AACxB,KAAI,CAAC,MAAM;EACV,MAAM,mBAAmB,QAAQ,IAAI;AACrC,MAAI,CAAC,iBACJ,OAAM,IAAI,MAAM,+CAA+C;AAEhE,SAAO,IAAI,KAAK,EAAE,kBAAkB,CAAC;;AAEtC,QAAO;;AAGR,SAAgB,QAAQ;AACvB,QAAO,QAAQ,SAAS,EAAE,EAAE,QAAA,gBAAQ,CAAC"}
|