@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,16 @@
|
|
|
1
|
+
import type { Exhibit } from "@prisma/client";
|
|
2
|
+
import type { IBaseService } from "./base.service.interface";
|
|
3
|
+
export interface ExhibitCreateDTO {
|
|
4
|
+
name: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
url?: string;
|
|
7
|
+
eventId: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ExhibitUpdateDTO extends Partial<ExhibitCreateDTO> {
|
|
10
|
+
}
|
|
11
|
+
export interface IExhibitService extends IBaseService<Exhibit, ExhibitCreateDTO, ExhibitUpdateDTO> {
|
|
12
|
+
findByEventId(eventId: string): Promise<Exhibit[]>;
|
|
13
|
+
findWithMembers(id: string): Promise<Exhibit | null>;
|
|
14
|
+
registerMember(exhibitId: string, memberId: string): Promise<void>;
|
|
15
|
+
unregisterMember(exhibitId: string, memberId: string): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
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("./base.service.interface"), exports);
|
|
18
|
+
__exportStar(require("./member.service.interface"), exports);
|
|
19
|
+
__exportStar(require("./discordAccount.service.interface"), exports);
|
|
20
|
+
__exportStar(require("./event.service.interface"), exports);
|
|
21
|
+
__exportStar(require("./exhibit.service.interface"), exports);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Member } from "@prisma/client";
|
|
2
|
+
import type { IBaseService } from "./base.service.interface";
|
|
3
|
+
export interface MemberCreateDTO {
|
|
4
|
+
name: string;
|
|
5
|
+
studentId: string;
|
|
6
|
+
departments: string[];
|
|
7
|
+
email: string;
|
|
8
|
+
personalEmail?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface MemberUpdateDTO extends Partial<MemberCreateDTO> {
|
|
11
|
+
}
|
|
12
|
+
export interface IMemberService extends IBaseService<Member, MemberCreateDTO, MemberUpdateDTO> {
|
|
13
|
+
findByEmail(email: string): Promise<Member | null>;
|
|
14
|
+
findByStudentId(studentId: string): Promise<Member[]>;
|
|
15
|
+
addDiscordAccount(memberId: string, discordId: string, nickName: string): Promise<Member>;
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Member, 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 { IMemberService, MemberCreateDTO, MemberUpdateDTO } from "./interfaces/member.service.interface";
|
|
6
|
+
export declare class MemberService extends BaseService<Member, MemberCreateDTO, MemberUpdateDTO, Prisma.MemberFindManyArgs, Prisma.MemberCreateInput, Prisma.MemberUpdateInput, IMemberRepository> implements IMemberService {
|
|
7
|
+
private readonly discordAccountRepository;
|
|
8
|
+
constructor(memberRepository: IMemberRepository, discordAccountRepository: IDiscordAccountRepository);
|
|
9
|
+
create(data: MemberCreateDTO): Promise<Member>;
|
|
10
|
+
update(id: string, data: MemberUpdateDTO): Promise<Member>;
|
|
11
|
+
findByEmail(email: string): Promise<Member | null>;
|
|
12
|
+
findByStudentId(studentId: string): Promise<Member[]>;
|
|
13
|
+
addDiscordAccount(memberId: string, discordId: string, nickName: string): Promise<Member>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemberService = void 0;
|
|
4
|
+
const base_service_1 = require("./base.service");
|
|
5
|
+
class MemberService extends base_service_1.BaseService {
|
|
6
|
+
constructor(memberRepository, discordAccountRepository) {
|
|
7
|
+
super(memberRepository);
|
|
8
|
+
this.discordAccountRepository = discordAccountRepository;
|
|
9
|
+
}
|
|
10
|
+
async create(data) {
|
|
11
|
+
// メールアドレスの重複チェック
|
|
12
|
+
const existingMember = await this.repository.findByEmail(data.email);
|
|
13
|
+
if (existingMember) {
|
|
14
|
+
throw new Error("Email already exists");
|
|
15
|
+
}
|
|
16
|
+
return this.repository.create(data);
|
|
17
|
+
}
|
|
18
|
+
async update(id, data) {
|
|
19
|
+
if (data.email) {
|
|
20
|
+
const existingMember = await this.repository.findByEmail(data.email);
|
|
21
|
+
if (existingMember && existingMember.id !== id) {
|
|
22
|
+
throw new Error("Email already exists");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return this.repository.update(id, data);
|
|
26
|
+
}
|
|
27
|
+
async findByEmail(email) {
|
|
28
|
+
return this.repository.findByEmail(email);
|
|
29
|
+
}
|
|
30
|
+
async findByStudentId(studentId) {
|
|
31
|
+
return this.repository.findByStudentId(studentId);
|
|
32
|
+
}
|
|
33
|
+
async addDiscordAccount(memberId, discordId, nickName) {
|
|
34
|
+
// メンバーの存在確認
|
|
35
|
+
const member = await this.repository.findById(memberId);
|
|
36
|
+
if (!member) {
|
|
37
|
+
throw new Error("Member not found");
|
|
38
|
+
}
|
|
39
|
+
// Discord IDの重複チェック
|
|
40
|
+
const existingAccount = await this.discordAccountRepository.findById(discordId);
|
|
41
|
+
if (existingAccount) {
|
|
42
|
+
throw new Error("Discord account already exists");
|
|
43
|
+
}
|
|
44
|
+
await this.discordAccountRepository.create({
|
|
45
|
+
id: discordId,
|
|
46
|
+
nickName,
|
|
47
|
+
member: { connect: { id: member.id } },
|
|
48
|
+
});
|
|
49
|
+
return this.repository.findById(memberId);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.MemberService = MemberService;
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shizuoka-its/core",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "ITS core library",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/su-its/core.git"
|
|
10
|
+
},
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"prisma"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"prepare": "npm run build",
|
|
21
|
+
"prebuild": "rimraf dist",
|
|
22
|
+
"prisma:generate": "prisma generate",
|
|
23
|
+
"prepublishOnly": "npm run build",
|
|
24
|
+
"version:patch": "npm version patch",
|
|
25
|
+
"version:minor": "npm version minor",
|
|
26
|
+
"version:major": "npm version major"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [],
|
|
29
|
+
"author": "",
|
|
30
|
+
"license": "ISC",
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^22.9.0",
|
|
33
|
+
"prisma": "^5.22.0",
|
|
34
|
+
"rimraf": "^6.0.1",
|
|
35
|
+
"typescript": "^5.6.3"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@prisma/client": "^5.22.0"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
datasource db {
|
|
2
|
+
provider = "postgresql"
|
|
3
|
+
url = env("DATABASE_URL")
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
generator client {
|
|
7
|
+
provider = "prisma-client-js"
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
model Member {
|
|
11
|
+
id String @id @default(uuid())
|
|
12
|
+
name String
|
|
13
|
+
studentId String @map("student_id")
|
|
14
|
+
departments String[]
|
|
15
|
+
email String @unique
|
|
16
|
+
personalEmail String? @map("personal_email")
|
|
17
|
+
// リレーション
|
|
18
|
+
discordAccounts DiscordAccount[]
|
|
19
|
+
events MemberEvent[]
|
|
20
|
+
exhibits MemberExhibit[]
|
|
21
|
+
createdAt DateTime @default(now())
|
|
22
|
+
updatedAt DateTime @updatedAt
|
|
23
|
+
|
|
24
|
+
@@map("members")
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
model DiscordAccount {
|
|
28
|
+
id String @id @map("discord_id") // DiscordIDをプライマリーキーとして使用
|
|
29
|
+
nickName String @map("nick_name")
|
|
30
|
+
memberId String @map("member_id")
|
|
31
|
+
member Member @relation(fields: [memberId], references: [id])
|
|
32
|
+
createdAt DateTime @default(now())
|
|
33
|
+
updatedAt DateTime @updatedAt
|
|
34
|
+
|
|
35
|
+
@@map("discord_accounts")
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
model Event {
|
|
39
|
+
id String @id @default(uuid())
|
|
40
|
+
name String
|
|
41
|
+
date DateTime
|
|
42
|
+
// リレーション
|
|
43
|
+
members MemberEvent[]
|
|
44
|
+
exhibits Exhibit[]
|
|
45
|
+
createdAt DateTime @default(now())
|
|
46
|
+
updatedAt DateTime @updatedAt
|
|
47
|
+
|
|
48
|
+
@@map("events")
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
model Exhibit {
|
|
52
|
+
id String @id @default(uuid())
|
|
53
|
+
name String
|
|
54
|
+
description String?
|
|
55
|
+
url String?
|
|
56
|
+
// リレーション
|
|
57
|
+
eventId String @map("event_id")
|
|
58
|
+
event Event @relation(fields: [eventId], references: [id])
|
|
59
|
+
members MemberExhibit[]
|
|
60
|
+
createdAt DateTime @default(now())
|
|
61
|
+
updatedAt DateTime @updatedAt
|
|
62
|
+
|
|
63
|
+
@@map("exhibits")
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// ジャンクションテーブル(Member - Event)
|
|
67
|
+
model MemberEvent {
|
|
68
|
+
id String @id @default(uuid())
|
|
69
|
+
memberId String @map("member_id")
|
|
70
|
+
eventId String @map("event_id")
|
|
71
|
+
member Member @relation(fields: [memberId], references: [id])
|
|
72
|
+
event Event @relation(fields: [eventId], references: [id])
|
|
73
|
+
createdAt DateTime @default(now())
|
|
74
|
+
updatedAt DateTime @updatedAt
|
|
75
|
+
|
|
76
|
+
@@unique([memberId, eventId])
|
|
77
|
+
@@map("member_events")
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// ジャンクションテーブル(Member - Exhibit)
|
|
81
|
+
model MemberExhibit {
|
|
82
|
+
id String @id @default(uuid())
|
|
83
|
+
memberId String @map("member_id")
|
|
84
|
+
exhibitId String @map("exhibit_id")
|
|
85
|
+
member Member @relation(fields: [memberId], references: [id])
|
|
86
|
+
exhibit Exhibit @relation(fields: [exhibitId], references: [id])
|
|
87
|
+
createdAt DateTime @default(now())
|
|
88
|
+
updatedAt DateTime @updatedAt
|
|
89
|
+
|
|
90
|
+
@@unique([memberId, exhibitId])
|
|
91
|
+
@@map("member_exhibits")
|
|
92
|
+
}
|