/
seneka.y
/
ClientServer
Обзор
Документация
Войти
/
seneka.y
/
ClientServer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
server/clientworker.cpp
203 строки
5 KB
Julia Sinika
Initial commit
09 ноя 2025, 22:05
09 ноя 2025, 22:05
bfef146
Код
Авторство
О чём код?
#include "clientworker.h" #include "database.h" #include <QDebug> #include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> #include <QThread> ClientWorker::ClientWorker(QObject* parent) : QObject(parent), m_socket(nullptr) {} ClientWorker::~ClientWorker() { if (m_socket) { m_socket->close(); m_socket->deleteLater(); m_socket = nullptr; } } void ClientWorker::initialize(qintptr socketDescriptor) { m_socket = new QTcpSocket(); if (!m_socket->setSocketDescriptor(socketDescriptor)) { m_socket->deleteLater(); m_socket = nullptr; deleteLater(); return; } m_socket->setParent(this); connect(m_socket, &QTcpSocket::readyRead, this, &ClientWorker::onReadyRead); connect(m_socket, &QTcpSocket::disconnected, this, &ClientWorker::onDisconnected); connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError))); } void ClientWorker::onReadyRead() { if (!m_socket) return; QByteArray data = m_socket->readAll(); processRequest(data); } void ClientWorker::onDisconnected() { if (m_socket) { m_socket->close(); m_socket->deleteLater(); m_socket = nullptr; } deleteLater(); } void ClientWorker::onError(QAbstractSocket::SocketError error) { if (!m_socket) return; qWarning() << "Socket error (" << error << "):" << m_socket->errorString(); } void ClientWorker::processRequest(const QByteArray& data) { QJsonParseError parseError; QJsonDocument doc = QJsonDocument::fromJson(data, &parseError); if (parseError.error != QJsonParseError::NoError) { QJsonObject errorResponse; return; } QJsonObject request = doc.object(); QString action = request["action"].toString(); if (action == "add_user") { handleAddUser(request); } else if (action == "get_users") { handleGetUsers(); } else if (action == "delete_user") { handleDeleteUser(request); } else if (action == "update_user") { handleUpdateUser(request); } else { QJsonObject errorResponse; errorResponse["status"] = "error"; errorResponse["message"] = "Unknown action: " + action; sendResponse(errorResponse); } } void ClientWorker::handleAddUser(const QJsonObject& request) { QString username = request["username"].toString(); QString email = request["email"].toString(); if (username.isEmpty() || email.isEmpty()) { QJsonObject response; response["status"] = "error"; response["message"] = "username и email обязательны"; sendResponse(response); return; } QString errorMsg; bool success = Database::instance().addUser(username, email, errorMsg); QJsonObject response; if (success) { response["status"] = "success"; response["message"] = "User added successfully"; } else { response["status"] = "error"; response["message"] = errorMsg; } sendResponse(response); } void ClientWorker::handleGetUsers() { QString errorMsg; QJsonArray users = Database::instance().getAllUsers(errorMsg); QJsonObject response; if (errorMsg.isEmpty()) { response["status"] = "success"; response["users"] = users; } else { response["status"] = "error"; response["message"] = errorMsg; } sendResponse(response); } void ClientWorker::handleDeleteUser(const QJsonObject& request) { int id = request["id"].toInt(); if (id <= 0) { QJsonObject response; response["status"] = "error"; response["message"] = "Некорректный ID пользователя"; sendResponse(response); return; } QString errorMsg; bool success = Database::instance().deleteUser(id, errorMsg); QJsonObject response; if (success) { response["status"] = "success"; response["message"] = "User deleted successfully"; } else { response["status"] = "error"; response["message"] = errorMsg; } sendResponse(response); } void ClientWorker::handleUpdateUser(const QJsonObject& request) { int id = request["id"].toInt(); QString username = request["username"].toString(); QString email = request["email"].toString(); if (id <= 0 || username.isEmpty() || email.isEmpty()) { QJsonObject response; response["status"] = "error"; response["message"] = "Некорректные данные"; sendResponse(response); return; } QString errorMsg; bool success = Database::instance().updateUser(id, username, email, errorMsg); QJsonObject response; if (success) { response["status"] = "success"; response["message"] = "User updated successfully"; } else { response["status"] = "error"; response["message"] = errorMsg; } sendResponse(response); } void ClientWorker::sendResponse(const QJsonObject& response) { if (!m_socket) { return; } if (m_socket->state() != QAbstractSocket::ConnectedState) { return; } QJsonDocument doc(response); QByteArray data = doc.toJson(QJsonDocument::Compact); qint64 written = m_socket->write(data); if (written <= 0) { return; } m_socket->flush(); }