import { Get, Body, Post, Route, Tags, SuccessResponse, Response, Example, Controller, Security, Request } from 'tsoa'; import { UserService } from '../services/user.service'; import { UserResponse, ProfileResponse, ProfileUpdate, ProfileUpdateResponse, ChangePasswordRequest, ChangePasswordResponse } from '../types/user.types'; import { ChangePassword } from '../types/auth.types'; import { profileUpdateSchema, changePasswordSchema } from "../validators/user.validator"; import { ValidationError } from '../middleware/errorHandler'; @Route('api/user') @Tags('Usermanagement') export class UserController { private userService = new UserService(); /** * Get current user profile * @summary Retrieve authenticated user's profile information * @param request Express request object with JWT token in Authorization header */ @Get('me') @SuccessResponse('200', 'User found') @Response('404', 'User not found') @Response('401', 'Invalid or expired token') @Security('jwt') public async getMe(@Request() request: any): Promise { // Extract token from Authorization header const token = request.headers.authorization?.replace('Bearer ', ''); if (!token) { throw new ValidationError('No token provided'); } return await this.userService.getUserProfile(token); } /** * Change password * @summary Change user password using old password * @param request Express request object with JWT token in Authorization header * @param body Old password and new password * @returns Success message */ @Post('change-password') @Security('jwt') @SuccessResponse('200', 'Password changed successfully') @Response('401', 'Invalid old password or token') @Response('400', 'Validation error') public async changePassword(@Request() request: any, @Body() body: ChangePassword): Promise { const { error } = changePasswordSchema.validate(body); if (error) { throw new ValidationError(error.details[0].message); } const token = request.headers.authorization?.replace('Bearer ', ''); if (!token) { throw new ValidationError('No token provided'); } return await this.userService.changePassword(token, body.oldPassword, body.newPassword); } }