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.
- 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 { - Installez les types de
express, soit le framework derrière NestJS. Nous aurons besoin du type "Request".npm install @types/express - Importez le type
Requestdeexpressimport { ProjetsService } from '../projets/projets.service';
import { EntityNotFoundError } from 'typeorm';
import { AuthGuard } from '@nestjs/passport';
import type { Request } from 'express';
//... - 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'utilisateursrc/issues/issues.controller.ts@Post()
async create(@Param('projetId') projetId: string,
@Body() createIssueDto: CreateIssueDto,
@Req() request: Request) {
const user = request.user as Utilisateur;
//... - 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);
} - 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.