Menu

Nest.js

Api Nestjs

Framework back qui permet une mise en place d'un serveur nodejs/express en utilisant une methode POO

src/article/dto/index

Principalement du CRUD

On y defint les types des information en entrer et en sortie

1import { Field, InputType, ObjectType } from "@nestjs/graphql"; 2import { Article } from "../models/article.model"; 3 4// Indique le type de donnée en entrer 5@InputType() 6export class ArticleCreateInput { 7 // Pour la creation d'un input 8 @Field(() => String) // On recupere le title de type string et qui retourne un string 9 title: string; 10 11 @Field(() => String) // une description de type string et qui retourne un string 12 description: string; 13 14 @Field(() => String) // ... 15 image: string; 16} 17 18// Les données en sortie seront de type object 19@ObjectType() 20export class ArticleCreateOutput { 21 @Field(() => Article) // L'object sera de type Article definie dans le model 22 article: Article; 23} 24 25// Les données en sortie seront de type object 26@ObjectType() 27export class ArticleDeleteOutput { 28 @Field(() => ID) // Apres la suppression d'un article on recupere sont id 29 articleId: Article["id"]; 30} 31 32// L'update extends le create il herite donc de toutes ses spec 33@InputType() 34export class ArticleUpdateInput extends ArticleCreateInput {} 35

src/article/models/index

Definition du model de la base de données

Definition de tout les champs et de leur spec

1import { Field, ID, ObjectType } from "@nestjs/graphql"; 2import { Entity, Column, PrimaryGeneratedColumn, BaseEntity } from "typeorm"; 3 4@Entity() // Model entiter a schematiser par la bdd 5@ObjectType() // indique que cest recuperable par graphql 6export class Article extends BaseEntity { 7 @Field(() => ID) 8 @PrimaryGeneratedColumn("uuid") // defini comme une pk 9 id:urandomNumber(); 10 11 @Field(() => String) 12 @Column() 13 title: string; 14 15 @Field(() => String) 16 @Column() 17 description: string; 18 19 @Field(() => String) 20 @Column() 21 image: string; 22} 23

src/article/resolvers/index

Definition des fonctions et de leur utilisation

1import { Query } from '@nestjs/common'; 2import { Args, ID, Mutation, Resolver } from '@nestjs/graphql'; 3import { Article } from '../models/article.model'; 4import { ArticleCreateInput, ArticleCreateOutput } from '../dto/article-create.dto'; 5import { ArticleUpdateInput, ArticleUpdateOutput } from '../dto/article-update.dto'; 6import { ArticleDeleteOutput } from '../dto/article-delete.dto'; 7import { ArticlePaginationArgs } from '../dto/article-pagination.dto'; 8import { ArticleService } from '../article.service'; 9 10// Defini une class qui utilisera un certain objet et effectura des action en conséquent 11@Resolver(Article) 12export class ArticleMutationsResolver { 13 // definition du constructeur et du service qu'il utilisera 14 constructor(private readonly articleService: ArticleService) {} 15 16 @Mutation(() => ArticleCreateOutput) 17 async articleCreate(@Args('input') input: ArticleCreateInput) { 18 return this.articleService.articleCreate(input); 19 } 20 21 @Mutation(() => ArticleUpdateOutput) 22 async articleUpdate( 23 @Args({ name: 'articleId', type: () => ID }) articleId: Article['id'], 24 @Args('input') input: ArticleUpdateInput 25 ) { 26 return this.articleService.articleUpdate(articleId, input); 27 } 28 29 @Mutation(() => ArticleDeleteOutput) 30 async articleDelete( 31 @Args({ name: 'articleId', type: () => ID }) articleId: Article['id'] 32 ) { 33 return this.articleService.articleDelete(articleId); 34 } 35} 36 37@Resolver(Article) 38export class ArticleQueriesResolver { 39 constructor(private readonly articleService: ArticleService) {} 40 41 @Query(() => [Article]) 42 async articlesPagination(@Args() args: ArticlePaginationArgs) { 43 return this.articleService.articlesList(args); 44 } 45} 46

src/article/article-service

Definition de la logique qui utilise les types, les models, et les services

1import { Repository } from 'typeorm'; 2import { Injectable } from '@nestjs/common'; 3import { InjectRepository } from '@nestjs/typeorm'; 4import { Article } from './models/article.model'; 5import { ArticleCreateInput, ArticleCreateOutput } from './dto/article-create.dto'; 6import { ArticleUpdateInput, ArticleUpdateOutput } from './dto/article-update.dto'; 7import { ArticleDeleteOutput } from './dto/article-delete.dto'; 8 9@Injectable() 10export class ArticleService { 11 constructor( 12 @InjectRepository(Article) 13 private readonly articleRepository: Repository<Article> 14 ) {} 15 16 async articleCreate(input: ArticleCreateInput): Promise<ArticleCreateOutput> { 17 const newArticle = this.articleRepository.create(input); 18 const article = await this.articleRepository.save(newArticle); 19 return { article }; 20 } 21 22 async articleUpdate( 23 articleId: Article['id'], 24 input: ArticleUpdateInput 25 ): Promise<ArticleUpdateOutput> { 26 const article = await this.articleRepository.findOneOrFail(articleId); 27 article.title = input.title; 28 article.description = input.description; 29 article.image = input.image; 30 await article.save(); 31 return { article }; 32 } 33 34 async articleDelete( 35 articleId: Article['id'] 36 ): Promise<ArticleDeleteOutput> { 37 const article = await this.articleRepository.findOneOrFail(articleId); 38 await article.remove(); 39 return { articleId }; 40 } 41} 42

src/article/article-module

Definition du module des articles

1import { Module } from "@nestjs/common"; 2import { TypeOrmModule } from "@nestjs/typeorm"; 3import { ArticleService } from "./article.service"; 4import { Article } from "./models/article.model"; 5import { ArticleMutationsResolver } from "./resolvers/article.mutations.resolver"; 6import { ArticleQueriesResolver } from "./resolvers/article.queries.resolver"; 7 8@Module({ 9 imports: [TypeOrmModule.forFeature([Article])], 10 providers: [ArticleService, ArticleMutationsResolver, ArticleQueriesResolver], 11}) 12export class ArticleModule {} 13