Implement basic UI with QML (MailListPage) and batching DbChangeProcessor (Step 3-4 of transition plan)
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
#include <QJsonObject>
|
||||
#include <QJsonArray>
|
||||
#include <QDebug>
|
||||
#include <QUrlQuery>
|
||||
#include <QDateTime>
|
||||
#include <QTimer>
|
||||
|
||||
@@ -25,11 +26,6 @@ GmailSynchronizer::GmailSynchronizer(QObject* parent)
|
||||
m_historyTimer->setInterval(2 * 60 * 1000); // 2 minutos
|
||||
}
|
||||
|
||||
GmailSynchronizer::~GmailSynchronizer()
|
||||
{
|
||||
m_historyTimer->stop();
|
||||
}
|
||||
|
||||
bool GmailSynchronizer::initialize(const Account& account)
|
||||
{
|
||||
// Guardar información de la cuenta
|
||||
@@ -60,10 +56,10 @@ bool GmailSynchronizer::syncFolder(const Folder& folder)
|
||||
}
|
||||
|
||||
qDebug() << "Starting Gmail sync for folder (label):" << folder.name();
|
||||
emit folderSyncStarted(folder.id());
|
||||
emit folderSyncStarted(QString::number(folder.id()));
|
||||
|
||||
// Obtener elementos de correo desde Gmail API
|
||||
QVector<MailItem> items = fetchMailItems(folder.id());
|
||||
QVector<MailItem> items = fetchMailItems(QString::number(folder.id()));
|
||||
|
||||
// En una implementación real, aquí compararíamos con la base de datos local
|
||||
// y emitiríamos las señales apropiadas para elementos nuevos/actualizados/eliminados
|
||||
@@ -75,7 +71,7 @@ bool GmailSynchronizer::syncFolder(const Folder& folder)
|
||||
}
|
||||
}
|
||||
|
||||
emit folderSyncFinished(folder.id(), true);
|
||||
emit folderSyncFinished(QString::number(folder.id()), true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -113,7 +109,7 @@ QVector<MailItem> GmailSynchronizer::fetchMailItems(const QString& folderId,
|
||||
|
||||
// Construir la URL para Gmail API
|
||||
// Nota: En Gmail, las carpetas se identifican por su nombre de label (ej: INBOX, DRAFTS, etc.)
|
||||
QString endpoint = String.format("/me/mailFolders/%1/messages", folderId);
|
||||
QString endpoint = QString("/me/mailFolders/%1/messages").arg(folderId);
|
||||
QString url = buildGmailUrl(endpoint);
|
||||
|
||||
// Parámetros de consulta
|
||||
@@ -257,7 +253,7 @@ void GmailSynchronizer::onHistoryTimer()
|
||||
// de todas las etiquetas (esto sería ineficiente en producción)
|
||||
QVector<Folder> folders = getFolders();
|
||||
for (const Folder& folder : folders) {
|
||||
syncFolder(folder.id());
|
||||
syncFolder(Folder(folder.id(), 0, QString()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -270,7 +266,7 @@ QString GmailSynchronizer::buildGmailUrl(const QString& endpoint) const
|
||||
|
||||
QNetworkRequest GmailSynchronizer::createAuthRequest(const QString& url) const
|
||||
{
|
||||
QNetworkRequest request(QUrl(url));
|
||||
QNetworkRequest request{QUrl(url)};
|
||||
request.setRawHeader("Authorization",
|
||||
QString("Bearer %1").arg(m_accessToken).toUtf8());
|
||||
request.setHeader(QNetworkRequest::ContentTypeHeader,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "imapsynchronizer.h"
|
||||
#include <QDebug>
|
||||
#include <cstdlib>
|
||||
|
||||
ImapSynchronizer::ImapSynchronizer(QObject* parent)
|
||||
: Synchronizer(parent)
|
||||
@@ -11,6 +12,15 @@ bool ImapSynchronizer::initialize(const Account& account)
|
||||
Q_UNUSED(account);
|
||||
qDebug() << "IMAP Synchronizer initialize (stub)";
|
||||
m_connected = true; // pretend success
|
||||
|
||||
// Publish AccountConnectedEvent
|
||||
WinoMail::Events::AccountConnectedEvent event;
|
||||
event.eventId = generateEventId();
|
||||
event.timestamp = QDateTime::currentDateTimeUtc();
|
||||
event.accountId = account.id();
|
||||
event.provider = "imap";
|
||||
PUBLISH(event);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -18,9 +28,36 @@ bool ImapSynchronizer::syncFolder(const Folder& folder)
|
||||
{
|
||||
Q_UNUSED(folder);
|
||||
qDebug() << "IMAP Synchronizer syncFolder (stub)";
|
||||
emit folderSyncStarted(folder.name());
|
||||
|
||||
// Publish SyncStartedEvent
|
||||
WinoMail::Events::SyncStartedEvent event;
|
||||
event.eventId = generateEventId();
|
||||
event.timestamp = QDateTime::currentDateTimeUtc();
|
||||
event.accountId = m_account.id();
|
||||
event.folderId = QString::number(folder.id()); // Assuming folder.id() returns int
|
||||
PUBLISH(event);
|
||||
|
||||
// In reality, we would connect to IMAP, list messages, etc.
|
||||
emit folderSyncFinished(folder.name(), true);
|
||||
// For now, simulate some mail items being added
|
||||
QVector<MailItem> items = fetchMailItems(QString::number(folder.id()));
|
||||
for (const MailItem& item : items) {
|
||||
WinoMail::Events::MailItemAddedEvent mailEvent;
|
||||
mailEvent.eventId = generateEventId();
|
||||
mailEvent.timestamp = QDateTime::currentDateTimeUtc();
|
||||
mailEvent.item = item;
|
||||
PUBLISH(mailEvent);
|
||||
}
|
||||
|
||||
// Publish SyncFinishedEvent
|
||||
WinoMail::Events::SyncFinishedEvent finishEvent;
|
||||
finishEvent.eventId = generateEventId();
|
||||
finishEvent.timestamp = QDateTime::currentDateTimeUtc();
|
||||
finishEvent.accountId = m_account.id();
|
||||
finishEvent.folderId = QString::number(folder.id());
|
||||
finishEvent.success = true;
|
||||
finishEvent.errorMessage = "";
|
||||
PUBLISH(finishEvent);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -41,7 +78,7 @@ QVector<MailItem> ImapSynchronizer::fetchMailItems(const QString& folderId,
|
||||
qDebug() << "IMAP Synchronizer fetchMailItems (stub)";
|
||||
// Return a dummy mail item for testing
|
||||
QVector<MailItem> items;
|
||||
items.append(MailItem(1, "Test Subject", "sender@example.com", "me@example.com",
|
||||
items.append(MailItem(1, 1, "Test Subject", "sender@example.com", "me@example.com",
|
||||
QDateTime::currentDateTime(), false, false));
|
||||
return items;
|
||||
}
|
||||
@@ -51,6 +88,13 @@ bool ImapSynchronizer::appendMailItem(const QString& folderId, const MailItem& i
|
||||
Q_UNUSED(folderId);
|
||||
Q_UNUSED(item);
|
||||
qDebug() << "IMAP Synchronizer appendMailItem (stub)";
|
||||
// In a real implementation, this would send the mail via IMAP APPEND
|
||||
// For now, we'll simulate success and publish an event
|
||||
WinoMail::Events::MailItemAddedEvent event;
|
||||
event.eventId = generateEventId();
|
||||
event.timestamp = QDateTime::currentDateTimeUtc();
|
||||
event.item = item;
|
||||
PUBLISH(event);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -63,6 +107,18 @@ bool ImapSynchronizer::updateMailItemFlags(const QString& folderId,
|
||||
Q_UNUSED(read);
|
||||
Q_UNUSED(flagged);
|
||||
qDebug() << "IMAP Synchronizer updateMailItemFlags (stub)";
|
||||
// In a real implementation, this would update flags via IMAP STORE
|
||||
// For now, we'll simulate success and publish an update event
|
||||
// We need to fetch the item first to know what changed
|
||||
MailItem item; // This would be fetched from storage
|
||||
item.setId(itemUid.toLongLong()); // Assuming there's a setter
|
||||
|
||||
WinoMail::Events::MailItemUpdatedEvent event;
|
||||
event.eventId = generateEventId();
|
||||
event.timestamp = QDateTime::currentDateTimeUtc();
|
||||
event.item = item;
|
||||
event.changedFields = QStringList() << "read" << "flagged"; // Simplified
|
||||
PUBLISH(event);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -72,5 +128,21 @@ bool ImapSynchronizer::deleteMailItem(const QString& folderId,
|
||||
Q_UNUSED(folderId);
|
||||
Q_UNUSED(itemUid);
|
||||
qDebug() << "IMAP Synchronizer deleteMailItem (stub)";
|
||||
// In a real implementation, this would delete the mail via IMAP STORE +FLAGS or EXPUNGE
|
||||
// For now, we'll simulate success and publish a removal event
|
||||
WinoMail::Events::MailItemRemovedEvent event;
|
||||
event.eventId = generateEventId();
|
||||
event.timestamp = QDateTime::currentDateTimeUtc();
|
||||
event.itemUid = itemUid;
|
||||
event.folderId = folderId.toInt(); // Assuming folderId is numeric
|
||||
PUBLISH(event);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Helper para generar IDs únicos de eventos
|
||||
QString ImapSynchronizer::generateEventId() const
|
||||
{
|
||||
// Simple implementation using timestamp and random component
|
||||
return QString::number(QDateTime::currentMSecsSinceEpoch()) + "_" +
|
||||
QString::number(std::rand());
|
||||
}
|
||||
@@ -2,6 +2,10 @@
|
||||
|
||||
#include "../synchronizer.h"
|
||||
#include <QObject>
|
||||
#include "../../core/eventbus.h"
|
||||
#include "../../core/models/account.h"
|
||||
#include "../../core/models/folder.h"
|
||||
#include "../../core/mailitem.h"
|
||||
|
||||
class ImapSynchronizer : public Synchronizer
|
||||
{
|
||||
@@ -31,4 +35,7 @@ private:
|
||||
QString m_username;
|
||||
QString m_password;
|
||||
bool m_useSsl{true};
|
||||
|
||||
// Helper para generar IDs únicos de eventos
|
||||
QString generateEventId() const;
|
||||
};
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <QJsonObject>
|
||||
#include <QJsonArray>
|
||||
#include <QDebug>
|
||||
#include <QUrlQuery>
|
||||
#include <QDateTime>
|
||||
#include <QTimer>
|
||||
|
||||
@@ -25,11 +26,6 @@ OutlookSynchronizer::OutlookSynchronizer(QObject* parent)
|
||||
m_deltaTimer->setInterval(5 * 60 * 1000); // 5 minutos
|
||||
}
|
||||
|
||||
OutlookSynchronizer::~OutlookSynchronizer()
|
||||
{
|
||||
m_deltaTimer->stop();
|
||||
}
|
||||
|
||||
bool OutlookSynchronizer::initialize(const Account& account)
|
||||
{
|
||||
// Guardar información de la cuenta
|
||||
@@ -60,10 +56,10 @@ bool OutlookSynchronizer::syncFolder(const Folder& folder)
|
||||
}
|
||||
|
||||
qDebug() << "Starting Outlook sync for folder:" << folder.name();
|
||||
emit folderSyncStarted(folder.id());
|
||||
emit folderSyncStarted(QString::number(folder.id()));
|
||||
|
||||
// Obtener elementos de correo desde Microsoft Graph
|
||||
QVector<MailItem> items = fetchMailItems(folder.id());
|
||||
QVector<MailItem> items = fetchMailItems(QString::number(folder.id()));
|
||||
|
||||
// En una implementación real, aquí compararíamos con la base de datos local
|
||||
// y emitiríamos las señales apropiadas para elementos nuevos/actualizados/eliminados
|
||||
@@ -75,7 +71,7 @@ bool OutlookSynchronizer::syncFolder(const Folder& folder)
|
||||
}
|
||||
}
|
||||
|
||||
emit folderSyncFinished(folder.id(), true);
|
||||
emit folderSyncFinished(QString::number(folder.id()), true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -264,7 +260,7 @@ QString OutlookSynchronizer::buildGraphUrl(const QString& endpoint) const
|
||||
|
||||
QNetworkRequest OutlookSynchronizer::createAuthRequest(const QString& url) const
|
||||
{
|
||||
QNetworkRequest request(QUrl(url));
|
||||
QNetworkRequest request{QUrl(url)};
|
||||
request.setRawHeader("Authorization",
|
||||
QString("Bearer %1").arg(m_accessToken).toUtf8());
|
||||
request.setHeader(QNetworkRequest::ContentTypeHeader,
|
||||
|
||||
Reference in New Issue
Block a user