Merge branch 'nest-graphql' into 'master'
Add Nest graphql settings Add Nest graphql settings for inital testing See merge request !1
Showing
14 changed files
with
178 additions
and
2 deletions
... | @@ -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 | +} |
project/packages/api/src/schema.gql
0 → 100644
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.
-
Please register or login to post a comment