Skip to content

Commit

Permalink
refactor(users): divide swagger decorators to docs file
Browse files Browse the repository at this point in the history
  • Loading branch information
astorverse committed Jul 30, 2024
1 parent 07ac573 commit 2e00720
Show file tree
Hide file tree
Showing 13 changed files with 326 additions and 137 deletions.
2 changes: 2 additions & 0 deletions src/APIs/users/controllers/users-create.controller.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { Controller } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { UsersCreateService } from '../services/users-create.service';
import { UsersCreateDocs } from '../docs/users-create-docs.decorator';

@UsersCreateDocs
@ApiTags('유저 API')
@Controller('users')
export class UsersCreateController {
Expand Down
26 changes: 4 additions & 22 deletions src/APIs/users/controllers/users-delete.controller.ts
Original file line number Diff line number Diff line change
@@ -1,36 +1,18 @@
import {
Body,
Controller,
Delete,
HttpCode,
Req,
Res,
UseGuards,
} from '@nestjs/common';
import {
ApiCookieAuth,
ApiNoContentResponse,
ApiOperation,
ApiTags,
} from '@nestjs/swagger';
import { Body, Controller, Delete, Req, Res, UseGuards } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { UsersDeleteService } from '../services/users-delete.service';
import { AuthGuardV2 } from 'src/common/guards/auth.guard';
import { Request, Response } from 'express';
import { UserDeleteRequestDto } from '../dtos/request/user-delete-request.dto';
import { UsersDeleteDocs } from '../docs/users-delete-docs.decorator';

@UsersDeleteDocs
@ApiTags('유저 API')
@Controller('users')
export class UsersDeleteController {
constructor(private readonly svc_usersDelete: UsersDeleteService) {}

@ApiOperation({
summary: '회원 탈퇴(soft delete)',
description: '회원을 탈퇴하고 연동된 게시글과 댓글을 soft delete한다.',
})
@ApiCookieAuth()
@UseGuards(AuthGuardV2)
@ApiNoContentResponse()
@HttpCode(204)
@Delete('me')
async deleteUser(
@Req() req: Request,
Expand Down
46 changes: 4 additions & 42 deletions src/APIs/users/controllers/users-read.controller.ts
Original file line number Diff line number Diff line change
@@ -1,37 +1,18 @@
import {
Controller,
Get,
HttpCode,
Param,
Req,
UseGuards,
} from '@nestjs/common';
import {
ApiCookieAuth,
ApiOkResponse,
ApiOperation,
ApiTags,
} from '@nestjs/swagger';
import { Controller, Get, Param, Req, UseGuards } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { UsersReadService } from '../services/users-read.service';
import { UserFollowingResponseDto } from '../dtos/response/user-following-response.dto';
import { Request } from 'express';
import { UserDto } from '../dtos/common/user.dto';
import { AuthGuardV2 } from 'src/common/guards/auth.guard';
import { UsersReadDocs } from '../docs/users-read-docs.decorator';

@UsersReadDocs
@ApiTags('유저 API')
@Controller('users')
export class UsersReadController {
constructor(private readonly svc_usersRead: UsersReadService) {}

@ApiOperation({
summary: '이름이 포함된 유저 검색',
description: '이름에 username이 포함된 유저를 검색한다.',
})
@ApiOkResponse({
description: '조회 성공',
type: [UserFollowingResponseDto],
})
@HttpCode(200)
@Get('username/:username')
async getUsersByName(
@Req() req: Request,
Expand All @@ -41,37 +22,18 @@ export class UsersReadController {
return await this.svc_usersRead.findUsersByName({ userId, username });
}

@ApiOperation({
summary: '특정 유저 프로필 조회(id)',
description: 'id가 일치하는 유저 프로필을 조회한다.',
})
@ApiOkResponse({ description: '조회 성공', type: UserDto })
@HttpCode(200)
@Get('profile/id/:userId')
async getUserById(@Param('userId') userId: number): Promise<UserDto> {
return await this.svc_usersRead.findUserById({ userId });
}

@ApiOperation({
summary: '특정 유저 프로필 조회(handle)',
description: 'handle이 일치하는 유저 프로필을 조회한다.',
})
@ApiOkResponse({ description: '조회 성공', type: UserDto })
@HttpCode(200)
@Get('profile/handle/:handle')
async getUserByHandle(@Param('handle') handle: string): Promise<UserDto> {
return await this.svc_usersRead.findUserByHandle({ handle });
}

@ApiOperation({
summary: '로그인된 유저의 프로필 불러오기',
description: '로그인된 유저의 프로필을 불러온다.',
})
@ApiCookieAuth()
@ApiOkResponse({ description: '불러오기 완료', type: UserDto })
@Get('me')
@UseGuards(AuthGuardV2)
@HttpCode(200)
async getMyProfile(@Req() req: Request): Promise<UserDto> {
const userId = req.user.userId;
return await this.svc_usersRead.findUserById({ userId });
Expand Down
55 changes: 3 additions & 52 deletions src/APIs/users/controllers/users-update.controller.ts
Original file line number Diff line number Diff line change
@@ -1,50 +1,31 @@
import {
Body,
Controller,
HttpCode,
Patch,
Post,
Req,
UploadedFile,
UseGuards,
UseInterceptors,
} from '@nestjs/common';
import {
ApiBody,
ApiConsumes,
ApiCookieAuth,
ApiCreatedResponse,
ApiOkResponse,
ApiOperation,
ApiTags,
} from '@nestjs/swagger';
import { ApiTags } from '@nestjs/swagger';
import { UsersUpdateService } from '../services/users-update.service';
import { UserDto } from '../dtos/common/user.dto';
import { AuthGuardV2 } from 'src/common/guards/auth.guard';
import { UserPatchRequestDto } from '../dtos/request/user-patch-request.dto';
import { Request } from 'express';
import { ImageUploadRequestDto } from 'src/modules/images/dtos/image-upload-request.dto';
import { ImageUploadResponseDto } from 'src/modules/images/dtos/image-upload-response.dto';
import { FileInterceptor } from '@nestjs/platform-express';
import { ApiResponseFromMetadata } from 'src/common/decorators/api-response-from-metadata.decorator';
import { UsersUpdateDocs } from '../docs/users-update-docs.decorator';

@UsersUpdateDocs
@ApiTags('유저 API')
@Controller('users')
export class UsersUpdateController {
constructor(private readonly svc_usersUpdate: UsersUpdateService) {}

@ApiOperation({
summary: '로그인된 유저의 이름이나 설명, 핸들을 변경',
description: '로그인된 유저의 이름이나 설명, 핸들, 혹은 모두를 변경한다.',
})
@ApiOkResponse({ description: '변경 성공', type: UserDto })
@ApiCookieAuth()
@Patch('me')
@HttpCode(200)
@UseGuards(AuthGuardV2)
@ApiResponseFromMetadata([
{ service: UsersUpdateService, methodName: 'updateUser' },
])
async patchUser(
@Req() req: Request,
@Body() body: UserPatchRequestDto,
Expand All @@ -59,23 +40,8 @@ export class UsersUpdateController {
});
}

@ApiOperation({
summary: '로그인된 유저의 프로필 이미지를 변경',
description: '스토리지에 프로필 사진을 업로드하고 변경한다.',
})
@ApiConsumes('multipart/form-data')
@ApiBody({
description: '업로드 할 파일',
type: ImageUploadRequestDto,
})
@ApiCreatedResponse({
description: '업로드 성공',
type: ImageUploadResponseDto,
})
@UseGuards(AuthGuardV2)
@ApiCookieAuth()
@UseInterceptors(FileInterceptor('file'))
@HttpCode(201)
@Post('me/profile-image')
async postProfileImage(
@Req() req: Request,
Expand All @@ -89,23 +55,8 @@ export class UsersUpdateController {
});
}

@ApiOperation({
summary: '로그인된 유저의 배경 이미지를 변경',
description: '스토리지에 배경 사진을 업로드하고 변경한다.',
})
@ApiConsumes('multipart/form-data')
@ApiBody({
description: '업로드 할 파일',
type: ImageUploadRequestDto,
})
@ApiCreatedResponse({
description: '업로드 성공',
type: ImageUploadResponseDto,
})
@UseGuards(AuthGuardV2)
@ApiCookieAuth()
@UseInterceptors(FileInterceptor('file'))
@HttpCode(201)
@Post('me/background-image')
async uploadBackgroundImage(
@Req() req: Request,
Expand Down
12 changes: 12 additions & 0 deletions src/APIs/users/docs/users-create-docs.decorator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { MethodNames } from '@/common/types/method';
import { applyDocs } from '@/utils/docs.utils';
import { ApiOperation } from '@nestjs/swagger';
import { ApiAuthResponse } from '@/common/decorators/api-auth-response.dto';
import { ApiResponseFromMetadata } from '@/common/decorators/api-response-from-metadata.decorator';
import { UsersCreateController } from '../controllers/users-create.controller';

type UsersCreateEndpoints = MethodNames<UsersCreateController>;

const UsersCreateDocsMap: Record<UsersCreateEndpoints, MethodDecorator[]> = {};

export const UsersCreateDocs = applyDocs(UsersCreateDocsMap);
27 changes: 27 additions & 0 deletions src/APIs/users/docs/users-delete-docs.decorator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { MethodNames } from '@/common/types/method';
import { applyDocs } from '@/utils/docs.utils';
import { ApiNoContentResponse, ApiOperation } from '@nestjs/swagger';
import { ApiAuthResponse } from '@/common/decorators/api-auth-response.dto';
import { ApiResponseFromMetadata } from '@/common/decorators/api-response-from-metadata.decorator';
import { UsersDeleteController } from '../controllers/users-delete.controller';
import { UsersDeleteService } from '../services/users-delete.service';
import { HttpCode } from '@nestjs/common';

type UsersDeleteEndpoints = MethodNames<UsersDeleteController>;

const UsersDeleteDocsMap: Record<UsersDeleteEndpoints, MethodDecorator[]> = {
deleteUser: [
ApiOperation({
summary: '회원 탈퇴(soft delete)',
description: '회원을 탈퇴하고 연동된 게시글과 댓글을 soft delete한다.',
}),
ApiAuthResponse(),
HttpCode(204),
ApiNoContentResponse(),
ApiResponseFromMetadata([
{ service: UsersDeleteService, methodName: 'deleteUser' },
]),
],
};

export const UsersDeleteDocs = applyDocs(UsersDeleteDocsMap);
65 changes: 65 additions & 0 deletions src/APIs/users/docs/users-read-docs.decorator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import { MethodNames } from '@/common/types/method';
import { applyDocs } from '@/utils/docs.utils';
import { ApiOkResponse, ApiOperation } from '@nestjs/swagger';
import { ApiAuthResponse } from '@/common/decorators/api-auth-response.dto';
import { ApiResponseFromMetadata } from '@/common/decorators/api-response-from-metadata.decorator';
import { UsersReadController } from '../controllers/users-read.controller';
import { UserFollowingResponseDto } from '../dtos/response/user-following-response.dto';
import { HttpCode } from '@nestjs/common';
import { UsersReadService } from '../services/users-read.service';
import { UserDto } from '../dtos/common/user.dto';

type UsersReadEndpoints = MethodNames<UsersReadController>;

const UsersReadDocsMap: Record<UsersReadEndpoints, MethodDecorator[]> = {
getUsersByName: [
ApiOperation({
summary: '이름이 포함된 유저 검색',
description: '이름에 username이 포함된 유저를 검색한다.',
}),
ApiOkResponse({
description: '조회 성공',
type: [UserFollowingResponseDto],
}),
HttpCode(200),
ApiResponseFromMetadata([
{ service: UsersReadService, methodName: 'findUsersByName' },
]),
],
getUserById: [
ApiOperation({
summary: '특정 유저 프로필 조회(id)',
description: 'id가 일치하는 유저 프로필을 조회한다.',
}),
ApiOkResponse({ description: '조회 성공', type: UserDto }),
HttpCode(200),
ApiResponseFromMetadata([
{ service: UsersReadService, methodName: 'findUserById' },
]),
],
getUserByHandle: [
ApiOperation({
summary: '특정 유저 프로필 조회(handle)',
description: 'handle이 일치하는 유저 프로필을 조회한다.',
}),
ApiOkResponse({ description: '조회 성공', type: UserDto }),
HttpCode(200),
ApiResponseFromMetadata([
{ service: UsersReadService, methodName: 'findUserByHandle' },
]),
],
getMyProfile: [
ApiOperation({
summary: '로그인된 유저의 프로필 불러오기',
description: '로그인된 유저의 프로필을 불러온다.',
}),
ApiAuthResponse(),
ApiOkResponse({ description: '불러오기 완료', type: UserDto }),
HttpCode(200),
ApiResponseFromMetadata([
{ service: UsersReadService, methodName: 'findUserById' },
]),
],
};

export const UsersReadDocs = applyDocs(UsersReadDocsMap);
Loading

0 comments on commit 2e00720

Please sign in to comment.