@shizuoka-its/core 2.0.0-alpha.4 → 2.0.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/application/usecase/eventParticipation/GetEventsByMember.d.ts +11 -0
  2. package/dist/application/usecase/eventParticipation/GetEventsByMember.js +12 -0
  3. package/dist/application/usecase/eventParticipation/GetExhibitsByMember.d.ts +11 -0
  4. package/dist/application/usecase/eventParticipation/GetExhibitsByMember.js +21 -0
  5. package/dist/application/usecase/eventParticipation/GetMembersByEvent.d.ts +13 -0
  6. package/dist/application/usecase/eventParticipation/GetMembersByEvent.js +20 -0
  7. package/dist/application/usecase/eventParticipation/GetMembersByExhibit.d.ts +13 -0
  8. package/dist/application/usecase/eventParticipation/GetMembersByExhibit.js +21 -0
  9. package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.d.ts +12 -0
  10. package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.js +23 -0
  11. package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.d.ts +12 -0
  12. package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.js +23 -0
  13. package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.d.ts +12 -0
  14. package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.js +19 -0
  15. package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.d.ts +12 -0
  16. package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.js +19 -0
  17. package/dist/application/usecase/eventParticipation/index.d.ts +8 -0
  18. package/dist/application/usecase/eventParticipation/index.js +25 -0
  19. package/dist/domain/aggregates/event/Event.d.ts +8 -0
  20. package/dist/domain/aggregates/event/Event.js +29 -0
  21. package/dist/domain/aggregates/event/EventRepository.d.ts +2 -0
  22. package/dist/domain/aggregates/event/Exhibit.d.ts +4 -0
  23. package/dist/domain/aggregates/event/Exhibit.js +10 -0
  24. package/dist/domain/exceptions/DomainExceptions.d.ts +3 -0
  25. package/dist/domain/exceptions/DomainExceptions.js +8 -1
  26. package/dist/infrastructure/prisma/PrismaEventRepository.d.ts +2 -0
  27. package/dist/infrastructure/prisma/PrismaEventRepository.js +68 -0
  28. package/dist/infrastructure/prisma/index.d.ts +0 -2
  29. package/dist/infrastructure/prisma/index.js +0 -2
  30. package/package.json +1 -1
  31. package/dist/domain/aggregates/memberEvent/MemberEvent.d.ts +0 -11
  32. package/dist/domain/aggregates/memberEvent/MemberEvent.js +0 -18
  33. package/dist/domain/aggregates/memberEvent/MemberEventRepository.d.ts +0 -8
  34. package/dist/domain/aggregates/memberEvent/MemberEventRepository.js +0 -2
  35. package/dist/domain/aggregates/memberExhibit/MemberExhibit.d.ts +0 -11
  36. package/dist/domain/aggregates/memberExhibit/MemberExhibit.js +0 -18
  37. package/dist/domain/aggregates/memberExhibit/MemberExhibitRepository.d.ts +0 -8
  38. package/dist/domain/aggregates/memberExhibit/MemberExhibitRepository.js +0 -2
  39. package/dist/infrastructure/prisma/PrismaMemberEventRepository.d.ts +0 -10
  40. package/dist/infrastructure/prisma/PrismaMemberEventRepository.js +0 -48
  41. package/dist/infrastructure/prisma/PrismaMemberExhibitRepository.d.ts +0 -10
  42. package/dist/infrastructure/prisma/PrismaMemberExhibitRepository.js +0 -48
@@ -0,0 +1,11 @@
1
+ import type { Event } from "../../../domain/aggregates/event/Event";
2
+ import type { EventRepository } from "../../../domain/aggregates/event/EventRepository";
3
+ import type { IUseCase } from "../base";
4
+ export interface GetEventsByMemberInput {
5
+ memberId: string;
6
+ }
7
+ export declare class GetEventsByMember implements IUseCase<GetEventsByMemberInput, Event[]> {
8
+ private readonly eventRepository;
9
+ constructor(eventRepository: EventRepository);
10
+ execute(input: GetEventsByMemberInput): Promise<Event[]>;
11
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GetEventsByMember = void 0;
4
+ class GetEventsByMember {
5
+ constructor(eventRepository) {
6
+ this.eventRepository = eventRepository;
7
+ }
8
+ async execute(input) {
9
+ return await this.eventRepository.findByParticipantMemberId(input.memberId);
10
+ }
11
+ }
12
+ exports.GetEventsByMember = GetEventsByMember;
@@ -0,0 +1,11 @@
1
+ import type { EventRepository } from "../../../domain/aggregates/event/EventRepository";
2
+ import type { Exhibit } from "../../../domain/aggregates/event/Exhibit";
3
+ import type { IUseCase } from "../base";
4
+ export interface GetExhibitsByMemberInput {
5
+ memberId: string;
6
+ }
7
+ export declare class GetExhibitsByMember implements IUseCase<GetExhibitsByMemberInput, Exhibit[]> {
8
+ private readonly eventRepository;
9
+ constructor(eventRepository: EventRepository);
10
+ execute(input: GetExhibitsByMemberInput): Promise<Exhibit[]>;
11
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GetExhibitsByMember = void 0;
4
+ class GetExhibitsByMember {
5
+ constructor(eventRepository) {
6
+ this.eventRepository = eventRepository;
7
+ }
8
+ async execute(input) {
9
+ const events = await this.eventRepository.findByParticipantMemberId(input.memberId);
10
+ const exhibits = [];
11
+ for (const event of events) {
12
+ for (const exhibit of event.getExhibits()) {
13
+ if (exhibit.getMemberIds().includes(input.memberId)) {
14
+ exhibits.push(exhibit);
15
+ }
16
+ }
17
+ }
18
+ return exhibits;
19
+ }
20
+ }
21
+ exports.GetExhibitsByMember = GetExhibitsByMember;
@@ -0,0 +1,13 @@
1
+ import type { Member } from "../../../domain/aggregates/member/Member";
2
+ import type { MemberRepository } from "../../../domain/aggregates/member/MemberRepository";
3
+ import type { EventRepository } from "../../../domain/aggregates/event/EventRepository";
4
+ import type { IUseCase } from "../base";
5
+ export interface GetMembersByEventInput {
6
+ eventId: string;
7
+ }
8
+ export declare class GetMembersByEvent implements IUseCase<GetMembersByEventInput, Member[]> {
9
+ private readonly eventRepository;
10
+ private readonly memberRepository;
11
+ constructor(eventRepository: EventRepository, memberRepository: MemberRepository);
12
+ execute(input: GetMembersByEventInput): Promise<Member[]>;
13
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GetMembersByEvent = void 0;
4
+ const ApplicationExceptions_1 = require("../../exceptions/ApplicationExceptions");
5
+ class GetMembersByEvent {
6
+ constructor(eventRepository, memberRepository) {
7
+ this.eventRepository = eventRepository;
8
+ this.memberRepository = memberRepository;
9
+ }
10
+ async execute(input) {
11
+ const event = await this.eventRepository.findById(input.eventId);
12
+ if (!event) {
13
+ throw new ApplicationExceptions_1.EventNotFoundException();
14
+ }
15
+ return (await Promise.all(event
16
+ .getMemberIds()
17
+ .map((memberId) => this.memberRepository.findById(memberId)))).filter((member) => member !== null);
18
+ }
19
+ }
20
+ exports.GetMembersByEvent = GetMembersByEvent;
@@ -0,0 +1,13 @@
1
+ import type { EventRepository } from "../../../domain/aggregates/event/EventRepository";
2
+ import type { Member } from "../../../domain/aggregates/member/Member";
3
+ import type { MemberRepository } from "../../../domain/aggregates/member/MemberRepository";
4
+ import type { IUseCase } from "../base";
5
+ export interface GetMembersByExhibitInput {
6
+ exhibitId: string;
7
+ }
8
+ export declare class GetMembersByExhibit implements IUseCase<GetMembersByExhibitInput, Member[]> {
9
+ private readonly memberRepository;
10
+ private readonly eventRepository;
11
+ constructor(memberRepository: MemberRepository, eventRepository: EventRepository);
12
+ execute(input: GetMembersByExhibitInput): Promise<Member[]>;
13
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GetMembersByExhibit = void 0;
4
+ const exceptions_1 = require("../../exceptions");
5
+ class GetMembersByExhibit {
6
+ constructor(memberRepository, eventRepository) {
7
+ this.memberRepository = memberRepository;
8
+ this.eventRepository = eventRepository;
9
+ }
10
+ async execute(input) {
11
+ const event = await this.eventRepository.findByExhibitId(input.exhibitId);
12
+ if (!event) {
13
+ throw new exceptions_1.EventNotFoundException();
14
+ }
15
+ const members = await Promise.all(event
16
+ .getMemberIds()
17
+ .map((memberId) => this.memberRepository.findById(memberId)));
18
+ return members.filter((m) => m !== null);
19
+ }
20
+ }
21
+ exports.GetMembersByExhibit = GetMembersByExhibit;
@@ -0,0 +1,12 @@
1
+ import type { EventRepository, MemberRepository } from "../../../domain";
2
+ import type { IUseCase } from "../base";
3
+ export interface RegisterMemberToEventInput {
4
+ memberId: string;
5
+ eventId: string;
6
+ }
7
+ export declare class RegisterMemberToEvent implements IUseCase<RegisterMemberToEventInput, void> {
8
+ private readonly eventRepository;
9
+ private readonly memberRepository;
10
+ constructor(eventRepository: EventRepository, memberRepository: MemberRepository);
11
+ execute(input: RegisterMemberToEventInput): Promise<void>;
12
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RegisterMemberToEvent = void 0;
4
+ const exceptions_1 = require("../../exceptions");
5
+ class RegisterMemberToEvent {
6
+ constructor(eventRepository, memberRepository) {
7
+ this.eventRepository = eventRepository;
8
+ this.memberRepository = memberRepository;
9
+ }
10
+ async execute(input) {
11
+ const event = await this.eventRepository.findById(input.eventId);
12
+ if (!event) {
13
+ throw new exceptions_1.EventNotFoundException();
14
+ }
15
+ const member = await this.memberRepository.findById(input.memberId);
16
+ if (!member) {
17
+ throw new exceptions_1.MemberNotFoundException();
18
+ }
19
+ event.addMemberId(input.memberId);
20
+ await this.eventRepository.save(event);
21
+ }
22
+ }
23
+ exports.RegisterMemberToEvent = RegisterMemberToEvent;
@@ -0,0 +1,12 @@
1
+ import type { EventRepository, MemberRepository } from "../../../domain";
2
+ import type { IUseCase } from "../base";
3
+ export interface RegisterMemberToExhibitInput {
4
+ memberId: string;
5
+ exhibitId: string;
6
+ }
7
+ export declare class RegisterMemberToExhibit implements IUseCase<RegisterMemberToExhibitInput, void> {
8
+ private readonly eventRepository;
9
+ private readonly memberRepository;
10
+ constructor(eventRepository: EventRepository, memberRepository: MemberRepository);
11
+ execute(input: RegisterMemberToExhibitInput): Promise<void>;
12
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RegisterMemberToExhibit = void 0;
4
+ const exceptions_1 = require("../..//exceptions");
5
+ class RegisterMemberToExhibit {
6
+ constructor(eventRepository, memberRepository) {
7
+ this.eventRepository = eventRepository;
8
+ this.memberRepository = memberRepository;
9
+ }
10
+ async execute(input) {
11
+ const event = await this.eventRepository.findByExhibitId(input.exhibitId);
12
+ if (!event) {
13
+ throw new exceptions_1.EventNotFoundException();
14
+ }
15
+ const member = await this.memberRepository.findById(input.memberId);
16
+ if (!member) {
17
+ throw new exceptions_1.MemberNotFoundException();
18
+ }
19
+ event.addExhibitMemberId(input.exhibitId, input.memberId);
20
+ await this.eventRepository.save(event);
21
+ }
22
+ }
23
+ exports.RegisterMemberToExhibit = RegisterMemberToExhibit;
@@ -0,0 +1,12 @@
1
+ import type { EventRepository, MemberRepository } from "../../../domain";
2
+ import type { IUseCase } from "../base";
3
+ export interface RemoveMemberFromEventInput {
4
+ memberId: string;
5
+ eventId: string;
6
+ }
7
+ export declare class RemoveMemberFromEvent implements IUseCase<RemoveMemberFromEventInput, void> {
8
+ private readonly eventRepository;
9
+ private readonly memberRepository;
10
+ constructor(eventRepository: EventRepository, memberRepository: MemberRepository);
11
+ execute(input: RemoveMemberFromEventInput): Promise<void>;
12
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RemoveMemberFromEvent = void 0;
4
+ const exceptions_1 = require("../../exceptions");
5
+ class RemoveMemberFromEvent {
6
+ constructor(eventRepository, memberRepository) {
7
+ this.eventRepository = eventRepository;
8
+ this.memberRepository = memberRepository;
9
+ }
10
+ async execute(input) {
11
+ const event = await this.eventRepository.findById(input.eventId);
12
+ if (!event) {
13
+ throw new exceptions_1.EventNotFoundException();
14
+ }
15
+ event.removeMemberId(input.memberId);
16
+ await this.eventRepository.save(event);
17
+ }
18
+ }
19
+ exports.RemoveMemberFromEvent = RemoveMemberFromEvent;
@@ -0,0 +1,12 @@
1
+ import type { EventRepository, MemberRepository } from "../../../domain";
2
+ import type { IUseCase } from "../base";
3
+ export interface RemoveMemberFromExhibitInput {
4
+ memberId: string;
5
+ exhibitId: string;
6
+ }
7
+ export declare class RemoveMemberFromExhibit implements IUseCase<RemoveMemberFromExhibitInput, void> {
8
+ private readonly memberRepository;
9
+ private readonly eventRepository;
10
+ constructor(memberRepository: MemberRepository, eventRepository: EventRepository);
11
+ execute(input: RemoveMemberFromExhibitInput): Promise<void>;
12
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RemoveMemberFromExhibit = void 0;
4
+ const exceptions_1 = require("../../exceptions");
5
+ class RemoveMemberFromExhibit {
6
+ constructor(memberRepository, eventRepository) {
7
+ this.memberRepository = memberRepository;
8
+ this.eventRepository = eventRepository;
9
+ }
10
+ async execute(input) {
11
+ const event = await this.eventRepository.findByExhibitId(input.exhibitId);
12
+ if (!event) {
13
+ throw new exceptions_1.EventNotFoundException();
14
+ }
15
+ event.removeExhibitMemberId(input.exhibitId, input.memberId);
16
+ await this.eventRepository.save(event);
17
+ }
18
+ }
19
+ exports.RemoveMemberFromExhibit = RemoveMemberFromExhibit;
@@ -0,0 +1,8 @@
1
+ export * from "./RegisterMemberToEvent";
2
+ export * from "./RemoveMemberFromEvent";
3
+ export * from "./GetEventsByMember";
4
+ export * from "./GetMembersByEvent";
5
+ export * from "./RegisterMemberToExhibit";
6
+ export * from "./RemoveMemberFromExhibit";
7
+ export * from "./GetExhibitsByMember";
8
+ export * from "./GetMembersByExhibit";
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ // TODO: 各ユースケース実装後にexport文を有効化すること
18
+ __exportStar(require("./RegisterMemberToEvent"), exports);
19
+ __exportStar(require("./RemoveMemberFromEvent"), exports);
20
+ __exportStar(require("./GetEventsByMember"), exports);
21
+ __exportStar(require("./GetMembersByEvent"), exports);
22
+ __exportStar(require("./RegisterMemberToExhibit"), exports);
23
+ __exportStar(require("./RemoveMemberFromExhibit"), exports);
24
+ __exportStar(require("./GetExhibitsByMember"), exports);
25
+ __exportStar(require("./GetMembersByExhibit"), exports);
@@ -5,7 +5,10 @@ export declare class Event {
5
5
  private name;
6
6
  private date;
7
7
  private exhibits;
8
+ private memberIds;
8
9
  constructor(id: string, name: string, date: Date);
10
+ getExhibits(): Exhibit[];
11
+ getMemberIds(): string[];
9
12
  changeName(newName: string): void;
10
13
  changeDate(newDate: Date): void;
11
14
  addExhibit(exhibit: Exhibit): void;
@@ -18,6 +21,10 @@ export declare class Event {
18
21
  changeExhibitLightningTalkDuration(exhibitId: string, newDuration: LightningTalkDuration): void;
19
22
  changeExhibitLightningTalkSlideUrl(exhibitId: string, newSlideUrl: Url): void;
20
23
  private getExhibitOrThrow;
24
+ addMemberId(memberId: string): void;
25
+ removeMemberId(memberId: string): void;
26
+ addExhibitMemberId(exhibitId: string, memberId: string): void;
27
+ removeExhibitMemberId(exhibitId: string, memberId: string): void;
21
28
  toSnapshot(): {
22
29
  id: string;
23
30
  name: string;
@@ -35,5 +42,6 @@ export declare class Event {
35
42
  slideUrl: Url | undefined;
36
43
  } | undefined;
37
44
  }[];
45
+ memberIds: string[];
38
46
  };
39
47
  }
@@ -10,6 +10,13 @@ class Event {
10
10
  this.name = name;
11
11
  this.date = date;
12
12
  this.exhibits = [];
13
+ this.memberIds = new Set();
14
+ }
15
+ getExhibits() {
16
+ return this.exhibits;
17
+ }
18
+ getMemberIds() {
19
+ return Array.from(this.memberIds);
13
20
  }
14
21
  changeName(newName) {
15
22
  this.name = newName;
@@ -22,6 +29,10 @@ class Event {
22
29
  if (this.exhibits.some((x) => x.id === exhibit.id)) {
23
30
  throw new exceptions_1.ExhibitAlreadyExistsException(`Exhibit(id=${exhibit.id}) は既に存在します`);
24
31
  }
32
+ // NOTE: Exhibitに登録するタイミングでEventのmemberIdsにも登録する必要がある
33
+ for (const memberId of exhibit.getMemberIds()) {
34
+ this.memberIds.add(memberId);
35
+ }
25
36
  this.exhibits.push(exhibit);
26
37
  }
27
38
  removeExhibit(exhibitId) {
@@ -56,12 +67,30 @@ class Event {
56
67
  }
57
68
  return exhibit;
58
69
  }
70
+ addMemberId(memberId) {
71
+ this.memberIds.add(memberId);
72
+ }
73
+ removeMemberId(memberId) {
74
+ for (const exhibit of this.exhibits) {
75
+ if (exhibit.getMemberIds().includes(memberId)) {
76
+ throw new exceptions_1.ExhibitHasMemberException();
77
+ }
78
+ }
79
+ this.memberIds.delete(memberId);
80
+ }
81
+ addExhibitMemberId(exhibitId, memberId) {
82
+ this.getExhibitOrThrow(exhibitId).addMemberId(memberId);
83
+ // NOTE: Exhibitに登録するタイミングでEventのmemberIdsにも登録する必要がある
84
+ this.memberIds.add(memberId);
85
+ }
86
+ removeExhibitMemberId(exhibitId, memberId) { }
59
87
  toSnapshot() {
60
88
  return {
61
89
  id: this.id,
62
90
  name: this.name,
63
91
  date: this.date,
64
92
  exhibits: this.exhibits.map((exhibit) => exhibit.toSnapshot()),
93
+ memberIds: Array.from(this.memberIds),
65
94
  };
66
95
  }
67
96
  }
@@ -1,6 +1,8 @@
1
1
  import type { Event } from "./Event";
2
2
  export interface EventRepository {
3
3
  findById(id: string): Promise<Event | null>;
4
+ findByParticipantMemberId(memberId: string): Promise<Event[]>;
5
+ findByExhibitId(exhibitId: string): Promise<Event | null>;
4
6
  findAll(): Promise<Event[]>;
5
7
  save(event: Event): Promise<void>;
6
8
  delete(eventId: string): Promise<void>;
@@ -7,8 +7,10 @@ export declare class Exhibit {
7
7
  private markdownContent?;
8
8
  private url?;
9
9
  private lightningTalk?;
10
+ private memberIds;
10
11
  static createWithLightningTalk(id: string, name: string, lt: LightningTalk, description?: string, markdownContent?: string, url?: Url): Exhibit;
11
12
  constructor(id: string, name: string, description?: string | undefined, markdownContent?: string | undefined, url?: Url | undefined);
13
+ getMemberIds(): string[];
12
14
  changeName(newName: string): void;
13
15
  changeDescription(newDescription: string): void;
14
16
  changeMarkdownContent(newMarkdownContent: string): void;
@@ -16,6 +18,8 @@ export declare class Exhibit {
16
18
  changeLightningTalkStartTime(newStartTime: Date): void;
17
19
  changeLightningTalkDuration(newDuration: LightningTalkDuration): void;
18
20
  changeLightningTalkSlideUrl(newSlideUrl: Url): void;
21
+ addMemberId(memberId: string): void;
22
+ removeMemberId(memberId: string): void;
19
23
  private getLightningTalkOrThrow;
20
24
  toSnapshot(): {
21
25
  id: string;
@@ -19,6 +19,10 @@ class Exhibit {
19
19
  this.description = description;
20
20
  this.markdownContent = markdownContent;
21
21
  this.url = url;
22
+ this.memberIds = new Set();
23
+ }
24
+ getMemberIds() {
25
+ return Array.from(this.memberIds);
22
26
  }
23
27
  changeName(newName) {
24
28
  this.name = newName;
@@ -41,6 +45,12 @@ class Exhibit {
41
45
  changeLightningTalkSlideUrl(newSlideUrl) {
42
46
  this.getLightningTalkOrThrow().changeSlideUrl(newSlideUrl);
43
47
  }
48
+ addMemberId(memberId) {
49
+ this.memberIds.add(memberId);
50
+ }
51
+ removeMemberId(memberId) {
52
+ this.memberIds.delete(memberId);
53
+ }
44
54
  getLightningTalkOrThrow() {
45
55
  if (!this.lightningTalk) {
46
56
  throw new exceptions_1.LightningTalkNotFoundException(`Exhibit(id=${this.id}) に紐づく LightningTalk が存在しません`);
@@ -40,3 +40,6 @@ export declare class LightningTalkNotFoundException extends DomainException {
40
40
  export declare class LightningTalkExhibitIdMismatchException extends DomainException {
41
41
  constructor(message?: string);
42
42
  }
43
+ export declare class ExhibitHasMemberException extends DomainException {
44
+ constructor(message?: string);
45
+ }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LightningTalkExhibitIdMismatchException = exports.LightningTalkNotFoundException = exports.ExhibitNotFoundException = exports.ExhibitAlreadyExistsException = exports.InvalidUrlProtocolException = exports.InvalidUrlException = exports.InvalidLightningTalkDurationException = exports.InvalidDepartmentException = exports.InvalidUniversityEmailException = exports.DiscordAccountNotConnectedException = exports.DiscordAccountAlreadyConnectedException = exports.InvalidEmailFormatException = exports.InvalidMemberException = exports.DomainException = void 0;
3
+ exports.ExhibitHasMemberException = exports.LightningTalkExhibitIdMismatchException = exports.LightningTalkNotFoundException = exports.ExhibitNotFoundException = exports.ExhibitAlreadyExistsException = exports.InvalidUrlProtocolException = exports.InvalidUrlException = exports.InvalidLightningTalkDurationException = exports.InvalidDepartmentException = exports.InvalidUniversityEmailException = exports.DiscordAccountNotConnectedException = exports.DiscordAccountAlreadyConnectedException = exports.InvalidEmailFormatException = exports.InvalidMemberException = exports.DomainException = void 0;
4
4
  class DomainException extends Error {
5
5
  constructor(message) {
6
6
  super(message);
@@ -99,3 +99,10 @@ class LightningTalkExhibitIdMismatchException extends DomainException {
99
99
  }
100
100
  }
101
101
  exports.LightningTalkExhibitIdMismatchException = LightningTalkExhibitIdMismatchException;
102
+ class ExhibitHasMemberException extends DomainException {
103
+ constructor(message = "イベントに紐づいた展示に当該メンバーがいるため、Eventから削除できません") {
104
+ super(message);
105
+ this.name = "ExhibitHasMemberException";
106
+ }
107
+ }
108
+ exports.ExhibitHasMemberException = ExhibitHasMemberException;
@@ -16,6 +16,8 @@ export declare class PrismaEventRepository implements EventRepository {
16
16
  */
17
17
  private findObsoleteExhibitIds;
18
18
  findById(id: string): Promise<Event | null>;
19
+ findByParticipantMemberId(memberId: string): Promise<Event[]>;
20
+ findByExhibitId(exhibitId: string): Promise<Event | null>;
19
21
  findAll(): Promise<Event[]>;
20
22
  save(event: Event): Promise<void>;
21
23
  delete(eventId: string): Promise<void>;
@@ -58,6 +58,14 @@ class PrismaEventRepository {
58
58
  },
59
59
  },
60
60
  });
61
+ // MemberExhibit(展示参加者)も先に削除
62
+ await prisma.memberExhibit.deleteMany({
63
+ where: {
64
+ exhibitId: {
65
+ in: await this.findObsoleteExhibitIds(snapshot.id, snapshotExhibitIds),
66
+ },
67
+ },
68
+ });
61
69
  // exhibit 削除
62
70
  await prisma.exhibit.deleteMany({
63
71
  where: {
@@ -108,6 +116,42 @@ class PrismaEventRepository {
108
116
  });
109
117
  }
110
118
  }
119
+ // 4) MemberEvent(イベント参加者)を同期
120
+ const eventMemberIds = event.getMemberIds();
121
+ // 古い参加者を削除
122
+ await prisma.memberEvent.deleteMany({
123
+ where: {
124
+ eventId: snapshot.id,
125
+ memberId: { notIn: eventMemberIds },
126
+ },
127
+ });
128
+ // 新しい参加者を登録(重複スキップ)
129
+ await prisma.memberEvent.createMany({
130
+ data: eventMemberIds.map((memberId) => ({
131
+ memberId,
132
+ eventId: snapshot.id,
133
+ })),
134
+ skipDuplicates: true,
135
+ });
136
+ // 5) MemberExhibit(展示参加者)を同期
137
+ for (const exhibitDomain of event.getExhibits()) {
138
+ const exhibitMemberIds = exhibitDomain.getMemberIds();
139
+ // 古い展示参加者を削除
140
+ await prisma.memberExhibit.deleteMany({
141
+ where: {
142
+ exhibitId: exhibitDomain.id,
143
+ memberId: { notIn: exhibitMemberIds },
144
+ },
145
+ });
146
+ // 新しい展示参加者を登録(重複スキップ)
147
+ await prisma.memberExhibit.createMany({
148
+ data: exhibitMemberIds.map((memberId) => ({
149
+ memberId,
150
+ exhibitId: exhibitDomain.id,
151
+ })),
152
+ skipDuplicates: true,
153
+ });
154
+ }
111
155
  }
112
156
  /**
113
157
  * どの ExhibitID が消えたかを調べるヘルパー
@@ -137,6 +181,30 @@ class PrismaEventRepository {
137
181
  return null;
138
182
  return this.toDomain(record);
139
183
  }
184
+ async findByParticipantMemberId(memberId) {
185
+ const records = await prisma.event.findMany({
186
+ where: {
187
+ members: { some: { memberId: memberId } },
188
+ },
189
+ include: {
190
+ exhibits: { include: { lightningTalk: true } },
191
+ },
192
+ });
193
+ return records.map((r) => this.toDomain(r));
194
+ }
195
+ async findByExhibitId(exhibitId) {
196
+ const record = await prisma.event.findFirst({
197
+ where: {
198
+ exhibits: { some: { id: exhibitId } },
199
+ },
200
+ include: {
201
+ exhibits: { include: { lightningTalk: true } },
202
+ },
203
+ });
204
+ if (!record)
205
+ return null;
206
+ return this.toDomain(record);
207
+ }
140
208
  async findAll() {
141
209
  const records = await prisma.event.findMany({
142
210
  include: {
@@ -1,4 +1,2 @@
1
1
  export * from "./PrismaEventRepository";
2
- export * from "./PrismaMemberEventRepository";
3
- export * from "./PrismaMemberExhibitRepository";
4
2
  export * from "./PrismaMemberRepository";
@@ -15,6 +15,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./PrismaEventRepository"), exports);
18
- __exportStar(require("./PrismaMemberEventRepository"), exports);
19
- __exportStar(require("./PrismaMemberExhibitRepository"), exports);
20
18
  __exportStar(require("./PrismaMemberRepository"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shizuoka-its/core",
3
- "version": "2.0.0-alpha.4",
3
+ "version": "2.0.0-alpha.5",
4
4
  "description": "ITS core library",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,11 +0,0 @@
1
- export declare class MemberEvent {
2
- readonly id: string;
3
- readonly memberId: string;
4
- readonly eventId: string;
5
- constructor(id: string, memberId: string, eventId: string);
6
- toSnapshot(): {
7
- id: string;
8
- memberId: string;
9
- eventId: string;
10
- };
11
- }
@@ -1,18 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MemberEvent = void 0;
4
- class MemberEvent {
5
- constructor(id, memberId, eventId) {
6
- this.id = id;
7
- this.memberId = memberId;
8
- this.eventId = eventId;
9
- }
10
- toSnapshot() {
11
- return {
12
- id: this.id,
13
- memberId: this.memberId,
14
- eventId: this.eventId,
15
- };
16
- }
17
- }
18
- exports.MemberEvent = MemberEvent;
@@ -1,8 +0,0 @@
1
- import type { MemberEvent } from "./MemberEvent";
2
- export interface MemberEventRepository {
3
- findById(id: string): Promise<MemberEvent | null>;
4
- findByMemberId(memberId: string): Promise<MemberEvent[]>;
5
- findByEventId(eventId: string): Promise<MemberEvent[]>;
6
- save(memberEvent: MemberEvent): Promise<void>;
7
- delete(id: string): Promise<void>;
8
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,11 +0,0 @@
1
- export declare class MemberExhibit {
2
- readonly id: string;
3
- readonly memberId: string;
4
- readonly exhibitId: string;
5
- constructor(id: string, memberId: string, exhibitId: string);
6
- toSnapshot(): {
7
- id: string;
8
- memberId: string;
9
- exhibitId: string;
10
- };
11
- }
@@ -1,18 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MemberExhibit = void 0;
4
- class MemberExhibit {
5
- constructor(id, memberId, exhibitId) {
6
- this.id = id;
7
- this.memberId = memberId;
8
- this.exhibitId = exhibitId;
9
- }
10
- toSnapshot() {
11
- return {
12
- id: this.id,
13
- memberId: this.memberId,
14
- exhibitId: this.exhibitId,
15
- };
16
- }
17
- }
18
- exports.MemberExhibit = MemberExhibit;
@@ -1,8 +0,0 @@
1
- import type { MemberExhibit } from "./MemberExhibit";
2
- export interface MemberExhibitRepository {
3
- findById(id: string): Promise<MemberExhibit | null>;
4
- findByMemberId(memberId: string): Promise<MemberExhibit[]>;
5
- findByExhibitId(exhibitId: string): Promise<MemberExhibit[]>;
6
- save(memberExhibit: MemberExhibit): Promise<void>;
7
- delete(id: string): Promise<void>;
8
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,10 +0,0 @@
1
- import { MemberEvent } from "../../domain/aggregates/memberEvent/MemberEvent";
2
- import type { MemberEventRepository } from "../../domain/aggregates/memberEvent/MemberEventRepository";
3
- export declare class PrismaMemberEventRepository implements MemberEventRepository {
4
- private toDomain;
5
- findById(id: string): Promise<MemberEvent | null>;
6
- findByMemberId(memberId: string): Promise<MemberEvent[]>;
7
- findByEventId(eventId: string): Promise<MemberEvent[]>;
8
- save(memberEvent: MemberEvent): Promise<void>;
9
- delete(id: string): Promise<void>;
10
- }
@@ -1,48 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PrismaMemberEventRepository = void 0;
4
- const client_1 = require("@prisma/client");
5
- const MemberEvent_1 = require("../../domain/aggregates/memberEvent/MemberEvent");
6
- const prisma = new client_1.PrismaClient();
7
- class PrismaMemberEventRepository {
8
- toDomain(record) {
9
- return new MemberEvent_1.MemberEvent(record.id, record.memberId, record.eventId);
10
- }
11
- async findById(id) {
12
- const record = await prisma.memberEvent.findUnique({ where: { id } });
13
- if (!record)
14
- return null;
15
- return this.toDomain(record);
16
- }
17
- async findByMemberId(memberId) {
18
- const records = await prisma.memberEvent.findMany({
19
- where: { memberId },
20
- });
21
- return records.map((r) => this.toDomain(r));
22
- }
23
- async findByEventId(eventId) {
24
- const records = await prisma.memberEvent.findMany({
25
- where: { eventId },
26
- });
27
- return records.map((r) => this.toDomain(r));
28
- }
29
- async save(memberEvent) {
30
- const snapshot = memberEvent.toSnapshot();
31
- await prisma.memberEvent.upsert({
32
- where: { id: snapshot.id },
33
- create: {
34
- id: snapshot.id,
35
- memberId: snapshot.memberId,
36
- eventId: snapshot.eventId,
37
- },
38
- update: {
39
- memberId: snapshot.memberId,
40
- eventId: snapshot.eventId,
41
- },
42
- });
43
- }
44
- async delete(id) {
45
- await prisma.memberEvent.delete({ where: { id } });
46
- }
47
- }
48
- exports.PrismaMemberEventRepository = PrismaMemberEventRepository;
@@ -1,10 +0,0 @@
1
- import { MemberExhibit } from "../../domain/aggregates/memberExhibit/MemberExhibit";
2
- import type { MemberExhibitRepository } from "../../domain/aggregates/memberExhibit/MemberExhibitRepository";
3
- export declare class PrismaMemberExhibitRepository implements MemberExhibitRepository {
4
- private toDomain;
5
- findById(id: string): Promise<MemberExhibit | null>;
6
- findByMemberId(memberId: string): Promise<MemberExhibit[]>;
7
- findByExhibitId(exhibitId: string): Promise<MemberExhibit[]>;
8
- save(memberExhibit: MemberExhibit): Promise<void>;
9
- delete(id: string): Promise<void>;
10
- }
@@ -1,48 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PrismaMemberExhibitRepository = void 0;
4
- const client_1 = require("@prisma/client");
5
- const MemberExhibit_1 = require("../../domain/aggregates/memberExhibit/MemberExhibit");
6
- const prisma = new client_1.PrismaClient();
7
- class PrismaMemberExhibitRepository {
8
- toDomain(record) {
9
- return new MemberExhibit_1.MemberExhibit(record.id, record.memberId, record.exhibitId);
10
- }
11
- async findById(id) {
12
- const record = await prisma.memberExhibit.findUnique({ where: { id } });
13
- if (!record)
14
- return null;
15
- return this.toDomain(record);
16
- }
17
- async findByMemberId(memberId) {
18
- const records = await prisma.memberExhibit.findMany({
19
- where: { memberId },
20
- });
21
- return records.map((r) => this.toDomain(r));
22
- }
23
- async findByExhibitId(exhibitId) {
24
- const records = await prisma.memberExhibit.findMany({
25
- where: { exhibitId },
26
- });
27
- return records.map((r) => this.toDomain(r));
28
- }
29
- async save(memberExhibit) {
30
- const snapshot = memberExhibit.toSnapshot();
31
- await prisma.memberExhibit.upsert({
32
- where: { id: snapshot.id },
33
- create: {
34
- id: snapshot.id,
35
- memberId: snapshot.memberId,
36
- exhibitId: snapshot.exhibitId,
37
- },
38
- update: {
39
- memberId: snapshot.memberId,
40
- exhibitId: snapshot.exhibitId,
41
- },
42
- });
43
- }
44
- async delete(id) {
45
- await prisma.memberExhibit.delete({ where: { id } });
46
- }
47
- }
48
- exports.PrismaMemberExhibitRepository = PrismaMemberExhibitRepository;