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 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/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/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" + } } } 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/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/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/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'), }, ]; 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/entities/problem.entity.ts b/src/entities/problem.entity.ts new file mode 100644 index 0000000..d2d64a4 --- /dev/null +++ b/src/entities/problem.entity.ts @@ -0,0 +1,15 @@ +import { SchemaFactory } from '@nestjs/mongoose'; + +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/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' }], -}); 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 80% rename from src/group/group.providers.ts rename to src/modules/group/providers.ts index f3473d5..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 './schemas/group.schema'; - 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 59% rename from src/group/group.service.ts rename to src/modules/group/service.ts index 0a939c1..1c14781 100644 --- a/src/group/group.service.ts +++ b/src/modules/group/service.ts @@ -1,23 +1,23 @@ +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 { 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/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 f825286..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 './schemas/problem.schema'; - export const problemProviders = [ { provide: 'PROBLEM_MODEL', diff --git a/src/problem/problem.repository.ts b/src/modules/problem/repository.ts similarity index 84% rename from src/problem/problem.repository.ts rename to src/modules/problem/repository.ts index 44923d0..e24b49b 100644 --- a/src/problem/problem.repository.ts +++ b/src/modules/problem/repository.ts @@ -1,12 +1,10 @@ +import { Problem } from '@entities/problem.entity'; 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/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/entities/problem.entity.ts b/src/problem/entities/problem.entity.ts deleted file mode 100644 index bc83dec..0000000 --- a/src/problem/entities/problem.entity.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class Problem { - problemId: number; - titleKo: string; - level: number; -} 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.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/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, -}); 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,