// rocie - An enterprise grocery management system // // Copyright (C) 2026 Benedikt Peetz // SPDX-License-Identifier: GPL-3.0-or-later // // This file is part of Rocie. // // You should have received a copy of the License along with this program. // If not, see . use crate::{ app::App, storage::sql::user::{PasswordHash, User, UserId}, }; use sqlx::query; impl User { pub(crate) async fn get_all(app: &App) -> Result, get_all::Error> { let records = query!( " SELECT id, name, password_hash, description FROM users " ) .fetch_all(&app.db) .await?; Ok(records .into_iter() .map(|record| Self { id: UserId::from_db(&record.id), name: record.name, password_hash: PasswordHash::from_db(record.password_hash), description: record.description, }) .collect()) } pub(crate) async fn from_id(app: &App, id: UserId) -> Result, from_id::Error> { let record = query!( " SELECT name, password_hash, description FROM users WHERE id = ? ", id ) .fetch_optional(&app.db) .await?; if let Some(record) = record { Ok(Some(Self { name: record.name, description: record.description, id, password_hash: PasswordHash::from_db(record.password_hash), })) } else { Ok(None) } } pub(crate) async fn from_name( app: &App, name: String, ) -> Result, from_name::Error> { let record = query!( " SELECT id, name, password_hash, description FROM users WHERE name = ? ", name ) .fetch_optional(&app.db) .await?; if let Some(record) = record { Ok(Some(Self { name: record.name, description: record.description, id: UserId::from_db(&record.id), password_hash: PasswordHash::from_db(record.password_hash), })) } else { Ok(None) } } } pub(crate) mod get_all { use actix_web::ResponseError; #[derive(thiserror::Error, Debug)] pub(crate) enum Error { #[error("Failed to execute the sql query")] SqlError(#[from] sqlx::Error), } impl ResponseError for Error {} } pub(crate) mod from_id { use actix_web::ResponseError; #[derive(thiserror::Error, Debug)] pub(crate) enum Error { #[error("Failed to execute the sql query")] SqlError(#[from] sqlx::Error), } impl ResponseError for Error {} } pub(crate) mod from_name { use actix_web::ResponseError; #[derive(thiserror::Error, Debug)] pub(crate) enum Error { #[error("Failed to execute the sql query")] SqlError(#[from] sqlx::Error), } impl ResponseError for Error {} }