diff --git a/src/announcements/announcements.controller.ts b/src/announcements/announcements.controller.ts index 294f5a7..1957ea4 100644 --- a/src/announcements/announcements.controller.ts +++ b/src/announcements/announcements.controller.ts @@ -1,6 +1,26 @@ -import { Controller } from '@nestjs/common'; +import { Body, Controller, Post, UseGuards } from '@nestjs/common'; +import { AnnouncementsService } from './announcements.service'; +import { JwtAuthGuard } from 'src/common/decorator/auth/jwt/jwt.guard'; +import { AuthUser } from 'src/auth/auth-user.decorator'; +import { User } from 'src/users/entities/users.entity'; +import { CreateAnnouncementDto } from './dtos/create-announcement.dto'; +import { ResponseBody, SuccessResponse } from 'src/common/response/response'; +import { RESPONSE_CODE } from 'src/common/response/response.code'; -@Controller('announcements') +@Controller('announcement') export class AnnouncementsController { - constructor() {} + constructor(private readonly announcementsService: AnnouncementsService) {} + + @Post() + @UseGuards(JwtAuthGuard) + async createAnnouncement( + @AuthUser() user: User, + @Body() createAnnouncementDto: CreateAnnouncementDto, + ): Promise { + await this.announcementsService.createAnnouncement( + user, + createAnnouncementDto, + ); + return SuccessResponse(RESPONSE_CODE[2000], null); + } } diff --git a/src/announcements/announcements.module.ts b/src/announcements/announcements.module.ts index fcbf0b4..f34dc52 100644 --- a/src/announcements/announcements.module.ts +++ b/src/announcements/announcements.module.ts @@ -3,9 +3,10 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { Announcement } from './entities/announcement.entity'; import { AnnouncementsService } from './announcements.service'; import { AnnouncementsController } from './announcements.controller'; +import { Meeting } from 'src/meetings/entities/meeting.entity'; @Module({ - imports: [TypeOrmModule.forFeature([Announcement])], + imports: [TypeOrmModule.forFeature([Announcement, Meeting])], controllers: [AnnouncementsController], providers: [AnnouncementsService], exports: [], diff --git a/src/announcements/announcements.service.ts b/src/announcements/announcements.service.ts index 6cf591f..ca67894 100644 --- a/src/announcements/announcements.service.ts +++ b/src/announcements/announcements.service.ts @@ -1,6 +1,46 @@ import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Announcement } from './entities/announcement.entity'; +import { User } from 'src/users/entities/users.entity'; +import { CreateAnnouncementDto } from './dtos/create-announcement.dto'; +import { Repository } from 'typeorm'; +import { Meeting } from 'src/meetings/entities/meeting.entity'; +import { Exception } from 'src/common/response/exception'; +import { RESPONSE_CODE } from 'src/common/response/response.code'; @Injectable() export class AnnouncementsService { - constructor() {} + constructor( + @InjectRepository(Announcement) + private readonly announcementRepository: Repository, + @InjectRepository(Meeting) + private readonly meetingRepository: Repository, + ) {} + + async createAnnouncement( + user: User, + createAnnouncementDto: CreateAnnouncementDto, + ) { + const meeting = await this.meetingRepository.findOne({ + where: { id: createAnnouncementDto.meetingId }, + relations: ['announcement'], + }); + + if (meeting === null) { + throw new Exception(RESPONSE_CODE[34040], null); + } + + if (meeting.announcement !== null) { + throw new Exception(RESPONSE_CODE[44090], null); + } + + const announcement = new Announcement(); + announcement.writer = user; + announcement.content = createAnnouncementDto.content; + announcement.title = createAnnouncementDto.title; + announcement.meeting = meeting; + await this.announcementRepository.save(announcement); + meeting.announcement = announcement; + await this.meetingRepository.save(meeting); + } } diff --git a/src/announcements/dtos/create-announcement.dto.ts b/src/announcements/dtos/create-announcement.dto.ts new file mode 100644 index 0000000..ed9162a --- /dev/null +++ b/src/announcements/dtos/create-announcement.dto.ts @@ -0,0 +1,12 @@ +import { IsString } from 'class-validator'; + +export class CreateAnnouncementDto { + @IsString() + meetingId!: string; + + @IsString() + title!: string; + + @IsString() + content!: string; +} diff --git a/src/common/response/response.code.ts b/src/common/response/response.code.ts index 55f007f..b17e106 100644 --- a/src/common/response/response.code.ts +++ b/src/common/response/response.code.ts @@ -62,6 +62,16 @@ export const RESPONSE_CODE: Record = { }, //MEETING + 34040: { + code: 34040, + message: '존재하지 않는 회의입니다.', + status: HttpStatus.NOT_FOUND, + }, //ANNOUNCEMENT + 44090: { + code: 44090, + message: '이미 공지사항이 존재합니다.', + status: HttpStatus.CONFLICT, + }, };