migration to typescript
This commit is contained in:
parent
924000b084
commit
9fde77468a
41 changed files with 11952 additions and 10164 deletions
128
Backend/src/controllers/AuthController.ts
Normal file
128
Backend/src/controllers/AuthController.ts
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
import { Body, Post, Route, Tags, SuccessResponse, Response, Example } from 'tsoa';
|
||||
import { AuthService } from '../services/auth.service';
|
||||
import {
|
||||
LoginRequest,
|
||||
RegisterRequest,
|
||||
RefreshTokenRequest,
|
||||
LoginResponse,
|
||||
RegisterResponse,
|
||||
RefreshTokenResponse
|
||||
} from '../types/auth.types';
|
||||
import { loginSchema, registerSchema, refreshTokenSchema } from '../validators/auth.validator';
|
||||
import { ValidationError } from '../middleware/errorHandler';
|
||||
|
||||
@Route('api/auth')
|
||||
@Tags('Authentication')
|
||||
export class AuthController {
|
||||
private authService = new AuthService();
|
||||
|
||||
/**
|
||||
* User login
|
||||
* @summary Login with username and password
|
||||
* @param body Login credentials
|
||||
* @returns JWT token and user information
|
||||
*/
|
||||
@Post('login')
|
||||
@SuccessResponse('200', 'Login successful')
|
||||
@Response('401', 'Invalid credentials')
|
||||
@Example<LoginResponse>({
|
||||
token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',
|
||||
refreshToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',
|
||||
user: {
|
||||
id: 1,
|
||||
username: 'admin',
|
||||
email: 'admin@elearning.local',
|
||||
role: {
|
||||
code: 'ADMIN',
|
||||
name: {
|
||||
th: 'ผู้ดูแลระบบ',
|
||||
en: 'Administrator'
|
||||
}
|
||||
},
|
||||
profile: {
|
||||
prefix: {
|
||||
th: 'นาย',
|
||||
en: 'Mr.'
|
||||
},
|
||||
first_name: 'Admin',
|
||||
last_name: 'User',
|
||||
avatar_url: undefined
|
||||
}
|
||||
}
|
||||
})
|
||||
public async login(@Body() body: LoginRequest): Promise<LoginResponse> {
|
||||
// Validate input
|
||||
const { error } = loginSchema.validate(body);
|
||||
if (error) {
|
||||
throw new ValidationError(error.details[0].message);
|
||||
}
|
||||
|
||||
return await this.authService.login(body);
|
||||
}
|
||||
|
||||
/**
|
||||
* User registration
|
||||
* @summary Register a new student account
|
||||
* @param body Registration data
|
||||
* @returns Created user information
|
||||
*/
|
||||
@Post('register')
|
||||
@SuccessResponse('201', 'Registration successful')
|
||||
@Response('400', 'Validation error')
|
||||
@Response('409', 'Username or email already exists')
|
||||
@Example<RegisterResponse>({
|
||||
user: {
|
||||
id: 4,
|
||||
username: 'newstudent',
|
||||
email: 'student@example.com',
|
||||
role: {
|
||||
code: 'STUDENT',
|
||||
name: {
|
||||
th: 'นักเรียน',
|
||||
en: 'Student'
|
||||
}
|
||||
},
|
||||
profile: {
|
||||
prefix: {
|
||||
th: 'นาย',
|
||||
en: 'Mr.'
|
||||
},
|
||||
first_name: 'John',
|
||||
last_name: 'Doe'
|
||||
}
|
||||
},
|
||||
message: 'Registration successful'
|
||||
})
|
||||
public async register(@Body() body: RegisterRequest): Promise<RegisterResponse> {
|
||||
// Validate input
|
||||
const { error } = registerSchema.validate(body);
|
||||
if (error) {
|
||||
throw new ValidationError(error.details[0].message);
|
||||
}
|
||||
|
||||
return await this.authService.register(body);
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh access token
|
||||
* @summary Get a new access token using refresh token
|
||||
* @param body Refresh token
|
||||
* @returns New access token and refresh token
|
||||
*/
|
||||
@Post('refresh')
|
||||
@SuccessResponse('200', 'Token refreshed')
|
||||
@Response('401', 'Invalid or expired refresh token')
|
||||
@Example<RefreshTokenResponse>({
|
||||
token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',
|
||||
refreshToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
|
||||
})
|
||||
public async refreshToken(@Body() body: RefreshTokenRequest): Promise<RefreshTokenResponse> {
|
||||
// Validate input
|
||||
const { error } = refreshTokenSchema.validate(body);
|
||||
if (error) {
|
||||
throw new ValidationError(error.details[0].message);
|
||||
}
|
||||
|
||||
return await this.authService.refreshToken(body.refreshToken);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,82 +0,0 @@
|
|||
const authService = require('../services/auth.service');
|
||||
const logger = require('../config/logger');
|
||||
|
||||
class AuthController {
|
||||
/**
|
||||
* Register a new user
|
||||
* POST /api/auth/register
|
||||
*/
|
||||
async register(req, res, next) {
|
||||
try {
|
||||
const { username, email, password } = req.body;
|
||||
|
||||
const result = await authService.register({
|
||||
username,
|
||||
email,
|
||||
password,
|
||||
});
|
||||
|
||||
logger.info(`User registered: ${username}`);
|
||||
|
||||
res.status(201).json(result);
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Login user
|
||||
* POST /api/auth/login
|
||||
*/
|
||||
async login(req, res, next) {
|
||||
try {
|
||||
const { username, email, password } = req.body;
|
||||
|
||||
const result = await authService.login({
|
||||
username,
|
||||
email,
|
||||
password,
|
||||
});
|
||||
|
||||
logger.info(`User logged in: ${result.user.username}`);
|
||||
|
||||
res.status(200).json(result);
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get current user profile
|
||||
* GET /api/auth/me
|
||||
*/
|
||||
async getProfile(req, res, next) {
|
||||
try {
|
||||
const user = await authService.getProfile(req.user.id);
|
||||
|
||||
res.status(200).json(user);
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Logout user
|
||||
* POST /api/auth/logout
|
||||
*/
|
||||
async logout(req, res, next) {
|
||||
try {
|
||||
// In a real implementation, you would invalidate the token
|
||||
// For now, just return success
|
||||
logger.info(`User logged out: ${req.user.username}`);
|
||||
|
||||
res.status(200).json({
|
||||
message: 'Logged out successfully',
|
||||
});
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = new AuthController();
|
||||
Loading…
Add table
Add a link
Reference in a new issue