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>
461 lines
11 KiB
JavaScript
461 lines
11 KiB
JavaScript
import * as companyService from '../services/company.service.js';
|
|
import * as noteService from '../services/note.service.js';
|
|
import * as companyReminderService from '../services/company-reminder.service.js';
|
|
import * as companyEmailService from '../services/company-email.service.js';
|
|
|
|
/**
|
|
* Get all companies
|
|
* GET /api/companies?search=query
|
|
* Members only see companies they are assigned to
|
|
*/
|
|
export const getAllCompanies = async (req, res, next) => {
|
|
try {
|
|
const { search } = req.query;
|
|
const userId = req.user?.id;
|
|
const userRole = req.user?.role;
|
|
|
|
const companies = await companyService.getAllCompanies(search, userId, userRole);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
count: companies.length,
|
|
data: companies,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Get company by ID
|
|
* GET /api/companies/:companyId
|
|
*/
|
|
export const getCompanyById = async (req, res, next) => {
|
|
try {
|
|
const { companyId } = req.params;
|
|
|
|
const company = await companyService.getCompanyById(companyId);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: company,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Get company email threads aggregated across user's email accounts
|
|
* GET /api/companies/:companyId/email-threads
|
|
*/
|
|
export const getCompanyEmailThreads = async (req, res, next) => {
|
|
try {
|
|
const userId = req.userId;
|
|
const { companyId } = req.params;
|
|
|
|
// Ensure company exists
|
|
await companyService.getCompanyById(companyId);
|
|
|
|
const result = await companyEmailService.getCompanyEmailThreads(companyId, userId);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: result,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Get unread email counts grouped by company for current user
|
|
* GET /api/companies/email-unread
|
|
*/
|
|
export const getCompanyUnreadCounts = async (req, res, next) => {
|
|
try {
|
|
const userId = req.userId;
|
|
const counts = await companyEmailService.getCompanyUnreadCounts(userId);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: counts,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Get company with relations (projects, todos, notes)
|
|
* GET /api/companies/:companyId/details
|
|
*/
|
|
export const getCompanyWithRelations = async (req, res, next) => {
|
|
try {
|
|
const { companyId } = req.params;
|
|
|
|
const company = await companyService.getCompanyWithRelations(companyId);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: company,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Create new company
|
|
* POST /api/companies
|
|
* Body: { name, description, address, city, country, phone, email, website }
|
|
*/
|
|
export const createCompany = async (req, res, next) => {
|
|
try {
|
|
const userId = req.userId;
|
|
const data = req.body;
|
|
|
|
const company = await companyService.createCompany(userId, data, { userId, ipAddress: req.ip, userAgent: req.headers['user-agent'] });
|
|
|
|
res.status(201).json({
|
|
success: true,
|
|
data: company,
|
|
message: 'Firma bola vytvorená',
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Update company
|
|
* PATCH /api/companies/:companyId
|
|
* Body: { name, description, address, city, country, phone, email, website }
|
|
*/
|
|
export const updateCompany = async (req, res, next) => {
|
|
try {
|
|
const userId = req.userId;
|
|
const { companyId } = req.params;
|
|
const data = req.body;
|
|
|
|
const company = await companyService.updateCompany(companyId, data, { userId, ipAddress: req.ip, userAgent: req.headers['user-agent'] });
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: company,
|
|
message: 'Firma bola aktualizovaná',
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Delete company
|
|
* DELETE /api/companies/:companyId
|
|
*/
|
|
export const deleteCompany = async (req, res, next) => {
|
|
try {
|
|
const { companyId } = req.params;
|
|
const userId = req.userId;
|
|
|
|
const result = await companyService.deleteCompany(companyId, { userId, ipAddress: req.ip, userAgent: req.headers['user-agent'] });
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
message: result.message,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Get company notes
|
|
* GET /api/companies/:companyId/notes
|
|
*/
|
|
export const getCompanyNotes = async (req, res, next) => {
|
|
try {
|
|
const { companyId } = req.params;
|
|
|
|
const notes = await noteService.getNotesByCompanyId(companyId);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
count: notes.length,
|
|
data: notes,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Add company note
|
|
* POST /api/companies/:companyId/notes
|
|
*/
|
|
export const addCompanyNote = async (req, res, next) => {
|
|
try {
|
|
const userId = req.userId;
|
|
const { companyId } = req.params;
|
|
const { content, dueDate } = req.body;
|
|
|
|
const note = await noteService.createNote(userId, {
|
|
content,
|
|
companyId,
|
|
dueDate,
|
|
});
|
|
|
|
res.status(201).json({
|
|
success: true,
|
|
data: note,
|
|
message: 'Poznámka bola pridaná',
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Update company note
|
|
* PATCH /api/companies/:companyId/notes/:noteId
|
|
*/
|
|
export const updateCompanyNote = async (req, res, next) => {
|
|
try {
|
|
const { noteId } = req.params;
|
|
const { content, dueDate } = req.body;
|
|
|
|
const note = await noteService.updateNote(noteId, {
|
|
content,
|
|
dueDate,
|
|
});
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: note,
|
|
message: 'Poznámka bola aktualizovaná',
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Delete company note
|
|
* DELETE /api/companies/:companyId/notes/:noteId
|
|
*/
|
|
export const deleteCompanyNote = async (req, res, next) => {
|
|
try {
|
|
const { noteId } = req.params;
|
|
|
|
const result = await noteService.deleteNote(noteId);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
message: result.message,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Company reminders
|
|
* CRUD for /api/companies/:companyId/reminders
|
|
*/
|
|
export const getCompanyReminders = async (req, res, next) => {
|
|
try {
|
|
const { companyId } = req.params;
|
|
|
|
const reminders = await companyReminderService.getRemindersByCompanyId(companyId);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
count: reminders.length,
|
|
data: reminders,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
export const createCompanyReminder = async (req, res, next) => {
|
|
try {
|
|
const userId = req.userId;
|
|
const { companyId } = req.params;
|
|
const { description, dueDate, isChecked } = req.body;
|
|
|
|
const reminder = await companyReminderService.createReminder(companyId, { description, dueDate, isChecked }, { userId, ipAddress: req.ip, userAgent: req.headers['user-agent'] });
|
|
|
|
res.status(201).json({
|
|
success: true,
|
|
data: reminder,
|
|
message: 'Reminder bol pridaný',
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
export const updateCompanyReminder = async (req, res, next) => {
|
|
try {
|
|
const userId = req.userId;
|
|
const { companyId, reminderId } = req.params;
|
|
const { description, dueDate, isChecked } = req.body;
|
|
|
|
const reminder = await companyReminderService.updateReminder(companyId, reminderId, { description, dueDate, isChecked }, { userId, ipAddress: req.ip, userAgent: req.headers['user-agent'] });
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: reminder,
|
|
message: 'Reminder bol aktualizovaný',
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
export const deleteCompanyReminder = async (req, res, next) => {
|
|
try {
|
|
const userId = req.userId;
|
|
const { companyId, reminderId } = req.params;
|
|
|
|
const result = await companyReminderService.deleteReminder(companyId, reminderId, { userId, ipAddress: req.ip, userAgent: req.headers['user-agent'] });
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
message: result.message,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
export const getReminderSummary = async (req, res, next) => {
|
|
try {
|
|
const userId = req.user?.id;
|
|
const userRole = req.user?.role;
|
|
const summary = await companyReminderService.getReminderSummary(userId, userRole);
|
|
res.status(200).json({
|
|
success: true,
|
|
data: summary,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
export const getReminderCountsByCompany = async (req, res, next) => {
|
|
try {
|
|
const userId = req.user?.id;
|
|
const userRole = req.user?.role;
|
|
const counts = await companyReminderService.getReminderCountsByCompany(userId, userRole);
|
|
res.status(200).json({
|
|
success: true,
|
|
data: counts,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
export const getUpcomingReminders = async (req, res, next) => {
|
|
try {
|
|
const userId = req.user?.id;
|
|
const userRole = req.user?.role;
|
|
const reminders = await companyReminderService.getUpcomingReminders(userId, userRole);
|
|
res.status(200).json({
|
|
success: true,
|
|
count: reminders.length,
|
|
data: reminders,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Get company users (team members)
|
|
* GET /api/companies/:companyId/users
|
|
*/
|
|
export const getCompanyUsers = async (req, res, next) => {
|
|
try {
|
|
const { companyId } = req.params;
|
|
|
|
const users = await companyService.getCompanyUsers(companyId);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
count: users.length,
|
|
data: users,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Assign user to company
|
|
* POST /api/companies/:companyId/users
|
|
* Body: { userId, role }
|
|
*/
|
|
export const assignUserToCompany = async (req, res, next) => {
|
|
try {
|
|
const currentUserId = req.userId;
|
|
const { companyId } = req.params;
|
|
const { userId, role } = req.body;
|
|
|
|
const assignment = await companyService.assignUserToCompany(companyId, userId, currentUserId, role, { userId: currentUserId, ipAddress: req.ip, userAgent: req.headers['user-agent'] });
|
|
|
|
res.status(201).json({
|
|
success: true,
|
|
data: assignment,
|
|
message: 'Používateľ bol priradený k firme',
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Remove user from company
|
|
* DELETE /api/companies/:companyId/users/:userId
|
|
*/
|
|
export const removeUserFromCompany = async (req, res, next) => {
|
|
try {
|
|
const currentUserId = req.userId;
|
|
const { companyId, userId } = req.params;
|
|
|
|
const result = await companyService.removeUserFromCompany(companyId, userId, { userId: currentUserId, ipAddress: req.ip, userAgent: req.headers['user-agent'] });
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
message: result.message,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Update user role on company
|
|
* PATCH /api/companies/:companyId/users/:userId
|
|
* Body: { role }
|
|
*/
|
|
export const updateUserRoleOnCompany = async (req, res, next) => {
|
|
try {
|
|
const { companyId, userId } = req.params;
|
|
const { role } = req.body;
|
|
|
|
const assignment = await companyService.updateUserRoleOnCompany(companyId, userId, role);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: assignment,
|
|
message: 'Rola používateľa bola aktualizovaná',
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|