diff --git a/src/controllers/company.controller.js b/src/controllers/company.controller.js index 47323f2..e3a6e48 100644 --- a/src/controllers/company.controller.js +++ b/src/controllers/company.controller.js @@ -295,3 +295,29 @@ export const deleteCompanyReminder = async (req, res) => { res.status(error.statusCode || 500).json(errorResponse); } }; + +export const getReminderSummary = async (_req, res) => { + try { + const summary = await companyReminderService.getReminderSummary(); + res.status(200).json({ + success: true, + data: summary, + }); + } catch (error) { + const errorResponse = formatErrorResponse(error, process.env.NODE_ENV === 'development'); + res.status(error.statusCode || 500).json(errorResponse); + } +}; + +export const getReminderCountsByCompany = async (_req, res) => { + try { + const counts = await companyReminderService.getReminderCountsByCompany(); + res.status(200).json({ + success: true, + data: counts, + }); + } catch (error) { + const errorResponse = formatErrorResponse(error, process.env.NODE_ENV === 'development'); + res.status(error.statusCode || 500).json(errorResponse); + } +}; diff --git a/src/routes/company.routes.js b/src/routes/company.routes.js index 120c075..c999d4e 100644 --- a/src/routes/company.routes.js +++ b/src/routes/company.routes.js @@ -10,6 +10,10 @@ const router = express.Router(); // All company routes require authentication router.use(authenticate); +// Reminder summaries (must be before :companyId routes) +router.get('/reminders/summary', companyController.getReminderSummary); +router.get('/reminders/counts', companyController.getReminderCountsByCompany); + /** * Company management */ diff --git a/src/services/company-reminder.service.js b/src/services/company-reminder.service.js index 68d3913..ecc7860 100644 --- a/src/services/company-reminder.service.js +++ b/src/services/company-reminder.service.js @@ -1,6 +1,6 @@ import { db } from '../config/database.js'; import { companies, companyReminders } from '../db/schema.js'; -import { eq, desc } from 'drizzle-orm'; +import { eq, desc, sql } from 'drizzle-orm'; import { NotFoundError, BadRequestError } from '../utils/errors.js'; const ensureCompanyExists = async (companyId) => { @@ -100,3 +100,34 @@ export const deleteReminder = async (companyId, reminderId) => { return { success: true, message: 'Reminder bol odstránený' }; }; + +export const getReminderSummary = async () => { + const [row] = await db + .select({ + total: sql`COUNT(*)::int`, + active: sql`COUNT(*) FILTER (WHERE ${companyReminders.isChecked} = false)::int`, + completed: sql`COUNT(*) FILTER (WHERE ${companyReminders.isChecked} = true)::int`, + }) + .from(companyReminders); + + return { + total: row?.total ?? 0, + active: row?.active ?? 0, + completed: row?.completed ?? 0, + }; +}; + +export const getReminderCountsByCompany = async () => { + const rows = await db + .select({ + companyId: companyReminders.companyId, + total: sql`COUNT(*)::int`, + active: sql`COUNT(*) FILTER (WHERE ${companyReminders.isChecked} = false)::int`, + completed: sql`COUNT(*) FILTER (WHERE ${companyReminders.isChecked} = true)::int`, + }) + .from(companyReminders) + .groupBy(companyReminders.companyId) + .orderBy(desc(companyReminders.companyId)); + + return rows; +};