Files
crm-server/src/controllers/admin.controller.js
richardtekula 3aba6c2955 refactor: Move audit logging from controllers into services
Add auditContext parameter to service mutating functions. Services now
call audit log functions internally when auditContext is provided.
Controllers pass { userId, ipAddress, userAgent } and no longer import
audit service or fetch extra data for audit purposes.

Files modified:
- 10 service files: added audit imports and auditContext parameter
- 9 controller files: removed audit imports and calls

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 07:39:41 +01:00

213 lines
5.3 KiB
JavaScript

import * as adminService from '../services/admin.service.js';
import * as statusService from '../services/status.service.js';
import { triggerEventNotifications } from '../cron/index.js';
/**
* Vytvorenie nového usera s automatic temporary password (admin only)
* Ak je poskytnutý email a emailPassword, automaticky sa fetchne JMAP account ID
* POST /api/admin/users
*/
export const createUser = async (req, res, next) => {
const { username, email, emailPassword, firstName, lastName, role } = req.body;
const adminId = req.userId;
const ipAddress = req.ip || req.connection.remoteAddress;
const userAgent = req.headers['user-agent'];
try {
const result = await adminService.createUser(
username,
firstName,
lastName,
role,
email,
emailPassword,
{ userId: adminId, ipAddress, userAgent }
);
res.status(201).json({
success: true,
data: {
user: {
id: result.user.id,
username: result.user.username,
firstName: result.user.firstName,
lastName: result.user.lastName,
role: result.user.role,
emailSetup: result.emailAccountCreated,
emailAccount: result.emailAccountData,
tempPassword: result.tempPassword,
},
},
message: result.emailAccountCreated
? result.emailAccountData.shared
? 'Používateľ vytvorený a pripojený k existujúcemu zdieľanému email účtu.'
: 'Používateľ úspešne vytvorený s novým emailovým účtom.'
: 'Používateľ úspešne vytvorený. Email môže byť nastavený neskôr.',
});
} catch (error) {
next(error);
}
};
/**
* Zoznam všetkých userov (admin only)
* GET /api/admin/users
*/
export const getAllUsers = async (req, res, next) => {
try {
const allUsers = await adminService.getAllUsers();
res.status(200).json({
success: true,
count: allUsers.length,
data: allUsers,
});
} catch (error) {
next(error);
}
};
/**
* Získanie konkrétneho usera (admin only)
* GET /api/admin/users/:userId
*/
export const getUser = async (req, res, next) => {
const { userId } = req.params;
try {
const user = await adminService.getUserById(userId);
res.status(200).json({
success: true,
data: {
user,
},
});
} catch (error) {
next(error);
}
};
/**
* Zmena role usera (admin only)
* PATCH /api/admin/users/:userId/role
*/
export const changeUserRole = async (req, res, next) => {
const { userId } = req.params;
const { role } = req.body;
const adminId = req.userId;
const ipAddress = req.ip || req.connection.remoteAddress;
const userAgent = req.headers['user-agent'];
try {
const result = await adminService.changeUserRole(userId, role, { userId: adminId, ipAddress, userAgent });
res.status(200).json({
success: true,
data: result,
message: 'Rola používateľa bola zmenená',
});
} catch (error) {
next(error);
}
};
/**
* Update user details (admin only)
* PATCH /api/admin/users/:userId
*/
export const updateUser = async (req, res, next) => {
const { userId } = req.params;
const { firstName, lastName } = req.body;
try {
const updated = await adminService.updateUser(userId, { firstName, lastName });
res.status(200).json({
success: true,
data: updated,
message: 'Používateľ bol aktualizovaný',
});
} catch (error) {
next(error);
}
};
/**
* Reset user password (admin only)
* POST /api/admin/users/:userId/reset-password
*/
export const resetUserPassword = async (req, res, next) => {
const { userId } = req.params;
try {
const result = await adminService.resetUserPassword(userId);
res.status(200).json({
success: true,
data: { tempPassword: result.tempPassword },
message: 'Heslo bolo resetované',
});
} catch (error) {
next(error);
}
};
/**
* Zmazanie usera (admin only)
* DELETE /api/admin/users/:userId
*/
export const deleteUser = async (req, res, next) => {
const { userId } = req.params;
const adminId = req.userId;
const ipAddress = req.ip || req.connection.remoteAddress;
const userAgent = req.headers['user-agent'];
try {
const result = await adminService.deleteUser(userId, { userId: adminId, ipAddress, userAgent });
res.status(200).json({
success: true,
message: 'Používateľ bol zmazaný',
deletedEmailAccounts: result.deletedEmailAccounts,
});
} catch (error) {
next(error);
}
};
/**
* Get server status (admin only)
* GET /api/admin/server-status
*/
export const getServerStatus = async (req, res, next) => {
try {
const status = await statusService.getServerStatus();
res.status(200).json({
success: true,
data: status,
});
} catch (error) {
next(error);
}
};
/**
* Manually trigger event notifications (admin only, for testing)
* POST /api/admin/trigger-notifications
*/
export const triggerNotifications = async (req, res, next) => {
try {
const stats = await triggerEventNotifications();
res.status(200).json({
success: true,
data: stats,
message: `Notifikácie odoslané: ${stats.sent}, neúspešné: ${stats.failed}, preskočené: ${stats.skipped}`,
});
} catch (error) {
next(error);
}
};