imkFinal/backend/src/auth/auth.controller.ts
2025-02-25 20:41:23 +01:00

158 lines
4.5 KiB
TypeScript

import {
Controller,
Post,
Body,
UnauthorizedException,
UseGuards,
Get,
Request,
Logger,
} from '@nestjs/common';
import { AuthService } from './auth.service';
import { LoginDto } from '../dto/login.dto';
import { CreateUserDto } from '../dto/create-user.dto';
import { JwtAuthGuard } from './jwt-auth.guard';
import { AdminGuard } from './admin.guard';
//@UseGuards(JwtAuthGuard, AdminGuard)
@Controller('auth')
export class AuthController {
private readonly logger = new Logger(AuthController.name);
constructor(private authService: AuthService) {
this.logger.log('AuthController initialized');
}
@Post('login')
async login(@Body() loginDto: LoginDto) {
this.logger.log('=== Login endpoint hit ===');
this.logger.debug('Raw request body:', {
username: loginDto.username,
email: loginDto.email,
hasPassword: !!loginDto.password,
});
const email = loginDto.getEmail();
this.logger.debug('Normalized login request:', {
email,
hasPassword: !!loginDto.password,
});
try {
this.logger.debug('Calling AuthService.validateUser...');
const user = await this.authService.validateUser(
email,
loginDto.password,
);
if (!user) {
this.logger.warn(`Login failed: Invalid credentials for ${email}`);
throw new UnauthorizedException('Invalid email or password');
}
this.logger.debug('User validated successfully:', {
id: user.id,
email: user.email,
name: user.name,
isAdmin: user.isAdmin,
});
this.logger.debug('Calling AuthService.login...');
const result = await this.authService.login(user);
this.logger.debug('Login successful, returning response:', {
hasAccessToken: !!result.access_token,
user: {
id: result.user.id,
email: result.user.email,
name: result.user.name,
isAdmin: result.user.isAdmin,
},
});
return result;
} catch (error) {
if (error instanceof UnauthorizedException) {
throw error;
}
this.logger.error('Login failed:', {
error: error.message,
stack: error.stack,
body: {
username: loginDto.username,
email: loginDto.email,
hasPassword: !!loginDto.password,
},
});
throw new UnauthorizedException('Invalid email or password');
}
}
@Post('register')
async register(@Body() createUserDto: CreateUserDto) {
console.log('=== Registration endpoint hit ===');
this.logger.log('=== Registration endpoint hit ===');
console.log('Registration request received:', createUserDto);
this.logger.log('Registration request received:', {
email: createUserDto.email,
name: createUserDto.name,
hasPassword: !!createUserDto.password
});
try {
console.log('Calling AuthService.createUser...');
this.logger.log('Calling AuthService.createUser...');
const result = await this.authService.createUser(createUserDto);
console.log('Registration successful:', result);
this.logger.log('Registration successful:', {
id: result.id,
email: result.email,
name: result.name,
});
return result;
} catch (error) {
console.error('Registration failed:', error);
this.logger.error('Registration failed:', {
error: error.message,
code: error.code,
command: error.command,
stack: error.stack,
});
throw error;
}
}
//@UseGuards(JwtAuthGuard)
@Post('create-admin')
async createAdmin(@Body() createUserDto: CreateUserDto) {
this.logger.log('=== Create admin endpoint hit ===');
this.logger.debug('Admin creation request received:', {
email: createUserDto.email,
name: createUserDto.name,
});
try {
this.logger.debug('Calling AuthService.createUser with isAdmin=true...');
const result = await this.authService.createUser(createUserDto, true);
this.logger.debug('Admin creation successful:', {
id: result.id,
email: result.email,
name: result.name,
});
return result;
} catch (error) {
this.logger.error('Admin creation failed:', {
error: error.message,
stack: error.stack,
});
throw error;
}
}
@UseGuards(JwtAuthGuard)
@Get('user-info')
async getUserInfo(@Request() req) {
return this.authService.getUserInfo(req.user.userId);
}
}