Aller au contenu principal

34-6 Modifier un projet (update())

  1. Premièrement, on doit récupérer le projet à mettre à jour, à partir de l'identifiant reçu.

    src/projets/projets.service.ts
    async modifier(id: number, updateProjetDto: UpdateProjetDto) : Promise<Projet> {
    const projet = await Projet.findOneOrFail({
    where: {
    id: id,
    },
    });
    }
    info

    Ici, on utilise findOneOrFail. Cette fonction, équivalente à findOne, lèvera une exception dans le cas où aucun résultat ne correspond à la requête. Cependant, il ne s'agit pas d'une erreur 404, une erreur serveur sera levée (500). On devra donc plutôt vérifier au niveau du contrôleur que le projet existe avant d'en faire la modification.

    info

    Profitez-en pour faire de cette fonction une fonction asynchrone et précisez le type de retour.

  2. Ensuite, on assigne au projet récupéré les propriétés équivalentes en provenance du DTO.

    src/projets/projets.service.ts
    async modifier(id: number, updateProjetDto: UpdateProjetDto) : Promise<Projet> {
    const projet = await Projet.findOneOrFail({
    where: {
    id: id,
    },
    });

    Object.assign(projet, updateProjetDto);
    }
    info

    La méthode Object.assign() est utilisée afin de copier les valeurs de toutes les propriétés d'un objet dans un autre objet cible. Cette méthode renvoie l'objet cible.

    `Object.assign(cible, ...sources);``

  3. Finalement, on retourne l'objet modifié, en prenant soin de le sauvegarder.

    src/projets/projets.service.ts
    async modifier(id: number, updateProjetDto: UpdateProjetDto) : Promise<Projet> {
    const projet = await Projet.findOneOrFail({
    where: {
    id: id,
    },
    });

    Object.assign(projet, updateProjetDto);
    return projet.save();
    }

Gestion de l'erreur dans le contrôleur

findOneOrFail génèrera une erreur si le projet n'est pas trouvé. On peut faire cette gestion dans le contrôleur et retourner une erreur 404.

info

Il n'est pas recommandé de retourner des erreurs HTTP dans un service. Ils sont à une couche logicielle qui ne devrait pas avoir avoir connaissance de la "couche réseau". Seulement le contrôleur devrait retourner des erreurs HTTP.

async update(@Param('id') id: string, @Body() updateProjetDto: UpdateProjetDto) {
try {
const projet = await this.projetsService.modifier(+id, updateProjetDto);
return projet
} catch (error) {
if (error instanceof EntityNotFoundError) {
throw new NotFoundException();
} else {
throw error; // On lance l'erreur "générique" si jamais ce n'est pas un 404.
}
}
}
info

On appelle directement la fonction modifier et on attrape l'erreur du service si findOneOrFail lève une erreur.

Si l'erreur est de type EntityNotFoundError (Erreur levée par TypeORM), on retourne une erreur 404 au client.

info

N'oubliez pas de faire de votre fonction une fonction asynchrone (async).

Test Postman

Vous pouvez essayer de modifier projet que vous sachez être existant, en utilisant des valeurs différentes.

Par exemple, PATCH http://localhost:3000/projets/2 avec un body tel que:

{
"nom": "Nom de projet modifié!"
}

Résultera en un résultat de ce genre:

{
"id": 2,
"nom": "Nom de projet modifié!",
"description": "Premier projet",
"imageUrl": null,
"date_creation": "2023-10-23T19:10:40.056Z",
"date_modification": "2023-10-30T19:42:12.317Z"
}