From 2d92a16e2f86f17feb9fc42bf4cf6c6f2d71f325 Mon Sep 17 00:00:00 2001 From: w8385 Date: Thu, 3 Apr 2025 20:03:54 +0900 Subject: [PATCH 1/6] chore: add .gitattributes to enforce LF line endings --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..07764a7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text eol=lf \ No newline at end of file From f6ee338e0e7f89eda1a3862b3ab9a99217a9529c Mon Sep 17 00:00:00 2001 From: w8385 Date: Fri, 4 Apr 2025 14:48:47 +0900 Subject: [PATCH 2/6] refactor: group entity --- src/group/group.providers.ts | 2 +- src/group/group.service.ts | 6 +++--- src/group/interfaces/group.interface.ts | 7 ------- src/group/schemas/group.schema.ts | 7 ------- 4 files changed, 4 insertions(+), 18 deletions(-) delete mode 100644 src/group/interfaces/group.interface.ts delete mode 100644 src/group/schemas/group.schema.ts diff --git a/src/group/group.providers.ts b/src/group/group.providers.ts index f3473d5..4f96ef6 100644 --- a/src/group/group.providers.ts +++ b/src/group/group.providers.ts @@ -1,6 +1,6 @@ import { Connection } from 'mongoose'; -import { GroupSchema } from './schemas/group.schema'; +import { GroupSchema } from './entities/group.entity'; export const groupProviders = [ { diff --git a/src/group/group.service.ts b/src/group/group.service.ts index 0a939c1..ccc35e9 100644 --- a/src/group/group.service.ts +++ b/src/group/group.service.ts @@ -9,15 +9,15 @@ export class GroupService { constructor(private readonly groupRepository: GroupRepository) {} async create(createGroupDto: CreateGroupDto): Promise { - return (await this.groupRepository.create(createGroupDto)) as Group; + return await this.groupRepository.create(createGroupDto); } async getAll(): Promise { - return (await this.groupRepository.getAll()) as Group[]; + return await this.groupRepository.getAll(); } async get(groupId: string): Promise { - return (await this.groupRepository.get(groupId)) as Group; + return await this.groupRepository.get(groupId); } deleteAll() { diff --git a/src/group/interfaces/group.interface.ts b/src/group/interfaces/group.interface.ts deleted file mode 100644 index 80c0fad..0000000 --- a/src/group/interfaces/group.interface.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Document } from 'mongoose'; - -export interface IGroup extends Document { - readonly name: string; - readonly description: string; - readonly pokers: string[]; -} diff --git a/src/group/schemas/group.schema.ts b/src/group/schemas/group.schema.ts deleted file mode 100644 index 7e40daa..0000000 --- a/src/group/schemas/group.schema.ts +++ /dev/null @@ -1,7 +0,0 @@ -import * as mongoose from 'mongoose'; - -export const GroupSchema = new mongoose.Schema({ - name: String, - description: String, - pokers: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Poker' }], -}); From 32eec8de79291087267d1fe1366bb455caa6867f Mon Sep 17 00:00:00 2001 From: w8385 Date: Fri, 4 Apr 2025 14:50:09 +0900 Subject: [PATCH 3/6] refactor: problem entity --- src/problem/entities/problem.entity.ts | 4 ++++ src/problem/interfaces/problem.interface.ts | 7 ------- src/problem/problem.providers.ts | 2 +- src/problem/problem.repository.ts | 3 +-- src/problem/schemas/problem.schema.ts | 7 ------- 5 files changed, 6 insertions(+), 17 deletions(-) delete mode 100644 src/problem/interfaces/problem.interface.ts delete mode 100644 src/problem/schemas/problem.schema.ts diff --git a/src/problem/entities/problem.entity.ts b/src/problem/entities/problem.entity.ts index bc83dec..c48b634 100644 --- a/src/problem/entities/problem.entity.ts +++ b/src/problem/entities/problem.entity.ts @@ -1,5 +1,9 @@ +import { SchemaFactory } from '@nestjs/mongoose'; + export class Problem { problemId: number; titleKo: string; level: number; } + +export const ProblemSchema = SchemaFactory.createForClass(Problem); diff --git a/src/problem/interfaces/problem.interface.ts b/src/problem/interfaces/problem.interface.ts deleted file mode 100644 index e2383de..0000000 --- a/src/problem/interfaces/problem.interface.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Document } from 'mongoose'; - -export interface IProblem extends Document { - problemId: number; - titleKo: string; - level: number; -} diff --git a/src/problem/problem.providers.ts b/src/problem/problem.providers.ts index f825286..d2ee0d2 100644 --- a/src/problem/problem.providers.ts +++ b/src/problem/problem.providers.ts @@ -1,6 +1,6 @@ import { Connection } from 'mongoose'; -import { ProblemSchema } from './schemas/problem.schema'; +import { ProblemSchema } from './entities/problem.entity'; export const problemProviders = [ { diff --git a/src/problem/problem.repository.ts b/src/problem/problem.repository.ts index 44923d0..3629cd5 100644 --- a/src/problem/problem.repository.ts +++ b/src/problem/problem.repository.ts @@ -2,11 +2,10 @@ import { Inject, Injectable } from '@nestjs/common'; import { Model } from 'mongoose'; import { Problem } from './entities/problem.entity'; -import { IProblem } from './interfaces/problem.interface'; @Injectable() export class ProblemRepository { - constructor(@Inject('PROBLEM_MODEL') private readonly problemModel: Model) {} + constructor(@Inject('PROBLEM_MODEL') private readonly problemModel: Model) {} create(problem: Problem) { return new this.problemModel(problem).save(); diff --git a/src/problem/schemas/problem.schema.ts b/src/problem/schemas/problem.schema.ts deleted file mode 100644 index 6a3c906..0000000 --- a/src/problem/schemas/problem.schema.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Schema } from 'mongoose'; - -export const ProblemSchema = new Schema({ - problemId: Number, - titleKo: String, - level: Number, -}); From 066299b4d06dbc74183230f6403e9d7f230f60ef Mon Sep 17 00:00:00 2001 From: w8385 Date: Fri, 4 Apr 2025 17:25:10 +0900 Subject: [PATCH 4/6] refactor: reorganize module imports and update paths --- eslint.config.mjs | 4 +-- src/app.module.ts | 17 +++++------ .../filters}/http-exception.filter.ts | 0 src/config.swagger.ts | 17 +++++------ src/{boj => }/entities/contest.entity.ts | 0 src/{group => }/entities/group.entity.ts | 0 .../entities/participant.entity.ts | 2 +- src/{poker => }/entities/poker.entity.ts | 0 src/{problem => }/entities/problem.entity.ts | 6 ++++ src/group/group.module.ts | 15 ---------- src/main.ts | 2 +- .../boj/controller.ts} | 2 +- .../boj.module.ts => modules/boj/module.ts} | 6 ++-- .../boj/repository.spec.ts} | 4 +-- .../boj/repository.ts} | 3 +- .../boj.service.ts => modules/boj/service.ts} | 4 +-- .../group/controller.ts} | 2 +- .../group/dto/create-group.dto.ts | 0 src/modules/group/module.ts | 15 ++++++++++ .../group/providers.ts} | 3 +- .../group/repository.ts} | 2 +- .../group/service.ts} | 4 +-- .../poker/controller.ts} | 2 +- .../poker/dto/create-poker.dto.ts | 0 src/modules/poker/module.ts | 29 +++++++++++++++++++ .../poker/providers.ts} | 3 +- .../poker/repository.ts} | 4 +-- .../poker/service.ts} | 10 +++---- .../problem/controller.ts} | 2 +- src/modules/problem/module.ts | 15 ++++++++++ .../problem/providers.ts} | 3 +- .../problem/repository.ts} | 3 +- .../problem/service.ts} | 16 +++++++--- .../solved/controller.ts} | 2 +- .../solved/module.ts} | 6 ++-- .../solved/repository.ts} | 0 .../solved/service.ts} | 2 +- .../ssu/controller.ts} | 2 +- src/modules/ssu/module.ts | 13 +++++++++ .../ssu.service.ts => modules/ssu/service.ts} | 4 +-- .../user/controller.ts} | 0 .../user.module.ts => modules/user/module.ts} | 6 ++-- .../user/service.ts} | 0 src/poker/poker.module.ts | 29 ------------------- src/problem/problem.module.ts | 15 ---------- src/ssu/ssu.module.ts | 13 --------- test/jest-e2e.json | 6 +++- tsconfig.json | 11 +++++++ 48 files changed, 163 insertions(+), 141 deletions(-) rename src/{ => common/filters}/http-exception.filter.ts (100%) rename src/{boj => }/entities/contest.entity.ts (100%) rename src/{group => }/entities/group.entity.ts (100%) rename src/{poker => }/entities/participant.entity.ts (80%) rename src/{poker => }/entities/poker.entity.ts (100%) rename src/{problem => }/entities/problem.entity.ts (51%) delete mode 100644 src/group/group.module.ts rename src/{boj/boj.controller.ts => modules/boj/controller.ts} (92%) rename src/{boj/boj.module.ts => modules/boj/module.ts} (69%) rename src/{boj/boj.repository.spec.ts => modules/boj/repository.spec.ts} (96%) rename src/{boj/boj.repository.ts => modules/boj/repository.ts} (99%) rename src/{boj/boj.service.ts => modules/boj/service.ts} (94%) rename src/{group/group.controller.ts => modules/group/controller.ts} (93%) rename src/{ => modules}/group/dto/create-group.dto.ts (100%) create mode 100644 src/modules/group/module.ts rename src/{group/group.providers.ts => modules/group/providers.ts} (79%) rename src/{group/group.repository.ts => modules/group/repository.ts} (96%) rename src/{group/group.service.ts => modules/group/service.ts} (85%) rename src/{poker/poker.controller.ts => modules/poker/controller.ts} (96%) rename src/{ => modules}/poker/dto/create-poker.dto.ts (100%) create mode 100644 src/modules/poker/module.ts rename src/{poker/poker.providers.ts => modules/poker/providers.ts} (79%) rename src/{poker/poker.repository.ts => modules/poker/repository.ts} (91%) rename src/{poker/poker.service.ts => modules/poker/service.ts} (93%) rename src/{problem/problem.controller.ts => modules/problem/controller.ts} (88%) create mode 100644 src/modules/problem/module.ts rename src/{problem/problem.providers.ts => modules/problem/providers.ts} (79%) rename src/{problem/problem.repository.ts => modules/problem/repository.ts} (93%) rename src/{problem/problem.service.ts => modules/problem/service.ts} (76%) rename src/{solved/solved.controller.ts => modules/solved/controller.ts} (98%) rename src/{solved/solved.module.ts => modules/solved/module.ts} (66%) rename src/{solved/solved.repository.ts => modules/solved/repository.ts} (100%) rename src/{solved/solved.service.ts => modules/solved/service.ts} (97%) rename src/{ssu/ssu.controller.ts => modules/ssu/controller.ts} (97%) create mode 100644 src/modules/ssu/module.ts rename src/{ssu/ssu.service.ts => modules/ssu/service.ts} (90%) rename src/{user/user.controller.ts => modules/user/controller.ts} (100%) rename src/{user/user.module.ts => modules/user/module.ts} (58%) rename src/{user/user.service.ts => modules/user/service.ts} (100%) delete mode 100644 src/poker/poker.module.ts delete mode 100644 src/problem/problem.module.ts delete mode 100644 src/ssu/ssu.module.ts diff --git a/eslint.config.mjs b/eslint.config.mjs index 8bf62b5..d5dba67 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -31,8 +31,8 @@ export default tseslint.config( '@typescript-eslint/no-floating-promises': 'warn', '@typescript-eslint/no-unsafe-argument': 'warn', '@typescript-eslint/no-unsafe-call': 'off', - // '@typescript-eslint/no-unsafe-member-access': 'off', - // '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-return': 'off', }, }, ); diff --git a/src/app.module.ts b/src/app.module.ts index 61e2d9e..8ca0b11 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,16 +1,15 @@ +import { DatabaseModule } from '@database/database.module'; +import { BojModule } from '@modules/boj/module'; +import { GroupModule } from '@modules/group/module'; +import { PokerModule } from '@modules/poker/module'; +import { ProblemModule } from '@modules/problem/module'; +import { SolvedModule } from '@modules/solved/module'; +import { SsuModule } from '@modules/ssu/module'; +import { UserModule } from '@modules/user/module'; import { CacheInterceptor, CacheModule } from '@nestjs/cache-manager'; import { Module } from '@nestjs/common'; import { APP_INTERCEPTOR } from '@nestjs/core'; -import { BojModule } from './boj/boj.module'; -import { DatabaseModule } from './database/database.module'; -import { GroupModule } from './group/group.module'; -import { PokerModule } from './poker/poker.module'; -import { ProblemModule } from './problem/problem.module'; -import { SolvedModule } from './solved/solved.module'; -import { SsuModule } from './ssu/ssu.module'; -import { UserModule } from './user/user.module'; - @Module({ imports: [ CacheModule.register({ diff --git a/src/http-exception.filter.ts b/src/common/filters/http-exception.filter.ts similarity index 100% rename from src/http-exception.filter.ts rename to src/common/filters/http-exception.filter.ts diff --git a/src/config.swagger.ts b/src/config.swagger.ts index f63175a..503baca 100644 --- a/src/config.swagger.ts +++ b/src/config.swagger.ts @@ -1,19 +1,18 @@ +import { BojModule } from '@modules/boj/module'; +import { GroupModule } from '@modules/group/module'; +import { PokerModule } from '@modules/poker/module'; +import { SolvedModule } from '@modules/solved/module'; +import { SsuModule } from '@modules/ssu/module'; import { INestApplication } from '@nestjs/common'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; -import { BojModule } from './boj/boj.module'; -import { GroupModule } from './group/group.module'; -import { PokerModule } from './poker/poker.module'; -import { SolvedModule } from './solved/solved.module'; -import { SsuModule } from './ssu/ssu.module'; - -export const configSwagger = (app: INestApplication) => { +export const configSwagger = (app: INestApplication) => { configCodePoker(app); configSSUJoon(app); configSolved(app); }; -const configCodePoker = (app: INestApplication) => { +const configCodePoker = (app: INestApplication) => { const options = new DocumentBuilder() .setTitle('코드포커 API') .setVersion('1.0') @@ -28,7 +27,7 @@ const configCodePoker = (app: INestApplication) => { SwaggerModule.setup('api', app, document); }; -const configSSUJoon = (app: INestApplication) => { +const configSSUJoon = (app: INestApplication) => { const options = new DocumentBuilder() .setTitle('BaekSSU API') .setVersion('1.0') diff --git a/src/boj/entities/contest.entity.ts b/src/entities/contest.entity.ts similarity index 100% rename from src/boj/entities/contest.entity.ts rename to src/entities/contest.entity.ts diff --git a/src/group/entities/group.entity.ts b/src/entities/group.entity.ts similarity index 100% rename from src/group/entities/group.entity.ts rename to src/entities/group.entity.ts diff --git a/src/poker/entities/participant.entity.ts b/src/entities/participant.entity.ts similarity index 80% rename from src/poker/entities/participant.entity.ts rename to src/entities/participant.entity.ts index 5960a1c..bd26e71 100644 --- a/src/poker/entities/participant.entity.ts +++ b/src/entities/participant.entity.ts @@ -1,6 +1,6 @@ import { SchemaFactory } from '@nestjs/mongoose'; -import { Problem } from '../../problem/entities/problem.entity'; +import { Problem } from './problem.entity'; export class Participant { handle: string; diff --git a/src/poker/entities/poker.entity.ts b/src/entities/poker.entity.ts similarity index 100% rename from src/poker/entities/poker.entity.ts rename to src/entities/poker.entity.ts diff --git a/src/problem/entities/problem.entity.ts b/src/entities/problem.entity.ts similarity index 51% rename from src/problem/entities/problem.entity.ts rename to src/entities/problem.entity.ts index c48b634..d2d64a4 100644 --- a/src/problem/entities/problem.entity.ts +++ b/src/entities/problem.entity.ts @@ -4,6 +4,12 @@ export class Problem { problemId: number; titleKo: string; level: number; + + constructor(problem: { problemId: number; titleKo: string; level: number }) { + this.problemId = problem.problemId; + this.titleKo = problem.titleKo; + this.level = problem.level; + } } export const ProblemSchema = SchemaFactory.createForClass(Problem); diff --git a/src/group/group.module.ts b/src/group/group.module.ts deleted file mode 100644 index 7fafbb2..0000000 --- a/src/group/group.module.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { DatabaseModule } from '../database/database.module'; -import { GroupController } from './group.controller'; -import { groupProviders } from './group.providers'; -import { GroupRepository } from './group.repository'; -import { GroupService } from './group.service'; - -@Module({ - imports: [DatabaseModule], - controllers: [GroupController], - providers: [GroupService, ...groupProviders, GroupRepository], - exports: [GroupService], -}) -export class GroupModule {} diff --git a/src/main.ts b/src/main.ts index dbd92b7..d321b07 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,8 +3,8 @@ import { NestFactory } from '@nestjs/core'; import * as process from 'node:process'; import { AppModule } from './app.module'; +import { HttpExceptionFilter } from './common/filters/http-exception.filter'; import { configSwagger } from './config.swagger'; -import { HttpExceptionFilter } from './http-exception.filter'; async function bootstrap() { const app = await NestFactory.create(AppModule); diff --git a/src/boj/boj.controller.ts b/src/modules/boj/controller.ts similarity index 92% rename from src/boj/boj.controller.ts rename to src/modules/boj/controller.ts index 5811609..9cb56d8 100644 --- a/src/boj/boj.controller.ts +++ b/src/modules/boj/controller.ts @@ -1,7 +1,7 @@ import { Controller, Get, Param } from '@nestjs/common'; import { ApiParam, ApiTags } from '@nestjs/swagger'; -import { BojService } from './boj.service'; +import { BojService } from './service'; @ApiTags('BOJ') @Controller('boj') diff --git a/src/boj/boj.module.ts b/src/modules/boj/module.ts similarity index 69% rename from src/boj/boj.module.ts rename to src/modules/boj/module.ts index 2637c9d..7f2f791 100644 --- a/src/boj/boj.module.ts +++ b/src/modules/boj/module.ts @@ -2,9 +2,9 @@ import { HttpModule } from '@nestjs/axios'; import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; -import { BojController } from './boj.controller'; -import { BojRepository } from './boj.repository'; -import { BojService } from './boj.service'; +import { BojController } from './controller'; +import { BojRepository } from './repository'; +import { BojService } from './service'; @Module({ imports: [ConfigModule.forRoot(), HttpModule], diff --git a/src/boj/boj.repository.spec.ts b/src/modules/boj/repository.spec.ts similarity index 96% rename from src/boj/boj.repository.spec.ts rename to src/modules/boj/repository.spec.ts index 93a5231..ec575a7 100644 --- a/src/boj/boj.repository.spec.ts +++ b/src/modules/boj/repository.spec.ts @@ -1,9 +1,9 @@ +import { Contest } from '@entities/contest.entity'; import { HttpModule } from '@nestjs/axios'; import { ConfigModule } from '@nestjs/config'; import { Test } from '@nestjs/testing'; -import { BojRepository } from './boj.repository'; -import { Contest } from './entities/contest.entity'; +import { BojRepository } from './repository'; describe('BojRepository', () => { let repository: BojRepository; diff --git a/src/boj/boj.repository.ts b/src/modules/boj/repository.ts similarity index 99% rename from src/boj/boj.repository.ts rename to src/modules/boj/repository.ts index b788c15..12a5f0e 100644 --- a/src/boj/boj.repository.ts +++ b/src/modules/boj/repository.ts @@ -1,3 +1,4 @@ +import { Contest } from '@entities/contest.entity'; import { HttpService } from '@nestjs/axios'; import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; @@ -6,8 +7,6 @@ import { Cheerio } from 'cheerio'; import { AnyNode } from 'domhandler'; import * as process from 'node:process'; -import { Contest } from './entities/contest.entity'; - @Injectable() export class BojRepository { constructor( diff --git a/src/boj/boj.service.ts b/src/modules/boj/service.ts similarity index 94% rename from src/boj/boj.service.ts rename to src/modules/boj/service.ts index 28566c2..ea7de62 100644 --- a/src/boj/boj.service.ts +++ b/src/modules/boj/service.ts @@ -1,7 +1,7 @@ +import { ContestList } from '@entities/contest.entity'; import { Injectable } from '@nestjs/common'; -import { BojRepository } from './boj.repository'; -import { ContestList } from './entities/contest.entity'; +import { BojRepository } from './repository'; @Injectable() export class BojService { diff --git a/src/group/group.controller.ts b/src/modules/group/controller.ts similarity index 93% rename from src/group/group.controller.ts rename to src/modules/group/controller.ts index 4a6f074..960a363 100644 --- a/src/group/group.controller.ts +++ b/src/modules/group/controller.ts @@ -2,7 +2,7 @@ import { Body, Controller, Delete, Get, Param, Post } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { CreateGroupDto } from './dto/create-group.dto'; -import { GroupService } from './group.service'; +import { GroupService } from './service'; @ApiTags('Group') @Controller('group') diff --git a/src/group/dto/create-group.dto.ts b/src/modules/group/dto/create-group.dto.ts similarity index 100% rename from src/group/dto/create-group.dto.ts rename to src/modules/group/dto/create-group.dto.ts diff --git a/src/modules/group/module.ts b/src/modules/group/module.ts new file mode 100644 index 0000000..e61edc8 --- /dev/null +++ b/src/modules/group/module.ts @@ -0,0 +1,15 @@ +import { DatabaseModule } from '@database/database.module'; +import { Module } from '@nestjs/common'; + +import { GroupController } from './controller'; +import { groupProviders } from './providers'; +import { GroupRepository } from './repository'; +import { GroupService } from './service'; + +@Module({ + imports: [DatabaseModule], + controllers: [GroupController], + providers: [GroupService, ...groupProviders, GroupRepository], + exports: [GroupService], +}) +export class GroupModule {} diff --git a/src/group/group.providers.ts b/src/modules/group/providers.ts similarity index 79% rename from src/group/group.providers.ts rename to src/modules/group/providers.ts index 4f96ef6..b80bc55 100644 --- a/src/group/group.providers.ts +++ b/src/modules/group/providers.ts @@ -1,7 +1,6 @@ +import { GroupSchema } from '@entities/group.entity'; import { Connection } from 'mongoose'; -import { GroupSchema } from './entities/group.entity'; - export const groupProviders = [ { provide: 'GROUP_MODEL', diff --git a/src/group/group.repository.ts b/src/modules/group/repository.ts similarity index 96% rename from src/group/group.repository.ts rename to src/modules/group/repository.ts index 014c77d..a223fd6 100644 --- a/src/group/group.repository.ts +++ b/src/modules/group/repository.ts @@ -1,8 +1,8 @@ +import { Group } from '@entities/group.entity'; import { Inject, Injectable, NotFoundException } from '@nestjs/common'; import { Model } from 'mongoose'; import { CreateGroupDto } from './dto/create-group.dto'; -import { Group } from './entities/group.entity'; @Injectable() export class GroupRepository { diff --git a/src/group/group.service.ts b/src/modules/group/service.ts similarity index 85% rename from src/group/group.service.ts rename to src/modules/group/service.ts index ccc35e9..1c14781 100644 --- a/src/group/group.service.ts +++ b/src/modules/group/service.ts @@ -1,8 +1,8 @@ +import { Group } from '@entities/group.entity'; import { Injectable } from '@nestjs/common'; import { CreateGroupDto } from './dto/create-group.dto'; -import { Group } from './entities/group.entity'; -import { GroupRepository } from './group.repository'; +import { GroupRepository } from './repository'; @Injectable() export class GroupService { diff --git a/src/poker/poker.controller.ts b/src/modules/poker/controller.ts similarity index 96% rename from src/poker/poker.controller.ts rename to src/modules/poker/controller.ts index 9d9325e..7d17439 100644 --- a/src/poker/poker.controller.ts +++ b/src/modules/poker/controller.ts @@ -2,7 +2,7 @@ import { Body, Controller, Delete, Get, Param, Post, Query } from '@nestjs/commo import { ApiOperation, ApiParam, ApiQuery, ApiTags } from '@nestjs/swagger'; import { CreatePokerDto } from './dto/create-poker.dto'; -import { PokerService } from './poker.service'; +import { PokerService } from './service'; @Controller('poker') @ApiTags('Poker') diff --git a/src/poker/dto/create-poker.dto.ts b/src/modules/poker/dto/create-poker.dto.ts similarity index 100% rename from src/poker/dto/create-poker.dto.ts rename to src/modules/poker/dto/create-poker.dto.ts diff --git a/src/modules/poker/module.ts b/src/modules/poker/module.ts new file mode 100644 index 0000000..8442ef9 --- /dev/null +++ b/src/modules/poker/module.ts @@ -0,0 +1,29 @@ +import { DatabaseModule } from '@database/database.module'; +import { ProblemService } from '@modules/problem/service'; +import { UserService } from '@modules/user/service'; +import { HttpModule } from '@nestjs/axios'; +import { Module } from '@nestjs/common'; +import { ScheduleModule } from '@nestjs/schedule'; + +import { groupProviders } from '../group/providers'; +import { GroupRepository } from '../group/repository'; +import { PokerController } from './controller'; +import { pokerProviders } from './providers'; +import { PokerRepository } from './repository'; +import { PokerService } from './service'; + +@Module({ + controllers: [PokerController], + exports: [PokerService], + imports: [DatabaseModule, HttpModule, ScheduleModule.forRoot()], + providers: [ + PokerService, + UserService, + ...pokerProviders, + PokerRepository, + ...groupProviders, + GroupRepository, + ProblemService, + ], +}) +export class PokerModule {} diff --git a/src/poker/poker.providers.ts b/src/modules/poker/providers.ts similarity index 79% rename from src/poker/poker.providers.ts rename to src/modules/poker/providers.ts index 3770d3d..e001ec2 100644 --- a/src/poker/poker.providers.ts +++ b/src/modules/poker/providers.ts @@ -1,7 +1,6 @@ +import { PokerSchema } from '@entities/poker.entity'; import { Connection } from 'mongoose'; -import { PokerSchema } from './entities/poker.entity'; - export const pokerProviders = [ { provide: 'POKER_MODEL', diff --git a/src/poker/poker.repository.ts b/src/modules/poker/repository.ts similarity index 91% rename from src/poker/poker.repository.ts rename to src/modules/poker/repository.ts index 93d9f8f..f044066 100644 --- a/src/poker/poker.repository.ts +++ b/src/modules/poker/repository.ts @@ -1,8 +1,8 @@ +import { Poker } from '@entities/poker.entity'; import { Inject, Injectable } from '@nestjs/common'; import { Model } from 'mongoose'; -import { GroupRepository } from '../group/group.repository'; -import { Poker } from './entities/poker.entity'; +import { GroupRepository } from '../group/repository'; @Injectable() export class PokerRepository { diff --git a/src/poker/poker.service.ts b/src/modules/poker/service.ts similarity index 93% rename from src/poker/poker.service.ts rename to src/modules/poker/service.ts index 2e0bd02..c1a7a28 100644 --- a/src/poker/poker.service.ts +++ b/src/modules/poker/service.ts @@ -1,12 +1,12 @@ +import { Poker } from '@entities/poker.entity'; import { Injectable } from '@nestjs/common'; import { ObjectId } from 'mongodb'; -import { GroupRepository } from '../group/group.repository'; -import { ProblemService } from '../problem/problem.service'; -import { UserService } from '../user/user.service'; +import { GroupRepository } from '../group/repository'; +import { ProblemService } from '../problem/service'; +import { UserService } from '../user/service'; import { CreatePokerDto } from './dto/create-poker.dto'; -import { Poker } from './entities/poker.entity'; -import { PokerRepository } from './poker.repository'; +import { PokerRepository } from './repository'; @Injectable() export class PokerService { diff --git a/src/problem/problem.controller.ts b/src/modules/problem/controller.ts similarity index 88% rename from src/problem/problem.controller.ts rename to src/modules/problem/controller.ts index de280a1..16a883a 100644 --- a/src/problem/problem.controller.ts +++ b/src/modules/problem/controller.ts @@ -1,7 +1,7 @@ import { Controller } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; -import { ProblemService } from './problem.service'; +import { ProblemService } from './service'; @ApiTags('Problem') @Controller('problem') diff --git a/src/modules/problem/module.ts b/src/modules/problem/module.ts new file mode 100644 index 0000000..a188684 --- /dev/null +++ b/src/modules/problem/module.ts @@ -0,0 +1,15 @@ +import { DatabaseModule } from '@database/database.module'; +import { HttpModule } from '@nestjs/axios'; +import { Module } from '@nestjs/common'; + +import { ProblemController } from './controller'; +import { problemProviders } from './providers'; +import { ProblemRepository } from './repository'; +import { ProblemService } from './service'; + +@Module({ + imports: [DatabaseModule, HttpModule], + controllers: [ProblemController], + providers: [ProblemService, ...problemProviders, ProblemRepository], +}) +export class ProblemModule {} diff --git a/src/problem/problem.providers.ts b/src/modules/problem/providers.ts similarity index 79% rename from src/problem/problem.providers.ts rename to src/modules/problem/providers.ts index d2ee0d2..7ab0050 100644 --- a/src/problem/problem.providers.ts +++ b/src/modules/problem/providers.ts @@ -1,7 +1,6 @@ +import { ProblemSchema } from '@entities/problem.entity'; import { Connection } from 'mongoose'; -import { ProblemSchema } from './entities/problem.entity'; - export const problemProviders = [ { provide: 'PROBLEM_MODEL', diff --git a/src/problem/problem.repository.ts b/src/modules/problem/repository.ts similarity index 93% rename from src/problem/problem.repository.ts rename to src/modules/problem/repository.ts index 3629cd5..e24b49b 100644 --- a/src/problem/problem.repository.ts +++ b/src/modules/problem/repository.ts @@ -1,8 +1,7 @@ +import { Problem } from '@entities/problem.entity'; import { Inject, Injectable } from '@nestjs/common'; import { Model } from 'mongoose'; -import { Problem } from './entities/problem.entity'; - @Injectable() export class ProblemRepository { constructor(@Inject('PROBLEM_MODEL') private readonly problemModel: Model) {} diff --git a/src/problem/problem.service.ts b/src/modules/problem/service.ts similarity index 76% rename from src/problem/problem.service.ts rename to src/modules/problem/service.ts index 2ba9de0..01f6a06 100644 --- a/src/problem/problem.service.ts +++ b/src/modules/problem/service.ts @@ -1,3 +1,4 @@ +import { Problem } from '@entities/problem.entity'; import { HttpService } from '@nestjs/axios'; import { Injectable } from '@nestjs/common'; @@ -20,7 +21,7 @@ export class ProblemService { } async getProblemsFromSolved(problemIds: number[]) { - const problems: object[] = []; + const problems: Problem[] = []; for (let page = 1; page <= (problemIds.length + 49) / 50; page++) { let url = `https://solved.ac/api/v3/search/problem?query=`; @@ -28,11 +29,18 @@ export class ProblemService { url = url.concat('id:' + problemIds[i] + '|'); } - const response = await this.httpService.axiosRef.get(url).then((res) => res.data); + const response = await this.httpService.axiosRef + .get<{ + items: { + problemId: number; + titleKo: string; + level: number; + }[]; + }>(url) + .then((res) => res.data); for (const problem of response['items']) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - problems.push(problem); + problems.push(new Problem(problem)); } } diff --git a/src/solved/solved.controller.ts b/src/modules/solved/controller.ts similarity index 98% rename from src/solved/solved.controller.ts rename to src/modules/solved/controller.ts index 4f2aff4..5b949f8 100644 --- a/src/solved/solved.controller.ts +++ b/src/modules/solved/controller.ts @@ -1,7 +1,7 @@ import { Controller, Get, Query } from '@nestjs/common'; import { ApiQuery, ApiTags } from '@nestjs/swagger'; -import { SolvedService } from './solved.service'; +import { SolvedService } from './service'; @ApiTags('solved') @Controller('solved') diff --git a/src/solved/solved.module.ts b/src/modules/solved/module.ts similarity index 66% rename from src/solved/solved.module.ts rename to src/modules/solved/module.ts index 37132b7..9b571a5 100644 --- a/src/solved/solved.module.ts +++ b/src/modules/solved/module.ts @@ -2,9 +2,9 @@ import { HttpModule } from '@nestjs/axios'; import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; -import { SolvedController } from './solved.controller'; -import { SolvedRepository } from './solved.repository'; -import { SolvedService } from './solved.service'; +import { SolvedController } from './controller'; +import { SolvedRepository } from './repository'; +import { SolvedService } from './service'; @Module({ imports: [ConfigModule, HttpModule], diff --git a/src/solved/solved.repository.ts b/src/modules/solved/repository.ts similarity index 100% rename from src/solved/solved.repository.ts rename to src/modules/solved/repository.ts diff --git a/src/solved/solved.service.ts b/src/modules/solved/service.ts similarity index 97% rename from src/solved/solved.service.ts rename to src/modules/solved/service.ts index 4d9b3f7..5acf997 100644 --- a/src/solved/solved.service.ts +++ b/src/modules/solved/service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import { SolvedRepository } from './solved.repository'; +import { SolvedRepository } from './repository'; @Injectable() export class SolvedService { diff --git a/src/ssu/ssu.controller.ts b/src/modules/ssu/controller.ts similarity index 97% rename from src/ssu/ssu.controller.ts rename to src/modules/ssu/controller.ts index 0ef5056..a3f9ddd 100644 --- a/src/ssu/ssu.controller.ts +++ b/src/modules/ssu/controller.ts @@ -1,7 +1,7 @@ import { Controller, Get, Query } from '@nestjs/common'; import { ApiQuery, ApiTags } from '@nestjs/swagger'; -import { SsuService } from './ssu.service'; +import { SsuService } from './service'; @ApiTags('SSU') @Controller('ssu') diff --git a/src/modules/ssu/module.ts b/src/modules/ssu/module.ts new file mode 100644 index 0000000..d74fa58 --- /dev/null +++ b/src/modules/ssu/module.ts @@ -0,0 +1,13 @@ +import { BojModule } from '@modules/boj/module'; +import { SolvedModule } from '@modules/solved/module'; +import { Module } from '@nestjs/common'; + +import { SsuController } from './controller'; +import { SsuService } from './service'; + +@Module({ + imports: [BojModule, SolvedModule], + controllers: [SsuController], + providers: [SsuService], +}) +export class SsuModule {} diff --git a/src/ssu/ssu.service.ts b/src/modules/ssu/service.ts similarity index 90% rename from src/ssu/ssu.service.ts rename to src/modules/ssu/service.ts index de847cb..591eec2 100644 --- a/src/ssu/ssu.service.ts +++ b/src/modules/ssu/service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; -import { BojService } from '../boj/boj.service'; -import { SolvedService } from '../solved/solved.service'; +import { BojService } from '../boj/service'; +import { SolvedService } from '../solved/service'; @Injectable() export class SsuService { diff --git a/src/user/user.controller.ts b/src/modules/user/controller.ts similarity index 100% rename from src/user/user.controller.ts rename to src/modules/user/controller.ts diff --git a/src/user/user.module.ts b/src/modules/user/module.ts similarity index 58% rename from src/user/user.module.ts rename to src/modules/user/module.ts index b604e7e..dc43481 100644 --- a/src/user/user.module.ts +++ b/src/modules/user/module.ts @@ -1,9 +1,9 @@ +import { DatabaseModule } from '@database/database.module'; import { HttpModule } from '@nestjs/axios'; import { Module } from '@nestjs/common'; -import { DatabaseModule } from '../database/database.module'; -import { UserController } from './user.controller'; -import { UserService } from './user.service'; +import { UserController } from './controller'; +import { UserService } from './service'; @Module({ imports: [DatabaseModule, HttpModule], diff --git a/src/user/user.service.ts b/src/modules/user/service.ts similarity index 100% rename from src/user/user.service.ts rename to src/modules/user/service.ts diff --git a/src/poker/poker.module.ts b/src/poker/poker.module.ts deleted file mode 100644 index 2b2760b..0000000 --- a/src/poker/poker.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { HttpModule } from '@nestjs/axios'; -import { Module } from '@nestjs/common'; -import { ScheduleModule } from '@nestjs/schedule'; - -import { DatabaseModule } from '../database/database.module'; -import { groupProviders } from '../group/group.providers'; -import { GroupRepository } from '../group/group.repository'; -import { ProblemService } from '../problem/problem.service'; -import { UserService } from '../user/user.service'; -import { PokerController } from './poker.controller'; -import { pokerProviders } from './poker.providers'; -import { PokerRepository } from './poker.repository'; -import { PokerService } from './poker.service'; - -@Module({ - controllers: [PokerController], - exports: [PokerService], - imports: [DatabaseModule, HttpModule, ScheduleModule.forRoot()], - providers: [ - PokerService, - UserService, - ...pokerProviders, - PokerRepository, - ...groupProviders, - GroupRepository, - ProblemService, - ], -}) -export class PokerModule {} diff --git a/src/problem/problem.module.ts b/src/problem/problem.module.ts deleted file mode 100644 index 30df95e..0000000 --- a/src/problem/problem.module.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { HttpModule } from '@nestjs/axios'; -import { Module } from '@nestjs/common'; - -import { DatabaseModule } from '../database/database.module'; -import { ProblemController } from './problem.controller'; -import { problemProviders } from './problem.providers'; -import { ProblemRepository } from './problem.repository'; -import { ProblemService } from './problem.service'; - -@Module({ - imports: [DatabaseModule, HttpModule], - controllers: [ProblemController], - providers: [ProblemService, ...problemProviders, ProblemRepository], -}) -export class ProblemModule {} diff --git a/src/ssu/ssu.module.ts b/src/ssu/ssu.module.ts deleted file mode 100644 index ce968da..0000000 --- a/src/ssu/ssu.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { BojModule } from '../boj/boj.module'; -import { SolvedModule } from '../solved/solved.module'; -import { SsuController } from './ssu.controller'; -import { SsuService } from './ssu.service'; - -@Module({ - imports: [BojModule, SolvedModule], - controllers: [SsuController], - providers: [SsuService], -}) -export class SsuModule {} diff --git a/test/jest-e2e.json b/test/jest-e2e.json index e9d912f..f673509 100644 --- a/test/jest-e2e.json +++ b/test/jest-e2e.json @@ -1,5 +1,9 @@ { - "moduleFileExtensions": ["js", "json", "ts"], + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], "rootDir": ".", "testEnvironment": "node", "testRegex": ".e2e-spec.ts$", diff --git a/tsconfig.json b/tsconfig.json index e4dbf2e..72bff20 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,17 @@ "sourceMap": true, "outDir": "./dist", "baseUrl": "./", + "paths": { + "@database/*": [ + "src/database/*" + ], + "@entities/*": [ + "src/entities/*" + ], + "@modules/*": [ + "src/modules/*" + ] + }, "incremental": true, "skipLibCheck": true, "strictNullChecks": true, From 861411b9bd4d7087c7c883a8f83f36d539038c50 Mon Sep 17 00:00:00 2001 From: w8385 Date: Fri, 4 Apr 2025 23:37:39 +0900 Subject: [PATCH 5/6] feat: docker-compose.yml --- .github/workflows/publish-deploy.yml | 17 +++++------------ Dockerfile | 2 -- docker-compose.yml | 22 ++++++++++++++++++++++ src/common/decorators/solved.decorators.ts | 6 ++++++ src/database/database.providers.ts | 2 +- 5 files changed, 34 insertions(+), 15 deletions(-) create mode 100644 docker-compose.yml create mode 100644 src/common/decorators/solved.decorators.ts diff --git a/.github/workflows/publish-deploy.yml b/.github/workflows/publish-deploy.yml index 79907e1..534bafb 100644 --- a/.github/workflows/publish-deploy.yml +++ b/.github/workflows/publish-deploy.yml @@ -81,20 +81,13 @@ jobs: steps: - name: executing remote ssh commands using password uses: appleboy/ssh-action@v1.0.3 + env: + PORT: ${{ secrets.ENV_PORT }} with: host: ${{ secrets.SSH_HOST }} + port: ${{ secrets.SSH_PORT }} username: ${{ secrets.SSH_USERNAME }} password: ${{ secrets.SSH_PASSWORD }} - port: ${{ secrets.SSH_PORT }} script: | - IMAGE_ID=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - IMAGE_ID=$(echo $IMAGE_ID | tr '[:upper:]' '[:lower:]') - CONTAINER_ID=${{ env.IMAGE_NAME }} - CONTAINER_ID=$(echo "CONTAINER_ID=Code-Poker/CodePoker-be" | sed -E 's#.*/##' | tr '[:upper:]' '[:lower:]') - docker pull $IMAGE_ID:main - docker stop $CONTAINER_ID - docker rm $CONTAINER_ID - docker run -d --name $CONTAINER_ID \ - -p 6370:6370 \ - --restart=always \ - $IMAGE_ID:main + docker-compose pull + docker-compose up -d diff --git a/Dockerfile b/Dockerfile index cfdba0c..c348f95 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,4 @@ COPY . . RUN npm install RUN npm run build -EXPOSE $PORT - CMD [ "npm", "run", "start" ] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..6c5a453 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,22 @@ +services: + backend: + image: ghcr.io/code-poker/codepoker-be:main + # build: . + container_name: codepoker-be + restart: unless-stopped + ports: + - ${PORT}:${PORT} + depends_on: + - mongodb + + mongodb: + image: mongo + container_name: mongodb + restart: unless-stopped + volumes: + - ./mongo_data:/data/db + healthcheck: + test: echo 'db.stats().ok' | mongosh localhost:27017/test --quiet + interval: 10s + timeout: 10s + retries: 5 diff --git a/src/common/decorators/solved.decorators.ts b/src/common/decorators/solved.decorators.ts new file mode 100644 index 0000000..e897589 --- /dev/null +++ b/src/common/decorators/solved.decorators.ts @@ -0,0 +1,6 @@ +import { applyDecorators } from '@nestjs/common'; +import { ApiQuery } from '@nestjs/swagger'; + +export function SolvedSearchQuery() { + return applyDecorators(ApiQuery({}), ApiQuery({}), ApiQuery({})); +} diff --git a/src/database/database.providers.ts b/src/database/database.providers.ts index 87bafc9..ae639df 100644 --- a/src/database/database.providers.ts +++ b/src/database/database.providers.ts @@ -4,6 +4,6 @@ export const databaseProviders = [ { provide: 'MONGODB', useFactory: (): Promise => - mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017/codepoker'), + mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017'), }, ]; From 6ceb4df02323f145154af42eb3ab365bb3768de9 Mon Sep 17 00:00:00 2001 From: w8385 Date: Fri, 4 Apr 2025 23:56:06 +0900 Subject: [PATCH 6/6] feat: add module name mapping in jest --- package.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 6d20c45..71cb9ed 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,11 @@ "**/*.(t|j)s" ], "coverageDirectory": "../coverage", - "testEnvironment": "node" + "testEnvironment": "node", + "moduleNameMapper": { + "^@database/(.*)$": "/database/$1", + "^@entities/(.*)$": "/entities/$1", + "^@modules/(.*)$": "/modules/$1" + } } }