diff --git a/src/apis/dogs/dogs.module.ts b/src/apis/dogs/dogs.module.ts new file mode 100644 index 0000000..bdc7419 --- /dev/null +++ b/src/apis/dogs/dogs.module.ts @@ -0,0 +1,18 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { DogsResolver } from './dogs.resolver'; +import { DogsService } from './dogs.service'; +import { Dog } from './entities/dog.entity'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([ + Dog, // + ]), + ], + providers: [ + DogsResolver, // + DogsService, // + ], +}) +export class DogsModule {} diff --git a/src/apis/dogs/dogs.resolver.ts b/src/apis/dogs/dogs.resolver.ts new file mode 100644 index 0000000..2363561 --- /dev/null +++ b/src/apis/dogs/dogs.resolver.ts @@ -0,0 +1,26 @@ +import { Args, Mutation, Query, Resolver } from '@nestjs/graphql'; +import { DogsService } from './dogs.service'; +import { CreateDogInput } from './dto/create-dog.input'; +import { Dog } from './entities/dog.entity'; + +@Resolver() +export class DogsResolver { + constructor( + private readonly dogsService: DogsService, // + ) {} + + @Query(() => String) + fetchDog( + @Args('id') id: string, // + ): string { + // return this.dogsService.findOneById({ id }); + return '임시 쿼리문'; + } + + @Mutation(() => Dog) + createDog( + @Args('createDogInput') createDogInput: CreateDogInput, // + ): Promise { + return this.dogsService.create({ createDogInput }); + } +} diff --git a/src/apis/dogs/dogs.service.ts b/src/apis/dogs/dogs.service.ts new file mode 100644 index 0000000..c7eb084 --- /dev/null +++ b/src/apis/dogs/dogs.service.ts @@ -0,0 +1,32 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Dog } from './entities/dog.entity'; +import { + IDogsServiceCreate, + IDogsServiceFindOneById, +} from './interfaces/dogs-service.interface'; + +@Injectable() +export class DogsService { + constructor( + @InjectRepository(Dog) + private readonly dogsRepository: Repository, // + ) {} + + async findOneById({ id }: IDogsServiceFindOneById): Promise { + const found = await this.dogsRepository.findOneBy({ id }); + + if (!found) { + throw new NotFoundException(`id ${id}를 갖는 강아지를 찾을 수 없음`); + } + + return found; + } + + async create({ createDogInput }: IDogsServiceCreate): Promise { + const dog = this.dogsRepository.create(createDogInput); + this.dogsRepository.save(dog); + return dog; + } +} diff --git a/src/apis/dogs/dto/create-dog.input.ts b/src/apis/dogs/dto/create-dog.input.ts new file mode 100644 index 0000000..52ea368 --- /dev/null +++ b/src/apis/dogs/dto/create-dog.input.ts @@ -0,0 +1,23 @@ +import { Field, Float, InputType, Int } from '@nestjs/graphql'; +import { DOG_TYPE } from '../enum/dog-type.enum'; + +@InputType() +export class CreateDogInput { + @Field(() => String) + name: string; + + @Field(() => Int) + age: number; + + @Field(() => Float) + weight: number; + + @Field(() => DOG_TYPE, { nullable: true }) + breed: DOG_TYPE; + + @Field(() => String, { nullable: true }) + specifics: string; + + @Field(() => String, { nullable: true }) + image: string; +} diff --git a/src/apis/dogs/entities/dog.entity.ts b/src/apis/dogs/entities/dog.entity.ts new file mode 100644 index 0000000..bb37637 --- /dev/null +++ b/src/apis/dogs/entities/dog.entity.ts @@ -0,0 +1,73 @@ +import { + Field, + Float, + Int, + ObjectType, + registerEnumType, +} from '@nestjs/graphql'; +import { + Column, + CreateDateColumn, + DeleteDateColumn, + Entity, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { DOG_TYPE } from '../enum/dog-type.enum'; + +registerEnumType(DOG_TYPE, { + name: 'DOG_TYPE', +}); + +@Entity() +@ObjectType() +export class Dog { + @PrimaryGeneratedColumn('uuid') + @Field(() => String) + id: string; + + @Column({ + length: 10, + }) + @Field(() => String) + name: string; + + @Column() + @Field(() => Int) + age: number; + + @Column({ + type: 'decimal', + precision: 4, + scale: 1, + }) + @Field(() => Float) + weight: number; + + @Column({ + type: 'enum', + enum: DOG_TYPE, + nullable: true, + }) + @Field(() => DOG_TYPE, { nullable: true }) + breed: DOG_TYPE; + + @Column({ + type: 'text', + nullable: true, + }) + @Field(() => String, { nullable: true }) + specifics: string; + + @Column({ + length: 100, + nullable: true, + }) + @Field(() => String, { nullable: true }) + image: string; + + @CreateDateColumn({ nullable: true }) + createdAt: Date; + + @DeleteDateColumn({ nullable: true }) + deletedAt: Date; +} diff --git a/src/apis/dogs/enum/dog-type.enum.ts b/src/apis/dogs/enum/dog-type.enum.ts new file mode 100644 index 0000000..3f511ab --- /dev/null +++ b/src/apis/dogs/enum/dog-type.enum.ts @@ -0,0 +1,6 @@ +export enum DOG_TYPE { + SMALL = 'SMALL', + MEDIUM = 'MEDIUM', + LARGE = 'LARGE', + SPECIAL = 'SPECIAL', +} diff --git a/src/apis/dogs/interfaces/dogs-service.interface.ts b/src/apis/dogs/interfaces/dogs-service.interface.ts new file mode 100644 index 0000000..a27f4fe --- /dev/null +++ b/src/apis/dogs/interfaces/dogs-service.interface.ts @@ -0,0 +1,9 @@ +import { CreateDogInput } from '../dto/create-dog.input'; + +export interface IDogsServiceFindOneById { + id: string; +} + +export interface IDogsServiceCreate { + createDogInput: CreateDogInput; +} diff --git a/src/app.module.ts b/src/app.module.ts index e04116c..2380097 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,14 +1,16 @@ import { Module } from '@nestjs/common'; -// import { AppController } from './app.controller'; import { ConfigModule } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { GraphQLModule } from '@nestjs/graphql'; import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo'; import { UsersModule } from './apis/users/user.module'; +import { DogsModule } from './apis/dogs/dogs.module'; @Module({ imports: [ + DogsModule, UsersModule, // + GraphQLModule.forRoot({ driver: ApolloDriver, autoSchemaFile: true, @@ -27,7 +29,5 @@ import { UsersModule } from './apis/users/user.module'; logging: true, }), ], - - providers: [], }) export class AppModule {} diff --git a/src/main.ts b/src/main.ts index 1d4c302..ddc2cbc 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -// import { ValidationPipe } from '@nestjs/common'; +import { ValidationPipe } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { graphqlUploadExpress } from 'graphql-upload'; import { AppModule } from './app.module'; @@ -6,8 +6,7 @@ import { HttpExceptionFilter } from './commons/filter/http-exception.filter'; async function bootstrap() { const app = await NestFactory.create(AppModule); - // 검증 위한 코드 - // app.useGlobalPipes(new ValidationPipe()); + app.useGlobalPipes(new ValidationPipe()); app.useGlobalFilters(new HttpExceptionFilter()); app.use(graphqlUploadExpress()); await app.listen(3000);