@shizuoka-its/core 0.1.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 +120 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +46 -0
- package/dist/repositories/base.repository.d.ts +12 -0
- package/dist/repositories/base.repository.js +10 -0
- package/dist/repositories/discordAccount.repository.d.ts +12 -0
- package/dist/repositories/discordAccount.repository.js +51 -0
- package/dist/repositories/event.repository.d.ts +14 -0
- package/dist/repositories/event.repository.js +67 -0
- package/dist/repositories/exhibit.repository.d.ts +13 -0
- package/dist/repositories/exhibit.repository.js +51 -0
- package/dist/repositories/factory.d.ts +16 -0
- package/dist/repositories/factory.js +20 -0
- package/dist/repositories/index.d.ts +1 -0
- package/dist/repositories/index.js +17 -0
- package/dist/repositories/interfaces/base.repository.interface.d.ts +7 -0
- package/dist/repositories/interfaces/base.repository.interface.js +2 -0
- package/dist/repositories/interfaces/discordAccount.repository.interface.d.ts +5 -0
- package/dist/repositories/interfaces/discordAccount.repository.interface.js +2 -0
- package/dist/repositories/interfaces/event.repository.interface.d.ts +7 -0
- package/dist/repositories/interfaces/event.repository.interface.js +2 -0
- package/dist/repositories/interfaces/exhibit.repository.interface.d.ts +6 -0
- package/dist/repositories/interfaces/exhibit.repository.interface.js +2 -0
- package/dist/repositories/interfaces/index.d.ts +7 -0
- package/dist/repositories/interfaces/index.js +23 -0
- package/dist/repositories/interfaces/member.repository.interface.d.ts +6 -0
- package/dist/repositories/interfaces/member.repository.interface.js +2 -0
- package/dist/repositories/interfaces/memberEvent.repository.interface.d.ts +6 -0
- package/dist/repositories/interfaces/memberEvent.repository.interface.js +2 -0
- package/dist/repositories/interfaces/memberExhibit.repository.interface.d.ts +6 -0
- package/dist/repositories/interfaces/memberExhibit.repository.interface.js +2 -0
- package/dist/repositories/member.repository.d.ts +13 -0
- package/dist/repositories/member.repository.js +44 -0
- package/dist/repositories/memberEvent.repository.d.ts +13 -0
- package/dist/repositories/memberEvent.repository.js +62 -0
- package/dist/repositories/memberExhibit.repository.d.ts +13 -0
- package/dist/repositories/memberExhibit.repository.js +62 -0
- package/dist/services/base.service.d.ts +17 -0
- package/dist/services/base.service.js +18 -0
- package/dist/services/discordAccount.service.d.ts +12 -0
- package/dist/services/discordAccount.service.js +54 -0
- package/dist/services/event.service.d.ts +18 -0
- package/dist/services/event.service.js +90 -0
- package/dist/services/exhibit.service.d.ts +19 -0
- package/dist/services/exhibit.service.js +117 -0
- package/dist/services/factory.d.ts +12 -0
- package/dist/services/factory.js +16 -0
- package/dist/services/index.d.ts +7 -0
- package/dist/services/index.js +23 -0
- package/dist/services/interfaces/base.service.interface.d.ts +7 -0
- package/dist/services/interfaces/base.service.interface.js +2 -0
- package/dist/services/interfaces/discordAccount.service.interface.d.ts +14 -0
- package/dist/services/interfaces/discordAccount.service.interface.js +2 -0
- package/dist/services/interfaces/event.service.interface.d.ts +15 -0
- package/dist/services/interfaces/event.service.interface.js +2 -0
- package/dist/services/interfaces/exhibit.service.interface.d.ts +16 -0
- package/dist/services/interfaces/exhibit.service.interface.js +2 -0
- package/dist/services/interfaces/index.d.ts +5 -0
- package/dist/services/interfaces/index.js +21 -0
- package/dist/services/interfaces/member.service.interface.d.ts +16 -0
- package/dist/services/interfaces/member.service.interface.js +2 -0
- package/dist/services/interfaces/types.d.ts +1 -0
- package/dist/services/interfaces/types.js +2 -0
- package/dist/services/member.service.d.ts +14 -0
- package/dist/services/member.service.js +52 -0
- package/package.json +40 -0
- package/prisma/schema.prisma +92 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemberRepository = void 0;
|
|
4
|
+
const base_repository_1 = require("./base.repository");
|
|
5
|
+
class MemberRepository extends base_repository_1.BaseRepository {
|
|
6
|
+
constructor(prisma) {
|
|
7
|
+
super(prisma, "member");
|
|
8
|
+
}
|
|
9
|
+
async findById(id) {
|
|
10
|
+
return this.prisma.member.findUnique({
|
|
11
|
+
where: { id },
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
async create(data) {
|
|
15
|
+
return this.prisma.member.create({
|
|
16
|
+
data,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async update(id, data) {
|
|
20
|
+
return this.prisma.member.update({
|
|
21
|
+
where: { id },
|
|
22
|
+
data,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async delete(id) {
|
|
26
|
+
return this.prisma.member.delete({
|
|
27
|
+
where: { id },
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async findMany(params) {
|
|
31
|
+
return this.prisma.member.findMany(params);
|
|
32
|
+
}
|
|
33
|
+
async findByEmail(email) {
|
|
34
|
+
return this.prisma.member.findUnique({
|
|
35
|
+
where: { email },
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async findByStudentId(studentId) {
|
|
39
|
+
return this.prisma.member.findMany({
|
|
40
|
+
where: { studentId },
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.MemberRepository = MemberRepository;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MemberEvent, Prisma, PrismaClient } from "@prisma/client";
|
|
2
|
+
import { BaseRepository } from "./base.repository";
|
|
3
|
+
import type { IMemberEventRepository } from "./interfaces/memberEvent.repository.interface";
|
|
4
|
+
export declare class MemberEventRepository extends BaseRepository<MemberEvent, Prisma.MemberEventCreateInput, Prisma.MemberEventUpdateInput, Prisma.MemberEventFindManyArgs> implements IMemberEventRepository {
|
|
5
|
+
constructor(prisma: PrismaClient);
|
|
6
|
+
findById(id: string): Promise<MemberEvent | null>;
|
|
7
|
+
create(data: Prisma.MemberEventCreateInput): Promise<MemberEvent>;
|
|
8
|
+
update(id: string, data: Prisma.MemberEventUpdateInput): Promise<MemberEvent>;
|
|
9
|
+
delete(id: string): Promise<MemberEvent>;
|
|
10
|
+
findMany(params?: Prisma.MemberEventFindManyArgs): Promise<MemberEvent[]>;
|
|
11
|
+
findByMemberId(memberId: string): Promise<MemberEvent[]>;
|
|
12
|
+
findByEventId(eventId: string): Promise<MemberEvent[]>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemberEventRepository = void 0;
|
|
4
|
+
const base_repository_1 = require("./base.repository");
|
|
5
|
+
class MemberEventRepository extends base_repository_1.BaseRepository {
|
|
6
|
+
constructor(prisma) {
|
|
7
|
+
super(prisma, "memberEvent");
|
|
8
|
+
}
|
|
9
|
+
async findById(id) {
|
|
10
|
+
return this.prisma.memberEvent.findUnique({
|
|
11
|
+
where: { id },
|
|
12
|
+
include: {
|
|
13
|
+
member: true,
|
|
14
|
+
event: true,
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
async create(data) {
|
|
19
|
+
return this.prisma.memberEvent.create({
|
|
20
|
+
data,
|
|
21
|
+
include: {
|
|
22
|
+
member: true,
|
|
23
|
+
event: true,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async update(id, data) {
|
|
28
|
+
return this.prisma.memberEvent.update({
|
|
29
|
+
where: { id },
|
|
30
|
+
data,
|
|
31
|
+
include: {
|
|
32
|
+
member: true,
|
|
33
|
+
event: true,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async delete(id) {
|
|
38
|
+
return this.prisma.memberEvent.delete({
|
|
39
|
+
where: { id },
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async findMany(params) {
|
|
43
|
+
return this.prisma.memberEvent.findMany(params);
|
|
44
|
+
}
|
|
45
|
+
async findByMemberId(memberId) {
|
|
46
|
+
return this.prisma.memberEvent.findMany({
|
|
47
|
+
where: { memberId },
|
|
48
|
+
include: {
|
|
49
|
+
event: true,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async findByEventId(eventId) {
|
|
54
|
+
return this.prisma.memberEvent.findMany({
|
|
55
|
+
where: { eventId },
|
|
56
|
+
include: {
|
|
57
|
+
member: true,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.MemberEventRepository = MemberEventRepository;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MemberExhibit, Prisma, PrismaClient } from "@prisma/client";
|
|
2
|
+
import { BaseRepository } from "./base.repository";
|
|
3
|
+
import type { IMemberExhibitRepository } from "./interfaces/memberExhibit.repository.interface";
|
|
4
|
+
export declare class MemberExhibitRepository extends BaseRepository<MemberExhibit, Prisma.MemberExhibitCreateInput, Prisma.MemberExhibitUpdateInput, Prisma.MemberExhibitFindManyArgs> implements IMemberExhibitRepository {
|
|
5
|
+
constructor(prisma: PrismaClient);
|
|
6
|
+
findById(id: string): Promise<MemberExhibit | null>;
|
|
7
|
+
create(data: Prisma.MemberExhibitCreateInput): Promise<MemberExhibit>;
|
|
8
|
+
update(id: string, data: Prisma.MemberExhibitUpdateInput): Promise<MemberExhibit>;
|
|
9
|
+
delete(id: string): Promise<MemberExhibit>;
|
|
10
|
+
findMany(params?: Prisma.MemberExhibitFindManyArgs): Promise<MemberExhibit[]>;
|
|
11
|
+
findByMemberId(memberId: string): Promise<MemberExhibit[]>;
|
|
12
|
+
findByExhibitId(exhibitId: string): Promise<MemberExhibit[]>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemberExhibitRepository = void 0;
|
|
4
|
+
const base_repository_1 = require("./base.repository");
|
|
5
|
+
class MemberExhibitRepository extends base_repository_1.BaseRepository {
|
|
6
|
+
constructor(prisma) {
|
|
7
|
+
super(prisma, "memberExhibit");
|
|
8
|
+
}
|
|
9
|
+
async findById(id) {
|
|
10
|
+
return this.prisma.memberExhibit.findUnique({
|
|
11
|
+
where: { id },
|
|
12
|
+
include: {
|
|
13
|
+
member: true,
|
|
14
|
+
exhibit: true,
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
async create(data) {
|
|
19
|
+
return this.prisma.memberExhibit.create({
|
|
20
|
+
data,
|
|
21
|
+
include: {
|
|
22
|
+
member: true,
|
|
23
|
+
exhibit: true,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async update(id, data) {
|
|
28
|
+
return this.prisma.memberExhibit.update({
|
|
29
|
+
where: { id },
|
|
30
|
+
data,
|
|
31
|
+
include: {
|
|
32
|
+
member: true,
|
|
33
|
+
exhibit: true,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async delete(id) {
|
|
38
|
+
return this.prisma.memberExhibit.delete({
|
|
39
|
+
where: { id },
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async findMany(params) {
|
|
43
|
+
return this.prisma.memberExhibit.findMany(params);
|
|
44
|
+
}
|
|
45
|
+
async findByMemberId(memberId) {
|
|
46
|
+
return this.prisma.memberExhibit.findMany({
|
|
47
|
+
where: { memberId },
|
|
48
|
+
include: {
|
|
49
|
+
exhibit: true,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async findByExhibitId(exhibitId) {
|
|
54
|
+
return this.prisma.memberExhibit.findMany({
|
|
55
|
+
where: { exhibitId },
|
|
56
|
+
include: {
|
|
57
|
+
member: true,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.MemberExhibitRepository = MemberExhibitRepository;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IBaseRepository } from "../repositories/interfaces/base.repository.interface";
|
|
2
|
+
import type { IBaseService } from "./interfaces/base.service.interface";
|
|
3
|
+
export declare abstract class BaseService<T, // T: エンティティの型
|
|
4
|
+
CreateDTO, // CreateDTO: エンティティの作成時に必要なデータの型
|
|
5
|
+
UpdateDTO, // UpdateDTO: エンティティの更新時に必要なデータの型
|
|
6
|
+
FindManyArgs, // FindManyArgs: 検索条件の型
|
|
7
|
+
CreateInput = CreateDTO, // CreateInput: リポジトリの作成入力型
|
|
8
|
+
UpdateInput = UpdateDTO, // UpdateInput: リポジトリの更新入力型
|
|
9
|
+
R extends IBaseRepository<T, CreateInput, UpdateInput, FindManyArgs> = IBaseRepository<T, CreateInput, UpdateInput, FindManyArgs>> implements IBaseService<T, CreateDTO, UpdateDTO> {
|
|
10
|
+
protected readonly repository: R;
|
|
11
|
+
constructor(repository: R);
|
|
12
|
+
findById(id: string): Promise<T | null>;
|
|
13
|
+
abstract create(data: CreateDTO): Promise<T>;
|
|
14
|
+
abstract update(id: string, data: UpdateDTO): Promise<T>;
|
|
15
|
+
delete(id: string): Promise<T>;
|
|
16
|
+
findMany(): Promise<T[]>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseService = void 0;
|
|
4
|
+
class BaseService {
|
|
5
|
+
constructor(repository) {
|
|
6
|
+
this.repository = repository;
|
|
7
|
+
}
|
|
8
|
+
async findById(id) {
|
|
9
|
+
return this.repository.findById(id);
|
|
10
|
+
}
|
|
11
|
+
async delete(id) {
|
|
12
|
+
return this.repository.delete(id);
|
|
13
|
+
}
|
|
14
|
+
async findMany() {
|
|
15
|
+
return this.repository.findMany();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.BaseService = BaseService;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DiscordAccount, Prisma } from "@prisma/client";
|
|
2
|
+
import type { IDiscordAccountRepository } from "../repositories/interfaces/discordAccount.repository.interface";
|
|
3
|
+
import type { IMemberRepository } from "../repositories/interfaces/member.repository.interface";
|
|
4
|
+
import { BaseService } from "./base.service";
|
|
5
|
+
import type { DiscordAccountCreateDTO, DiscordAccountUpdateDTO, IDiscordAccountService } from "./interfaces/discordAccount.service.interface";
|
|
6
|
+
export declare class DiscordAccountService extends BaseService<DiscordAccount, DiscordAccountCreateDTO, DiscordAccountUpdateDTO, Prisma.DiscordAccountFindManyArgs, Prisma.DiscordAccountCreateInput, Prisma.DiscordAccountUpdateInput, IDiscordAccountRepository> implements IDiscordAccountService {
|
|
7
|
+
private readonly memberRepository;
|
|
8
|
+
constructor(discordAccountRepository: IDiscordAccountRepository, memberRepository: IMemberRepository);
|
|
9
|
+
create(data: DiscordAccountCreateDTO): Promise<DiscordAccount>;
|
|
10
|
+
update(id: string, data: DiscordAccountUpdateDTO): Promise<DiscordAccount>;
|
|
11
|
+
findByMemberId(memberId: string): Promise<DiscordAccount[]>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DiscordAccountService = void 0;
|
|
4
|
+
const base_service_1 = require("./base.service");
|
|
5
|
+
class DiscordAccountService extends base_service_1.BaseService {
|
|
6
|
+
constructor(discordAccountRepository, memberRepository) {
|
|
7
|
+
super(discordAccountRepository);
|
|
8
|
+
this.memberRepository = memberRepository;
|
|
9
|
+
}
|
|
10
|
+
async create(data) {
|
|
11
|
+
// メンバーの存在確認
|
|
12
|
+
const member = await this.memberRepository.findById(data.memberId);
|
|
13
|
+
if (!member) {
|
|
14
|
+
throw new Error("Member not found");
|
|
15
|
+
}
|
|
16
|
+
// Discord IDの重複チェック
|
|
17
|
+
const existingAccount = await this.repository.findById(data.id);
|
|
18
|
+
if (existingAccount) {
|
|
19
|
+
throw new Error("Discord account already exists");
|
|
20
|
+
}
|
|
21
|
+
return this.repository.create({
|
|
22
|
+
id: data.id,
|
|
23
|
+
nickName: data.nickName,
|
|
24
|
+
member: { connect: { id: data.memberId } },
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async update(id, data) {
|
|
28
|
+
// 既存アカウントの確認
|
|
29
|
+
const existingAccount = await this.repository.findById(id);
|
|
30
|
+
if (!existingAccount) {
|
|
31
|
+
throw new Error("Discord account not found");
|
|
32
|
+
}
|
|
33
|
+
// メンバーIDが変更される場合、メンバーの存在確認
|
|
34
|
+
if (data.memberId) {
|
|
35
|
+
const member = await this.memberRepository.findById(data.memberId);
|
|
36
|
+
if (!member) {
|
|
37
|
+
throw new Error("Member not found");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return this.repository.update(id, {
|
|
41
|
+
nickName: data.nickName,
|
|
42
|
+
member: { connect: { id: data.memberId } },
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async findByMemberId(memberId) {
|
|
46
|
+
// メンバーの存在確認
|
|
47
|
+
const member = await this.memberRepository.findById(memberId);
|
|
48
|
+
if (!member) {
|
|
49
|
+
throw new Error("Member not found");
|
|
50
|
+
}
|
|
51
|
+
return this.repository.findByMemberId(memberId);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.DiscordAccountService = DiscordAccountService;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Event, Prisma } from "@prisma/client";
|
|
2
|
+
import type { IEventRepository } from "../repositories/interfaces/event.repository.interface";
|
|
3
|
+
import type { IMemberRepository } from "../repositories/interfaces/member.repository.interface";
|
|
4
|
+
import type { IMemberEventRepository } from "../repositories/interfaces/memberEvent.repository.interface";
|
|
5
|
+
import { BaseService } from "./base.service";
|
|
6
|
+
import type { EventCreateDTO, EventUpdateDTO, IEventService } from "./interfaces/event.service.interface";
|
|
7
|
+
export declare class EventService extends BaseService<Event, EventCreateDTO, EventUpdateDTO, Prisma.EventFindManyArgs, Prisma.EventCreateInput, Prisma.EventUpdateInput, IEventRepository> implements IEventService {
|
|
8
|
+
private readonly memberRepository;
|
|
9
|
+
private readonly memberEventRepository;
|
|
10
|
+
constructor(eventRepository: IEventRepository, memberRepository: IMemberRepository, memberEventRepository: IMemberEventRepository);
|
|
11
|
+
create(data: EventCreateDTO): Promise<Event>;
|
|
12
|
+
update(id: string, data: EventUpdateDTO): Promise<Event>;
|
|
13
|
+
findUpcoming(limit?: number): Promise<Event[]>;
|
|
14
|
+
findWithMembers(id: string): Promise<Event | null>;
|
|
15
|
+
findWithExhibits(id: string): Promise<Event | null>;
|
|
16
|
+
registerMember(eventId: string, memberId: string): Promise<void>;
|
|
17
|
+
unregisterMember(eventId: string, memberId: string): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventService = void 0;
|
|
4
|
+
const base_service_1 = require("./base.service");
|
|
5
|
+
class EventService extends base_service_1.BaseService {
|
|
6
|
+
constructor(eventRepository, memberRepository, memberEventRepository) {
|
|
7
|
+
super(eventRepository);
|
|
8
|
+
this.memberRepository = memberRepository;
|
|
9
|
+
this.memberEventRepository = memberEventRepository;
|
|
10
|
+
}
|
|
11
|
+
async create(data) {
|
|
12
|
+
// 日付の検証
|
|
13
|
+
if (data.date < new Date()) {
|
|
14
|
+
throw new Error("Event date cannot be in the past");
|
|
15
|
+
}
|
|
16
|
+
return this.repository.create({
|
|
17
|
+
name: data.name,
|
|
18
|
+
date: data.date,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async update(id, data) {
|
|
22
|
+
// イベントの存在確認
|
|
23
|
+
const existingEvent = await this.repository.findById(id);
|
|
24
|
+
if (!existingEvent) {
|
|
25
|
+
throw new Error("Event not found");
|
|
26
|
+
}
|
|
27
|
+
// 日付の検証(日付が更新される場合)
|
|
28
|
+
if (data.date && data.date < new Date()) {
|
|
29
|
+
throw new Error("Event date cannot be in the past");
|
|
30
|
+
}
|
|
31
|
+
return this.repository.update(id, data);
|
|
32
|
+
}
|
|
33
|
+
async findUpcoming(limit) {
|
|
34
|
+
return this.repository.findUpcoming(limit);
|
|
35
|
+
}
|
|
36
|
+
async findWithMembers(id) {
|
|
37
|
+
const event = await this.repository.findWithMembers(id);
|
|
38
|
+
if (!event) {
|
|
39
|
+
throw new Error("Event not found");
|
|
40
|
+
}
|
|
41
|
+
return event;
|
|
42
|
+
}
|
|
43
|
+
async findWithExhibits(id) {
|
|
44
|
+
const event = await this.repository.findWithExhibits(id);
|
|
45
|
+
if (!event) {
|
|
46
|
+
throw new Error("Event not found");
|
|
47
|
+
}
|
|
48
|
+
return event;
|
|
49
|
+
}
|
|
50
|
+
async registerMember(eventId, memberId) {
|
|
51
|
+
// イベントの存在確認
|
|
52
|
+
const event = await this.repository.findById(eventId);
|
|
53
|
+
if (!event) {
|
|
54
|
+
throw new Error("Event not found");
|
|
55
|
+
}
|
|
56
|
+
// メンバーの存在確認
|
|
57
|
+
const member = await this.memberRepository.findById(memberId);
|
|
58
|
+
if (!member) {
|
|
59
|
+
throw new Error("Member not found");
|
|
60
|
+
}
|
|
61
|
+
// 既に登録済みかチェック
|
|
62
|
+
const existingRegistration = await this.memberEventRepository.findMany({
|
|
63
|
+
where: {
|
|
64
|
+
eventId,
|
|
65
|
+
memberId,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
if (existingRegistration.length > 0) {
|
|
69
|
+
throw new Error("Member already registered to this event");
|
|
70
|
+
}
|
|
71
|
+
await this.memberEventRepository.create({
|
|
72
|
+
event: { connect: { id: eventId } },
|
|
73
|
+
member: { connect: { id: memberId } },
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async unregisterMember(eventId, memberId) {
|
|
77
|
+
// 登録の存在確認
|
|
78
|
+
const registration = await this.memberEventRepository.findMany({
|
|
79
|
+
where: {
|
|
80
|
+
eventId,
|
|
81
|
+
memberId,
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
if (registration.length === 0) {
|
|
85
|
+
throw new Error("Member is not registered to this event");
|
|
86
|
+
}
|
|
87
|
+
await this.memberEventRepository.delete(registration[0].id);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.EventService = EventService;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Exhibit, Prisma } from "@prisma/client";
|
|
2
|
+
import type { IEventRepository } from "../repositories/interfaces/event.repository.interface";
|
|
3
|
+
import type { IExhibitRepository } from "../repositories/interfaces/exhibit.repository.interface";
|
|
4
|
+
import type { IMemberRepository } from "../repositories/interfaces/member.repository.interface";
|
|
5
|
+
import type { IMemberExhibitRepository } from "../repositories/interfaces/memberExhibit.repository.interface";
|
|
6
|
+
import { BaseService } from "./base.service";
|
|
7
|
+
import type { ExhibitCreateDTO, ExhibitUpdateDTO, IExhibitService } from "./interfaces/exhibit.service.interface";
|
|
8
|
+
export declare class ExhibitService extends BaseService<Exhibit, ExhibitCreateDTO, ExhibitUpdateDTO, Prisma.ExhibitFindManyArgs, Prisma.ExhibitCreateInput, Prisma.ExhibitUpdateInput, IExhibitRepository> implements IExhibitService {
|
|
9
|
+
private readonly eventRepository;
|
|
10
|
+
private readonly memberRepository;
|
|
11
|
+
private readonly memberExhibitRepository;
|
|
12
|
+
constructor(exhibitRepository: IExhibitRepository, eventRepository: IEventRepository, memberRepository: IMemberRepository, memberExhibitRepository: IMemberExhibitRepository);
|
|
13
|
+
create(data: ExhibitCreateDTO): Promise<Exhibit>;
|
|
14
|
+
update(id: string, data: ExhibitUpdateDTO): Promise<Exhibit>;
|
|
15
|
+
findByEventId(eventId: string): Promise<Exhibit[]>;
|
|
16
|
+
findWithMembers(id: string): Promise<Exhibit | null>;
|
|
17
|
+
registerMember(exhibitId: string, memberId: string): Promise<void>;
|
|
18
|
+
unregisterMember(exhibitId: string, memberId: string): Promise<void>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExhibitService = void 0;
|
|
4
|
+
const base_service_1 = require("./base.service");
|
|
5
|
+
class ExhibitService extends base_service_1.BaseService {
|
|
6
|
+
constructor(exhibitRepository, eventRepository, memberRepository, memberExhibitRepository) {
|
|
7
|
+
super(exhibitRepository);
|
|
8
|
+
this.eventRepository = eventRepository;
|
|
9
|
+
this.memberRepository = memberRepository;
|
|
10
|
+
this.memberExhibitRepository = memberExhibitRepository;
|
|
11
|
+
}
|
|
12
|
+
async create(data) {
|
|
13
|
+
// イベントの存在確認
|
|
14
|
+
const event = await this.eventRepository.findById(data.eventId);
|
|
15
|
+
if (!event) {
|
|
16
|
+
throw new Error("Event not found");
|
|
17
|
+
}
|
|
18
|
+
// URLの形式チェック(もし提供されている場合)
|
|
19
|
+
if (data.url) {
|
|
20
|
+
try {
|
|
21
|
+
new URL(data.url);
|
|
22
|
+
}
|
|
23
|
+
catch (_a) {
|
|
24
|
+
throw new Error("Invalid URL format");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return this.repository.create({
|
|
28
|
+
name: data.name,
|
|
29
|
+
description: data.description,
|
|
30
|
+
url: data.url,
|
|
31
|
+
event: { connect: { id: data.eventId } },
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async update(id, data) {
|
|
35
|
+
// 展示の存在確認
|
|
36
|
+
const existingExhibit = await this.repository.findById(id);
|
|
37
|
+
if (!existingExhibit) {
|
|
38
|
+
throw new Error("Exhibit not found");
|
|
39
|
+
}
|
|
40
|
+
// イベントIDが変更される場合、イベントの存在確認
|
|
41
|
+
if (data.eventId) {
|
|
42
|
+
const event = await this.eventRepository.findById(data.eventId);
|
|
43
|
+
if (!event) {
|
|
44
|
+
throw new Error("Event not found");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// URLの形式チェック(もし更新される場合)
|
|
48
|
+
if (data.url) {
|
|
49
|
+
try {
|
|
50
|
+
new URL(data.url);
|
|
51
|
+
}
|
|
52
|
+
catch (_a) {
|
|
53
|
+
throw new Error("Invalid URL format");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return this.repository.update(id, data);
|
|
57
|
+
}
|
|
58
|
+
async findByEventId(eventId) {
|
|
59
|
+
// イベントの存在確認
|
|
60
|
+
const event = await this.eventRepository.findById(eventId);
|
|
61
|
+
if (!event) {
|
|
62
|
+
throw new Error("Event not found");
|
|
63
|
+
}
|
|
64
|
+
return this.repository.findByEventId(eventId);
|
|
65
|
+
}
|
|
66
|
+
async findWithMembers(id) {
|
|
67
|
+
const exhibit = await this.repository.findWithMembers(id);
|
|
68
|
+
if (!exhibit) {
|
|
69
|
+
throw new Error("Exhibit not found");
|
|
70
|
+
}
|
|
71
|
+
return exhibit;
|
|
72
|
+
}
|
|
73
|
+
async registerMember(exhibitId, memberId) {
|
|
74
|
+
// 展示の存在確認
|
|
75
|
+
const exhibit = await this.repository.findById(exhibitId);
|
|
76
|
+
if (!exhibit) {
|
|
77
|
+
throw new Error("Exhibit not found");
|
|
78
|
+
}
|
|
79
|
+
// メンバーの存在確認
|
|
80
|
+
const member = await this.memberRepository.findById(memberId);
|
|
81
|
+
if (!member) {
|
|
82
|
+
throw new Error("Member not found");
|
|
83
|
+
}
|
|
84
|
+
// 既に登録済みかチェック
|
|
85
|
+
const existingRegistration = await this.memberExhibitRepository.findMany({
|
|
86
|
+
where: {
|
|
87
|
+
exhibitId,
|
|
88
|
+
memberId,
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
if (existingRegistration.length > 0) {
|
|
92
|
+
throw new Error("Member already registered to this exhibit");
|
|
93
|
+
}
|
|
94
|
+
// イベントへの参加確認も追加するかもしれない
|
|
95
|
+
// TODO: 確認
|
|
96
|
+
// const event = await this.eventRepository.findById(exhibit.eventId)
|
|
97
|
+
// const isMemberRegisteredToEvent = ...
|
|
98
|
+
await this.memberExhibitRepository.create({
|
|
99
|
+
exhibit: { connect: { id: exhibitId } },
|
|
100
|
+
member: { connect: { id: memberId } },
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async unregisterMember(exhibitId, memberId) {
|
|
104
|
+
// 登録の存在確認
|
|
105
|
+
const registration = await this.memberExhibitRepository.findMany({
|
|
106
|
+
where: {
|
|
107
|
+
exhibitId,
|
|
108
|
+
memberId,
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
if (registration.length === 0) {
|
|
112
|
+
throw new Error("Member is not registered to this exhibit");
|
|
113
|
+
}
|
|
114
|
+
await this.memberExhibitRepository.delete(registration[0].id);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.ExhibitService = ExhibitService;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Repositories } from "../repositories";
|
|
2
|
+
import { DiscordAccountService } from "./discordAccount.service";
|
|
3
|
+
import { EventService } from "./event.service";
|
|
4
|
+
import { ExhibitService } from "./exhibit.service";
|
|
5
|
+
import { MemberService } from "./member.service";
|
|
6
|
+
export declare const createServices: (repositories: Repositories) => {
|
|
7
|
+
member: MemberService;
|
|
8
|
+
discordAccount: DiscordAccountService;
|
|
9
|
+
event: EventService;
|
|
10
|
+
exhibit: ExhibitService;
|
|
11
|
+
};
|
|
12
|
+
export type Services = ReturnType<typeof createServices>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createServices = void 0;
|
|
4
|
+
const discordAccount_service_1 = require("./discordAccount.service");
|
|
5
|
+
const event_service_1 = require("./event.service");
|
|
6
|
+
const exhibit_service_1 = require("./exhibit.service");
|
|
7
|
+
const member_service_1 = require("./member.service");
|
|
8
|
+
const createServices = (repositories) => {
|
|
9
|
+
return {
|
|
10
|
+
member: new member_service_1.MemberService(repositories.member, repositories.discordAccount),
|
|
11
|
+
discordAccount: new discordAccount_service_1.DiscordAccountService(repositories.discordAccount, repositories.member),
|
|
12
|
+
event: new event_service_1.EventService(repositories.event, repositories.member, repositories.memberEvent),
|
|
13
|
+
exhibit: new exhibit_service_1.ExhibitService(repositories.exhibit, repositories.event, repositories.member, repositories.memberExhibit),
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
exports.createServices = createServices;
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
__exportStar(require("./interfaces"), exports);
|
|
18
|
+
__exportStar(require("./base.service"), exports);
|
|
19
|
+
__exportStar(require("./member.service"), exports);
|
|
20
|
+
__exportStar(require("./discordAccount.service"), exports);
|
|
21
|
+
__exportStar(require("./event.service"), exports);
|
|
22
|
+
__exportStar(require("./exhibit.service"), exports);
|
|
23
|
+
__exportStar(require("./factory"), exports);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DiscordAccount } from "@prisma/client";
|
|
2
|
+
import type { IBaseService } from "./base.service.interface";
|
|
3
|
+
export interface DiscordAccountCreateDTO {
|
|
4
|
+
id: string;
|
|
5
|
+
nickName: string;
|
|
6
|
+
memberId: string;
|
|
7
|
+
}
|
|
8
|
+
export interface DiscordAccountUpdateDTO {
|
|
9
|
+
nickName?: string;
|
|
10
|
+
memberId?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface IDiscordAccountService extends IBaseService<DiscordAccount, DiscordAccountCreateDTO, DiscordAccountUpdateDTO> {
|
|
13
|
+
findByMemberId(memberId: string): Promise<DiscordAccount[]>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Event } from "@prisma/client";
|
|
2
|
+
import type { IBaseService } from "./base.service.interface";
|
|
3
|
+
export interface EventCreateDTO {
|
|
4
|
+
name: string;
|
|
5
|
+
date: Date;
|
|
6
|
+
}
|
|
7
|
+
export interface EventUpdateDTO extends Partial<EventCreateDTO> {
|
|
8
|
+
}
|
|
9
|
+
export interface IEventService extends IBaseService<Event, EventCreateDTO, EventUpdateDTO> {
|
|
10
|
+
findUpcoming(limit?: number): Promise<Event[]>;
|
|
11
|
+
findWithMembers(id: string): Promise<Event | null>;
|
|
12
|
+
findWithExhibits(id: string): Promise<Event | null>;
|
|
13
|
+
registerMember(eventId: string, memberId: string): Promise<void>;
|
|
14
|
+
unregisterMember(eventId: string, memberId: string): Promise<void>;
|
|
15
|
+
}
|