Skip to content

Commit

Permalink
Merge pull request #12 from indnb/feature/add-login-admin
Browse files Browse the repository at this point in the history
Feature/add login admin
  • Loading branch information
brizzinck authored Jan 12, 2025
2 parents 8290760 + c346955 commit 9557120
Show file tree
Hide file tree
Showing 15 changed files with 110 additions and 0 deletions.
1 change: 1 addition & 0 deletions \
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pub mod create_jwt;
Empty file added api
Empty file.
8 changes: 8 additions & 0 deletions src/api/admin/get.rs
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
use crate::models::admin::admin_jwt;
use log::info;
use rocket::get;

#[allow(dead_code)]
#[get("/admin/get")]
pub async fn get(claims: admin_jwt::AdminJwt) {
info!("Welcome, user with ID: {}", claims.admin_name);
}
39 changes: 39 additions & 0 deletions src/api/admin/post.rs
Original file line number Diff line number Diff line change
@@ -1 +1,40 @@
use crate::dto::request::admin::login_admin::LoginAdminData;
use crate::error::api_error::ApiError;
use crate::models::admin::admin_jwt;
use crate::utils::env_configuration::EnvConfiguration;
use crate::utils::prelude_api::*;
use crate::utils::security;
use chrono::{Duration, Utc};
use rocket::post;

#[post("/admin/login", data = "<data>")]
pub async fn login(data: Json<LoginAdminData>) -> Result<String, ApiError> {
let data = data.into_inner();
let LoginAdminData {
admin_name,
admin_password,
} = data;
let password_env = EnvConfiguration::get().admin_password.to_owned();
let name_env = EnvConfiguration::get().admin_name.to_owned();
if name_env != admin_name {
return Err(ApiError::ValidationError(
"Error validation admin name".to_string(),
));
}

if password_env != admin_password {
return Err(ApiError::ValidationError(
"Error validation admin password".to_string(),
));
}
let my_claims = admin_jwt::AdminJwt {
admin_password,
admin_name,
exp: (Utc::now() + Duration::hours(24)).timestamp() as u64,
};

match security::encoded_data(&my_claims) {
Ok(token) => Ok(token),
Err(err) => Err(ApiError::TokenGenerationError(err.to_string())),
}
}
6 changes: 6 additions & 0 deletions src/dto/request/admin/check_jwt.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
use serde::Deserialize;
#[derive(Deserialize)]
#[allow(dead_code)]
pub struct CheckJwtAdminData {
jwt: String,
}
7 changes: 7 additions & 0 deletions src/dto/request/admin/login_admin.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
use serde::Deserialize;

#[derive(Deserialize)]
pub struct LoginAdminData {
pub admin_password: String,
pub admin_name: String,
}
2 changes: 2 additions & 0 deletions src/dto/request/admin/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pub mod check_jwt;
pub mod login_admin;
1 change: 1 addition & 0 deletions src/dto/request/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
pub mod admin;
pub mod hackathon_2024;
pub mod user;
26 changes: 26 additions & 0 deletions src/middleware/get_user.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
use crate::models::admin::admin_jwt;
use crate::utils::security;
use rocket::http::Status;
use rocket::request::FromRequest;
use rocket::{request, Request};

#[rocket::async_trait]
impl<'r> FromRequest<'r> for admin_jwt::AdminJwt {
type Error = ();

#[allow(dead_code)]
async fn from_request(req: &'r Request<'_>) -> request::Outcome<Self, Self::Error> {
let token = req
.headers()
.get_one("Authorization")
.and_then(|header| header.strip_prefix("Bearer "));

match token {
Some(token) => match security::decoded_data::<admin_jwt::AdminJwt>(token) {
Ok(token_data) => request::Outcome::Success(token_data.claims),
Err(_) => request::Outcome::Error((Status::Unauthorized, ())),
},
None => request::Outcome::Error((Status::Unauthorized, ())),
}
}
}
1 change: 1 addition & 0 deletions src/middleware/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
pub mod admin_match;
pub mod claims;
pub mod get_user;
9 changes: 9 additions & 0 deletions src/models/admin/admin_jwt.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
use serde::{Deserialize, Serialize};

#[allow(dead_code)]
#[derive(Debug, Serialize, Deserialize)]
pub struct AdminJwt {
pub admin_password: String,
pub admin_name: String,
pub exp: u64,
}
1 change: 1 addition & 0 deletions src/models/admin/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pub mod admin_jwt;
1 change: 1 addition & 0 deletions src/models/mod.rs
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
pub mod admin;
pub mod hackathon_2024;
3 changes: 3 additions & 0 deletions src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ impl Server {
api::hackathon_2024::team::get::by_id,
api::hackathon_2024::team::put::by_id,
api::hackathon_2024::team::delete::by_id,
// /adnmin/
api::admin::post::login,
api::admin::get::get,
// /other/*
],
)
Expand Down
5 changes: 5 additions & 0 deletions src/utils/env_configuration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ pub struct EnvConfiguration {
pub admin_role: UserRoleEnum,
*/
#[allow(dead_code)]
pub admin_name: String,
#[allow(dead_code)]
pub admin_password: String,
#[allow(dead_code)]
pub jwt_secret: String,
Expand Down Expand Up @@ -58,6 +60,9 @@ impl EnvConfiguration {
)
.parse()
.expect("Invalid ADMIN_PASSWORD"),
admin_name: EnvConfiguration::unwrap_env("ADMIN_NAME", Some("ADMIN_NAME".to_owned()))
.parse()
.expect("Invalid ADMIN_NAME"),
jwt_secret: EnvConfiguration::unwrap_env("JWT_SECRET", Some("jwt_secret".to_owned()))
.parse()
.expect("Invalid JWT_SECRET"),
Expand Down

0 comments on commit 9557120

Please sign in to comment.