From 42ba6e021de05e5a3fabb261c8c998281a4ce49d Mon Sep 17 00:00:00 2001 From: Kim Daehyeon Date: Sat, 25 Nov 2023 19:29:03 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20entity=201=EC=B0=A8=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20-=20#3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit user team participant possible_time announcement --- src/announcements/announcements.controller.ts | 6 ++ src/announcements/announcements.module.ts | 13 ++++ src/announcements/announcements.service.ts | 6 ++ .../entities/announcement.entity.ts | 34 +++++++++++ src/app.module.ts | 8 +++ src/config/typeorm.config.ts | 2 +- src/meetings/entities/meeting.entity.ts | 40 +++++++++++++ src/meetings/meetings.controller.ts | 6 ++ src/meetings/meetings.module.ts | 13 ++++ src/meetings/meetings.service.ts | 6 ++ src/relationentities/participant.entity.ts | 21 +++++++ src/relationentities/possible_time.entity.ts | 24 ++++++++ .../relationentities.module.ts | 12 ++++ src/teams/entities/team.entity.ts | 40 +++++++++++++ src/teams/teams.controller.ts | 6 ++ src/teams/teams.module.ts | 13 ++++ src/teams/teams.service.ts | 6 ++ src/users/entities/users.entity.ts | 59 +++++++------------ src/users/users.service.ts | 2 - 19 files changed, 276 insertions(+), 41 deletions(-) create mode 100644 src/announcements/announcements.controller.ts create mode 100644 src/announcements/announcements.module.ts create mode 100644 src/announcements/announcements.service.ts create mode 100644 src/announcements/entities/announcement.entity.ts create mode 100644 src/meetings/entities/meeting.entity.ts create mode 100644 src/meetings/meetings.controller.ts create mode 100644 src/meetings/meetings.module.ts create mode 100644 src/meetings/meetings.service.ts create mode 100644 src/relationentities/participant.entity.ts create mode 100644 src/relationentities/possible_time.entity.ts create mode 100644 src/relationentities/relationentities.module.ts create mode 100644 src/teams/entities/team.entity.ts create mode 100644 src/teams/teams.controller.ts create mode 100644 src/teams/teams.module.ts create mode 100644 src/teams/teams.service.ts diff --git a/src/announcements/announcements.controller.ts b/src/announcements/announcements.controller.ts new file mode 100644 index 0000000..294f5a7 --- /dev/null +++ b/src/announcements/announcements.controller.ts @@ -0,0 +1,6 @@ +import { Controller } from '@nestjs/common'; + +@Controller('announcements') +export class AnnouncementsController { + constructor() {} +} diff --git a/src/announcements/announcements.module.ts b/src/announcements/announcements.module.ts new file mode 100644 index 0000000..fcbf0b4 --- /dev/null +++ b/src/announcements/announcements.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Announcement } from './entities/announcement.entity'; +import { AnnouncementsService } from './announcements.service'; +import { AnnouncementsController } from './announcements.controller'; + +@Module({ + imports: [TypeOrmModule.forFeature([Announcement])], + controllers: [AnnouncementsController], + providers: [AnnouncementsService], + exports: [], +}) +export class AnnouncementsModule {} diff --git a/src/announcements/announcements.service.ts b/src/announcements/announcements.service.ts new file mode 100644 index 0000000..6cf591f --- /dev/null +++ b/src/announcements/announcements.service.ts @@ -0,0 +1,6 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class AnnouncementsService { + constructor() {} +} diff --git a/src/announcements/entities/announcement.entity.ts b/src/announcements/entities/announcement.entity.ts new file mode 100644 index 0000000..5a28fc6 --- /dev/null +++ b/src/announcements/entities/announcement.entity.ts @@ -0,0 +1,34 @@ +import { + Column, + Entity, + JoinColumn, + ManyToOne, + OneToOne, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { IsString } from 'class-validator'; +import { User } from '../../users/entities/users.entity'; +import { Meeting } from '../../meetings/entities/meeting.entity'; + +@Entity() +export class Announcement { + @PrimaryGeneratedColumn('uuid') + id!: string; + + @ManyToOne((type) => User, (user) => user.announcements, { + onDelete: 'SET NULL', + }) + writer!: User; + + @OneToOne((type) => Meeting, (meeting) => meeting.announcement) + @JoinColumn() + meeting!: Meeting; + + @Column() + @IsString() + title!: string; + + @Column() + @IsString() + content!: string; +} diff --git a/src/app.module.ts b/src/app.module.ts index 76903ea..75e8986 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -4,6 +4,10 @@ import { ConfigModule } from '@nestjs/config'; import { generateTypeOrmConfig } from './config/typeorm.config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { UsersModule } from './users/users.module'; +import { RelationentitiesModule } from './relationentities/relationentities.module'; +import { TeamsModule } from './teams/teams.module'; +import { MeetingsModule } from './meetings/meetings.module'; +import { AnnouncementsModule } from './announcements/announcements.module'; @Module({ imports: [ @@ -19,6 +23,10 @@ import { UsersModule } from './users/users.module'; }), TypeOrmModule.forRoot(generateTypeOrmConfig(process.env)), UsersModule, + TeamsModule, + RelationentitiesModule, + MeetingsModule, + AnnouncementsModule, ], controllers: [], providers: [], diff --git a/src/config/typeorm.config.ts b/src/config/typeorm.config.ts index 0717d5d..3235814 100644 --- a/src/config/typeorm.config.ts +++ b/src/config/typeorm.config.ts @@ -9,7 +9,7 @@ export const generateTypeOrmConfig: GenerateTypeOrmConfig = (env) => ({ username: env.DATABASE_USERNAME, password: env.DATABASE_PASSWORD, database: env.DATABASE_NAME, - synchronize: false, + synchronize: true, logging: process.env.NODE_ENV !== 'prod' && process.env.NODE_ENV !== 'test', entities: [__dirname + '/../**/*.entity{.ts,.js}'], }); diff --git a/src/meetings/entities/meeting.entity.ts b/src/meetings/entities/meeting.entity.ts new file mode 100644 index 0000000..841317c --- /dev/null +++ b/src/meetings/entities/meeting.entity.ts @@ -0,0 +1,40 @@ +import { + Column, + Entity, + JoinColumn, + OneToMany, + OneToOne, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { IsDate, IsNumber, IsString } from 'class-validator'; +import { Announcement } from '../../announcements/entities/announcement.entity'; +import { Possible_Time } from '../../relationentities/possible_time.entity'; + +@Entity() +export class Meeting { + @PrimaryGeneratedColumn('uuid') + id!: string; + + @Column() + @IsString() + name!: string; + + @Column() + @IsDate() + dateTime?: Date; + + @Column() + @IsNumber() + duration!: number; + + @Column() + @IsString() + location?: string; + + @OneToOne((type) => Announcement, (announcement) => announcement.meeting) + @JoinColumn() + announcement?: Announcement; + + @OneToMany((type) => Possible_Time, (possibleTime) => possibleTime) + possibleTimes?: Possible_Time[]; +} diff --git a/src/meetings/meetings.controller.ts b/src/meetings/meetings.controller.ts new file mode 100644 index 0000000..2b10c59 --- /dev/null +++ b/src/meetings/meetings.controller.ts @@ -0,0 +1,6 @@ +import { Controller } from '@nestjs/common'; + +@Controller('meetings') +export class MeetingsController { + constructor() {} +} diff --git a/src/meetings/meetings.module.ts b/src/meetings/meetings.module.ts new file mode 100644 index 0000000..193ab50 --- /dev/null +++ b/src/meetings/meetings.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Meeting } from './entities/meeting.entity'; +import { MeetingsController } from './meetings.controller'; +import { MeetingsService } from './meetings.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Meeting])], + controllers: [MeetingsController], + providers: [MeetingsService], + exports: [], +}) +export class MeetingsModule {} diff --git a/src/meetings/meetings.service.ts b/src/meetings/meetings.service.ts new file mode 100644 index 0000000..2c77cc6 --- /dev/null +++ b/src/meetings/meetings.service.ts @@ -0,0 +1,6 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class MeetingsService { + constructor() {} +} diff --git a/src/relationentities/participant.entity.ts b/src/relationentities/participant.entity.ts new file mode 100644 index 0000000..9be608d --- /dev/null +++ b/src/relationentities/participant.entity.ts @@ -0,0 +1,21 @@ +import { Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; +import { User } from '../users/entities/users.entity'; +import { Team } from '../teams/entities/team.entity'; + +@Entity() +export class Participant { + @PrimaryGeneratedColumn('uuid') + id!: string; + + @ManyToOne((type) => User, (user) => user.participants, { + nullable: false, + onDelete: 'CASCADE', + }) + user!: User; + + @ManyToOne((type) => Team, (team) => team.participants, { + nullable: false, + onDelete: 'CASCADE', + }) + team!: Team; +} diff --git a/src/relationentities/possible_time.entity.ts b/src/relationentities/possible_time.entity.ts new file mode 100644 index 0000000..a189143 --- /dev/null +++ b/src/relationentities/possible_time.entity.ts @@ -0,0 +1,24 @@ +import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; +import { User } from '../users/entities/users.entity'; +import { Meeting } from '../meetings/entities/meeting.entity'; + +@Entity() +export class Possible_Time { + @PrimaryGeneratedColumn('uuid') + id!: string; + + @ManyToOne((type) => User, (user) => user.possibleTimes, { + nullable: false, + onDelete: 'CASCADE', + }) + user!: User; + + @ManyToOne((type) => Meeting, (meeting) => meeting.possibleTimes, { + nullable: false, + onDelete: 'CASCADE', + }) + meeting!: Meeting; + + @Column() + possibleTime!: Date; +} diff --git a/src/relationentities/relationentities.module.ts b/src/relationentities/relationentities.module.ts new file mode 100644 index 0000000..a4e54f0 --- /dev/null +++ b/src/relationentities/relationentities.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Participant } from './participant.entity'; +import { Possible_Time } from './possible_time.entity'; + +@Module({ + imports: [TypeOrmModule.forFeature([Participant, Possible_Time])], + controllers: [], + providers: [], + exports: [], +}) +export class RelationentitiesModule {} diff --git a/src/teams/entities/team.entity.ts b/src/teams/entities/team.entity.ts new file mode 100644 index 0000000..6389d61 --- /dev/null +++ b/src/teams/entities/team.entity.ts @@ -0,0 +1,40 @@ +import { + Column, + Entity, + ManyToOne, + OneToMany, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { IsDate, IsNumber, IsString } from 'class-validator'; +import { Participant } from '../../relationentities/participant.entity'; +import { User } from '../../users/entities/users.entity'; + +@Entity() +export class Team { + @PrimaryGeneratedColumn('uuid') + id!: string; + + @ManyToOne(() => User) + boss!: User; + + @Column() + @IsString() + name!: string; + + @Column() + @IsNumber() + maxMember!: number; + + @Column() + @IsDate() + startedAt!: Date; + + @Column() + @IsDate() + endedAt!: Date; + + @OneToMany((type) => Participant, (participant) => participant, { + nullable: true, + }) + participants: Participant[]; +} diff --git a/src/teams/teams.controller.ts b/src/teams/teams.controller.ts new file mode 100644 index 0000000..05dad11 --- /dev/null +++ b/src/teams/teams.controller.ts @@ -0,0 +1,6 @@ +import { Controller } from '@nestjs/common'; + +@Controller('teams') +export class TeamsController { + constructor() {} +} diff --git a/src/teams/teams.module.ts b/src/teams/teams.module.ts new file mode 100644 index 0000000..331763d --- /dev/null +++ b/src/teams/teams.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Team } from './entities/team.entity'; +import { TeamsController } from './teams.controller'; +import { TeamsService } from './teams.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Team])], + controllers: [TeamsController], + providers: [TeamsService], + exports: [], +}) +export class TeamsModule {} diff --git a/src/teams/teams.service.ts b/src/teams/teams.service.ts new file mode 100644 index 0000000..9bc2393 --- /dev/null +++ b/src/teams/teams.service.ts @@ -0,0 +1,6 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class TeamsService { + constructor() {} +} diff --git a/src/users/entities/users.entity.ts b/src/users/entities/users.entity.ts index 4e7686e..53bde06 100644 --- a/src/users/entities/users.entity.ts +++ b/src/users/entities/users.entity.ts @@ -1,52 +1,35 @@ -import { InternalServerErrorException } from '@nestjs/common'; -import { - BeforeInsert, - BeforeUpdate, - Column, - Entity, - PrimaryGeneratedColumn, -} from 'typeorm'; -import { IsEmail, IsString, Matches } from 'class-validator'; -import * as bcrypt from 'bcrypt'; +import { Column, Entity, OneToMany, PrimaryColumn, Unique } from 'typeorm'; +import { IsString } from 'class-validator'; +import { Participant } from '../../relationentities/participant.entity'; +import { Announcement } from '../../announcements/entities/announcement.entity'; +import { Possible_Time } from '../../relationentities/possible_time.entity'; @Entity() +@Unique(['nickname']) export class User { - @PrimaryGeneratedColumn('uuid') - id!: number; + @PrimaryColumn() + id!: string; @Column() @IsString() nickname!: string; - @Column({ unique: true }) - @IsEmail() - email!: string; - @Column({ select: false }) @IsString() - @Matches(/^(?=.*\d)[A-Za-z\d@$!%*?&]{8,}$/, { - message: - 'Password must be at least 8 characters(en) long, contain 1 number', - }) + //@Matches(/^(?=.*\d)[A-Za-z\d@$!%*?&]{8,}$/, { + // message: + // 'Password must be at least 8 characters(en) long, contain 1 number', + //}) password!: string; - @BeforeInsert() - @BeforeUpdate() - async hashPassword(): Promise { - if (this.password) { - try { - this.password = await bcrypt.hash(this.password, 10); - } catch (e) { - throw new InternalServerErrorException(); - } - } - } + @OneToMany((type) => Participant, (participant) => participant, { + nullable: true, + }) + participants: Participant[]; + + @OneToMany((type) => Announcement, (announcement) => announcement.writer) + announcements: Announcement[]; - async checkPassword(plainPassword: string): Promise { - try { - return await bcrypt.compare(plainPassword, this.password); - } catch (e) { - throw new InternalServerErrorException(); - } - } + @OneToMany((type) => Possible_Time, (possibleTime) => possibleTime) + possibleTimes: Possible_Time[]; } diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 1c9fa9b..4643edf 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -12,8 +12,6 @@ export class UsersService { async deleteAccount() { const user: User = new User(); - user.nickname = 'test'; - user.email = 'sdf@sf.com'; user.password = '1234'; await this.usersRepository.save(user); }