import { AuthCookieService, RequestMetadata } from "@cv/auth"; import { Controller, Post, Res } from "@nestjs/common"; import type { Response } from "express"; import { AuthenticationService } from "../authentication.service"; import { RefreshTokenCookie } from "../token/refresh-token-cookie.decorator"; import { RefreshTokenResponseDto } from "../token/refresh-token-response.dto"; import { TokenExpiration } from "../token/token-expiration.type"; @Controller("api/auth") export class AuthenticationController { constructor( private readonly authenticationService: AuthenticationService, private readonly authCookieService: AuthCookieService, ) {} @Post("credentials/refresh") async refreshToken( @RefreshTokenCookie() refresh_token: string, @RequestMetadata() requestMetadata: RequestMetadata, @Res({ passthrough: true }) res: Response, ): Promise { const result = await this.authenticationService.refreshToken( { refresh_token }, requestMetadata, ); this.authCookieService.setAuthCookies( res, result.access_token, result.refresh_token, ); const accessTokenExpiration = TokenExpiration.fromExpiryDate( result.expires_at, ); return new RefreshTokenResponseDto({ expiresAt: accessTokenExpiration.expiresAt.toISOString(), expiresInSeconds: accessTokenExpiration.expiresInSeconds, }); } }