1
0
forked from BRT/arc
arc/database/dao/ApplicationDAO.cpp
slava eb14339623 Add core scripts for Black app automation and XML parsing
Implemented `CommonScript` as a base class with reusable functionality for automation workflows, including PIN input, app navigation, and server communication. Added specialized scripts like `GetCardInfoScript`, `GetProfileInfoScript`, and `LoginAndCheckAccountsScript` for card retrieval, profile parsing, and login validation. Introduced `ScreenXmlParser` for efficient XML-based UI parsing and node detection.
2026-03-11 19:45:08 +07:00

317 lines
11 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>
#include <QSettings>
#include "ApplicationDAO.h"
#include "DatabaseManager.h"
#include "db/ApplicationInfo.h"
bool ApplicationDAO::upsertApplication(const ApplicationInfo &info) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
INSERT INTO applications (id, device_id, pin_code, name, code, package, status, comment, install, pin_code_checked)
VALUES (:id, :device_id, :pin_code, :name, :code, :package, :status, :comment, :install, :pin_code_checked)
ON CONFLICT(device_id, code)
DO UPDATE SET
device_id = excluded.device_id,
pin_code = excluded.pin_code,
name = excluded.name,
code = excluded.code,
package = excluded.package,
status = excluded.status,
comment = excluded.comment,
install = excluded.install,
pin_code_checked = excluded.pin_code_checked
)");
query.bindValue(":id", info.id);
query.bindValue(":device_id", info.deviceId);
query.bindValue(":pin_code", info.pinCode);
query.bindValue(":name", info.name);
query.bindValue(":code", info.code);
query.bindValue(":package", info.package);
query.bindValue(":status", info.status);
query.bindValue(":comment", info.comment);
query.bindValue(":install", info.install ? "yes" : "no");
query.bindValue(":pin_code_checked", info.pinCodeChecked ? "yes" : "no");
if (!query.exec()) {
qWarning() << "Ошибка при вставке/обновлении application:" << query.lastError().text();
return false;
}
return true;
}
bool ApplicationDAO::updatePinCode(const QString &appId, const QString &pinCode) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
UPDATE applications
SET pin_code = :pin_code
WHERE id = :id
)");
query.bindValue(":pin_code", pinCode);
query.bindValue(":id", appId);
if (!query.exec()) {
qWarning() << "Ошибка при обновлении PIN-кода приложения:" << query.lastError().text();
return false;
}
return true;
}
bool ApplicationDAO::update(
const int &appId,
const QString &pinCode,
const QString &comment,
const QString &status
) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
UPDATE applications
SET pin_code = :pin_code, comment = :comment, status = :status
WHERE id = :id
)");
query.bindValue(":id", appId);
query.bindValue(":comment", comment);
query.bindValue(":pin_code", pinCode);
query.bindValue(":status", status);
if (!query.exec()) {
qWarning() << "Ошибка при обновлении PIN-кода приложения:" << query.lastError().text();
return false;
}
return true;
}
bool ApplicationDAO::updatePinCodeStatus(
const int &appId,
const QString &pinCodeStatus,
const QString &comment
) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
UPDATE applications
SET pin_code_checked = :pin_code_checked, comment = :comment, status = :status
WHERE id = :id
)");
query.bindValue(":id", appId);
query.bindValue(":comment", comment);
query.bindValue(":pin_code_checked", pinCodeStatus);
query.bindValue(":status", pinCodeStatus == "yes" ? "active" : "off");
if (!query.exec()) {
qWarning() << "Ошибка при обновлении PIN-кода приложения:" << query.lastError().text();
return false;
}
return true;
}
ApplicationInfo parseApplication(const QSqlQuery &query) {
ApplicationInfo app;
app.id = query.value("id").toInt();
app.deviceId = query.value("device_id").toString();
app.pinCode = query.value("pin_code").toString();
app.code = query.value("code").toString();
app.name = query.value("name").toString();
app.package = query.value("package").toString();
app.status = query.value("status").toString();
app.comment = query.value("comment").toString();
app.install = query.value("install").toString() == "yes";
app.pinCodeChecked = query.value("pin_code_checked").toString() == "yes";
app.phone = query.value("phone").toString();
app.email = query.value("email").toString();
app.fullName = query.value("full_name").toString();
app.bankProfileId = query.value("bank_profile_id").toString();
app.currency = query.value("currency").toString();
app.amount = query.value("amount").toDouble();
return app;
}
ApplicationInfo ApplicationDAO::getApplication(const QString &deviceId, const QString &appCode) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
SELECT id, device_id, pin_code, code, name, package, status, comment, install, pin_code_checked, phone, email, full_name, bank_profile_id, currency, amount
FROM applications
WHERE device_id = :device_id AND code = :code
LIMIT 1
)");
query.bindValue(":device_id", deviceId);
query.bindValue(":code", appCode);
if (!query.exec()) {
qWarning() << "Ошибка при получении приложений по deviceId:" << query.lastError().text();
return {};
}
while (query.next()) {
return parseApplication(query);
}
return {};
}
QList<ApplicationInfo> ApplicationDAO::getApplicationsByDeviceId(const QString &deviceId) {
QSqlQuery query(DatabaseManager::instance().database());
QList<ApplicationInfo> list;
query.prepare(R"(
SELECT id, device_id, pin_code, code, name, package, status, comment, install, pin_code_checked, phone, email, full_name, bank_profile_id, currency, amount
FROM applications
WHERE device_id = :device_id AND install = 'yes'
)");
query.bindValue(":device_id", deviceId);
if (!query.exec()) {
qWarning() << "Ошибка при получении приложений по deviceId:" << query.lastError().text();
return {};
}
while (query.next()) {
list.append(parseApplication(query));
}
return list;
}
bool ApplicationDAO::updateProfileInfo(
const int &appId,
const QString &fullName,
const QString &phone,
const QString &email
) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
UPDATE applications
SET full_name = :full_name, phone = :phone, email = :email
WHERE id = :id
)");
query.bindValue(":id", appId);
query.bindValue(":full_name", fullName);
query.bindValue(":phone", phone);
query.bindValue(":email", email);
if (!query.exec()) {
qWarning() << "Ошибка при обновлении профиля приложения:" << query.lastError().text();
return false;
}
return true;
}
bool ApplicationDAO::updateAmount(const int appId, const double amount) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare("UPDATE applications SET amount = :amount WHERE id = :id");
query.bindValue(":amount", amount);
query.bindValue(":id", appId);
if (!query.exec()) {
qWarning() << "Ошибка при обновлении amount в application:" << query.lastError().text();
return false;
}
return true;
}
bool ApplicationDAO::updateBankProfileId(const int appId, const QString &bankProfileId) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare("UPDATE applications SET bank_profile_id = :bank_profile_id WHERE id = :id");
query.bindValue(":bank_profile_id", bankProfileId);
query.bindValue(":id", appId);
if (!query.exec()) {
qWarning() << "Ошибка при обновлении bank_profile_id:" << query.lastError().text();
return false;
}
return true;
}
bool ApplicationDAO::activateAppsForDevice(const QString &deviceId) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
UPDATE applications SET status = 'active'
WHERE device_id = :device_id AND install = 'yes' AND pin_code_checked = 'yes'
)");
query.bindValue(":device_id", deviceId);
if (!query.exec()) {
qWarning() << "Ошибка при активации приложений:" << query.lastError().text();
return false;
}
return true;
}
bool ApplicationDAO::deactivateAppsForDevice(const QString &deviceId) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
UPDATE applications SET status = 'off'
WHERE device_id = :device_id AND install = 'yes'
)");
query.bindValue(":device_id", deviceId);
if (!query.exec()) {
qWarning() << "Ошибка при деактивации приложений:" << query.lastError().text();
return false;
}
return true;
}
bool ApplicationDAO::checkInstalledApps(const QString &deviceId, const QSet<QString> &apps) {
QSqlQuery query(DatabaseManager::instance().database());
const QSettings settings("config.ini", QSettings::IniFormat);
QStringList banks = settings.value("apps/list", QStringList()).toStringList();
// Сбросить install = 'no' для банков которых нет в текущем apps/list
if (!banks.isEmpty()) {
QStringList placeholders;
for (int i = 0; i < banks.size(); ++i) placeholders << "?";
query.prepare(QString(R"(
UPDATE applications SET install = 'no'
WHERE device_id = ? AND code NOT IN (%1)
)").arg(placeholders.join(",")));
query.addBindValue(deviceId);
for (const QString &bank : banks) query.addBindValue(bank);
if (!query.exec()) {
qWarning() << "Ошибка при сбросе install:" << query.lastError().text();
}
}
for (const QString &bank: banks) {
QString package = settings.value(bank + "/android_package_name").toString();
QString name = settings.value(bank + "/name").toString();
const QString currency = settings.value(bank + "/currency").toString();
query.prepare(R"(
INSERT INTO applications (device_id, name, code, package, status, install, pin_code_checked, currency)
VALUES (:device_id, :name, :code, :package, :status, :install, :pin_code_checked, :currency)
ON CONFLICT(device_id, code)
DO UPDATE SET
install = excluded.install,
currency = CASE WHEN excluded.currency != '' THEN excluded.currency ELSE currency END
)");
query.bindValue(":device_id", deviceId);
query.bindValue(":code", bank);
query.bindValue(":name", name);
query.bindValue(":package", package);
query.bindValue(":status", "off");
query.bindValue(":pin_code_checked", "no");
query.bindValue(":install", apps.contains(package) ? "yes" : "no");
query.bindValue(":currency", currency);
if (!query.exec()) {
qWarning() << "Ошибка при проверке приложений:" << query.lastError().text();
return false;
}
}
return true;
}