import { Body, Controller, Get, HttpCode, Post, Req, UseGuards } from "@nestjs/common"; import { ApiBearerAuth, ApiTags } from "@nestjs/swagger"; import type { Request } from "express"; import { AuthService } from "./auth.service.js"; import { LoginDto } from "./dto/login.dto.js"; import { RefreshDto } from "./dto/refresh.dto.js"; import { JwtAuthGuard } from "./jwt-auth.guard.js"; import { CurrentUser } from "./decorators/current-user.decorator.js"; import type { EdenAuthenticatedUser } from "./jwt-auth.guard.js"; function requestContext(req: Request) { return { ipAddress: req.ip ?? null, userAgent: req.headers["user-agent"] ?? null, }; } @ApiTags("auth") @Controller("v1/auth") export class AuthController { constructor(private readonly auth: AuthService) {} @Post("login") @HttpCode(200) async login(@Body() dto: LoginDto, @Req() req: Request) { return this.auth.login(dto.email, dto.password, dto.applicationKey, requestContext(req)); } @Post("refresh") @HttpCode(200) async refresh(@Body() dto: RefreshDto, @Req() req: Request) { return this.auth.refresh(dto.refreshToken, requestContext(req)); } @Post("logout") @HttpCode(204) async logout(@Body() dto: RefreshDto, @Req() req: Request) { await this.auth.logout(dto.refreshToken, requestContext(req)); } @Get("me") @ApiBearerAuth() @UseGuards(JwtAuthGuard) async me(@CurrentUser() user: EdenAuthenticatedUser) { return this.auth.getProfile(user.id); } }