1
0
forked from BRT/arc
arc/database/dao/AccountDAO.cpp
trnsmkot 290f89fae4 Add enhanced account and transaction handling features
Refactored code to improve account and transaction data parsing and management, introducing support for additional fields like card numbers and account statuses. Added new utilities for database connections, device-specific screenshot handling, and XML parsing for enriched account and transaction details.
2025-05-07 14:15:08 +07:00

141 lines
4.8 KiB
C++

#include <QSqlQuery>
#include <QSqlError>
#include "AccountDAO.h"
#include "db/AccountInfo.h"
#include "DatabaseManager.h"
bool AccountDAO::upsertAccount(const AccountInfo &info) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
INSERT INTO accounts (device_id, app_name, numbers, last_numbers, amount, update_time, status, description)
VALUES (:device_id, :app_name, :numbers, :last_numbers, :amount, :update_time, :status, :description)
ON CONFLICT(device_id, app_name, last_numbers)
DO UPDATE SET
amount = excluded.amount,
update_time = excluded.update_time,
status = excluded.status
)");
query.bindValue(":device_id", info.deviceId);
query.bindValue(":app_name", info.appName);
query.bindValue(":numbers", info.numbers);
query.bindValue(":last_numbers", info.lastNumbers);
query.bindValue(":amount", info.amount);
query.bindValue(":update_time", info.updateTime.toString(Qt::ISODate));
query.bindValue(":status", accountStatusToString(info.status));
query.bindValue(":description", info.description);
if (!query.exec()) {
qWarning() << "Ошибка при вставке/обновлении account:" << query.lastError().text();
return false;
}
return true;
}
bool AccountDAO::deleteAccount(const int id) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare("DELETE FROM accounts WHERE id = :id");
query.bindValue(":id", id);
return query.exec();
}
QList<AccountInfo> AccountDAO::getAccounts(const QString &deviceId, const QString &appName) {
QList<AccountInfo> accounts;
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
SELECT id, device_id, app_name, numbers, last_numbers, amount, update_time, status, description
FROM accounts
WHERE device_id = :device_id AND app_name = :app_name
)");
query.bindValue(":device_id", deviceId);
query.bindValue(":app_name", appName);
if (!query.exec()) {
qWarning() << "Ошибка при получении accounts:" << query.lastError().text();
return accounts;
}
while (query.next()) {
AccountInfo acc;
acc.id = query.value("id").toInt();
acc.deviceId = query.value("device_id").toString();
acc.appName = query.value("app_name").toString();
acc.numbers = query.value("numbers").toString();
acc.lastNumbers = query.value("last_numbers").toString();
acc.amount = query.value("amount").toDouble();
acc.updateTime = QDateTime::fromString(query.value("update_time").toString(), Qt::ISODate);
acc.status = accountStatusFromString(query.value("status").toString());
acc.description = query.value("description").toString();
accounts.append(acc);
}
return accounts;
}
AccountInfo parseAccount(const QSqlQuery &query) {
AccountInfo acc;
acc.id = query.value("id").toInt();
acc.deviceId = query.value("device_id").toString();
acc.appName = query.value("app_name").toString();
acc.lastNumbers = query.value("last_numbers").toString();
acc.numbers = query.value("numbers").toString();
acc.amount = query.value("amount").toDouble();
acc.updateTime = QDateTime::fromString(query.value("update_time").toString(), Qt::ISODate);
acc.status = accountStatusFromString(query.value("status").toString());
acc.description = query.value("description").toString();
return acc;
}
AccountInfo AccountDAO::getAccountById(const int accountId) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
SELECT id, device_id, app_name, numbers, last_numbers, amount, update_time, status, description
FROM accounts
WHERE id = :id
LIMIT 1
)");
query.bindValue(":id", accountId);
if (!query.exec()) {
qWarning() << "Ошибка при получении account по ID:" << query.lastError().text();
return {};
}
if (query.next()) {
return parseAccount(query);
}
return {};
}
AccountInfo AccountDAO::findAppAccount(const QString &appName, const QString &cardNumber) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
SELECT id, device_id, app_name, numbers, last_numbers, amount, update_time, status, description
FROM accounts
WHERE app_name = :app_name AND numbers = :numbers
LIMIT 1
)");
query.bindValue(":app_name", appName);
query.bindValue(":numbers", cardNumber);
if (!query.exec()) {
qWarning() << "Ошибка при получении account по ID:" << query.lastError().text();
return {};
}
if (query.next()) {
return parseAccount(query);
}
return {};
}