diff --git a/api/src/guards/request/auth/admin.rs b/api/src/guards/request/auth/admin.rs new file mode 100644 index 0000000..b22a145 --- /dev/null +++ b/api/src/guards/request/auth/admin.rs @@ -0,0 +1,40 @@ +use entity::candidate::Model as Admin; +use portfolio_core::sea_orm::prelude::Uuid; +use portfolio_core::services::admin_service::AdminService; +use rocket::http::Status; +use rocket::outcome::Outcome; +use rocket::request::{FromRequest, Request}; + +use crate::pool::Db; + +pub struct AdminAuth(Admin); + +impl Into for AdminAuth { + fn into(self) -> Admin { + self.0 + } +} + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for AdminAuth { + type Error = Option; + async fn from_request(req: &'r Request<'_>) -> Outcome { + let session_id = req.cookies().get("id").unwrap().name_value().1; + let conn = &req.rocket().state::().unwrap().conn; + + let uuid = match Uuid::parse_str(&session_id) { + Ok(uuid) => uuid, + Err(_) => return Outcome::Failure((Status::BadRequest, None)), + }; + + let session = AdminService::auth(conn, uuid).await; + + match session { + Ok(model) => Outcome::Success(AdminAuth(model)), + Err(e) => Outcome::Failure( + (Status::from_code(e.code()).unwrap_or(Status::InternalServerError), None) + ), + } + + } +} \ No newline at end of file diff --git a/api/src/guards/request/auth/candidate.rs b/api/src/guards/request/auth/candidate.rs new file mode 100644 index 0000000..5b3200c --- /dev/null +++ b/api/src/guards/request/auth/candidate.rs @@ -0,0 +1,38 @@ +use entity::candidate::Model as Candidate; +use portfolio_core::sea_orm::prelude::Uuid; +use portfolio_core::services::candidate_service::CandidateService; +use rocket::http::Status; +use rocket::outcome::Outcome; +use rocket::request::{FromRequest, Request}; + +use crate::pool::Db; + +pub struct CandidateAuth(Candidate); + +impl Into for CandidateAuth { + fn into(self) -> Candidate { + self.0 + } +} + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for CandidateAuth { + type Error = Option; + async fn from_request(req: &'r Request<'_>) -> Outcome { + let session_id = req.cookies().get("id").unwrap().name_value().1; + let conn = &req.rocket().state::().unwrap().conn; + + let uuid = match Uuid::parse_str(&session_id) { + Ok(uuid) => uuid, + Err(_) => return Outcome::Failure((Status::BadRequest, None)), + }; + + let session = CandidateService::auth(conn, uuid).await; + + match session { + Ok(model) => Outcome::Success(CandidateAuth(model)), + Err(_) => Outcome::Failure((Status::Unauthorized, None)), + } + + } +} \ No newline at end of file diff --git a/api/src/guards/request/auth/mod.rs b/api/src/guards/request/auth/mod.rs new file mode 100644 index 0000000..e4cf6a5 --- /dev/null +++ b/api/src/guards/request/auth/mod.rs @@ -0,0 +1,5 @@ +pub mod admin; +pub mod candidate; + +pub use admin::*; +pub use candidate::*; diff --git a/api/src/guards/request/mod.rs b/api/src/guards/request/mod.rs index 066d9a7..5696e21 100644 --- a/api/src/guards/request/mod.rs +++ b/api/src/guards/request/mod.rs @@ -1 +1 @@ -pub mod session_auth; \ No newline at end of file +pub mod auth; \ No newline at end of file diff --git a/api/src/lib.rs b/api/src/lib.rs index 0e6613b..14f5ebb 100644 --- a/api/src/lib.rs +++ b/api/src/lib.rs @@ -3,7 +3,7 @@ extern crate rocket; use std::net::SocketAddr; -use guards::request::session_auth::{CandidateAuth, AdminAuth}; +use guards::request::auth::{CandidateAuth, AdminAuth}; use portfolio_core::services::candidate_service::CandidateService; use requests::{LoginRequest, RegisterRequest}; use rocket::http::Status;