131 lines
4.1 KiB
C++
131 lines
4.1 KiB
C++
|
|
#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;
|
||
|
|
}
|