Files
wino-mail-dtkqt/src/db/dao/signaturedao.cpp
T
javier fdef311257 feat: complete settings view + signatures + signatures DAO + icons
- SettingsView: complete UI with tabs for Accounts, Categories, Rules, Templates, Signatures, General, Appearance
- Categories: QTreeWidget with hierarchical view, color picker, parent categories
- Rules: QListWidget with RuleEditorDialog integration, toggle enabled
- Templates: QListWidget with TemplateEditorDialog integration
- Signatures: QListWidget with SignatureEditorDialog integration
- SignatureDao: full CRUD with default signature support
- common_structs.h: QColor for Category, all structs centralized
- icons.qrc: updated with Linear/Outline/Bold icons from resources
- Category: QColor instead of QString for color
- EmailTreeModel/DateGroupProxyModel: email grouping by date
- MailListView: QTreeView with date grouping combo
- ReaderView: subject frame with shadow, avatar in header, body inside header
- MainWindow: frameless with rounded corners, 1px border, edge resize, no status bar
- icons.qrc: complete icon set from resources/icons/SVG
2026-08-24 10:29:13 +02:00

220 lines
8.1 KiB
C++

#include "signaturedao.h"
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QDateTime>
bool SignatureDao::insert(Signature& sig)
{
QSqlDatabase db = DatabaseManager::instance().database();
QSqlQuery query(db);
query.prepare(
"INSERT INTO Signature (accountId, name, html, isDefault, createdAt, updatedAt) "
"VALUES (:accountId, :name, :html, :isDefault, :createdAt, :updatedAt)");
query.bindValue(":accountId", sig.accountId >= 0 ? sig.accountId : QVariant());
query.bindValue(":name", sig.name);
query.bindValue(":html", sig.html);
query.bindValue(":isDefault", sig.isDefault ? 1 : 0);
query.bindValue(":createdAt", QDateTime::currentDateTimeUtc().toString(Qt::ISODate));
query.bindValue(":updatedAt", QDateTime::currentDateTimeUtc().toString(Qt::ISODate));
if (!query.exec()) {
qDebug() << "[SignatureDao] Insert failed:" << query.lastError().text();
return false;
}
sig.id = query.lastInsertId().toLongLong();
return true;
}
bool SignatureDao::update(const Signature& sig)
{
QSqlDatabase db = DatabaseManager::instance().database();
QSqlQuery query(db);
query.prepare(
"UPDATE Signature SET accountId = :accountId, name = :name, html = :html, "
"isDefault = :isDefault, updatedAt = :updatedAt "
"WHERE id = :id");
query.bindValue(":id", sig.id);
query.bindValue(":accountId", sig.accountId >= 0 ? sig.accountId : QVariant());
query.bindValue(":name", sig.name);
query.bindValue(":html", sig.html);
query.bindValue(":isDefault", sig.isDefault ? 1 : 0);
query.bindValue(":updatedAt", QDateTime::currentDateTimeUtc().toString(Qt::ISODate));
if (!query.exec()) {
qDebug() << "[SignatureDao] Update failed:" << query.lastError().text();
return false;
}
return true;
}
bool SignatureDao::remove(qint64 id)
{
QSqlDatabase db = DatabaseManager::instance().database();
QSqlQuery query(db);
query.prepare("DELETE FROM Signature WHERE id = :id");
query.bindValue(":id", id);
if (!query.exec()) {
qDebug() << "[SignatureDao] Remove failed:" << query.lastError().text();
return false;
}
return true;
}
std::optional<Signature> SignatureDao::findById(qint64 id)
{
QSqlDatabase db = DatabaseManager::instance().database();
QSqlQuery query(db);
query.prepare("SELECT id, accountId, name, html, isDefault, createdAt, updatedAt FROM Signature WHERE id = :id");
query.bindValue(":id", id);
if (!query.exec() || !query.next()) {
return std::nullopt;
}
Signature sig;
sig.id = query.value("id").toLongLong();
sig.accountId = query.value("accountId").isNull() ? -1 : query.value("accountId").toLongLong();
sig.name = query.value("name").toString();
sig.html = query.value("html").toString();
sig.isDefault = query.value("isDefault").toBool();
sig.createdAt = QDateTime::fromString(query.value("createdAt").toString(), Qt::ISODate);
sig.updatedAt = QDateTime::fromString(query.value("updatedAt").toString(), Qt::ISODate);
return sig;
}
QVector<Signature> SignatureDao::findByAccount(qint64 accountId)
{
QSqlDatabase db = DatabaseManager::instance().database();
QSqlQuery query(db);
if (accountId >= 0) {
query.prepare("SELECT id, accountId, name, html, isDefault, createdAt, updatedAt FROM Signature WHERE accountId = :accountId OR accountId IS NULL ORDER BY name");
query.bindValue(":accountId", accountId);
} else {
query.prepare("SELECT id, accountId, name, html, isDefault, createdAt, updatedAt FROM Signature WHERE accountId IS NULL ORDER BY name");
}
QVector<Signature> sigs;
if (query.exec()) {
while (query.next()) {
Signature sig;
sig.id = query.value("id").toLongLong();
sig.accountId = query.value("accountId").isNull() ? -1 : query.value("accountId").toLongLong();
sig.name = query.value("name").toString();
sig.html = query.value("html").toString();
sig.isDefault = query.value("isDefault").toBool();
sig.createdAt = QDateTime::fromString(query.value("createdAt").toString(), Qt::ISODate);
sig.updatedAt = QDateTime::fromString(query.value("updatedAt").toString(), Qt::ISODate);
sigs.append(sig);
}
}
return sigs;
}
QVector<Signature> SignatureDao::findGlobal()
{
QSqlDatabase db = DatabaseManager::instance().database();
QSqlQuery query(db);
query.exec("SELECT id, accountId, name, html, isDefault, createdAt, updatedAt FROM Signature WHERE accountId IS NULL ORDER BY name");
QVector<Signature> sigs;
while (query.next()) {
Signature sig;
sig.id = query.value("id").toLongLong();
sig.accountId = -1;
sig.name = query.value("name").toString();
sig.html = query.value("html").toString();
sig.isDefault = query.value("isDefault").toBool();
sig.createdAt = QDateTime::fromString(query.value("createdAt").toString(), Qt::ISODate);
sig.updatedAt = QDateTime::fromString(query.value("updatedAt").toString(), Qt::ISODate);
sigs.append(sig);
}
return sigs;
}
QVector<Signature> SignatureDao::findAll()
{
QSqlDatabase db = DatabaseManager::instance().database();
QSqlQuery query(db);
query.exec("SELECT id, accountId, name, html, isDefault, createdAt, updatedAt FROM Signature ORDER BY name");
QVector<Signature> sigs;
while (query.next()) {
Signature sig;
sig.id = query.value("id").toLongLong();
sig.accountId = query.value("accountId").isNull() ? -1 : query.value("accountId").toLongLong();
sig.name = query.value("name").toString();
sig.html = query.value("html").toString();
sig.isDefault = query.value("isDefault").toBool();
sig.createdAt = QDateTime::fromString(query.value("createdAt").toString(), Qt::ISODate);
sig.updatedAt = QDateTime::fromString(query.value("updatedAt").toString(), Qt::ISODate);
sigs.append(sig);
}
return sigs;
}
std::optional<Signature> SignatureDao::findDefault(qint64 accountId)
{
QSqlDatabase db = DatabaseManager::instance().database();
QSqlQuery query(db);
query.prepare(
"SELECT id, accountId, name, html, isDefault, createdAt, updatedAt "
"FROM Signature "
"WHERE (accountId = :accountId OR accountId IS NULL) AND isDefault = 1 "
"ORDER BY accountId DESC LIMIT 1");
query.bindValue(":accountId", accountId >= 0 ? accountId : QVariant());
if (!query.exec() || !query.next()) {
return std::nullopt;
}
Signature sig;
sig.id = query.value("id").toLongLong();
sig.accountId = query.value("accountId").isNull() ? -1 : query.value("accountId").toLongLong();
sig.name = query.value("name").toString();
sig.html = query.value("html").toString();
sig.isDefault = query.value("isDefault").toBool();
sig.createdAt = QDateTime::fromString(query.value("createdAt").toString(), Qt::ISODate);
sig.updatedAt = QDateTime::fromString(query.value("updatedAt").toString(), Qt::ISODate);
return sig;
}
bool SignatureDao::setDefault(qint64 id, bool isDefault)
{
QSqlDatabase db = DatabaseManager::instance().database();
db.transaction();
// First unset all defaults for the same account
QSqlQuery query(db);
query.prepare(
"UPDATE Signature SET isDefault = 0 WHERE accountId = "
"(SELECT accountId FROM Signature WHERE id = :id)");
query.bindValue(":id", id);
if (!query.exec()) {
db.rollback();
return false;
}
// Set the new default
query.prepare("UPDATE Signature SET isDefault = :isDefault, updatedAt = :updatedAt WHERE id = :id");
query.bindValue(":id", id);
query.bindValue(":isDefault", isDefault ? 1 : 0);
query.bindValue(":updatedAt", QDateTime::currentDateTimeUtc().toString(Qt::ISODate));
if (!query.exec()) {
db.rollback();
qDebug() << "[SignatureDao] setDefault failed:" << query.lastError().text();
return false;
}
db.commit();
return true;
}