import { Controller, Post, Patch, Body, UseGuards, Request, Get, } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger'; import { AuthGuard } from '@nestjs/passport'; import { AuthService } from './auth.service'; import { RegisterDto } from './dto/register.dto'; import { LoginDto } from './dto/login.dto'; import { SwitchOrgDto } from './dto/switch-org.dto'; import { JwtAuthGuard } from './guards/jwt-auth.guard'; import { AllowViewer } from '../../common/decorators/allow-viewer.decorator'; @ApiTags('auth') @Controller('auth') export class AuthController { constructor(private authService: AuthService) {} @Post('register') @ApiOperation({ summary: 'Register a new user' }) async register(@Body() dto: RegisterDto) { return this.authService.register(dto); } @Post('login') @ApiOperation({ summary: 'Login with email and password' }) @UseGuards(AuthGuard('local')) async login(@Request() req: any, @Body() _dto: LoginDto) { const ip = req.headers['x-forwarded-for'] || req.ip; const ua = req.headers['user-agent']; return this.authService.login(req.user, ip, ua); } @Get('profile') @ApiOperation({ summary: 'Get current user profile' }) @ApiBearerAuth() @UseGuards(JwtAuthGuard) async getProfile(@Request() req: any) { return this.authService.getProfile(req.user.sub); } @Patch('intro-seen') @ApiOperation({ summary: 'Mark the how-to intro as seen for the current user' }) @ApiBearerAuth() @UseGuards(JwtAuthGuard) @AllowViewer() async markIntroSeen(@Request() req: any) { await this.authService.markIntroSeen(req.user.sub); return { success: true }; } @Post('switch-org') @ApiOperation({ summary: 'Switch active organization' }) @ApiBearerAuth() @UseGuards(JwtAuthGuard) @AllowViewer() async switchOrg(@Request() req: any, @Body() dto: SwitchOrgDto) { const ip = req.headers['x-forwarded-for'] || req.ip; const ua = req.headers['user-agent']; return this.authService.switchOrganization(req.user.sub, dto.organizationId, ip, ua); } }