34-5 Créer un projet (create() + save())
Afin de créer et sauvegarder un nouveau projet, on commence par instancier un nouveau projet à partir de la fonction create() sur l'entité.
async creer(createProjetDto: CreateProjetDto) : Promise<Projet> {
const projet = Projet.create({
nom: createProjetDto.nom,
description: createProjetDto.description,
image_url: createProjetDto.image_url,
});
}
Cela ne sauvegarde rien dans la base de données, vous devrez appeler la fonction save() pour cela et retourner le résultat. La fonction save() sur l'entité effectuera le INSERT dans la base de données et retournera la nouvelle entrée (le projet).
async creer(createProjetDto: CreateProjetDto) : Promise<Projet> {
const projet = Projet.create({
nom: createProjetDto.nom,
description: createProjetDto.description,
image_url: createProjetDto.image_url,
});
return projet.save();
}
Test Postman
Vous pouvez essayer de créer un nouveau projet avec un nom et une description.
{
"nom": "Un projet",
"description": "Je ne me tanne pas de créer des projets!"
}
Vous recevrez probablement l'erreur suivante ☹️:
{
"message": [
"imageUrl must be a string"
],
"error": "Bad Request",
"statusCode": 400
}
Validation optionnelle de imageUrl
C'est qu'une validation de string est présente sur la propriété imageUrl du modèle. On doit ajouter que cette propriété est optionnelle.
//...
@ApiProperty({
description: "L'URL de l'image du projet",
example: 'https://i.imgur.com/Y5nZ4Qe.jpg',
})
@IsOptional()
@IsString()
imageUrl?: string;
//...
On vient donc dire d'exécuter la validation seulement si l'attribut est présent.
Éviter la répétition
Lors de la création de l'entité projet, on utilise le DTO et ce dernier est répété plusieurs fois puisqu'on accède à ses différents attributs. Par exemple:
const projet = Projet.create({
nom: createProjetDto.nom,
description: createProjetDto.description,
imageUrl: createProjetDto.imageUrl,
return projet.save();
});
Pour éviter cette répétition, on peut plutôt utiliser le format suivant:
async creer(createProjetDto: CreateProjetDto): Promise<Projet> {
const { nom, description, imageUrl } = createProjetDto;
const projet = Projet.create({
nom: nom,
description: description,
imageUrl: imageUrl,
});
return projet.save();
}
const { nom, description, imageUrl } = createProjetDto; est l'équivalent de faire:
const nom = createProjetDto.nom;
const description = createProjetDto.description;
const imageUrl = createProjetDto.imageUrl;
Et donc équivalent à
async creer(createProjetDto: CreateProjetDto): Promise<Projet> {
const nom = createProjetDto.nom;
const description = createProjetDto.description;
const imageUrl = createProjetDto.imageUrl;
const projet = Projet.create({
nom: nom,
description: description,
imageUrl: imageUrl,
});
return projet.save();
}
Contrôleur
Le contrôleur ne change pas, il demeure le même qu'avant!
@Post()
create(@Body() createProjetDto: CreateProjetDto) {
return this.projetsService.creer(createProjetDto);
}