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>
213 lines
5.3 KiB
JavaScript
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);
|
|
}
|
|
};
|