Aller au contenu principal

35-5 Créer une relation

Ensuite, comment lors de la création, associer une issue à un projet?

Cela n'est pas tellement différent d'avant dans un certain sens, mais nous n'avons pas besoin d'une propriété projet ou projetId sur le DTO de création puisque cette information sera communiquée via l'URL.

DTO de création CreateIssueDto avec validations

Cette étape est à effectuer par vous-même! 😁

Complétez le DTO pour la création d'une issue (CreateIssueDto) et ajoutez-y les validations.

Validation d'un enum

Si vous voulez valider un enum (pour le statut), vous pouvez utiliser le décorateur @IsEnum(Statut)

Action create du contrôleur IssuesController

  1. Récupérer le paramètre projetId en provenance de l'URL
    src/issues/issues.controller.ts
    @Post()
    create(@Param('projetId') projetId: string,
    @Body() createIssueDto: CreateIssueDto) {
    return this.issuesService.create(createIssueDto);
    }
  2. Passer le paramètre au service
    src/issues/issues.controller.ts
    @Post()
    create(@Param('projetId') projetId: string,
    @Body() createIssueDto: CreateIssueDto) {
    return this.issuesService.create(+projetId, createIssueDto);
    }

Action create du service IssuesService

  1. Ajouter le paramètre projetId en entrée
    src/issues/issues.service.ts
    create(projetId: number, createIssueDto: CreateIssueDto) {
    return 'This action adds a new issue';
    }
  2. Créer l'issue, en spécifiant projetId et en utilisant save pour sauvegarder.
    attention

    Vous devez compléter la fonction par vous-même, je vous donne seulement la façon de faire le lien entre l'issue et le projet via l'attribut projetId.

    src/issues/issues.service.ts
    create(projetId: number, createIssueDto: CreateIssueDto) {

    const issue = Issue.create({
    projet_id: projetId,
    //... les autres propriétés
    });

    // à compléter...
    }

Test via Postman

Vous devriez avoir un projet de test dans votre base de données, tentez de créer une issue pour ce projet.

Par exemple, dans mon cas, je peux faire une requête:

  • Action/URL POST http://localhost:3000/projets/1/issues
  • Body
    {
    "titre": "Commander de la piza",
    "contenu": "Toujours une bonne idée",
    "statut": "open"
    }

Et obtenir comme retour:

{
"id": 6,
"projetId": 3,
"titre": "Commander de la piza",
"contenu": "Toujours une bonne idée",
"image_url": null,
"statut": "open",
"date_creation": "2025-10-30T19:24:47.019Z",
"date_modification": "2025-10-30T19:24:47.019Z"
}

En plus de pouvoir vérifier dans la BD que le tout a été inséré!

Imgur

INSERT INTO "issues"("projetId", "titre", "contenu", "imageUrl", "statut", "date_creation", "date_modification") VALUES ($1, $2, $3, DEFAULT, $4, DEFAULT, DEFAULT) RETURNING "id", "statut", "date_creation", "date_modification" -- PARAMETERS: [1,"Commander de la piza","Toujours une bonne idée","Open"]