From 05be898259f6e0a92009d18a657b8577db77f078 Mon Sep 17 00:00:00 2001 From: richardtekula Date: Thu, 20 Nov 2025 08:15:43 +0100 Subject: [PATCH] Mark emails as read on JMAP server (fixes Betterbird showing unread) --- src/controllers/crm-email.controller.js | 31 +++++++++++++++++++++++++ src/services/contact.service.js | 17 ++++++++++++++ src/services/crm-email.service.js | 6 ++++- 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/controllers/crm-email.controller.js b/src/controllers/crm-email.controller.js index 38c1115..8e41ec2 100644 --- a/src/controllers/crm-email.controller.js +++ b/src/controllers/crm-email.controller.js @@ -208,8 +208,39 @@ export const markContactEmailsRead = async (req, res) => { const userId = req.userId; const { contactId } = req.params; + // Get contact to find which email account it belongs to + const contact = await contactService.getContactById(contactId, userId); + if (!contact) { + return res.status(404).json({ + success: false, + error: { message: 'Kontakt nenájdený', statusCode: 404 }, + }); + } + + // Get email account with credentials + const emailAccount = await emailAccountService.getEmailAccountWithCredentials(contact.emailAccountId, userId); + const jmapConfig = getJmapConfigFromAccount(emailAccount); + + // Mark emails as read in database and get the updated emails const result = await crmEmailService.markContactEmailsAsRead(userId, contactId); + // Also mark emails as read on JMAP server + if (result.emails && result.emails.length > 0) { + logger.info(`Marking ${result.emails.length} emails as read on JMAP server`); + + for (const email of result.emails) { + if (!email.jmapId) { + continue; + } + try { + await markEmailAsRead(jmapConfig, userId, email.jmapId, true); + logger.debug(`✅ Marked JMAP email as read: ${email.jmapId}`); + } catch (jmapError) { + logger.error('Failed to mark JMAP email as read', { jmapId: email.jmapId, error: jmapError.message }); + } + } + } + res.status(200).json({ success: true, message: `Označených ${result.count} emailov ako prečítaných`, diff --git a/src/services/contact.service.js b/src/services/contact.service.js index f33668a..288f2ce 100644 --- a/src/services/contact.service.js +++ b/src/services/contact.service.js @@ -69,6 +69,23 @@ export const addContact = async (userId, emailAccountId, jmapConfig, email, name return newContact; }; +/** + * Get a contact by ID + */ +export const getContactById = async (contactId, userId) => { + const [contact] = await db + .select() + .from(contacts) + .where(and(eq(contacts.id, contactId), eq(contacts.userId, userId))) + .limit(1); + + if (!contact) { + throw new NotFoundError('Kontakt nenájdený'); + } + + return contact; +}; + /** * Remove a contact */ diff --git a/src/services/crm-email.service.js b/src/services/crm-email.service.js index e73d80d..31081cd 100644 --- a/src/services/crm-email.service.js +++ b/src/services/crm-email.service.js @@ -246,7 +246,11 @@ export const markContactEmailsAsRead = async (userId, contactId) => { console.log('✅ markContactEmailsAsRead result:', { count: result.length, contactId }); - return { success: true, count: result.length }; + return { + success: true, + count: result.length, + emails: result, // Return the emails so controller can mark them on JMAP server + }; }; /**