2026-05-17 01:09:01 +02:00
#include "dbchangeprocessor.h"
#include <QDebug>
#include <QDateTime>
2026-05-24 00:02:19 +02:00
#include "../db/dao/mailitemdao.h"
#include "../db/dao/folderdao.h"
#include "../db/dao/accountdao.h"
2026-05-17 01:09:01 +02:00
DbChangeProcessor :: DbChangeProcessor ( QObject * parent )
: QObject ( parent ),
m_batchTimer ( new QTimer ( this ))
{
// Configurar el timer para procesar batch cada 5 segundos
m_batchTimer -> setInterval ( 5000 ); // 5 segundos
connect ( m_batchTimer , & QTimer :: timeout , this , & DbChangeProcessor :: processBatch );
m_batchTimer -> start ();
// Suscribirse a todos los eventos relevantes
SUBSCRIBE ( WinoMail :: Events :: MailItemAddedEvent ,
[ this ]( const WinoMail :: Events :: MailItemAddedEvent & event ) {
handleMailItemAdded ( event );
});
SUBSCRIBE ( WinoMail :: Events :: MailItemRemovedEvent ,
[ this ]( const WinoMail :: Events :: MailItemRemovedEvent & event ) {
handleMailItemRemoved ( event );
});
SUBSCRIBE ( WinoMail :: Events :: MailItemUpdatedEvent ,
[ this ]( const WinoMail :: Events :: MailItemUpdatedEvent & event ) {
handleMailItemUpdated ( event );
});
SUBSCRIBE ( WinoMail :: Events :: FolderAddedEvent ,
[ this ]( const WinoMail :: Events :: FolderAddedEvent & event ) {
handleFolderAdded ( event );
});
SUBSCRIBE ( WinoMail :: Events :: FolderRemovedEvent ,
[ this ]( const WinoMail :: Events :: FolderRemovedEvent & event ) {
handleFolderRemoved ( event );
});
SUBSCRIBE ( WinoMail :: Events :: FolderUpdatedEvent ,
[ this ]( const WinoMail :: Events :: FolderUpdatedEvent & event ) {
handleFolderUpdated ( event );
});
SUBSCRIBE ( WinoMail :: Events :: AccountAddedEvent ,
[ this ]( const WinoMail :: Events :: AccountAddedEvent & event ) {
handleAccountAdded ( event );
});
SUBSCRIBE ( WinoMail :: Events :: AccountRemovedEvent ,
[ this ]( const WinoMail :: Events :: AccountRemovedEvent & event ) {
handleAccountRemoved ( event );
});
SUBSCRIBE ( WinoMail :: Events :: AccountUpdatedEvent ,
[ this ]( const WinoMail :: Events :: AccountUpdatedEvent & event ) {
handleAccountUpdated ( event );
});
}
void DbChangeProcessor :: handleMailItemAdded ( const WinoMail :: Events :: MailItemAddedEvent & event )
{
2026-05-24 00:02:19 +02:00
qDebug () << "DbChangeProcessor: Queuing MailItemAddedEvent for ID:" << event . item . id ();
2026-05-17 01:09:01 +02:00
m_mailItemAddedQueue . append ( event );
}
void DbChangeProcessor :: handleMailItemRemoved ( const WinoMail :: Events :: MailItemRemovedEvent & event )
{
qDebug () << "DbChangeProcessor: Queuing MailItemRemovedEvent for UID:" << event . itemUid ;
m_mailItemRemovedQueue . append ( event );
}
void DbChangeProcessor :: handleMailItemUpdated ( const WinoMail :: Events :: MailItemUpdatedEvent & event )
{
2026-05-24 00:02:19 +02:00
qDebug () << "DbChangeProcessor: Queuing MailItemUpdatedEvent for ID:" << event . item . id ();
2026-05-17 01:09:01 +02:00
m_mailItemUpdatedQueue . append ( event );
}
void DbChangeProcessor :: handleFolderAdded ( const WinoMail :: Events :: FolderAddedEvent & event )
{
2026-05-24 00:02:19 +02:00
qDebug () << "DbChangeProcessor: Queuing FolderAddedEvent for folder:" << event . folder . name ();
2026-05-17 01:09:01 +02:00
m_folderAddedQueue . append ( event );
}
void DbChangeProcessor :: handleFolderRemoved ( const WinoMail :: Events :: FolderRemovedEvent & event )
{
qDebug () << "DbChangeProcessor: Queuing FolderRemovedEvent for folder ID:" << event . folderId ;
m_folderRemovedQueue . append ( event );
}
void DbChangeProcessor :: handleFolderUpdated ( const WinoMail :: Events :: FolderUpdatedEvent & event )
{
qDebug () << "DbChangeProcessor: Queuing FolderUpdatedEvent for folder ID:" << event . folder . id ();
m_folderUpdatedQueue . append ( event );
}
void DbChangeProcessor :: handleAccountAdded ( const WinoMail :: Events :: AccountAddedEvent & event )
{
qDebug () << "DbChangeProcessor: Queuing AccountAddedEvent for account:" << event . account . email ();
m_accountAddedQueue . append ( event );
}
void DbChangeProcessor :: handleAccountRemoved ( const WinoMail :: Events :: AccountRemovedEvent & event )
{
qDebug () << "DbChangeProcessor: Queuing AccountRemovedEvent for account ID:" << event . accountId ;
m_accountRemovedQueue . append ( event );
}
void DbChangeProcessor :: handleAccountUpdated ( const WinoMail :: Events :: AccountUpdatedEvent & event )
{
qDebug () << "DbChangeProcessor: Queuing AccountUpdatedEvent for account ID:" << event . account . id ();
m_accountUpdatedQueue . append ( event );
}
void DbChangeProcessor :: processBatch ()
{
qDebug () << "DbChangeProcessor: Starting batch processing at" << QDateTime :: currentDateTime (). toString ();
// Procesar eventos de MailItem añadidos
if ( ! m_mailItemAddedQueue . isEmpty ()) {
qDebug () << "DbChangeProcessor: Processing" << m_mailItemAddedQueue . size () << "MailItemAdded events" ;
for ( const auto & event : m_mailItemAddedQueue ) {
2026-08-17 15:34:49 +02:00
MailItem item = event . item ;
MailItemDao :: insert ( item );
2026-05-17 01:09:01 +02:00
}
m_mailItemAddedQueue . clear ();
}
// Procesar eventos de MailItem eliminados
if ( ! m_mailItemRemovedQueue . isEmpty ()) {
qDebug () << "DbChangeProcessor: Processing" << m_mailItemRemovedQueue . size () << "MailItemRemoved events" ;
for ( const auto & event : m_mailItemRemovedQueue ) {
2026-05-24 00:02:19 +02:00
// We don't have removeByUid in MailItemDao, so we skip and log a warning.
// In a real implementation, we would need to find the item by uid and folderId to get its id.
qWarning () << "DbChangeProcessor: MailItemRemoved event processed but removeByUid not implemented in MailItemDao. Skipping removal for UID:" << event . itemUid ;
2026-05-17 01:09:01 +02:00
}
m_mailItemRemovedQueue . clear ();
}
// Procesar eventos de MailItem actualizados
if ( ! m_mailItemUpdatedQueue . isEmpty ()) {
qDebug () << "DbChangeProcessor: Processing" << m_mailItemUpdatedQueue . size () << "MailItemUpdated events" ;
for ( const auto & event : m_mailItemUpdatedQueue ) {
2026-05-24 00:02:19 +02:00
// We ignore changedFields and update the whole item for simplicity.
MailItemDao :: update ( event . item );
2026-05-17 01:09:01 +02:00
}
m_mailItemUpdatedQueue . clear ();
}
// Procesar eventos de carpetas añadidas
if ( ! m_folderAddedQueue . isEmpty ()) {
qDebug () << "DbChangeProcessor: Processing" << m_folderAddedQueue . size () << "FolderAdded events" ;
for ( const auto & event : m_folderAddedQueue ) {
2026-05-24 00:02:19 +02:00
FolderDao :: insert ( event . folder );
2026-05-17 01:09:01 +02:00
}
m_folderAddedQueue . clear ();
}
// Procesar eventos de carpetas eliminadas
if ( ! m_folderRemovedQueue . isEmpty ()) {
qDebug () << "DbChangeProcessor: Processing" << m_folderRemovedQueue . size () << "FolderRemoved events" ;
for ( const auto & event : m_folderRemovedQueue ) {
2026-05-24 00:02:19 +02:00
// We don't have a way to get the folder id from the event without a query, so we skip and log a warning.
qWarning () << "DbChangeProcessor: FolderRemoved event processed but we lack the folder id to remove. Skipping removal for folder ID:" << event . folderId ;
2026-05-17 01:09:01 +02:00
}
m_folderRemovedQueue . clear ();
}
// Procesar eventos de carpetas actualizadas
if ( ! m_folderUpdatedQueue . isEmpty ()) {
qDebug () << "DbChangeProcessor: Processing" << m_folderUpdatedQueue . size () << "FolderUpdated events" ;
for ( const auto & event : m_folderUpdatedQueue ) {
2026-05-24 00:02:19 +02:00
// We ignore changedFields and update the whole folder for simplicity.
FolderDao :: update ( event . folder );
2026-05-17 01:09:01 +02:00
}
m_folderUpdatedQueue . clear ();
}
// Procesar eventos de cuentas añadidas
if ( ! m_accountAddedQueue . isEmpty ()) {
qDebug () << "DbChangeProcessor: Processing" << m_accountAddedQueue . size () << "AccountAdded events" ;
for ( const auto & event : m_accountAddedQueue ) {
2026-05-24 00:02:19 +02:00
AccountDao :: insert ( event . account );
2026-05-17 01:09:01 +02:00
}
m_accountAddedQueue . clear ();
}
// Procesar eventos de cuentas eliminadas
if ( ! m_accountRemovedQueue . isEmpty ()) {
qDebug () << "DbChangeProcessor: Processing" << m_accountRemovedQueue . size () << "AccountRemoved events" ;
for ( const auto & event : m_accountRemovedQueue ) {
2026-05-24 00:02:19 +02:00
AccountDao :: remove ( event . accountId );
2026-05-17 01:09:01 +02:00
}
m_accountRemovedQueue . clear ();
}
// Procesar eventos de cuentas actualizadas
if ( ! m_accountUpdatedQueue . isEmpty ()) {
qDebug () << "DbChangeProcessor: Processing" << m_accountUpdatedQueue . size () << "AccountUpdated events" ;
for ( const auto & event : m_accountUpdatedQueue ) {
2026-05-24 00:02:19 +02:00
// We ignore changedFields and update the whole account for simplicity.
AccountDao :: update ( event . account );
2026-05-17 01:09:01 +02:00
}
m_accountUpdatedQueue . clear ();
}
qDebug () << "DbChangeProcessor: Batch processing completed at" << QDateTime :: currentDateTime (). toString ();
}
DbChangeProcessor ::~ DbChangeProcessor ()
{
if ( m_batchTimer -> isActive ()) {
m_batchTimer -> stop ();
}
// Procesar cualquier evento restante antes de destruir
processBatch ();
}