From 947d1d9b9930a6e4a6612e63bbe7c8c91277a0fa Mon Sep 17 00:00:00 2001 From: richardtekula Date: Wed, 26 Nov 2025 07:35:55 +0100 Subject: [PATCH] notification about emails in company card --- src/controllers/company.controller.js | 19 ++++++++++++++ src/routes/company.routes.js | 3 +++ src/services/company-email.service.js | 38 ++++++++++++++++++++++++++- 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/controllers/company.controller.js b/src/controllers/company.controller.js index 070501a..71191f8 100644 --- a/src/controllers/company.controller.js +++ b/src/controllers/company.controller.js @@ -69,6 +69,25 @@ export const getCompanyEmailThreads = async (req, res) => { } }; +/** + * Get unread email counts grouped by company for current user + * GET /api/companies/email-unread + */ +export const getCompanyUnreadCounts = async (req, res) => { + try { + const userId = req.userId; + const counts = await companyEmailService.getCompanyUnreadCounts(userId); + + 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); + } +}; + /** * Get company with relations (projects, todos, notes) * GET /api/companies/:companyId/details diff --git a/src/routes/company.routes.js b/src/routes/company.routes.js index aa60e6c..9ba58d7 100644 --- a/src/routes/company.routes.js +++ b/src/routes/company.routes.js @@ -14,6 +14,9 @@ router.use(authenticate); router.get('/reminders/summary', companyController.getReminderSummary); router.get('/reminders/counts', companyController.getReminderCountsByCompany); +// Company unread email summary +router.get('/email-unread', companyController.getCompanyUnreadCounts); + // Company email threads router.get( '/:companyId/email-threads', diff --git a/src/services/company-email.service.js b/src/services/company-email.service.js index eaebfa2..bcb152a 100644 --- a/src/services/company-email.service.js +++ b/src/services/company-email.service.js @@ -1,4 +1,4 @@ -import { and, desc, eq, inArray } from 'drizzle-orm'; +import { and, desc, eq, inArray, isNull, not, sql } from 'drizzle-orm'; import { db } from '../config/database.js'; import { contacts, emailAccounts, emails, userEmailAccounts } from '../db/schema.js'; @@ -98,3 +98,39 @@ export const getCompanyEmailThreads = async (companyId, userId) => { threads, }; }; + +export const getCompanyUnreadCounts = async (userId) => { + const accountLinks = await db + .select({ id: emailAccounts.id }) + .from(userEmailAccounts) + .innerJoin(emailAccounts, eq(userEmailAccounts.emailAccountId, emailAccounts.id)) + .where( + and( + eq(userEmailAccounts.userId, userId), + eq(emailAccounts.isActive, true) + ) + ); + + const accountIds = accountLinks.map((acc) => acc.id); + + if (accountIds.length === 0) { + return []; + } + + const rows = await db + .select({ + companyId: emails.companyId, + unreadCount: sql`count(*)::int`, + }) + .from(emails) + .where( + and( + inArray(emails.emailAccountId, accountIds), + eq(emails.isRead, false), + not(isNull(emails.companyId)) + ) + ) + .groupBy(emails.companyId); + + return rows; +};