92 lines
3.0 KiB
TypeScript
92 lines
3.0 KiB
TypeScript
// File: src/common/auth/auth.controller.ts
|
|
// บันทึกการแก้ไข: เพิ่ม Type ให้ req และแก้ไข Import (Fix TS7006)
|
|
|
|
import {
|
|
Controller,
|
|
Post,
|
|
Body,
|
|
Get,
|
|
UseGuards,
|
|
UnauthorizedException,
|
|
Req,
|
|
HttpCode,
|
|
HttpStatus,
|
|
} from '@nestjs/common';
|
|
import { Throttle } from '@nestjs/throttler';
|
|
import { AuthService } from './auth.service.js';
|
|
import { LoginDto } from './dto/login.dto.js';
|
|
import { RegisterDto } from './dto/register.dto.js';
|
|
import { JwtAuthGuard } from '../guards/jwt-auth.guard.js';
|
|
import { JwtRefreshGuard } from '../guards/jwt-refresh.guard.js';
|
|
import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger';
|
|
import { Request } from 'express'; // ✅ Import Request
|
|
|
|
// สร้าง Interface สำหรับ Request ที่มี User (เพื่อให้ TS รู้จัก req.user)
|
|
interface RequestWithUser extends Request {
|
|
user: any;
|
|
}
|
|
|
|
@ApiTags('Authentication')
|
|
@Controller('auth')
|
|
export class AuthController {
|
|
constructor(private authService: AuthService) {}
|
|
|
|
@Post('login')
|
|
@Throttle({ default: { limit: 5, ttl: 60000 } })
|
|
@HttpCode(HttpStatus.OK)
|
|
@ApiOperation({ summary: 'เข้าสู่ระบบเพื่อรับ Access & Refresh Token' })
|
|
async login(@Body() loginDto: LoginDto) {
|
|
const user = await this.authService.validateUser(
|
|
loginDto.username,
|
|
loginDto.password,
|
|
);
|
|
|
|
if (!user) {
|
|
throw new UnauthorizedException('Invalid credentials');
|
|
}
|
|
|
|
return this.authService.login(user);
|
|
}
|
|
|
|
@Post('register-admin')
|
|
@UseGuards(JwtAuthGuard)
|
|
@ApiBearerAuth()
|
|
@ApiOperation({ summary: 'สร้างบัญชีผู้ใช้ใหม่ (Admin Only)' })
|
|
async register(@Body() registerDto: RegisterDto) {
|
|
return this.authService.register(registerDto);
|
|
}
|
|
|
|
@UseGuards(JwtRefreshGuard)
|
|
@Post('refresh')
|
|
@HttpCode(HttpStatus.OK)
|
|
@ApiOperation({ summary: 'ขอ Access Token ใหม่ด้วย Refresh Token' })
|
|
async refresh(@Req() req: RequestWithUser) {
|
|
// ✅ ระบุ Type ชัดเจน
|
|
return this.authService.refreshToken(req.user.sub, req.user.refreshToken);
|
|
}
|
|
|
|
@UseGuards(JwtAuthGuard)
|
|
@Post('logout')
|
|
@HttpCode(HttpStatus.OK)
|
|
@ApiBearerAuth()
|
|
@ApiOperation({ summary: 'ออกจากระบบ (Revoke Token)' })
|
|
async logout(@Req() req: RequestWithUser) {
|
|
// ✅ ระบุ Type ชัดเจน
|
|
const token = req.headers.authorization?.split(' ')[1];
|
|
// ต้องเช็คว่ามี token หรือไม่ เพื่อป้องกัน runtime error
|
|
if (!token) {
|
|
return { message: 'No token provided' };
|
|
}
|
|
return this.authService.logout(req.user.sub, token);
|
|
}
|
|
|
|
@UseGuards(JwtAuthGuard)
|
|
@Get('profile')
|
|
@ApiBearerAuth()
|
|
@ApiOperation({ summary: 'ดึงข้อมูลผู้ใช้ปัจจุบัน' })
|
|
getProfile(@Req() req: RequestWithUser) {
|
|
// ✅ ระบุ Type ชัดเจน
|
|
return req.user;
|
|
}
|
|
}
|