https://project.mdnd-it.cc/work_packages/94
This commit is contained in:
2025-08-23 04:25:28 +02:00
parent 725516ad6c
commit 19cfa031d0
25823 changed files with 1095587 additions and 2801760 deletions
@@ -0,0 +1,168 @@
import { Router } from 'express';
import { authRequired } from '../../Application/Services/AuthMiddleware';
import { container } from '../../Application/Services/DIContainer';
import { ErrorResponseService } from '../../Application/Services/ErrorResponseService';
import { ValidationMiddleware } from '../../Application/Services/ValidationMiddleware';
import { GeneralSearchService } from '../../Application/Search/Generalsearch';
import { logRequest, logError, logAuth, logWarning } from '../../Application/Services/Logger';
const userRouter = Router();
// Create search service that isn't in the container yet
const searchService = new GeneralSearchService(container.userRepository, container.organizationRepository, container.deckRepository);
// Login endpoint
userRouter.post('/login',
ValidationMiddleware.combine([
ValidationMiddleware.validateRequiredFields(['username', 'password']),
ValidationMiddleware.validateStringLength({
username: { min: 3, max: 50 },
password: { min: 6, max: 100 }
})
]),
async (req, res) => {
try {
logRequest('Login endpoint accessed', req, res, { username: req.body.username });
const { username, password } = req.body;
const result = await container.loginCommandHandler.execute({ username, password }, res);
if (result) {
logAuth('User login successful', result.user.id, { username: result.user.username }, req, res);
res.json(result);
} else {
return ErrorResponseService.sendUnauthorized(res, 'Invalid username or password');
}
} catch (error) {
logError('Login endpoint error', error as Error, req, res);
if (error instanceof Error) {
if (error.message.includes('Invalid username')) {
return ErrorResponseService.sendUnauthorized(res, 'Invalid username or password');
}
if (error.message.includes('Invalid password')) {
return ErrorResponseService.sendUnauthorized(res, 'Invalid username or password');
}
if (error.message.includes('not verified')) {
return ErrorResponseService.sendUnauthorized(res, 'Please verify your email address');
}
if (error.message.includes('deactivated')) {
return ErrorResponseService.sendUnauthorized(res, 'Account has been deactivated');
}
}
return ErrorResponseService.sendInternalServerError(res);
}
});
// Create user endpoint
userRouter.post('/create',
ValidationMiddleware.combine([
ValidationMiddleware.validateRequiredFields(['username', 'email', 'password']),
ValidationMiddleware.validateEmailFormat(['email']),
ValidationMiddleware.validateStringLength({
username: { min: 3, max: 50 },
password: { min: 6, max: 100 }
})
]),
async (req, res) => {
try {
logRequest('Create user endpoint accessed', req, res, {
username: req.body.username,
email: req.body.email
});
const result = await container.createUserCommandHandler.execute(req.body);
logRequest('User created successfully', req, res, {
userId: result.id,
username: result.username
});
res.status(201).json(result);
} catch (error) {
logError('Create user endpoint error', error as Error, req, res);
if (error instanceof Error) {
if (error.message.includes('already exists')) {
return ErrorResponseService.sendConflict(res, error.message);
}
if (error.message.includes('validation')) {
return ErrorResponseService.sendBadRequest(res, error.message);
}
}
return ErrorResponseService.sendInternalServerError(res);
}
});
// Get user profile (current user)
userRouter.get('/profile', authRequired, async (req, res) => {
try {
const userId = (req as any).user.userId;
logRequest('Get user profile endpoint accessed', req, res, { userId });
const result = await container.getUserByIdQueryHandler.execute({ id: userId });
if (!result) {
logWarning('User profile not found', { userId }, req, res);
return ErrorResponseService.sendNotFound(res, 'User not found');
}
logRequest('User profile retrieved successfully', req, res, {
userId,
username: result.username
});
res.json(result);
} catch (error) {
logError('Get user profile endpoint error', error as Error, req, res);
return ErrorResponseService.sendInternalServerError(res);
}
});
// Update user profile (current user)
userRouter.patch('/profile', authRequired, async (req, res) => {
try {
const userId = (req as any).user.userId;
logRequest('Update user profile endpoint accessed', req, res, {
userId,
fieldsToUpdate: Object.keys(req.body)
});
const result = await container.updateUserCommandHandler.execute({ id: userId, ...req.body });
if (!result) {
return ErrorResponseService.sendNotFound(res, 'User not found');
}
logRequest('User profile updated successfully', req, res, {
userId,
username: result.username
});
res.json(result);
} catch (error) {
logError('Update user profile endpoint error', error as Error, req, res);
if (error instanceof Error) {
if (error.message.includes('already exists')) {
return ErrorResponseService.sendConflict(res, error.message);
}
if (error.message.includes('validation')) {
return ErrorResponseService.sendBadRequest(res, error.message);
}
}
return ErrorResponseService.sendInternalServerError(res);
}
});
export default userRouter;