diff --git a/core/src/services/admin_service.rs b/core/src/services/admin_service.rs index 71bda95..76c719a 100644 --- a/core/src/services/admin_service.rs +++ b/core/src/services/admin_service.rs @@ -13,19 +13,9 @@ impl AdminService { admin_id: i32, password: String, ) -> Result { - let admin = Query::find_admin_by_id(db, admin_id).await?; - - let Some(admin) = admin else { - return Err(ServiceError::CandidateNotFound); - }; - + let admin = Query::find_admin_by_id(db, admin_id).await?.ok_or(ServiceError::InvalidCredentials)?; let private_key_encrypted = admin.private_key; - - let private_key = crypto::decrypt_password(private_key_encrypted, password).await; - - let Ok(private_key) = private_key else { - return Err(ServiceError::CryptoDecryptFailed); - }; + let private_key = crypto::decrypt_password(private_key_encrypted, password).await?; Ok(private_key) } @@ -36,24 +26,64 @@ impl AdminService { password: String, ip_addr: String, ) -> Result<(String, String), ServiceError> { - let session_id = - SessionService::new_session(db, None, Some(admin_id), password.clone(), ip_addr).await; - match session_id { - Ok(session_id) => { - let private_key = Self::decrypt_private_key(db, admin_id, password).await?; - Ok((session_id, private_key)) - } - Err(e) => Err(e), - } + let session_id = SessionService::new_session(db, + None, + Some(admin_id), + password.clone(), + ip_addr + ) + .await?; + + let private_key = Self::decrypt_private_key(db, admin_id, password).await?; + Ok((session_id, private_key)) } pub async fn auth(db: &DbConn, session_uuid: Uuid) -> Result { - match SessionService::auth_user_session(db, session_uuid).await { - Ok(user) => match user { - AdminUser::Admin(admin) => Ok(admin), - AdminUser::Candidate(_) => unreachable!(), - }, - Err(e) => Err(e), + match SessionService::auth_user_session(db, session_uuid).await? { + AdminUser::Admin(admin) => Ok(admin), + AdminUser::Candidate(_) => unreachable!(), } } } + +#[cfg(test)] +mod admin_tests { + use chrono::Local; + use entity::admin; + use sea_orm::{Set, ActiveModelTrait}; + + use crate::{util::get_memory_sqlite_connection, error::ServiceError}; + + use super::*; + + + #[tokio::test] + async fn test_admin_login() -> Result<(), ServiceError> { + let db = get_memory_sqlite_connection().await; + let _ = admin::ActiveModel { + id: Set(1), + name: Set("Admin".to_owned()), + public_key: Set("age1u889gp407hsz309wn09kxx9anl6uns30m27lfwnctfyq9tq4qpus8tzmq5".to_owned()), + // AGE-SECRET-KEY-14QG24502DMUUQDT2SPMX2YXPSES0X8UD6NT0PCTDAT6RH8V5Q3GQGSRXPS + private_key: Set("5KCEGk0ueWVGnu5Xo3rmpLoilcVZ2ZWmwIcdZEJ8rrBNW7jwzZU/XTcTXtk/xyy/zjF8s+YnuVpOklQvX3EC/Sn+ZwyPY3jokM2RNwnZZlnqdehOEV1SMm/Y".to_owned()), + // test + password: Set("$argon2i$v=19$m=6000,t=3,p=10$WE9xCQmmWdBK82R4SEjoqA$TZSc6PuLd4aWK2x2WAb+Lm9sLySqjK3KLbNyqyQmzPQ".to_owned()), + created_at: Set(Local::now().naive_local()), + updated_at: Set(Local::now().naive_local()), + ..Default::default() + } + .insert(&db) + .await?; + + let (session_id, _private_key) = AdminService::login(&db, 1, "test".to_owned(), "127.0.0.1".to_owned()).await?; + + let logged_admin = AdminService::auth(&db, session_id.parse().unwrap()).await?; + + assert_eq!(logged_admin.id, 1); + assert_eq!(logged_admin.name, "Admin"); + + + Ok(()) + + } +} \ No newline at end of file diff --git a/core/src/services/session_service.rs b/core/src/services/session_service.rs index f81cc3e..4960fc4 100644 --- a/core/src/services/session_service.rs +++ b/core/src/services/session_service.rs @@ -162,7 +162,12 @@ impl SessionService { #[cfg(test)] mod tests { - use sea_orm::prelude::Uuid; + use entity::{admin, candidate, session, parent}; + + use sea_orm::{ + prelude::Uuid, sea_query::TableCreateStatement, ConnectionTrait, Database, DbBackend, + DbConn, Schema, + }; use crate::{ crypto,