장재혁

Merge branch 'nest-graphql' into 'master'

Add Nest graphql settings

Add Nest graphql settings for inital testing

See merge request !1
1 node_modules 1 node_modules
2 +.history
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -2,6 +2,7 @@ module.exports = { ...@@ -2,6 +2,7 @@ module.exports = {
2 parser: '@typescript-eslint/parser', 2 parser: '@typescript-eslint/parser',
3 parserOptions: { 3 parserOptions: {
4 project: 'tsconfig.json', 4 project: 'tsconfig.json',
5 + tsconfigRootDir: __dirname,
5 sourceType: 'module', 6 sourceType: 'module',
6 }, 7 },
7 plugins: ['@typescript-eslint/eslint-plugin'], 8 plugins: ['@typescript-eslint/eslint-plugin'],
...@@ -20,5 +21,6 @@ module.exports = { ...@@ -20,5 +21,6 @@ module.exports = {
20 '@typescript-eslint/explicit-function-return-type': 'off', 21 '@typescript-eslint/explicit-function-return-type': 'off',
21 '@typescript-eslint/explicit-module-boundary-types': 'off', 22 '@typescript-eslint/explicit-module-boundary-types': 'off',
22 '@typescript-eslint/no-explicit-any': 'off', 23 '@typescript-eslint/no-explicit-any': 'off',
24 + '@typescript-eslint/no-unused-vars': 'off',
23 }, 25 },
24 }; 26 };
......
...@@ -23,10 +23,19 @@ ...@@ -23,10 +23,19 @@
23 "dependencies": { 23 "dependencies": {
24 "@nestjs/common": "^7.6.15", 24 "@nestjs/common": "^7.6.15",
25 "@nestjs/core": "^7.6.15", 25 "@nestjs/core": "^7.6.15",
26 + "@nestjs/graphql": "^7.10.3",
26 "@nestjs/platform-express": "^7.6.15", 27 "@nestjs/platform-express": "^7.6.15",
28 + "@nestjs/typeorm": "^7.1.5",
29 + "apollo-server-express": "^2.23.0",
30 + "class-transformer": "^0.4.0",
31 + "class-validator": "^0.13.1",
32 + "graphql": "^15.5.0",
33 + "graphql-tools": "^7.0.4",
27 "reflect-metadata": "^0.1.13", 34 "reflect-metadata": "^0.1.13",
28 "rimraf": "^3.0.2", 35 "rimraf": "^3.0.2",
29 - "rxjs": "^6.6.6" 36 + "rxjs": "^6.6.6",
37 + "sqlite3": "^5.0.2",
38 + "typeorm": "^0.2.32"
30 }, 39 },
31 "devDependencies": { 40 "devDependencies": {
32 "@nestjs/cli": "^7.6.0", 41 "@nestjs/cli": "^7.6.0",
......
1 import { Module } from '@nestjs/common'; 1 import { Module } from '@nestjs/common';
2 +import { GraphQLModule } from '@nestjs/graphql';
3 +import { TypeOrmModule } from '@nestjs/typeorm';
4 +import { join } from 'path';
2 import { AppController } from './app.controller'; 5 import { AppController } from './app.controller';
3 import { AppService } from './app.service'; 6 import { AppService } from './app.service';
7 +import { MypageModule } from './mypage/mypage.module';
4 8
5 @Module({ 9 @Module({
6 - imports: [], 10 + imports: [
11 + GraphQLModule.forRoot({
12 + autoSchemaFile: join(process.cwd(), 'src/schema.gql'),
13 + sortSchema: true,
14 + }),
15 + TypeOrmModule.forRoot({
16 + type: 'sqlite',
17 + database: ':memory:',
18 + entities: ['dist/**/*.entity{.ts,.js}'],
19 + synchronize: true,
20 + }),
21 + MypageModule,
22 + ],
7 controllers: [AppController], 23 controllers: [AppController],
8 providers: [AppService], 24 providers: [AppService],
9 }) 25 })
......
1 +import { ValidationPipe } from '@nestjs/common';
1 import { NestFactory } from '@nestjs/core'; 2 import { NestFactory } from '@nestjs/core';
2 import { AppModule } from './app.module'; 3 import { AppModule } from './app.module';
3 4
4 async function bootstrap() { 5 async function bootstrap() {
5 const app = await NestFactory.create(AppModule); 6 const app = await NestFactory.create(AppModule);
7 +
8 + app.useGlobalPipes(new ValidationPipe());
6 await app.listen(3000); 9 await app.listen(3000);
7 } 10 }
8 bootstrap(); 11 bootstrap();
......
1 +import { Field, InputType } from '@nestjs/graphql';
2 +import { IsAlpha } from 'class-validator';
3 +import { Entity } from 'typeorm';
4 +
5 +@Entity()
6 +@InputType()
7 +export class CreateMyInput {
8 + @IsAlpha()
9 + @Field()
10 + name: string;
11 +
12 + @Field({ nullable: true })
13 + type?: string;
14 +}
1 +/* eslint-disable @typescript-eslint/no-unused-vars */
2 +import { ObjectType, Field, Int } from '@nestjs/graphql';
3 +import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
4 +
5 +@Entity()
6 +@ObjectType()
7 +export class MyPage {
8 + @PrimaryGeneratedColumn()
9 + @Field((type) => Int)
10 + id: number;
11 +
12 + @Column()
13 + @Field()
14 + name: string;
15 +
16 + @Column({ nullable: true })
17 + @Field({ nullable: true })
18 + type?: string;
19 +}
1 +import { Module } from '@nestjs/common';
2 +import { MypageService } from './mypage.service';
3 +import { MypageResolver } from './mypage.resolver';
4 +import { TypeOrmModule } from '@nestjs/typeorm';
5 +import { MyPage } from './mypage.entity';
6 +
7 +@Module({
8 + imports: [TypeOrmModule.forFeature([MyPage])],
9 + providers: [MypageService, MypageResolver],
10 +})
11 +export class MypageModule {}
1 +import { Test, TestingModule } from '@nestjs/testing';
2 +import { MypageResolver } from './mypage.resolver';
3 +
4 +describe('MypageResolver', () => {
5 + let resolver: MypageResolver;
6 +
7 + beforeEach(async () => {
8 + const module: TestingModule = await Test.createTestingModule({
9 + providers: [MypageResolver],
10 + }).compile();
11 +
12 + resolver = module.get<MypageResolver>(MypageResolver);
13 + });
14 +
15 + it('should be defined', () => {
16 + expect(resolver).toBeDefined();
17 + });
18 +});
1 +import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
2 +import { MypageService } from './mypage.service';
3 +import { MyPage } from './mypage.entity';
4 +import { CreateMyInput } from './dto/create-mypage.input';
5 +
6 +@Resolver((of) => MyPage)
7 +export class MypageResolver {
8 + constructor(private myPageService: MypageService) {}
9 +
10 + @Query((returns) => [MyPage])
11 + myPage(): Promise<MyPage[]> {
12 + return this.myPageService.findAll();
13 + }
14 +
15 + @Mutation((returns) => MyPage)
16 + createMyPage(
17 + @Args('createMyInput') createMyPage: CreateMyInput,
18 + ): Promise<MyPage> {
19 + return this.myPageService.createMy(createMyPage);
20 + }
21 +}
1 +import { Test, TestingModule } from '@nestjs/testing';
2 +import { MypageService } from './mypage.service';
3 +
4 +describe('MypageService', () => {
5 + let service: MypageService;
6 +
7 + beforeEach(async () => {
8 + const module: TestingModule = await Test.createTestingModule({
9 + providers: [MypageService],
10 + }).compile();
11 +
12 + service = module.get<MypageService>(MypageService);
13 + });
14 +
15 + it('should be defined', () => {
16 + expect(service).toBeDefined();
17 + });
18 +});
1 +import { Injectable } from '@nestjs/common';
2 +import { InjectRepository } from '@nestjs/typeorm';
3 +import { Repository } from 'typeorm';
4 +import { CreateMyInput } from './dto/create-mypage.input';
5 +import { MyPage } from './mypage.entity';
6 +
7 +@Injectable()
8 +export class MypageService {
9 + constructor(
10 + @InjectRepository(MyPage) private myPageRepository: Repository<MyPage>,
11 + ) {}
12 +
13 + async createMy(createMyInput: CreateMyInput): Promise<MyPage> {
14 + const newPage = this.myPageRepository.create(createMyInput);
15 +
16 + return this.myPageRepository.save(newPage);
17 + }
18 +
19 + async findAll(): Promise<MyPage[]> {
20 + return this.myPageRepository.find();
21 + }
22 +}
1 +# ------------------------------------------------------
2 +# THIS FILE WAS AUTOMATICALLY GENERATED (DO NOT MODIFY)
3 +# ------------------------------------------------------
4 +
5 +input CreateMyInput {
6 + name: String!
7 + type: String
8 +}
9 +
10 +type Mutation {
11 + createMyPage(createMyInput: CreateMyInput!): MyPage!
12 +}
13 +
14 +type MyPage {
15 + id: Int!
16 + name: String!
17 + type: String
18 +}
19 +
20 +type Query {
21 + myPage: [MyPage!]!
22 +}
This diff could not be displayed because it is too large.