@shizuoka-its/core 0.2.1 → 0.3.0
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 +35 -16
- package/dist/index.d.ts +6 -4
- package/dist/repositories/base.repository.d.ts +1 -2
- package/dist/repositories/factory.d.ts +2 -0
- package/dist/repositories/factory.js +2 -0
- package/dist/repositories/interfaces/index.d.ts +1 -0
- package/dist/repositories/interfaces/index.js +1 -0
- package/dist/repositories/interfaces/lightningTalk.repository.interface.d.ts +9 -0
- package/dist/repositories/interfaces/lightningTalk.repository.interface.js +2 -0
- package/dist/repositories/lightningTalk.repository.d.ts +26 -0
- package/dist/repositories/lightningTalk.repository.js +51 -0
- package/dist/services/factory.d.ts +2 -0
- package/dist/services/factory.js +2 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.js +1 -0
- package/dist/services/interfaces/base.service.interface.d.ts +3 -3
- package/dist/services/interfaces/index.d.ts +1 -0
- package/dist/services/interfaces/index.js +1 -0
- package/dist/services/interfaces/lightningTalk.service.interface.d.ts +36 -0
- package/dist/services/interfaces/lightningTalk.service.interface.js +2 -0
- package/dist/services/lightningTalk.service.d.ts +29 -0
- package/dist/services/lightningTalk.service.js +58 -0
- package/package.json +1 -1
- package/prisma/schema.prisma +16 -0
- package/prisma/migrations/20241107053440_init/migration.sql +0 -97
- package/prisma/migrations/migration_lock.toml +0 -3
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# @
|
|
1
|
+
# @shizuoka-its/core
|
|
2
2
|
|
|
3
3
|
ITSで使用する共通のデータベースアクセス層とビジネスロジックを提供するライブラリです。
|
|
4
4
|
|
|
@@ -9,46 +9,47 @@ npm install @shizuoka-its/core
|
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
## 使い方
|
|
12
|
+
|
|
12
13
|
```typescript
|
|
13
|
-
import { createClient } from
|
|
14
|
+
import { createClient } from "@shizuoka-its/core";
|
|
14
15
|
|
|
15
16
|
async function example() {
|
|
16
17
|
// クライアントの作成(オプションあり)
|
|
17
18
|
const client = createClient({
|
|
18
19
|
prismaOptions: {
|
|
19
|
-
log: [
|
|
20
|
-
}
|
|
21
|
-
})
|
|
20
|
+
log: ["query", "error"],
|
|
21
|
+
},
|
|
22
|
+
});
|
|
22
23
|
|
|
23
24
|
try {
|
|
24
|
-
const { services } = client
|
|
25
|
+
const { services } = client;
|
|
25
26
|
|
|
26
27
|
// メンバーの作成
|
|
27
28
|
const member = await services.member.create({
|
|
28
29
|
name: "山田太郎",
|
|
29
30
|
studentId: "20240001",
|
|
30
|
-
|
|
31
|
-
email: "yamada@example.com"
|
|
32
|
-
})
|
|
31
|
+
department: "情報工学科",
|
|
32
|
+
email: "yamada@example.com",
|
|
33
|
+
});
|
|
33
34
|
|
|
34
35
|
// Discordアカウントの紐付け
|
|
35
36
|
await services.discordAccount.create({
|
|
36
37
|
id: "discord_user_id", // Discord IDをそのまま使用
|
|
37
38
|
nickName: "Yamada Taro",
|
|
38
|
-
memberId: member.id
|
|
39
|
-
})
|
|
39
|
+
memberId: member.id,
|
|
40
|
+
});
|
|
40
41
|
|
|
41
42
|
// イベントの作成
|
|
42
43
|
const event = await services.event.create({
|
|
43
44
|
name: "プログラミング勉強会",
|
|
44
|
-
date: new Date("2024-12-01")
|
|
45
|
-
})
|
|
45
|
+
date: new Date("2024-12-01"),
|
|
46
|
+
});
|
|
46
47
|
|
|
47
48
|
// イベントへの参加登録
|
|
48
|
-
await services.event.registerMember(event.id, member.id)
|
|
49
|
+
await services.event.registerMember(event.id, member.id);
|
|
49
50
|
} finally {
|
|
50
51
|
// 必ずクリーンアップ
|
|
51
|
-
await client.disconnect()
|
|
52
|
+
await client.disconnect();
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
55
|
```
|
|
@@ -56,24 +57,35 @@ async function example() {
|
|
|
56
57
|
## 機能
|
|
57
58
|
|
|
58
59
|
### メンバー管理
|
|
60
|
+
|
|
59
61
|
- メンバーの作成、更新、削除
|
|
60
62
|
- メールアドレスによる検索
|
|
61
63
|
- 学籍番号による検索
|
|
64
|
+
- Discordアカウントの紐づけ
|
|
62
65
|
|
|
63
66
|
### Discordアカウント管理
|
|
67
|
+
|
|
64
68
|
- Discordアカウントの紐付け
|
|
65
69
|
- メンバーごとのDiscordアカウント取得
|
|
66
70
|
|
|
67
71
|
### イベント管理
|
|
72
|
+
|
|
68
73
|
- イベントの作成、更新、削除
|
|
69
74
|
- イベント参加者の管理
|
|
70
75
|
- 今後のイベント一覧取得
|
|
76
|
+
- 展示ごとのイベント一覧取得
|
|
71
77
|
|
|
72
78
|
### 展示管理
|
|
79
|
+
|
|
73
80
|
- 展示の作成、更新、削除
|
|
74
81
|
- イベントごとの展示一覧
|
|
75
82
|
- 展示参加者の管理
|
|
76
83
|
|
|
84
|
+
### ライトニングトーク管理
|
|
85
|
+
|
|
86
|
+
- ライトニングトークの作成、更新、削除
|
|
87
|
+
- イベントごとのライトニングトーク一覧
|
|
88
|
+
|
|
77
89
|
## プロジェクト構成
|
|
78
90
|
|
|
79
91
|
```
|
|
@@ -90,23 +102,28 @@ src/
|
|
|
90
102
|
## 開発セットアップ
|
|
91
103
|
|
|
92
104
|
1. リポジトリのクローン
|
|
105
|
+
|
|
93
106
|
```bash
|
|
94
107
|
git clone https://github.com/su-its/core.git
|
|
95
108
|
cd core
|
|
96
109
|
```
|
|
97
110
|
|
|
98
111
|
2. 依存関係のインストール
|
|
112
|
+
|
|
99
113
|
```bash
|
|
100
114
|
npm install
|
|
101
115
|
```
|
|
102
116
|
|
|
103
117
|
3. 環境変数の設定
|
|
118
|
+
|
|
104
119
|
```bash
|
|
105
120
|
cp .env.example .env
|
|
106
121
|
```
|
|
122
|
+
|
|
107
123
|
`.env`ファイルを編集してデータベース接続情報を設定
|
|
108
124
|
|
|
109
125
|
4. データベースのマイグレーション
|
|
126
|
+
|
|
110
127
|
```bash
|
|
111
128
|
npx prisma migrate dev
|
|
112
129
|
```
|
|
@@ -117,4 +134,6 @@ npx prisma migrate dev
|
|
|
117
134
|
|
|
118
135
|
## コントリビューター
|
|
119
136
|
|
|
120
|
-
- @KinjiKawaguchi
|
|
137
|
+
- @KinjiKawaguchi
|
|
138
|
+
- @KikyoNanakusa
|
|
139
|
+
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { type DiscordAccount, type Event, type Exhibit, type Member, type MemberEvent, type MemberExhibit, type Prisma, PrismaClient } from "@prisma/client";
|
|
1
|
+
import { type DiscordAccount, type Event, type Exhibit, type LightningTalk, type Member, type MemberEvent, type MemberExhibit, type Prisma, PrismaClient } from "@prisma/client";
|
|
2
2
|
export * from "./repositories";
|
|
3
3
|
export * from "./services";
|
|
4
|
-
export type { Member, Event, Exhibit, DiscordAccount, MemberEvent, MemberExhibit, };
|
|
4
|
+
export type { Member, Event, Exhibit, DiscordAccount, MemberEvent, MemberExhibit, LightningTalk, };
|
|
5
5
|
type ClientOptions = {
|
|
6
6
|
prismaOptions?: Prisma.PrismaClientOptions;
|
|
7
7
|
};
|
|
8
|
-
export type { IMemberService, IEventService, IExhibitService, IDiscordAccountService, } from "./services/interfaces";
|
|
9
|
-
export type { MemberCreateDTO, MemberUpdateDTO, EventCreateDTO, EventUpdateDTO, ExhibitCreateDTO, ExhibitUpdateDTO, DiscordAccountCreateDTO, DiscordAccountUpdateDTO, } from "./services/interfaces";
|
|
8
|
+
export type { IMemberService, IEventService, IExhibitService, IDiscordAccountService, ILightningTalkService, } from "./services/interfaces";
|
|
9
|
+
export type { MemberCreateDTO, MemberUpdateDTO, EventCreateDTO, EventUpdateDTO, ExhibitCreateDTO, ExhibitUpdateDTO, DiscordAccountCreateDTO, DiscordAccountUpdateDTO, LightningTalkCreateDTO, LightningTalkUpdateDTO, } from "./services/interfaces";
|
|
10
10
|
export declare const createClient: ({ prismaOptions }?: ClientOptions) => {
|
|
11
11
|
prisma: PrismaClient<{
|
|
12
12
|
datasources?: Prisma.Datasources | undefined;
|
|
@@ -26,12 +26,14 @@ export declare const createClient: ({ prismaOptions }?: ClientOptions) => {
|
|
|
26
26
|
exhibit: import("./repositories/exhibit.repository").ExhibitRepository;
|
|
27
27
|
memberEvent: import("./repositories/memberEvent.repository").MemberEventRepository;
|
|
28
28
|
memberExhibit: import("./repositories/memberExhibit.repository").MemberExhibitRepository;
|
|
29
|
+
lightningTalk: import("./repositories/lightningTalk.repository").LightningTalkRepository;
|
|
29
30
|
};
|
|
30
31
|
services: {
|
|
31
32
|
member: import("./services").MemberService;
|
|
32
33
|
discordAccount: import("./services").DiscordAccountService;
|
|
33
34
|
event: import("./services").EventService;
|
|
34
35
|
exhibit: import("./services").ExhibitService;
|
|
36
|
+
lightningTalk: import("./services").LightningTalkService;
|
|
35
37
|
};
|
|
36
38
|
disconnect: () => Promise<void>;
|
|
37
39
|
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { PrismaClient } from "@prisma/client";
|
|
2
|
-
|
|
3
|
-
export declare abstract class BaseRepository<T, CreateInput, UpdateInput, FindManyArgs = unknown> implements IBaseRepository<T, CreateInput, UpdateInput, FindManyArgs> {
|
|
2
|
+
export declare abstract class BaseRepository<T, CreateInput, UpdateInput, FindManyArgs> {
|
|
4
3
|
protected readonly prisma: PrismaClient;
|
|
5
4
|
protected readonly modelName: string;
|
|
6
5
|
constructor(prisma: PrismaClient, modelName: string);
|
|
@@ -2,6 +2,7 @@ import type { PrismaClient } from "@prisma/client";
|
|
|
2
2
|
import { DiscordAccountRepository } from "./discordAccount.repository";
|
|
3
3
|
import { EventRepository } from "./event.repository";
|
|
4
4
|
import { ExhibitRepository } from "./exhibit.repository";
|
|
5
|
+
import { LightningTalkRepository } from "./lightningTalk.repository";
|
|
5
6
|
import { MemberRepository } from "./member.repository";
|
|
6
7
|
import { MemberEventRepository } from "./memberEvent.repository";
|
|
7
8
|
import { MemberExhibitRepository } from "./memberExhibit.repository";
|
|
@@ -12,5 +13,6 @@ export declare const createRepositories: (prisma: PrismaClient) => {
|
|
|
12
13
|
exhibit: ExhibitRepository;
|
|
13
14
|
memberEvent: MemberEventRepository;
|
|
14
15
|
memberExhibit: MemberExhibitRepository;
|
|
16
|
+
lightningTalk: LightningTalkRepository;
|
|
15
17
|
};
|
|
16
18
|
export type Repositories = ReturnType<typeof createRepositories>;
|
|
@@ -4,6 +4,7 @@ exports.createRepositories = void 0;
|
|
|
4
4
|
const discordAccount_repository_1 = require("./discordAccount.repository");
|
|
5
5
|
const event_repository_1 = require("./event.repository");
|
|
6
6
|
const exhibit_repository_1 = require("./exhibit.repository");
|
|
7
|
+
const lightningTalk_repository_1 = require("./lightningTalk.repository");
|
|
7
8
|
const member_repository_1 = require("./member.repository");
|
|
8
9
|
const memberEvent_repository_1 = require("./memberEvent.repository");
|
|
9
10
|
const memberExhibit_repository_1 = require("./memberExhibit.repository");
|
|
@@ -15,6 +16,7 @@ const createRepositories = (prisma) => {
|
|
|
15
16
|
exhibit: new exhibit_repository_1.ExhibitRepository(prisma),
|
|
16
17
|
memberEvent: new memberEvent_repository_1.MemberEventRepository(prisma),
|
|
17
18
|
memberExhibit: new memberExhibit_repository_1.MemberExhibitRepository(prisma),
|
|
19
|
+
lightningTalk: new lightningTalk_repository_1.LightningTalkRepository(prisma),
|
|
18
20
|
};
|
|
19
21
|
};
|
|
20
22
|
exports.createRepositories = createRepositories;
|
|
@@ -21,3 +21,4 @@ __exportStar(require("./event.repository.interface"), exports);
|
|
|
21
21
|
__exportStar(require("./exhibit.repository.interface"), exports);
|
|
22
22
|
__exportStar(require("./memberEvent.repository.interface"), exports);
|
|
23
23
|
__exportStar(require("./memberExhibit.repository.interface"), exports);
|
|
24
|
+
__exportStar(require("./lightningTalk.repository.interface"), exports);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Exhibit, LightningTalk, Prisma } from "@prisma/client";
|
|
2
|
+
import type { IBaseRepository } from "./base.repository.interface";
|
|
3
|
+
export interface ILightningTalkRepository extends IBaseRepository<LightningTalk & {
|
|
4
|
+
exhibit: Exhibit;
|
|
5
|
+
}, Prisma.LightningTalkCreateInput, Prisma.LightningTalkUpdateInput, Prisma.LightningTalkFindManyArgs> {
|
|
6
|
+
findByEventId(eventId: string): Promise<(LightningTalk & {
|
|
7
|
+
exhibit: Exhibit;
|
|
8
|
+
})[]>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Exhibit, LightningTalk, Prisma, PrismaClient } from "@prisma/client";
|
|
2
|
+
import { BaseRepository } from "./base.repository";
|
|
3
|
+
import type { ILightningTalkRepository } from "./interfaces/lightningTalk.repository.interface";
|
|
4
|
+
export declare class LightningTalkRepository extends BaseRepository<LightningTalk & {
|
|
5
|
+
exhibit: Exhibit;
|
|
6
|
+
}, Prisma.LightningTalkCreateInput, Prisma.LightningTalkUpdateInput, Prisma.LightningTalkFindManyArgs> implements ILightningTalkRepository {
|
|
7
|
+
constructor(prisma: PrismaClient);
|
|
8
|
+
create(data: Prisma.LightningTalkCreateInput): Promise<LightningTalk & {
|
|
9
|
+
exhibit: Exhibit;
|
|
10
|
+
}>;
|
|
11
|
+
update(id: string, data: Prisma.LightningTalkUpdateInput): Promise<LightningTalk & {
|
|
12
|
+
exhibit: Exhibit;
|
|
13
|
+
}>;
|
|
14
|
+
delete(id: string): Promise<LightningTalk & {
|
|
15
|
+
exhibit: Exhibit;
|
|
16
|
+
}>;
|
|
17
|
+
findById(id: string): Promise<(LightningTalk & {
|
|
18
|
+
exhibit: Exhibit;
|
|
19
|
+
}) | null>;
|
|
20
|
+
findByEventId(eventId: string): Promise<(LightningTalk & {
|
|
21
|
+
exhibit: Exhibit;
|
|
22
|
+
})[]>;
|
|
23
|
+
findMany(args?: Prisma.LightningTalkFindManyArgs): Promise<(LightningTalk & {
|
|
24
|
+
exhibit: Exhibit;
|
|
25
|
+
})[]>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LightningTalkRepository = void 0;
|
|
4
|
+
const base_repository_1 = require("./base.repository");
|
|
5
|
+
class LightningTalkRepository extends base_repository_1.BaseRepository {
|
|
6
|
+
constructor(prisma) {
|
|
7
|
+
super(prisma, "lightningTalk");
|
|
8
|
+
}
|
|
9
|
+
async create(data) {
|
|
10
|
+
return this.prisma.lightningTalk.create({
|
|
11
|
+
data,
|
|
12
|
+
include: { exhibit: true },
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
async update(id, data) {
|
|
16
|
+
return this.prisma.lightningTalk.update({
|
|
17
|
+
where: { exhibitId: id },
|
|
18
|
+
data,
|
|
19
|
+
include: { exhibit: true },
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async delete(id) {
|
|
23
|
+
return this.prisma.lightningTalk.delete({
|
|
24
|
+
where: { exhibitId: id },
|
|
25
|
+
include: { exhibit: true },
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async findById(id) {
|
|
29
|
+
return this.prisma.lightningTalk.findUnique({
|
|
30
|
+
where: { exhibitId: id },
|
|
31
|
+
include: { exhibit: true },
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async findByEventId(eventId) {
|
|
35
|
+
return this.prisma.lightningTalk.findMany({
|
|
36
|
+
where: {
|
|
37
|
+
exhibit: {
|
|
38
|
+
eventId,
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
include: { exhibit: true },
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async findMany(args) {
|
|
45
|
+
return this.prisma.lightningTalk.findMany({
|
|
46
|
+
...args,
|
|
47
|
+
include: { ...args === null || args === void 0 ? void 0 : args.include, exhibit: true },
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.LightningTalkRepository = LightningTalkRepository;
|
|
@@ -2,11 +2,13 @@ import type { Repositories } from "../repositories";
|
|
|
2
2
|
import { DiscordAccountService } from "./discordAccount.service";
|
|
3
3
|
import { EventService } from "./event.service";
|
|
4
4
|
import { ExhibitService } from "./exhibit.service";
|
|
5
|
+
import { LightningTalkService } from "./lightningTalk.service";
|
|
5
6
|
import { MemberService } from "./member.service";
|
|
6
7
|
export declare const createServices: (repositories: Repositories) => {
|
|
7
8
|
member: MemberService;
|
|
8
9
|
discordAccount: DiscordAccountService;
|
|
9
10
|
event: EventService;
|
|
10
11
|
exhibit: ExhibitService;
|
|
12
|
+
lightningTalk: LightningTalkService;
|
|
11
13
|
};
|
|
12
14
|
export type Services = ReturnType<typeof createServices>;
|
package/dist/services/factory.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.createServices = void 0;
|
|
|
4
4
|
const discordAccount_service_1 = require("./discordAccount.service");
|
|
5
5
|
const event_service_1 = require("./event.service");
|
|
6
6
|
const exhibit_service_1 = require("./exhibit.service");
|
|
7
|
+
const lightningTalk_service_1 = require("./lightningTalk.service");
|
|
7
8
|
const member_service_1 = require("./member.service");
|
|
8
9
|
const createServices = (repositories) => {
|
|
9
10
|
return {
|
|
@@ -11,6 +12,7 @@ const createServices = (repositories) => {
|
|
|
11
12
|
discordAccount: new discordAccount_service_1.DiscordAccountService(repositories.discordAccount, repositories.member),
|
|
12
13
|
event: new event_service_1.EventService(repositories.event, repositories.member, repositories.memberEvent),
|
|
13
14
|
exhibit: new exhibit_service_1.ExhibitService(repositories.exhibit, repositories.event, repositories.member, repositories.memberExhibit),
|
|
15
|
+
lightningTalk: new lightningTalk_service_1.LightningTalkService(repositories.lightningTalk, repositories.exhibit),
|
|
14
16
|
};
|
|
15
17
|
};
|
|
16
18
|
exports.createServices = createServices;
|
package/dist/services/index.d.ts
CHANGED
package/dist/services/index.js
CHANGED
|
@@ -20,4 +20,5 @@ __exportStar(require("./member.service"), exports);
|
|
|
20
20
|
__exportStar(require("./discordAccount.service"), exports);
|
|
21
21
|
__exportStar(require("./event.service"), exports);
|
|
22
22
|
__exportStar(require("./exhibit.service"), exports);
|
|
23
|
+
__exportStar(require("./lightningTalk.service"), exports);
|
|
23
24
|
__exportStar(require("./factory"), exports);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export interface IBaseService<T,
|
|
1
|
+
export interface IBaseService<T, CreateInput, UpdateInput> {
|
|
2
2
|
findById(id: string): Promise<T | null>;
|
|
3
|
-
create(data:
|
|
4
|
-
update(id: string, data:
|
|
3
|
+
create(data: CreateInput): Promise<T>;
|
|
4
|
+
update(id: string, data: UpdateInput): Promise<T>;
|
|
5
5
|
delete(id: string): Promise<T>;
|
|
6
6
|
findMany(): Promise<T[]>;
|
|
7
7
|
}
|
|
@@ -19,3 +19,4 @@ __exportStar(require("./member.service.interface"), exports);
|
|
|
19
19
|
__exportStar(require("./discordAccount.service.interface"), exports);
|
|
20
20
|
__exportStar(require("./event.service.interface"), exports);
|
|
21
21
|
__exportStar(require("./exhibit.service.interface"), exports);
|
|
22
|
+
__exportStar(require("./lightningTalk.service.interface"), exports);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Exhibit, LightningTalk } from "@prisma/client";
|
|
2
|
+
import type { IBaseService } from "./base.service.interface";
|
|
3
|
+
export interface LightningTalkCreateDTO {
|
|
4
|
+
exhibitId: string;
|
|
5
|
+
startTime: Date;
|
|
6
|
+
duration: number;
|
|
7
|
+
slideUrl?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface LightningTalkUpdateDTO {
|
|
10
|
+
startTime?: Date;
|
|
11
|
+
duration?: number;
|
|
12
|
+
slideUrl?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ILightningTalkService extends IBaseService<LightningTalk & {
|
|
15
|
+
exhibit: Exhibit;
|
|
16
|
+
}, // 常にexhibitを含む
|
|
17
|
+
LightningTalkCreateDTO, LightningTalkUpdateDTO> {
|
|
18
|
+
findById(id: string): Promise<(LightningTalk & {
|
|
19
|
+
exhibit: Exhibit;
|
|
20
|
+
}) | null>;
|
|
21
|
+
create(data: LightningTalkCreateDTO): Promise<LightningTalk & {
|
|
22
|
+
exhibit: Exhibit;
|
|
23
|
+
}>;
|
|
24
|
+
update(id: string, data: LightningTalkUpdateDTO): Promise<LightningTalk & {
|
|
25
|
+
exhibit: Exhibit;
|
|
26
|
+
}>;
|
|
27
|
+
delete(id: string): Promise<LightningTalk & {
|
|
28
|
+
exhibit: Exhibit;
|
|
29
|
+
}>;
|
|
30
|
+
findMany(): Promise<(LightningTalk & {
|
|
31
|
+
exhibit: Exhibit;
|
|
32
|
+
})[]>;
|
|
33
|
+
findByEventId(eventId: string): Promise<(LightningTalk & {
|
|
34
|
+
exhibit: Exhibit;
|
|
35
|
+
})[]>;
|
|
36
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Exhibit, LightningTalk, Prisma } from "@prisma/client";
|
|
2
|
+
import type { IExhibitRepository } from "../repositories/interfaces/exhibit.repository.interface";
|
|
3
|
+
import type { ILightningTalkRepository } from "../repositories/interfaces/lightningTalk.repository.interface";
|
|
4
|
+
import { BaseService } from "./base.service";
|
|
5
|
+
import type { ILightningTalkService, LightningTalkCreateDTO, LightningTalkUpdateDTO } from "./interfaces/lightningTalk.service.interface";
|
|
6
|
+
export declare class LightningTalkService extends BaseService<LightningTalk & {
|
|
7
|
+
exhibit: Exhibit;
|
|
8
|
+
}, LightningTalkCreateDTO, LightningTalkUpdateDTO, Prisma.LightningTalkFindManyArgs, Prisma.LightningTalkCreateInput, Prisma.LightningTalkUpdateInput, ILightningTalkRepository> implements ILightningTalkService {
|
|
9
|
+
private readonly exhibitRepository;
|
|
10
|
+
constructor(lightningTalkrepository: ILightningTalkRepository, exhibitRepository: IExhibitRepository);
|
|
11
|
+
findById(id: string): Promise<(LightningTalk & {
|
|
12
|
+
exhibit: Exhibit;
|
|
13
|
+
}) | null>;
|
|
14
|
+
create(data: LightningTalkCreateDTO): Promise<LightningTalk & {
|
|
15
|
+
exhibit: Exhibit;
|
|
16
|
+
}>;
|
|
17
|
+
update(id: string, data: LightningTalkUpdateDTO): Promise<LightningTalk & {
|
|
18
|
+
exhibit: Exhibit;
|
|
19
|
+
}>;
|
|
20
|
+
delete(id: string): Promise<LightningTalk & {
|
|
21
|
+
exhibit: Exhibit;
|
|
22
|
+
}>;
|
|
23
|
+
findMany(): Promise<(LightningTalk & {
|
|
24
|
+
exhibit: Exhibit;
|
|
25
|
+
})[]>;
|
|
26
|
+
findByEventId(eventId: string): Promise<(LightningTalk & {
|
|
27
|
+
exhibit: Exhibit;
|
|
28
|
+
})[]>;
|
|
29
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LightningTalkService = void 0;
|
|
4
|
+
const base_service_1 = require("./base.service");
|
|
5
|
+
class LightningTalkService extends base_service_1.BaseService {
|
|
6
|
+
constructor(lightningTalkrepository, exhibitRepository) {
|
|
7
|
+
super(lightningTalkrepository);
|
|
8
|
+
this.exhibitRepository = exhibitRepository;
|
|
9
|
+
}
|
|
10
|
+
async findById(id) {
|
|
11
|
+
return this.repository.findById(id);
|
|
12
|
+
}
|
|
13
|
+
async create(data) {
|
|
14
|
+
// 展示の存在確認
|
|
15
|
+
const exhibit = await this.exhibitRepository.findById(data.exhibitId);
|
|
16
|
+
if (!exhibit) {
|
|
17
|
+
throw new Error("Exhibit not found");
|
|
18
|
+
}
|
|
19
|
+
// すでにLTとして登録されていないか確認
|
|
20
|
+
const existingLT = await this.repository.findById(data.exhibitId);
|
|
21
|
+
if (existingLT) {
|
|
22
|
+
throw new Error("This exhibit is already registered as a lightning talk");
|
|
23
|
+
}
|
|
24
|
+
return this.repository.create({
|
|
25
|
+
exhibit: { connect: { id: data.exhibitId } },
|
|
26
|
+
startTime: data.startTime,
|
|
27
|
+
duration: data.duration,
|
|
28
|
+
slideUrl: data.slideUrl,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
async update(id, data) {
|
|
32
|
+
// LTの存在確認
|
|
33
|
+
const lightningTalk = await this.repository.findById(id);
|
|
34
|
+
if (!lightningTalk) {
|
|
35
|
+
throw new Error("Lightning talk not found");
|
|
36
|
+
}
|
|
37
|
+
return this.repository.update(id, {
|
|
38
|
+
startTime: data.startTime,
|
|
39
|
+
duration: data.duration,
|
|
40
|
+
slideUrl: data.slideUrl,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async delete(id) {
|
|
44
|
+
// LTの存在確認
|
|
45
|
+
const lightningTalk = await this.repository.findById(id);
|
|
46
|
+
if (!lightningTalk) {
|
|
47
|
+
throw new Error("Lightning talk not found");
|
|
48
|
+
}
|
|
49
|
+
return this.repository.delete(id);
|
|
50
|
+
}
|
|
51
|
+
async findMany() {
|
|
52
|
+
return this.repository.findMany();
|
|
53
|
+
}
|
|
54
|
+
async findByEventId(eventId) {
|
|
55
|
+
return this.repository.findByEventId(eventId);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.LightningTalkService = LightningTalkService;
|
package/package.json
CHANGED
package/prisma/schema.prisma
CHANGED
|
@@ -57,12 +57,28 @@ model Exhibit {
|
|
|
57
57
|
eventId String @map("event_id")
|
|
58
58
|
event Event @relation(fields: [eventId], references: [id])
|
|
59
59
|
members MemberExhibit[]
|
|
60
|
+
|
|
61
|
+
// 必要だがアクセスしない関係として定義
|
|
62
|
+
lightningTalk LightningTalk?
|
|
60
63
|
createdAt DateTime @default(now())
|
|
61
64
|
updatedAt DateTime @updatedAt
|
|
62
65
|
|
|
63
66
|
@@map("exhibits")
|
|
64
67
|
}
|
|
65
68
|
|
|
69
|
+
// イベント中のLT
|
|
70
|
+
model LightningTalk {
|
|
71
|
+
exhibitId String @id @map("exhibit_id") // PKかつFKとして使用
|
|
72
|
+
exhibit Exhibit @relation(fields: [exhibitId], references: [id])
|
|
73
|
+
startTime DateTime @map("start_time")
|
|
74
|
+
duration Int // 分単位
|
|
75
|
+
slideUrl String? @map("slide_url")
|
|
76
|
+
createdAt DateTime @default(now())
|
|
77
|
+
updatedAt DateTime @updatedAt
|
|
78
|
+
|
|
79
|
+
@@map("lightning_talks")
|
|
80
|
+
}
|
|
81
|
+
|
|
66
82
|
// ジャンクションテーブル(Member - Event)
|
|
67
83
|
model MemberEvent {
|
|
68
84
|
id String @id @default(uuid())
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
-- CreateTable
|
|
2
|
-
CREATE TABLE "members" (
|
|
3
|
-
"id" TEXT NOT NULL,
|
|
4
|
-
"name" TEXT NOT NULL,
|
|
5
|
-
"student_id" TEXT NOT NULL,
|
|
6
|
-
"department" TEXT NOT NULL,
|
|
7
|
-
"email" TEXT NOT NULL,
|
|
8
|
-
"personal_email" TEXT,
|
|
9
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
10
|
-
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
11
|
-
|
|
12
|
-
CONSTRAINT "members_pkey" PRIMARY KEY ("id")
|
|
13
|
-
);
|
|
14
|
-
|
|
15
|
-
-- CreateTable
|
|
16
|
-
CREATE TABLE "discord_accounts" (
|
|
17
|
-
"discord_id" TEXT NOT NULL,
|
|
18
|
-
"nick_name" TEXT NOT NULL,
|
|
19
|
-
"member_id" TEXT NOT NULL,
|
|
20
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
21
|
-
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
22
|
-
|
|
23
|
-
CONSTRAINT "discord_accounts_pkey" PRIMARY KEY ("discord_id")
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
-- CreateTable
|
|
27
|
-
CREATE TABLE "events" (
|
|
28
|
-
"id" TEXT NOT NULL,
|
|
29
|
-
"name" TEXT NOT NULL,
|
|
30
|
-
"date" TIMESTAMP(3) NOT NULL,
|
|
31
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
32
|
-
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
33
|
-
|
|
34
|
-
CONSTRAINT "events_pkey" PRIMARY KEY ("id")
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
-- CreateTable
|
|
38
|
-
CREATE TABLE "exhibits" (
|
|
39
|
-
"id" TEXT NOT NULL,
|
|
40
|
-
"name" TEXT NOT NULL,
|
|
41
|
-
"description" TEXT,
|
|
42
|
-
"url" TEXT,
|
|
43
|
-
"event_id" TEXT NOT NULL,
|
|
44
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
45
|
-
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
46
|
-
|
|
47
|
-
CONSTRAINT "exhibits_pkey" PRIMARY KEY ("id")
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
-- CreateTable
|
|
51
|
-
CREATE TABLE "member_events" (
|
|
52
|
-
"id" TEXT NOT NULL,
|
|
53
|
-
"member_id" TEXT NOT NULL,
|
|
54
|
-
"event_id" TEXT NOT NULL,
|
|
55
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
56
|
-
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
57
|
-
|
|
58
|
-
CONSTRAINT "member_events_pkey" PRIMARY KEY ("id")
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
-- CreateTable
|
|
62
|
-
CREATE TABLE "member_exhibits" (
|
|
63
|
-
"id" TEXT NOT NULL,
|
|
64
|
-
"member_id" TEXT NOT NULL,
|
|
65
|
-
"exhibit_id" TEXT NOT NULL,
|
|
66
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
67
|
-
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
68
|
-
|
|
69
|
-
CONSTRAINT "member_exhibits_pkey" PRIMARY KEY ("id")
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
-- CreateIndex
|
|
73
|
-
CREATE UNIQUE INDEX "members_email_key" ON "members"("email");
|
|
74
|
-
|
|
75
|
-
-- CreateIndex
|
|
76
|
-
CREATE UNIQUE INDEX "member_events_member_id_event_id_key" ON "member_events"("member_id", "event_id");
|
|
77
|
-
|
|
78
|
-
-- CreateIndex
|
|
79
|
-
CREATE UNIQUE INDEX "member_exhibits_member_id_exhibit_id_key" ON "member_exhibits"("member_id", "exhibit_id");
|
|
80
|
-
|
|
81
|
-
-- AddForeignKey
|
|
82
|
-
ALTER TABLE "discord_accounts" ADD CONSTRAINT "discord_accounts_member_id_fkey" FOREIGN KEY ("member_id") REFERENCES "members"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
83
|
-
|
|
84
|
-
-- AddForeignKey
|
|
85
|
-
ALTER TABLE "exhibits" ADD CONSTRAINT "exhibits_event_id_fkey" FOREIGN KEY ("event_id") REFERENCES "events"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
86
|
-
|
|
87
|
-
-- AddForeignKey
|
|
88
|
-
ALTER TABLE "member_events" ADD CONSTRAINT "member_events_member_id_fkey" FOREIGN KEY ("member_id") REFERENCES "members"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
89
|
-
|
|
90
|
-
-- AddForeignKey
|
|
91
|
-
ALTER TABLE "member_events" ADD CONSTRAINT "member_events_event_id_fkey" FOREIGN KEY ("event_id") REFERENCES "events"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
92
|
-
|
|
93
|
-
-- AddForeignKey
|
|
94
|
-
ALTER TABLE "member_exhibits" ADD CONSTRAINT "member_exhibits_member_id_fkey" FOREIGN KEY ("member_id") REFERENCES "members"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
95
|
-
|
|
96
|
-
-- AddForeignKey
|
|
97
|
-
ALTER TABLE "member_exhibits" ADD CONSTRAINT "member_exhibits_exhibit_id_fkey" FOREIGN KEY ("exhibit_id") REFERENCES "exhibits"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|