use diesel::prelude::*; use serde::{Serialize, Deserialize}; use siren::ServiceError; use crate::db::schema::users; use super::hash_password; #[derive(Debug, Serialize, Deserialize)] pub struct RegisterUser { pub email: String, pub password: String, pub first_name: String, pub last_name: String, } impl RegisterUser { pub fn convert_to_insert(self) -> Result { let hash = hash_password(self.password.as_bytes())?; Ok(InsertUser { email: self.email.to_lowercase(), hash, role: "user".to_string(), first_name: self.first_name, last_name: self.last_name, }) } } #[derive(Debug, Serialize, Deserialize)] pub struct LoginRequest { pub email: String, pub password: String, } #[derive(Debug, Serialize, Deserialize)] pub struct LoginResponse { pub token: String, } #[derive(Debug, Queryable, QueryableByName, Serialize, Deserialize)] #[diesel(table_name = users)] pub struct QueryUser { pub email: String, pub hash: String, pub role: String, pub first_name: String, pub last_name: String, } impl QueryUser { pub fn get_by_email(email: &str) -> Result { let mut conn = crate::db::connection()?; // Check if the user exists by email, case insensitive let user = users::table .filter(users::email.eq(email.to_lowercase())) .first(&mut conn)?; Ok(user) } } #[derive(Debug, Insertable, AsChangeset, Serialize, Deserialize)] #[diesel(table_name = users)] pub struct InsertUser { pub email: String, pub hash: String, pub role: String, pub first_name: String, pub last_name: String, } impl InsertUser { pub fn insert(user: Self) -> Result { let mut conn = crate::db::connection()?; let user = diesel::insert_into(users::table) .values(user) .get_result(&mut conn)?; Ok(user) } }