diff --git a/app/backend/src/groups/groups.controller.ts b/app/backend/src/groups/groups.controller.ts index c634c52c..693a2548 100644 --- a/app/backend/src/groups/groups.controller.ts +++ b/app/backend/src/groups/groups.controller.ts @@ -1,5 +1,5 @@ -import { Body, Controller, Delete, Get, Param, ParseIntPipe, Post, UseGuards } from '@nestjs/common'; -import { ApiBody, ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger'; +import { Body, Controller, Delete, Get, Param, ParseIntPipe, Post, Query, UseGuards } from '@nestjs/common'; +import { ApiBody, ApiOperation, ApiParam, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger'; import { GroupsService } from './groups.service'; import { GetUser } from 'libs/decorators/get-user.decorator'; import { AtGuard } from 'src/auth/guards/at.guard'; @@ -26,6 +26,19 @@ export class GroupsController { return this.groupsService.getAllGroups(); } + @Get('/info') + @ApiOperation({ + summary: '승인코드를 사용하여 그룹 정보 추출', + description: '승인 코드를 사용하여 특정 그룹 정보를 추출합니다.', + }) + @ApiQuery({ name: 'access-code', description: '참가할 그룹의 승인 코드' }) + @ApiResponse({ status: 201, description: 'Successfully retrieved group information' }) + @ApiResponse({ status: 401, description: 'Unauthorized' }) + @ApiResponse({ status: 404, description: 'Group not found for the provided access code' }) + async getGroupByAccessCode(@Query('access_code') accessCode: string): Promise { + return this.groupsService.getGroupByAccessCode(accessCode); + } + @Get('/:id') @ApiOperation({ summary: '특정 그룹 정보 조회', @@ -58,7 +71,10 @@ export class GroupsController { @ApiBody({ type: CreateGroupsDto }) @ApiResponse({ status: 201, description: 'Successfully created', type: CreateGroupsDto }) @ApiResponse({ status: 401, description: 'Unauthorized' }) - async createGroups(@Body() createGroupsDto: CreateGroupsDto, @GetUser() member: Member): Promise { + async createGroups( + @Body() createGroupsDto: CreateGroupsDto, + @GetUser() member: Member, + ): Promise<{ group: Group; accessCode: string }> { return this.groupsService.createGroups(createGroupsDto, member); } @@ -84,7 +100,6 @@ export class GroupsController { @ApiParam({ name: 'id', description: '참가를 취소할 그룹의 Id' }) @ApiResponse({ status: 200, description: 'Successfully leaved join' }) @ApiResponse({ status: 401, description: 'Unauthorized' }) - @ApiResponse({ status: 403, description: 'Forbidden' }) @ApiResponse({ status: 404, description: 'Group with id not found' }) async leaveGroup(@Param('id', ParseIntPipe) id: number, @GetUser() member: Member): Promise { return this.groupsService.leaveGroup(id, member); diff --git a/app/backend/src/groups/groups.repository.ts b/app/backend/src/groups/groups.repository.ts index b5c92cec..511b1fd9 100644 --- a/app/backend/src/groups/groups.repository.ts +++ b/app/backend/src/groups/groups.repository.ts @@ -3,6 +3,7 @@ import { PrismaService } from 'prisma/prisma.service'; import { Group, Member } from '@prisma/client'; import { MemberInformationDto } from 'src/member/dto/member.dto'; import { CreateGroupsDto } from './dto/create-groups.dto'; +import { v4 as uuidv4 } from 'uuid'; @Injectable() export class GroupsRepository { @@ -27,6 +28,27 @@ export class GroupsRepository { return Promise.all(groupPromises); } + async getGroupByAccessCode(accessCode: string): Promise { + const groupAccessCode = await this.prisma.groupAccessCode.findUnique({ + where: { + accessCode: accessCode, + }, + include: { + groupAccessCodes: true, + }, + }); + + if (!groupAccessCode) { + throw new NotFoundException('Group not found for the provided access code'); + } + + const membersCount = await this.getGroupMembersCount(Number(groupAccessCode.groupId)); + return { + ...groupAccessCode.groupAccessCodes, + membersCount, + }; + } + async getGroups(id: number): Promise { const group = await this.prisma.group.findUnique({ where: { @@ -60,24 +82,30 @@ export class GroupsRepository { })); } - async createGroups(createGroupsDto: CreateGroupsDto, member: Member): Promise { - try { - const { title, groupTypeId } = createGroupsDto; - - const group = await this.prisma.group.create({ - data: { - title: title, - groupTypeId: groupTypeId, - member: { - connect: { id: Number(member.id) }, - }, + async createGroups(createGroupsDto: CreateGroupsDto, member: Member): Promise<{ group: Group; accessCode: string }> { + const { title, groupTypeId } = createGroupsDto; + + const group = await this.prisma.group.create({ + data: { + title: title, + groupTypeId: groupTypeId, + member: { + connect: { id: Number(member.id) }, }, - }); + }, + }); - return group; - } catch (error) { - throw new Error(`Failed to create group: ${error.message}`); - } + const accessCode = uuidv4(); + await this.prisma.groupAccessCode.create({ + data: { + accessCode, + groupId: group.id, + }, + }); + + await this.joinGroup(Number(group.id), member); + + return { group, accessCode }; } async joinGroup(id: number, member: Member): Promise { diff --git a/app/backend/src/groups/groups.service.ts b/app/backend/src/groups/groups.service.ts index afad0032..33b3d2d5 100644 --- a/app/backend/src/groups/groups.service.ts +++ b/app/backend/src/groups/groups.service.ts @@ -12,6 +12,10 @@ export class GroupsService { return this.groupsRepository.getAllGroups(); } + async getGroupByAccessCode(accessCode: string): Promise { + return this.groupsRepository.getGroupByAccessCode(accessCode); + } + async getGroups(id: number): Promise { return this.groupsRepository.getGroups(id); } @@ -20,7 +24,7 @@ export class GroupsService { return this.groupsRepository.getAllMembersOfGroup(id); } - async createGroups(createGroupsDto: CreateGroupsDto, member: Member): Promise { + async createGroups(createGroupsDto: CreateGroupsDto, member: Member): Promise<{ group: Group; accessCode: string }> { return this.groupsRepository.createGroups(createGroupsDto, member); }