Aller au contenu principal

40-2 Récupérer l'utilisateur dans le contrôleur

Le mécanisme d'interception du jeton dans l'en-tête et ensuite d'authentification générée par Passport ajoute une propriété user à l'objet de requête lors de l'authentification.

On peut ainsi utiliser cette propriété pour récupérer l'utilisateur.

Créer une issue et associer un responsable

Imaginons qu'on veuille assigner automatiquement comme responsable d'une issue celui qui la crée.

  1. Il est important de protéger le contrôleur dans un premier temps pour déclencher le mécanisme d'authentification.
    src/issues/issues.controller.ts
    @ApiTags('issues')
    @Controller('projets/:projetId/issues')
    @UseGuards(AuthGuard('jwt'))
    export class IssuesController {
  2. Installez les types de express, soit le framework derrière NestJS. Nous aurons besoin du type "Request".
    npm install @types/express
  3. Importez le type Request de express
    import { ProjetsService } from '../projets/projets.service';
    import { EntityNotFoundError } from 'typeorm';
    import { AuthGuard } from '@nestjs/passport';
    import type { Request } from 'express';

    //...
  4. Ensuite, à l'aide du décorateur @Req() de requête, on peut aller récupérer le détail de la requête et l'utilisateur
    src/issues/issues.controller.ts
    @Post()
    async create(@Param('projetId') projetId: string,
    @Body() createIssueDto: CreateIssueDto,
    @Req() request: Request) {
    const user = request.user as Utilisateur;
    //...
  5. Envoyer l'utilisateur au service de création
    src/issues/issues.controller.ts
    @Post()
    async create(@Param('projetId') projetId: string,
    @Body() createIssueDto: CreateIssueDto,
    @Req() request: Request) {
    const user = request.user as Utilisateur;
    const projet = await this.projetsService.obtenir(+projetId);
    if(!projet)
    throw new NotFoundException();

    return this.issuesService.create(+projetId, user, createIssueDto);
    }
  6. Sauvegarder l'issue avec l'utilisateur
    src/issues/issues.service.ts
    @Injectable()
    export class IssuesService {
    create(projetId: number, user: Utilisateur, createIssueDto: CreateIssueDto) {
    const { titre, contenu, imageUrl, statut } = createIssueDto;
    const issue = Issue.create({
    projetId: projetId,
    titre: titre,
    contenu: contenu,
    imageUrl: imageUrl,
    statut: statut,
    responsable: user
    });
    return issue.save();
    }

Test Postman

Vous pouvez faire un test Postman de création d'issue (ex.: POST http://localhost:3000/projets/1/issues), à l'aide d'un jeton et l'utilisateur devrait être associé à ce dernier lors de la sauvegarde.