Files

131 lines
4.1 KiB
C++
Raw Permalink Normal View History

2026-07-12 14:34:52 +04:00
#include "users_repository.h"
#include "create_user_request.h"
#include "repository_result.h"
#include "update_user_request.h"
#include "user_dto.h"
#include <QSqlError>
#include <QSqlQuery>
UsersRepository::UsersRepository(QSqlDatabase &database, QObject *parent)
: BaseSqlTableRepository(database, parent) {}
RepositoryResult UsersRepository::createUser(const CreateUserRequest &request) {
QSqlQuery query = foreignKeysOnQuery();
query.prepare("INSERT INTO users (username, password_hash, salt, role_id) "
"VALUES (:username, :password_hash, :salt, :role_id)");
query.bindValue(":password_hash", request.passwordHash());
query.bindValue(":role_id", request.roleId());
query.bindValue(":salt", request.salt());
query.bindValue(":username", request.username());
if (!query.exec()) {
return RepositoryResult::failureResult(query.lastError().text());
}
emit dataCreated();
return RepositoryResult::successResult();
}
RepositoryResult UsersRepository::getUserById(qint32 id, UserDTO &user) const {
QSqlQuery query = foreignKeysOnQuery();
query.prepare("SELECT user_id, username, password_hash, salt, role_id FROM "
"users WHERE "
"user_id = :user_id");
query.bindValue(":user_id", id);
if (!query.exec()) {
return RepositoryResult::failureResult(query.lastError().text());
}
if (!query.next()) {
return RepositoryResult::failureResult("User not found");
}
user = mapQueryToDTO(query);
emit dataRetrieved();
return RepositoryResult::successResult();
}
RepositoryResult UsersRepository::getUserByUsername(const QString &username,
UserDTO &user) const {
QSqlQuery query = foreignKeysOnQuery();
query.prepare("SELECT user_id, username, password_hash, salt, role_id FROM "
"users WHERE "
"username = :username");
query.bindValue(":username", username);
if (!query.exec()) {
return RepositoryResult::failureResult(query.lastError().text());
}
if (!query.next()) {
return RepositoryResult::failureResult("User not found");
}
user = mapQueryToDTO(query);
emit dataRetrieved();
return RepositoryResult::successResult();
}
RepositoryResult UsersRepository::getAllUsers(QVector<UserDTO> &users) const {
QSqlQuery query = foreignKeysOnQuery();
query.prepare(
"SELECT user_id, username, password_hash, salt, role_id FROM users");
if (!query.exec()) {
return RepositoryResult::failureResult(query.lastError().text());
}
while (query.next()) {
users.append(mapQueryToDTO(query));
}
emit dataRetrieved();
return RepositoryResult::successResult();
}
RepositoryResult UsersRepository::updateUser(const UpdateUserRequest &request) {
QSqlQuery query = foreignKeysOnQuery();
query.prepare("UPDATE users SET username = :username, password_hash = "
":password_hash, "
"salt = :salt, role_id = :role_id WHERE user_id = :user_id");
query.bindValue(":username", request.username());
query.bindValue(":password_hash", request.passwordHash());
query.bindValue(":salt", request.salt());
query.bindValue(":role_id", request.roleId());
query.bindValue(":user_id", request.userId());
if (!query.exec()) {
return RepositoryResult::failureResult(query.lastError().text());
}
emit dataUpdated();
return RepositoryResult::successResult();
}
RepositoryResult UsersRepository::deleteUserById(qint32 userId) {
QSqlQuery query = foreignKeysOnQuery();
query.prepare("DELETE FROM users WHERE user_id = :user_id");
query.bindValue(":user_id", userId);
if (!query.exec()) {
return RepositoryResult::failureResult(query.lastError().text());
}
emit dataDeleted();
return RepositoryResult::successResult();
}
UserDTO UsersRepository::mapQueryToDTO(const QSqlQuery &query) const {
UserDTO userDTO;
userDTO.setPasswordHash(query.value("password_hash").toString());
userDTO.setRoleId(query.value("role_id").toInt());
userDTO.setSalt(query.value("salt").toString());
userDTO.setUserId(query.value("user_id").toInt());
userDTO.setUsername(query.value("username").toString());
return userDTO;
}