use actix_identity::Identity; use actix_web::{get, HttpResponse, post, web}; use serde::{Deserialize, Serialize}; use crate::api::JsonResponse; use crate::AppState; use crate::entity::user_info::Model; use crate::errors::{AppError, UserError}; use crate::service::user_info::Query; pub(crate) fn create_auth_token(user: &Model) -> u64 { use std::{ collections::hash_map::DefaultHasher, hash::{Hash, Hasher}, }; let mut hasher = DefaultHasher::new(); user.hash(&mut hasher); hasher.finish() } #[derive(Clone, Debug, Serialize, Deserialize)] pub(crate) struct LoginParams { pub(crate) email: String, pub(crate) password: String, } #[post("/v1.0/login")] async fn login( data: web::Data, identity: Identity, input: web::Json ) -> Result { match Query::login(&data.conn, &input.email, &input.password).await? { Some(user) => { let token = create_auth_token(&user).to_string(); identity.remember(token.clone()); let json_response = JsonResponse { code: 200, err: "".to_owned(), data: token.clone(), }; Ok(HttpResponse::Ok() .content_type("application/json") .append_header(("X-Auth-Token", token)) .body(serde_json::to_string(&json_response)?)) } None => Err(UserError::LoginFailed.into()) } }