use chrono::{DateTime, Utc};
use sqlx::{Execute, PgPool};
use super::{Area, Function, Role};
#[derive(Clone)]
pub struct User {
pub id: i32,
pub name: String,
pub email: String,
pub password: String,
pub salt: String,
pub role: Role,
pub function: Function,
pub area_id: i32,
pub area: Option,
pub locked: bool,
pub last_login: Option>,
pub receive_notifications: bool,
}
impl User {
pub async fn create(
pool: &PgPool,
name: &str,
email: &str,
password: &str,
salt: &str,
role: Role,
function: Function,
area_id: i32,
) -> anyhow::Result {
let created = sqlx::query!(
r#"
INSERT INTO user_ (name, email, password, salt, role, function, areaId)
VALUES ($1, $2, $3, $4, $5, $6, $7)
RETURNING id;
"#,
name,
email,
password,
salt,
role as Role,
function as Function,
area_id
)
.fetch_one(pool)
.await;
match created {
Ok(result) => Ok(result.id),
Err(err) => Err(err.into()),
}
}
pub async fn read_by_id(pool: &PgPool, id: i32) -> anyhow::Result {
let record = sqlx::query!(
r#"
SELECT id,
name,
email,
password,
salt,
role AS "role: Role",
function AS "function: Function",
areaId,
locked,
lastLogin,
receiveNotifications
FROM user_
WHERE id = $1;
"#,
id,
)
.fetch_one(pool)
.await?;
let user = User {
id: record.id,
name: record.name,
email: record.email,
password: record.password,
salt: record.salt,
role: record.role,
function: record.function,
area_id: record.areaid,
area: None,
locked: record.locked,
last_login: record.lastlogin,
receive_notifications: record.receivenotifications,
};
Ok(user)
}
pub async fn read_for_login(pool: &PgPool, email: &str) -> anyhow::Result