Aller au contenu principal

28-4 Création d'un service ProjetsService

Au même titre qu'en Angular où la logique applicative est généralement déléguée à un Service, Nest fait usage du même concept.

Le contrôleur reçoit la requête et, au besoin, délègue au service la logique applicative comme la communication avec la base de données.

Créer le service ProjetsService via le CLI

À l'aide du CLI de Nest, créez un service via la commande suivante:

nest g service projets

Le fichier suivant devrait avoir été créé:

src/projets/projets.service.ts
info

Normalement, vous n'avez pas à spécifier le chemin d'accès complet. Si vous créez un service projets, Nest comprendra qu'il doit le mettre dans le dossier projets.

Cependant, s'il s'agissait d'un service ayant un autre nom, mais qu'il doit être dans le dossier projets, il faudrait préciser le dossier.

Sans le module Projets, une référence au service devrait avoir été ajoutée via le tableau de providers:

src/projets/projets.module.ts
@Module({
controllers: [ProjetsController],
providers: [ProjetsService]
})
export class ProjetsModule {}

Ajout de la liste de projets au service

Plutôt que de maintenir la liste en mémoire dans le contrôleur, déplaçons cette liste au niveau du service.

  1. Créez une propriété privée projets contenant la liste.
    src/projets/projets.service.ts
    export class ProjetsService {
    private timestamp = new Date().toJSON();
    private projets = [
    {
    id: 1,
    nom: 'LAN Party (NestJS API)',
    description: 'Organiser le LAN Party',
    image_url: 'https://i.imgur.com/Y5nZ4Qe.jpg',
    date_creation: this.timestamp,
    date_modification: this.timestamp,
    },
    {
    id: 2,
    nom: 'Discreddit (NestJS API)',
    description: 'Projet de session',
    image_url: 'https://i.imgur.com/Y5nZ4Qe.jpg',
    date_creation: this.timestamp,
    date_modification: this.timestamp,
    },
    ];
    }
  2. Créez ensuite une fonction obtenirTous() retournant la liste de projets en mémoire.
    src/projets/projets.service.ts
    obtenirTous() {
    return this.projets;
    }

Modifier le contrôleur pour utiliser le service

Modifiez maintenant le contrôleur afin que ce dernier utilise le service pour obtenir la liste de projets.

  1. Injecter via son constructeur ProjetsService. Le principe est le même qu'Angular!

    src/projets/projets.controller.ts
    @Controller('projets')
    export class ProjetsController {
    constructor(private projetsService: ProjetsService) {}

    //...
    info

    Comme le service ProjetsService utilise le décorateur @Injectable, il est possible de l'injecter dans une classe via le constructeur. Il s'agit du même mécanisme d'injection de dépendance qu'Angular.

    L'effet est donc de créer une propriété privée projetsService de type ProjetService dans la classe ProjetsController.

  2. Dans le contrôleur, il suffit de faire appel au service dans findAll() afin d'obtenir la liste de projets et retourner cette dernière.

    src/projets/projets.controller.ts
    @Get()
    findAll() {
    return this.projetsService.obtenirTous();
    }

Test via Postman

Effectuer la requête dans Postman (http://localhost:3000/projets) devrait vous donner le même résultat.

[
{
"id": 1,
"nom": "LAN Party (NestJS API)",
"description": "Organiser le LAN Party",
"imageUrl": "https://i.imgur.com/Y5nZ4Qe.jpg",
"date_creation": "2023-10-11T12:11:11.487Z",
"date_modification": "2023-10-11T12:11:11.487Z"
},
{
"id": 2,
"nom": "Discreddit (NestJS API)",
"description": "Projet de session",
"imageUrl": "https://i.imgur.com/Y5nZ4Qe.jpg",
"date_creation": "2023-10-11T12:11:11.487Z",
"date_modification": "2023-10-11T12:11:11.487Z"
}
]