From 31f9b6cfea97a9bb84c94864f6c00a2ac5b887dc Mon Sep 17 00:00:00 2001 From: Maulana Sodiqin Date: Sun, 6 Apr 2025 22:13:46 +0700 Subject: [PATCH] feat: microservice ready --- Cargo.lock | 114 ++++++++++++++++++ Cargo.toml | 6 +- imphnen-apis/src/apps/mod.rs | 55 --------- .../src/apps/v1/auth/auth_middleware.rs | 50 -------- imphnen-apis/src/apps/v1/docs/mod.rs | 8 -- imphnen-apis/src/apps/v1/mod.rs | 23 ---- imphnen-apis/src/apps/v2/auth/mod.rs | 9 -- imphnen-apis/src/apps/v2/mod.rs | 9 -- imphnen-apis/src/apps/v2/permissions/.gitkeep | 0 imphnen-apis/src/apps/v2/roles/.gitkeep | 0 imphnen-apis/src/apps/v2/users/.gitkeep | 0 imphnen-apis/src/bin/api.rs | 9 -- imphnen-apis/src/main.rs | 9 -- imphnen-core-service/Cargo.toml | 25 ++++ imphnen-core-service/src/bin/api.rs | 10 ++ .../src/bin/seed_permissions.rs | 0 .../src/bin/seed_roles.rs | 0 .../src/bin/seed_roles_permissions.rs | 0 .../src/bin/seed_users.rs | 0 imphnen-core-service/src/main.rs | 10 ++ imphnen-dimentorin-service/Cargo.toml | 24 ++++ imphnen-dimentorin-service/src/lib.rs | 14 +++ .../Cargo.toml | 4 +- imphnen-gacha-service/src/lib.rs | 9 ++ .../src}/v1/gacha/gacha_controller.rs | 0 .../src}/v1/gacha/gacha_dto.rs | 0 .../src}/v1/gacha/gacha_repository.rs | 6 +- .../src}/v1/gacha/gacha_schema.rs | 0 .../src}/v1/gacha/gacha_service.rs | 0 .../src}/v1/gacha/mod.rs | 0 imphnen-gacha-service/src/v1/mod.rs | 2 + imphnen-gateway-service/Cargo.toml | 25 ++++ .../src/docs.rs | 12 +- imphnen-gateway-service/src/lib.rs | 32 +++++ imphnen-gateway-service/src/middleware.rs | 73 +++++++++++ imphnen-iam-service/Cargo.toml | 24 ++++ .../src/lib.rs | 4 +- .../src}/v1/auth/auth_controller.rs | 0 .../src}/v1/auth/auth_dto.rs | 0 .../src}/v1/auth/auth_repository.rs | 0 .../src}/v1/auth/auth_schema.rs | 0 .../src}/v1/auth/auth_service.rs | 0 .../src}/v1/auth/mod.rs | 8 +- imphnen-iam-service/src/v1/mod.rs | 22 ++++ .../src}/v1/permissions/mod.rs | 7 +- .../v1/permissions/permissions_controller.rs | 0 .../src}/v1/permissions/permissions_dto.rs | 0 .../src}/v1/permissions/permissions_enum.rs | 0 .../src}/v1/permissions/permissions_guard.rs | 0 .../v1/permissions/permissions_repository.rs | 0 .../src}/v1/permissions/permissions_schema.rs | 0 .../v1/permissions/permissions_service.rs | 0 .../src}/v1/roles/mod.rs | 7 +- .../src}/v1/roles/roles_controller.rs | 0 .../src}/v1/roles/roles_dto.rs | 0 .../src}/v1/roles/roles_enum.rs | 0 .../src}/v1/roles/roles_repository.rs | 0 .../src}/v1/roles/roles_schema.rs | 0 .../src}/v1/roles/roles_service.rs | 0 .../src}/v1/users/mod.rs | 0 .../src}/v1/users/users_controller.rs | 0 .../src}/v1/users/users_dto.rs | 0 .../src}/v1/users/users_repository.rs | 0 .../src}/v1/users/users_schema.rs | 0 .../src}/v1/users/users_service.rs | 0 tests/Cargo.toml | 16 +++ .../iam_service}/auth/auth_controller_test.rs | 31 ++--- .../iam_service}/auth/auth_repository_test.rs | 0 tests/src/iam_service/auth/mod.rs | 4 + tests/src/iam_service/mod.rs | 4 + tests/src/iam_service/permissions/mod.rs | 4 + .../permissions_controller_test.rs | 0 .../permissions_repository_test.rs | 2 +- tests/src/iam_service/roles/mod.rs | 4 + .../roles/roles_controller_test.rs | 0 .../roles/roles_repository_test.rs | 24 ++-- tests/src/iam_service/users/mod.rs | 4 + .../users/users_controller_test.rs | 8 +- .../users/users_repository_test.rs | 0 tests/src/lib.rs | 6 + 80 files changed, 477 insertions(+), 240 deletions(-) delete mode 100644 imphnen-apis/src/apps/mod.rs delete mode 100644 imphnen-apis/src/apps/v1/auth/auth_middleware.rs delete mode 100644 imphnen-apis/src/apps/v1/docs/mod.rs delete mode 100644 imphnen-apis/src/apps/v1/mod.rs delete mode 100644 imphnen-apis/src/apps/v2/auth/mod.rs delete mode 100644 imphnen-apis/src/apps/v2/mod.rs delete mode 100644 imphnen-apis/src/apps/v2/permissions/.gitkeep delete mode 100644 imphnen-apis/src/apps/v2/roles/.gitkeep delete mode 100644 imphnen-apis/src/apps/v2/users/.gitkeep delete mode 100644 imphnen-apis/src/bin/api.rs delete mode 100644 imphnen-apis/src/main.rs create mode 100644 imphnen-core-service/Cargo.toml create mode 100644 imphnen-core-service/src/bin/api.rs rename {imphnen-apis => imphnen-core-service}/src/bin/seed_permissions.rs (100%) rename {imphnen-apis => imphnen-core-service}/src/bin/seed_roles.rs (100%) rename {imphnen-apis => imphnen-core-service}/src/bin/seed_roles_permissions.rs (100%) rename {imphnen-apis => imphnen-core-service}/src/bin/seed_users.rs (100%) create mode 100644 imphnen-core-service/src/main.rs create mode 100644 imphnen-dimentorin-service/Cargo.toml create mode 100644 imphnen-dimentorin-service/src/lib.rs rename {imphnen-apis => imphnen-gacha-service}/Cargo.toml (92%) create mode 100644 imphnen-gacha-service/src/lib.rs rename {imphnen-apis/src/apps => imphnen-gacha-service/src}/v1/gacha/gacha_controller.rs (100%) rename {imphnen-apis/src/apps => imphnen-gacha-service/src}/v1/gacha/gacha_dto.rs (100%) rename {imphnen-apis/src/apps => imphnen-gacha-service/src}/v1/gacha/gacha_repository.rs (96%) rename {imphnen-apis/src/apps => imphnen-gacha-service/src}/v1/gacha/gacha_schema.rs (100%) rename {imphnen-apis/src/apps => imphnen-gacha-service/src}/v1/gacha/gacha_service.rs (100%) rename {imphnen-apis/src/apps => imphnen-gacha-service/src}/v1/gacha/mod.rs (100%) create mode 100644 imphnen-gacha-service/src/v1/mod.rs create mode 100644 imphnen-gateway-service/Cargo.toml rename imphnen-apis/src/apps/v1/docs/docs_controller.rs => imphnen-gateway-service/src/docs.rs (84%) create mode 100644 imphnen-gateway-service/src/lib.rs create mode 100644 imphnen-gateway-service/src/middleware.rs create mode 100644 imphnen-iam-service/Cargo.toml rename {imphnen-apis => imphnen-iam-service}/src/lib.rs (95%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/auth/auth_controller.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/auth/auth_dto.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/auth/auth_repository.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/auth/auth_schema.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/auth/auth_service.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/auth/mod.rs (82%) create mode 100644 imphnen-iam-service/src/v1/mod.rs rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/permissions/mod.rs (88%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/permissions/permissions_controller.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/permissions/permissions_dto.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/permissions/permissions_enum.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/permissions/permissions_guard.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/permissions/permissions_repository.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/permissions/permissions_schema.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/permissions/permissions_service.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/roles/mod.rs (87%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/roles/roles_controller.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/roles/roles_dto.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/roles/roles_enum.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/roles/roles_repository.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/roles/roles_schema.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/roles/roles_service.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/users/mod.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/users/users_controller.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/users/users_dto.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/users/users_repository.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/users/users_schema.rs (100%) rename {imphnen-apis/src/apps => imphnen-iam-service/src}/v1/users/users_service.rs (100%) create mode 100644 tests/Cargo.toml rename {imphnen-apis/src/apps/v1 => tests/src/iam_service}/auth/auth_controller_test.rs (95%) rename {imphnen-apis/src/apps/v1 => tests/src/iam_service}/auth/auth_repository_test.rs (100%) create mode 100644 tests/src/iam_service/auth/mod.rs create mode 100644 tests/src/iam_service/mod.rs create mode 100644 tests/src/iam_service/permissions/mod.rs rename {imphnen-apis/src/apps/v1 => tests/src/iam_service}/permissions/permissions_controller_test.rs (100%) rename {imphnen-apis/src/apps/v1 => tests/src/iam_service}/permissions/permissions_repository_test.rs (98%) create mode 100644 tests/src/iam_service/roles/mod.rs rename {imphnen-apis/src/apps/v1 => tests/src/iam_service}/roles/roles_controller_test.rs (100%) rename {imphnen-apis/src/apps/v1 => tests/src/iam_service}/roles/roles_repository_test.rs (94%) create mode 100644 tests/src/iam_service/users/mod.rs rename {imphnen-apis/src/apps/v1 => tests/src/iam_service}/users/users_controller_test.rs (98%) rename {imphnen-apis/src/apps/v1 => tests/src/iam_service}/users/users_repository_test.rs (100%) create mode 100644 tests/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 8af5f38..290f06b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1849,6 +1849,31 @@ checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" [[package]] name = "imphnen-backend-service" version = "0.1.0" +dependencies = [ + "anyhow", + "axum", + "axum-test", + "chrono", + "imphnen-entities", + "imphnen-gateway-service", + "imphnen-libs", + "imphnen-utils", + "lazy_static", + "rand 0.9.0", + "regex", + "serde", + "serde_json", + "surrealdb", + "tokio", + "tower-http", + "utoipa", + "utoipa-swagger-ui", + "validator", +] + +[[package]] +name = "imphnen-dimentorin-service" +version = "0.1.0" dependencies = [ "anyhow", "axum", @@ -1881,6 +1906,79 @@ dependencies = [ "utoipa", ] +[[package]] +name = "imphnen-gacha-service" +version = "0.1.0" +dependencies = [ + "anyhow", + "axum", + "axum-test", + "chrono", + "imphnen-entities", + "imphnen-libs", + "imphnen-utils", + "lazy_static", + "rand 0.9.0", + "regex", + "serde", + "serde_json", + "surrealdb", + "tokio", + "tower-http", + "utoipa", + "utoipa-swagger-ui", + "validator", +] + +[[package]] +name = "imphnen-gateway-service" +version = "0.1.0" +dependencies = [ + "anyhow", + "axum", + "axum-test", + "chrono", + "imphnen-entities", + "imphnen-iam-service", + "imphnen-libs", + "imphnen-utils", + "lazy_static", + "rand 0.9.0", + "regex", + "serde", + "serde_json", + "surrealdb", + "tokio", + "tower-http", + "utoipa", + "utoipa-swagger-ui", + "validator", +] + +[[package]] +name = "imphnen-iam-service" +version = "0.1.0" +dependencies = [ + "anyhow", + "axum", + "axum-test", + "chrono", + "imphnen-entities", + "imphnen-libs", + "imphnen-utils", + "lazy_static", + "rand 0.9.0", + "regex", + "serde", + "serde_json", + "surrealdb", + "tokio", + "tower-http", + "utoipa", + "utoipa-swagger-ui", + "validator", +] + [[package]] name = "imphnen-libs" version = "0.1.0" @@ -4159,6 +4257,22 @@ dependencies = [ "winapi", ] +[[package]] +name = "tests" +version = "0.1.0" +dependencies = [ + "axum", + "axum-test", + "chrono", + "imphnen-entities", + "imphnen-iam-service", + "imphnen-libs", + "imphnen-utils", + "serde_json", + "surrealdb", + "tokio", +] + [[package]] name = "thiserror" version = "1.0.69" diff --git a/Cargo.toml b/Cargo.toml index a0ade04..1e2ef9a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,10 +1,8 @@ [workspace] resolver = "2" members = [ - "imphnen-apis", - "imphnen-utils", - "imphnen-libs", - "imphnen-entities", + "imphnen-*", + "tests", ] [workspace.dependencies] diff --git a/imphnen-apis/src/apps/mod.rs b/imphnen-apis/src/apps/mod.rs deleted file mode 100644 index 2e45d3b..0000000 --- a/imphnen-apis/src/apps/mod.rs +++ /dev/null @@ -1,55 +0,0 @@ -use crate::{AppState, Env, SurrealMemClient, SurrealWsClient}; -use axum::{ - http::{header, HeaderValue, Method}, - response::Redirect, - routing::get, - Extension, Router, -}; -use tower_http::cors::CorsLayer; -use utoipa_swagger_ui::SwaggerUi; - -pub mod v1; -pub mod v2; - -pub use v1::*; - -pub async fn apps( - surrealdb_ws: SurrealWsClient, - surrealdb_mem: SurrealMemClient, -) -> Router { - let state = AppState { - surrealdb_ws, - surrealdb_mem, - }; - let env = Env::new(); - let cors_origins = match env.rust_env.as_str() { - "development" => vec!["http://localhost:3000"], - "production" => { - vec!["https://gacha.imphnen.dev", "https://imphnen.dev"] - } - _ => vec![ - "http://localhost:3000", - "https://gacha.imphnen.dev", - "https://imphnen.dev", - ], - }; - - let allowed_origins: Vec = cors_origins - .into_iter() - .filter_map(|origin| origin.parse::().ok()) - .collect(); - - let cors_middleware = CorsLayer::new() - .allow_origin(allowed_origins) - .allow_methods([Method::GET, Method::POST, Method::PUT, Method::DELETE]) - .allow_headers([header::AUTHORIZATION, header::CONTENT_TYPE]) - .allow_credentials(true); - - Router::new() - .route("/", get(Redirect::to("/docs"))) - .nest("/v1", v1::routes().await) - .nest("/v2", v2::routes().await) - .merge(SwaggerUi::new("/docs").url("/openapi.json", v1::docs_router())) - .layer(cors_middleware) - .layer(Extension(state)) -} diff --git a/imphnen-apis/src/apps/v1/auth/auth_middleware.rs b/imphnen-apis/src/apps/v1/auth/auth_middleware.rs deleted file mode 100644 index 2ede395..0000000 --- a/imphnen-apis/src/apps/v1/auth/auth_middleware.rs +++ /dev/null @@ -1,50 +0,0 @@ -use crate::{ - common_response, extract_email, AppState, UsersItemDtoRaw, UsersRepository, -}; -use axum::{ - extract::Request, http::StatusCode, middleware::Next, response::Response, - Extension, -}; -use std::convert::Infallible; - -pub async fn auth_middleware( - Extension(state): Extension, - mut req: Request, - next: Next, -) -> Result { - let headers = req.headers(); - - let email = match extract_email(headers) { - Some(email) => email, - None => { - return Ok(common_response( - StatusCode::UNAUTHORIZED, - "Invalid or expired token", - )); - } - }; - - let repository = UsersRepository::new(&state); - - let user: Option = - match repository.query_user_by_email(email).await { - Ok(user) => Some(user), - Err(err) => { - return Ok(common_response( - StatusCode::INTERNAL_SERVER_ERROR, - &err.to_string(), - )) - } - }; - - if user.is_none() { - return Ok(common_response( - StatusCode::UNAUTHORIZED, - "Unauthorized user", - )); - } - - req.extensions_mut().insert(user.unwrap()); - - Ok(next.run(req).await) -} diff --git a/imphnen-apis/src/apps/v1/docs/mod.rs b/imphnen-apis/src/apps/v1/docs/mod.rs deleted file mode 100644 index 62ced02..0000000 --- a/imphnen-apis/src/apps/v1/docs/mod.rs +++ /dev/null @@ -1,8 +0,0 @@ -use utoipa::OpenApi; - -pub mod docs_controller; -pub use docs_controller::*; - -pub fn docs_router() -> utoipa::openapi::OpenApi { - ApiDoc::openapi() -} diff --git a/imphnen-apis/src/apps/v1/mod.rs b/imphnen-apis/src/apps/v1/mod.rs deleted file mode 100644 index 27c98df..0000000 --- a/imphnen-apis/src/apps/v1/mod.rs +++ /dev/null @@ -1,23 +0,0 @@ -use axum::{middleware::from_fn, Router}; -pub mod auth; -pub mod docs; -pub mod gacha; -pub mod permissions; -pub mod roles; -pub mod users; - -pub use auth::*; -pub use docs::*; -pub use permissions::*; -pub use roles::*; -pub use users::*; - -pub async fn routes() -> Router { - let public_routes = Router::new().nest("/auth", auth_router()); - let protected_routes = Router::new() - .nest("/users", users_router()) - .nest("/roles", roles_router()) - .nest("/permissions", permissions_router()) - .layer(from_fn(auth::auth_middleware::auth_middleware)); - Router::new().merge(public_routes).merge(protected_routes) -} diff --git a/imphnen-apis/src/apps/v2/auth/mod.rs b/imphnen-apis/src/apps/v2/auth/mod.rs deleted file mode 100644 index b4f12d6..0000000 --- a/imphnen-apis/src/apps/v2/auth/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -use axum::{response::IntoResponse, routing::post, Router}; - -async fn dummy_login() -> impl IntoResponse { - "Logged in successfully" -} - -pub fn auth_router() -> Router { - Router::new().route("/login", post(dummy_login)) -} diff --git a/imphnen-apis/src/apps/v2/mod.rs b/imphnen-apis/src/apps/v2/mod.rs deleted file mode 100644 index 55bed3e..0000000 --- a/imphnen-apis/src/apps/v2/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -use axum::Router; - -pub mod auth; -pub use auth::*; - -pub async fn routes() -> Router { - let public_routes = Router::new().nest("/auth", auth::auth_router()); - Router::new().merge(public_routes) -} diff --git a/imphnen-apis/src/apps/v2/permissions/.gitkeep b/imphnen-apis/src/apps/v2/permissions/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/imphnen-apis/src/apps/v2/roles/.gitkeep b/imphnen-apis/src/apps/v2/roles/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/imphnen-apis/src/apps/v2/users/.gitkeep b/imphnen-apis/src/apps/v2/users/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/imphnen-apis/src/bin/api.rs b/imphnen-apis/src/bin/api.rs deleted file mode 100644 index f5c0055..0000000 --- a/imphnen-apis/src/bin/api.rs +++ /dev/null @@ -1,9 +0,0 @@ -use imphnen_backend_service::{apps, axum_init}; - -#[tokio::main] -async fn main() { - axum_init(|surrealdb_ws, surrealdb_mem| async { - apps(surrealdb_ws, surrealdb_mem).await - }) - .await; -} diff --git a/imphnen-apis/src/main.rs b/imphnen-apis/src/main.rs deleted file mode 100644 index f5c0055..0000000 --- a/imphnen-apis/src/main.rs +++ /dev/null @@ -1,9 +0,0 @@ -use imphnen_backend_service::{apps, axum_init}; - -#[tokio::main] -async fn main() { - axum_init(|surrealdb_ws, surrealdb_mem| async { - apps(surrealdb_ws, surrealdb_mem).await - }) - .await; -} diff --git a/imphnen-core-service/Cargo.toml b/imphnen-core-service/Cargo.toml new file mode 100644 index 0000000..1b2b0b3 --- /dev/null +++ b/imphnen-core-service/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "imphnen-backend-service" +version = "0.1.0" +edition = "2021" + +[dependencies] +imphnen-entities = { version = "0.1.0", path = "../imphnen-entities" } +imphnen-libs = { version = "0.1.0", path = "../imphnen-libs" } +imphnen-utils = { version = "0.1.0", path = "../imphnen-utils" } +axum.workspace = true +serde.workspace = true +serde_json.workspace = true +utoipa.workspace = true +lazy_static.workspace = true +regex.workspace = true +validator.workspace = true +axum-test.workspace = true +surrealdb.workspace = true +rand.workspace = true +tokio.workspace = true +chrono.workspace = true +anyhow.workspace = true +tower-http.workspace = true +utoipa-swagger-ui.workspace = true +imphnen-gateway-service = { version = "0.1.0", path = "../imphnen-gateway-service" } diff --git a/imphnen-core-service/src/bin/api.rs b/imphnen-core-service/src/bin/api.rs new file mode 100644 index 0000000..7d654e2 --- /dev/null +++ b/imphnen-core-service/src/bin/api.rs @@ -0,0 +1,10 @@ +use imphnen_gateway_service::gateway_service; +use imphnen_libs::axum_init; + +#[tokio::main] +async fn main() { + axum_init(|surrealdb_ws, surrealdb_mem| async { + gateway_service(surrealdb_ws, surrealdb_mem).await + }) + .await; +} diff --git a/imphnen-apis/src/bin/seed_permissions.rs b/imphnen-core-service/src/bin/seed_permissions.rs similarity index 100% rename from imphnen-apis/src/bin/seed_permissions.rs rename to imphnen-core-service/src/bin/seed_permissions.rs diff --git a/imphnen-apis/src/bin/seed_roles.rs b/imphnen-core-service/src/bin/seed_roles.rs similarity index 100% rename from imphnen-apis/src/bin/seed_roles.rs rename to imphnen-core-service/src/bin/seed_roles.rs diff --git a/imphnen-apis/src/bin/seed_roles_permissions.rs b/imphnen-core-service/src/bin/seed_roles_permissions.rs similarity index 100% rename from imphnen-apis/src/bin/seed_roles_permissions.rs rename to imphnen-core-service/src/bin/seed_roles_permissions.rs diff --git a/imphnen-apis/src/bin/seed_users.rs b/imphnen-core-service/src/bin/seed_users.rs similarity index 100% rename from imphnen-apis/src/bin/seed_users.rs rename to imphnen-core-service/src/bin/seed_users.rs diff --git a/imphnen-core-service/src/main.rs b/imphnen-core-service/src/main.rs new file mode 100644 index 0000000..7d654e2 --- /dev/null +++ b/imphnen-core-service/src/main.rs @@ -0,0 +1,10 @@ +use imphnen_gateway_service::gateway_service; +use imphnen_libs::axum_init; + +#[tokio::main] +async fn main() { + axum_init(|surrealdb_ws, surrealdb_mem| async { + gateway_service(surrealdb_ws, surrealdb_mem).await + }) + .await; +} diff --git a/imphnen-dimentorin-service/Cargo.toml b/imphnen-dimentorin-service/Cargo.toml new file mode 100644 index 0000000..5c87db5 --- /dev/null +++ b/imphnen-dimentorin-service/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "imphnen-dimentorin-service" +version = "0.1.0" +edition = "2024" + +[dependencies] +imphnen-entities = { version = "0.1.0", path = "../imphnen-entities" } +imphnen-libs = { version = "0.1.0", path = "../imphnen-libs" } +imphnen-utils = { version = "0.1.0", path = "../imphnen-utils" } +axum.workspace = true +serde.workspace = true +serde_json.workspace = true +utoipa.workspace = true +lazy_static.workspace = true +regex.workspace = true +validator.workspace = true +axum-test.workspace = true +surrealdb.workspace = true +rand.workspace = true +tokio.workspace = true +chrono.workspace = true +anyhow.workspace = true +tower-http.workspace = true +utoipa-swagger-ui.workspace = true \ No newline at end of file diff --git a/imphnen-dimentorin-service/src/lib.rs b/imphnen-dimentorin-service/src/lib.rs new file mode 100644 index 0000000..1303f3d --- /dev/null +++ b/imphnen-dimentorin-service/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: u64, right: u64) -> u64 { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/imphnen-apis/Cargo.toml b/imphnen-gacha-service/Cargo.toml similarity index 92% rename from imphnen-apis/Cargo.toml rename to imphnen-gacha-service/Cargo.toml index df1cba3..1122fba 100644 --- a/imphnen-apis/Cargo.toml +++ b/imphnen-gacha-service/Cargo.toml @@ -1,7 +1,7 @@ [package] -name = "imphnen-backend-service" +name = "imphnen-gacha-service" version = "0.1.0" -edition = "2021" +edition = "2024" [dependencies] imphnen-entities = { version = "0.1.0", path = "../imphnen-entities" } diff --git a/imphnen-gacha-service/src/lib.rs b/imphnen-gacha-service/src/lib.rs new file mode 100644 index 0000000..96dde7c --- /dev/null +++ b/imphnen-gacha-service/src/lib.rs @@ -0,0 +1,9 @@ +use imphnen_entities::*; +use imphnen_libs::*; +use imphnen_utils::*; + +pub mod v1; +pub use imphnen_entities::*; +pub use imphnen_libs::*; +pub use imphnen_utils::*; +pub use v1::*; diff --git a/imphnen-apis/src/apps/v1/gacha/gacha_controller.rs b/imphnen-gacha-service/src/v1/gacha/gacha_controller.rs similarity index 100% rename from imphnen-apis/src/apps/v1/gacha/gacha_controller.rs rename to imphnen-gacha-service/src/v1/gacha/gacha_controller.rs diff --git a/imphnen-apis/src/apps/v1/gacha/gacha_dto.rs b/imphnen-gacha-service/src/v1/gacha/gacha_dto.rs similarity index 100% rename from imphnen-apis/src/apps/v1/gacha/gacha_dto.rs rename to imphnen-gacha-service/src/v1/gacha/gacha_dto.rs diff --git a/imphnen-apis/src/apps/v1/gacha/gacha_repository.rs b/imphnen-gacha-service/src/v1/gacha/gacha_repository.rs similarity index 96% rename from imphnen-apis/src/apps/v1/gacha/gacha_repository.rs rename to imphnen-gacha-service/src/v1/gacha/gacha_repository.rs index 1b6d908..bb8dd01 100644 --- a/imphnen-apis/src/apps/v1/gacha/gacha_repository.rs +++ b/imphnen-gacha-service/src/v1/gacha/gacha_repository.rs @@ -1,9 +1,9 @@ use super::{GachaClaimSchema, GachaItemSchema, GachaRollSchema}; use crate::{ - get_id, make_thing, query_list_with_meta, AppState, MetaRequestDto, ResourceEnum, - ResponseListSuccessDto, + AppState, MetaRequestDto, ResourceEnum, ResponseListSuccessDto, get_id, + make_thing, query_list_with_meta, }; -use anyhow::{bail, Result}; +use anyhow::{Result, bail}; pub struct GachaRepository<'a> { state: &'a AppState, diff --git a/imphnen-apis/src/apps/v1/gacha/gacha_schema.rs b/imphnen-gacha-service/src/v1/gacha/gacha_schema.rs similarity index 100% rename from imphnen-apis/src/apps/v1/gacha/gacha_schema.rs rename to imphnen-gacha-service/src/v1/gacha/gacha_schema.rs diff --git a/imphnen-apis/src/apps/v1/gacha/gacha_service.rs b/imphnen-gacha-service/src/v1/gacha/gacha_service.rs similarity index 100% rename from imphnen-apis/src/apps/v1/gacha/gacha_service.rs rename to imphnen-gacha-service/src/v1/gacha/gacha_service.rs diff --git a/imphnen-apis/src/apps/v1/gacha/mod.rs b/imphnen-gacha-service/src/v1/gacha/mod.rs similarity index 100% rename from imphnen-apis/src/apps/v1/gacha/mod.rs rename to imphnen-gacha-service/src/v1/gacha/mod.rs diff --git a/imphnen-gacha-service/src/v1/mod.rs b/imphnen-gacha-service/src/v1/mod.rs new file mode 100644 index 0000000..5bf0546 --- /dev/null +++ b/imphnen-gacha-service/src/v1/mod.rs @@ -0,0 +1,2 @@ +pub mod gacha; +pub use gacha::*; diff --git a/imphnen-gateway-service/Cargo.toml b/imphnen-gateway-service/Cargo.toml new file mode 100644 index 0000000..7c54ffb --- /dev/null +++ b/imphnen-gateway-service/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "imphnen-gateway-service" +version = "0.1.0" +edition = "2024" + +[dependencies] +imphnen-iam-service = { version = "0.1.0", path = "../imphnen-iam-service" } +imphnen-entities = { version = "0.1.0", path = "../imphnen-entities" } +imphnen-libs = { version = "0.1.0", path = "../imphnen-libs" } +imphnen-utils = { version = "0.1.0", path = "../imphnen-utils" } +axum.workspace = true +serde.workspace = true +serde_json.workspace = true +utoipa.workspace = true +lazy_static.workspace = true +regex.workspace = true +validator.workspace = true +axum-test.workspace = true +surrealdb.workspace = true +rand.workspace = true +tokio.workspace = true +chrono.workspace = true +anyhow.workspace = true +tower-http.workspace = true +utoipa-swagger-ui.workspace = true \ No newline at end of file diff --git a/imphnen-apis/src/apps/v1/docs/docs_controller.rs b/imphnen-gateway-service/src/docs.rs similarity index 84% rename from imphnen-apis/src/apps/v1/docs/docs_controller.rs rename to imphnen-gateway-service/src/docs.rs index a023109..341601e 100644 --- a/imphnen-apis/src/apps/v1/docs/docs_controller.rs +++ b/imphnen-gateway-service/src/docs.rs @@ -1,9 +1,7 @@ -use crate::{ - v1::{ - auth, permissions, roles, users, AuthLoginRequestDto, AuthLoginResponsetDto, AuthResendOtpRequestDto, AuthVerifyEmailRequestDto - }, AuthNewPasswordRequestDto, AuthRefreshTokenRequestDto, MessageResponseDto, MetaRequestDto, MetaResponseDto, PermissionsItemDto, PermissionsRequestDto, ResponseListSuccessDto, ResponseSuccessDto, RolesItemDto, RolesRequestCreateDto, RolesRequestUpdateDto, TokenDto, UsersCreateRequestDto, UsersDetailItemDto, UsersItemDto, UsersListItemDto, UsersUpdateRequestDto +use imphnen_iam_service::{ +auth, permissions, roles, users, AuthLoginRequestDto, AuthLoginResponsetDto, AuthResendOtpRequestDto, AuthVerifyEmailRequestDto, + AuthNewPasswordRequestDto, AuthRefreshTokenRequestDto, MessageResponseDto, MetaRequestDto, MetaResponseDto, PermissionsItemDto, PermissionsRequestDto, ResponseListSuccessDto, ResponseSuccessDto, RolesItemDto, RolesRequestCreateDto, RolesRequestUpdateDto, TokenDto, UsersCreateRequestDto, UsersDetailItemDto, UsersItemDto, UsersListItemDto, UsersUpdateRequestDto }; - use utoipa::{ openapi::security::{Http, HttpAuthScheme, SecurityScheme}, Modify, OpenApi, @@ -101,3 +99,7 @@ impl Modify for SecurityAddon { } } } + +pub fn docs_router() -> utoipa::openapi::OpenApi { + ApiDoc::openapi() +} \ No newline at end of file diff --git a/imphnen-gateway-service/src/lib.rs b/imphnen-gateway-service/src/lib.rs new file mode 100644 index 0000000..62820d5 --- /dev/null +++ b/imphnen-gateway-service/src/lib.rs @@ -0,0 +1,32 @@ +use axum::{ + Extension, Router, middleware::from_fn, response::Redirect, routing::get, +}; +use imphnen_entities::{AppState, SurrealMemClient, SurrealWsClient}; +use imphnen_iam_service::{iam_protected_routes, iam_public_routes}; + +pub mod docs; +pub mod middleware; + +pub use docs::*; +pub use middleware::*; +use utoipa_swagger_ui::SwaggerUi; + +pub async fn gateway_service( + surrealdb_ws: SurrealWsClient, + surrealdb_mem: SurrealMemClient, +) -> Router { + let state = AppState { + surrealdb_ws, + surrealdb_mem, + }; + + let public_routes = iam_public_routes(); + let protected_routes = iam_protected_routes().layer(from_fn(auth_middleware)); + + Router::new() + .route("/", get(Redirect::to("/docs"))) + .nest("/v1", public_routes.merge(protected_routes)) + .merge(SwaggerUi::new("/docs").url("/openapi.json", docs_router())) + .layer(cors_middleware()) + .layer(Extension(state.clone())) +} diff --git a/imphnen-gateway-service/src/middleware.rs b/imphnen-gateway-service/src/middleware.rs new file mode 100644 index 0000000..855c621 --- /dev/null +++ b/imphnen-gateway-service/src/middleware.rs @@ -0,0 +1,73 @@ +use axum::{ + Extension, + extract::Request, + http::{HeaderValue, Method, StatusCode, header}, + middleware::Next, + response::Response, +}; +use imphnen_iam_service::{UsersItemDtoRaw, UsersRepository}; +use imphnen_libs::{AppState, Env}; +use imphnen_utils::{common_response, extract_email}; +use std::convert::Infallible; +use tower_http::cors::CorsLayer; + +pub async fn auth_middleware( + Extension(state): Extension, + mut req: Request, + next: Next, +) -> Result { + let headers = req.headers(); + let email = match extract_email(headers) { + Some(email) => email, + None => { + return Ok(common_response( + StatusCode::UNAUTHORIZED, + "Invalid or expired token", + )); + } + }; + let repository = UsersRepository::new(&state); + let user: Option = + match repository.query_user_by_email(email).await { + Ok(user) => Some(user), + Err(err) => { + return Ok(common_response( + StatusCode::INTERNAL_SERVER_ERROR, + &err.to_string(), + )); + } + }; + if user.is_none() { + return Ok(common_response( + StatusCode::UNAUTHORIZED, + "Unauthorized user", + )); + } + req.extensions_mut().insert(user.unwrap()); + Ok(next.run(req).await) +} + +pub fn cors_middleware() -> CorsLayer { + let env = Env::new(); + let cors_origins = match env.rust_env.as_str() { + "development" => vec!["http://localhost:3000"], + "production" => { + vec!["https://gacha.imphnen.dev", "https://imphnen.dev"] + } + _ => vec![ + "http://localhost:3000", + "https://gacha.imphnen.dev", + "https://imphnen.dev", + ], + }; + let allowed_origins: Vec = cors_origins + .into_iter() + .filter_map(|origin| origin.parse::().ok()) + .collect(); + + CorsLayer::new() + .allow_origin(allowed_origins) + .allow_methods([Method::GET, Method::POST, Method::PUT, Method::DELETE]) + .allow_headers([header::AUTHORIZATION, header::CONTENT_TYPE]) + .allow_credentials(true) +} diff --git a/imphnen-iam-service/Cargo.toml b/imphnen-iam-service/Cargo.toml new file mode 100644 index 0000000..4edeaac --- /dev/null +++ b/imphnen-iam-service/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "imphnen-iam-service" +version = "0.1.0" +edition = "2024" + +[dependencies] +imphnen-entities = { version = "0.1.0", path = "../imphnen-entities" } +imphnen-libs = { version = "0.1.0", path = "../imphnen-libs" } +imphnen-utils = { version = "0.1.0", path = "../imphnen-utils" } +axum.workspace = true +serde.workspace = true +serde_json.workspace = true +utoipa.workspace = true +lazy_static.workspace = true +regex.workspace = true +validator.workspace = true +axum-test.workspace = true +surrealdb.workspace = true +rand.workspace = true +tokio.workspace = true +chrono.workspace = true +anyhow.workspace = true +tower-http.workspace = true +utoipa-swagger-ui.workspace = true \ No newline at end of file diff --git a/imphnen-apis/src/lib.rs b/imphnen-iam-service/src/lib.rs similarity index 95% rename from imphnen-apis/src/lib.rs rename to imphnen-iam-service/src/lib.rs index cae114e..3e5bec5 100644 --- a/imphnen-apis/src/lib.rs +++ b/imphnen-iam-service/src/lib.rs @@ -3,11 +3,11 @@ use imphnen_entities::*; use imphnen_libs::*; use imphnen_utils::*; -pub mod apps; +pub mod v1; -pub use apps::*; pub use imphnen_entities::*; pub use imphnen_libs::*; +pub use v1::*; pub fn create_test_user( email: &str, diff --git a/imphnen-apis/src/apps/v1/auth/auth_controller.rs b/imphnen-iam-service/src/v1/auth/auth_controller.rs similarity index 100% rename from imphnen-apis/src/apps/v1/auth/auth_controller.rs rename to imphnen-iam-service/src/v1/auth/auth_controller.rs diff --git a/imphnen-apis/src/apps/v1/auth/auth_dto.rs b/imphnen-iam-service/src/v1/auth/auth_dto.rs similarity index 100% rename from imphnen-apis/src/apps/v1/auth/auth_dto.rs rename to imphnen-iam-service/src/v1/auth/auth_dto.rs diff --git a/imphnen-apis/src/apps/v1/auth/auth_repository.rs b/imphnen-iam-service/src/v1/auth/auth_repository.rs similarity index 100% rename from imphnen-apis/src/apps/v1/auth/auth_repository.rs rename to imphnen-iam-service/src/v1/auth/auth_repository.rs diff --git a/imphnen-apis/src/apps/v1/auth/auth_schema.rs b/imphnen-iam-service/src/v1/auth/auth_schema.rs similarity index 100% rename from imphnen-apis/src/apps/v1/auth/auth_schema.rs rename to imphnen-iam-service/src/v1/auth/auth_schema.rs diff --git a/imphnen-apis/src/apps/v1/auth/auth_service.rs b/imphnen-iam-service/src/v1/auth/auth_service.rs similarity index 100% rename from imphnen-apis/src/apps/v1/auth/auth_service.rs rename to imphnen-iam-service/src/v1/auth/auth_service.rs diff --git a/imphnen-apis/src/apps/v1/auth/mod.rs b/imphnen-iam-service/src/v1/auth/mod.rs similarity index 82% rename from imphnen-apis/src/apps/v1/auth/mod.rs rename to imphnen-iam-service/src/v1/auth/mod.rs index d1e9b6c..a08978b 100644 --- a/imphnen-apis/src/apps/v1/auth/mod.rs +++ b/imphnen-iam-service/src/v1/auth/mod.rs @@ -1,17 +1,11 @@ -use axum::{routing::post, Router}; +use axum::{Router, routing::post}; pub mod auth_controller; pub mod auth_dto; -pub mod auth_middleware; pub mod auth_repository; pub mod auth_schema; pub mod auth_service; -#[cfg(test)] -pub mod auth_controller_test; -#[cfg(test)] -pub mod auth_repository_test; - pub use auth_dto::*; pub use auth_repository::*; pub use auth_schema::*; diff --git a/imphnen-iam-service/src/v1/mod.rs b/imphnen-iam-service/src/v1/mod.rs new file mode 100644 index 0000000..d6cacd5 --- /dev/null +++ b/imphnen-iam-service/src/v1/mod.rs @@ -0,0 +1,22 @@ +use axum::Router; + +pub mod auth; +pub mod permissions; +pub mod roles; +pub mod users; + +pub use auth::*; +pub use permissions::*; +pub use roles::*; +pub use users::*; + +pub fn iam_public_routes() -> Router { + Router::new().nest("/auth", auth_router()) +} + +pub fn iam_protected_routes() -> Router { + Router::new() + .nest("/users", users_router()) + .nest("/roles", roles_router()) + .nest("/permissions", permissions_router()) +} diff --git a/imphnen-apis/src/apps/v1/permissions/mod.rs b/imphnen-iam-service/src/v1/permissions/mod.rs similarity index 88% rename from imphnen-apis/src/apps/v1/permissions/mod.rs rename to imphnen-iam-service/src/v1/permissions/mod.rs index bb6d01b..c8628fb 100644 --- a/imphnen-apis/src/apps/v1/permissions/mod.rs +++ b/imphnen-iam-service/src/v1/permissions/mod.rs @@ -1,6 +1,6 @@ use axum::{ - routing::{delete, get, post, put}, Router, + routing::{delete, get, post, put}, }; pub mod permissions_controller; pub mod permissions_dto; @@ -10,11 +10,6 @@ pub mod permissions_repository; pub mod permissions_schema; pub mod permissions_service; -#[cfg(test)] -pub mod permissions_controller_test; -#[cfg(test)] -pub mod permissions_repository_test; - pub use permissions_controller::*; pub use permissions_dto::*; pub use permissions_enum::*; diff --git a/imphnen-apis/src/apps/v1/permissions/permissions_controller.rs b/imphnen-iam-service/src/v1/permissions/permissions_controller.rs similarity index 100% rename from imphnen-apis/src/apps/v1/permissions/permissions_controller.rs rename to imphnen-iam-service/src/v1/permissions/permissions_controller.rs diff --git a/imphnen-apis/src/apps/v1/permissions/permissions_dto.rs b/imphnen-iam-service/src/v1/permissions/permissions_dto.rs similarity index 100% rename from imphnen-apis/src/apps/v1/permissions/permissions_dto.rs rename to imphnen-iam-service/src/v1/permissions/permissions_dto.rs diff --git a/imphnen-apis/src/apps/v1/permissions/permissions_enum.rs b/imphnen-iam-service/src/v1/permissions/permissions_enum.rs similarity index 100% rename from imphnen-apis/src/apps/v1/permissions/permissions_enum.rs rename to imphnen-iam-service/src/v1/permissions/permissions_enum.rs diff --git a/imphnen-apis/src/apps/v1/permissions/permissions_guard.rs b/imphnen-iam-service/src/v1/permissions/permissions_guard.rs similarity index 100% rename from imphnen-apis/src/apps/v1/permissions/permissions_guard.rs rename to imphnen-iam-service/src/v1/permissions/permissions_guard.rs diff --git a/imphnen-apis/src/apps/v1/permissions/permissions_repository.rs b/imphnen-iam-service/src/v1/permissions/permissions_repository.rs similarity index 100% rename from imphnen-apis/src/apps/v1/permissions/permissions_repository.rs rename to imphnen-iam-service/src/v1/permissions/permissions_repository.rs diff --git a/imphnen-apis/src/apps/v1/permissions/permissions_schema.rs b/imphnen-iam-service/src/v1/permissions/permissions_schema.rs similarity index 100% rename from imphnen-apis/src/apps/v1/permissions/permissions_schema.rs rename to imphnen-iam-service/src/v1/permissions/permissions_schema.rs diff --git a/imphnen-apis/src/apps/v1/permissions/permissions_service.rs b/imphnen-iam-service/src/v1/permissions/permissions_service.rs similarity index 100% rename from imphnen-apis/src/apps/v1/permissions/permissions_service.rs rename to imphnen-iam-service/src/v1/permissions/permissions_service.rs diff --git a/imphnen-apis/src/apps/v1/roles/mod.rs b/imphnen-iam-service/src/v1/roles/mod.rs similarity index 87% rename from imphnen-apis/src/apps/v1/roles/mod.rs rename to imphnen-iam-service/src/v1/roles/mod.rs index 035475d..0da30a3 100644 --- a/imphnen-apis/src/apps/v1/roles/mod.rs +++ b/imphnen-iam-service/src/v1/roles/mod.rs @@ -1,6 +1,6 @@ use axum::{ - routing::{delete, get, post, put}, Router, + routing::{delete, get, post, put}, }; pub mod roles_controller; @@ -10,11 +10,6 @@ pub mod roles_repository; pub mod roles_schema; pub mod roles_service; -#[cfg(test)] -pub mod roles_controller_test; -#[cfg(test)] -pub mod roles_repository_test; - pub use roles_controller::*; pub use roles_dto::*; pub use roles_enum::*; diff --git a/imphnen-apis/src/apps/v1/roles/roles_controller.rs b/imphnen-iam-service/src/v1/roles/roles_controller.rs similarity index 100% rename from imphnen-apis/src/apps/v1/roles/roles_controller.rs rename to imphnen-iam-service/src/v1/roles/roles_controller.rs diff --git a/imphnen-apis/src/apps/v1/roles/roles_dto.rs b/imphnen-iam-service/src/v1/roles/roles_dto.rs similarity index 100% rename from imphnen-apis/src/apps/v1/roles/roles_dto.rs rename to imphnen-iam-service/src/v1/roles/roles_dto.rs diff --git a/imphnen-apis/src/apps/v1/roles/roles_enum.rs b/imphnen-iam-service/src/v1/roles/roles_enum.rs similarity index 100% rename from imphnen-apis/src/apps/v1/roles/roles_enum.rs rename to imphnen-iam-service/src/v1/roles/roles_enum.rs diff --git a/imphnen-apis/src/apps/v1/roles/roles_repository.rs b/imphnen-iam-service/src/v1/roles/roles_repository.rs similarity index 100% rename from imphnen-apis/src/apps/v1/roles/roles_repository.rs rename to imphnen-iam-service/src/v1/roles/roles_repository.rs diff --git a/imphnen-apis/src/apps/v1/roles/roles_schema.rs b/imphnen-iam-service/src/v1/roles/roles_schema.rs similarity index 100% rename from imphnen-apis/src/apps/v1/roles/roles_schema.rs rename to imphnen-iam-service/src/v1/roles/roles_schema.rs diff --git a/imphnen-apis/src/apps/v1/roles/roles_service.rs b/imphnen-iam-service/src/v1/roles/roles_service.rs similarity index 100% rename from imphnen-apis/src/apps/v1/roles/roles_service.rs rename to imphnen-iam-service/src/v1/roles/roles_service.rs diff --git a/imphnen-apis/src/apps/v1/users/mod.rs b/imphnen-iam-service/src/v1/users/mod.rs similarity index 100% rename from imphnen-apis/src/apps/v1/users/mod.rs rename to imphnen-iam-service/src/v1/users/mod.rs diff --git a/imphnen-apis/src/apps/v1/users/users_controller.rs b/imphnen-iam-service/src/v1/users/users_controller.rs similarity index 100% rename from imphnen-apis/src/apps/v1/users/users_controller.rs rename to imphnen-iam-service/src/v1/users/users_controller.rs diff --git a/imphnen-apis/src/apps/v1/users/users_dto.rs b/imphnen-iam-service/src/v1/users/users_dto.rs similarity index 100% rename from imphnen-apis/src/apps/v1/users/users_dto.rs rename to imphnen-iam-service/src/v1/users/users_dto.rs diff --git a/imphnen-apis/src/apps/v1/users/users_repository.rs b/imphnen-iam-service/src/v1/users/users_repository.rs similarity index 100% rename from imphnen-apis/src/apps/v1/users/users_repository.rs rename to imphnen-iam-service/src/v1/users/users_repository.rs diff --git a/imphnen-apis/src/apps/v1/users/users_schema.rs b/imphnen-iam-service/src/v1/users/users_schema.rs similarity index 100% rename from imphnen-apis/src/apps/v1/users/users_schema.rs rename to imphnen-iam-service/src/v1/users/users_schema.rs diff --git a/imphnen-apis/src/apps/v1/users/users_service.rs b/imphnen-iam-service/src/v1/users/users_service.rs similarity index 100% rename from imphnen-apis/src/apps/v1/users/users_service.rs rename to imphnen-iam-service/src/v1/users/users_service.rs diff --git a/tests/Cargo.toml b/tests/Cargo.toml new file mode 100644 index 0000000..8898e4f --- /dev/null +++ b/tests/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "tests" +version = "0.1.0" +edition = "2024" + +[dependencies] +imphnen-libs = { version = "0.1.0", path = "../imphnen-libs" } +imphnen-utils = { version = "0.1.0", path = "../imphnen-utils" } +imphnen-entities = { version = "0.1.0", path = "../imphnen-entities" } +imphnen-iam-service = { version = "0.1.0", path = "../imphnen-iam-service" } +axum.workspace = true +axum-test.workspace = true +chrono.workspace = true +surrealdb.workspace = true +tokio.workspace = true +serde_json.workspace = true diff --git a/imphnen-apis/src/apps/v1/auth/auth_controller_test.rs b/tests/src/iam_service/auth/auth_controller_test.rs similarity index 95% rename from imphnen-apis/src/apps/v1/auth/auth_controller_test.rs rename to tests/src/iam_service/auth/auth_controller_test.rs index 613a1e3..ca2b5a7 100644 --- a/imphnen-apis/src/apps/v1/auth/auth_controller_test.rs +++ b/tests/src/iam_service/auth/auth_controller_test.rs @@ -1,8 +1,9 @@ use crate::{ - apps::v1::auth::auth_router, create_mock_app_state, create_test_user, - encode_refresh_token, AuthOtpSchema, OtpManager, ResourceEnum, RolesRepository, + AuthOtpSchema, AuthRepository, OtpManager, ResourceEnum, RolesRepository, + UsersRepository, auth::auth_router, create_mock_app_state, create_test_user, + encode_refresh_token, }; -use axum::{http::StatusCode, Extension}; +use axum::{Extension, http::StatusCode}; use axum_test::TestServer; use serde_json::json; use surrealdb::Uuid; @@ -31,7 +32,7 @@ async fn test_login_should_fail_with_wrong_password() { .nest("/v1/auth", auth_router()) .layer(Extension(state.clone())); let server = TestServer::new(app).unwrap(); - let repo = crate::apps::v1::users::UsersRepository::new(&state); + let repo = UsersRepository::new(&state); let role_repo = RolesRepository::new(&state); let role_id = role_repo .query_role_by_name("Student".to_string()) @@ -58,7 +59,7 @@ async fn test_login_should_fail_if_user_not_active() { .nest("/v1/auth", auth_router()) .layer(Extension(state.clone())); let server = TestServer::new(app).unwrap(); - let repo = crate::apps::v1::users::UsersRepository::new(&state); + let repo = UsersRepository::new(&state); let role_repo = RolesRepository::new(&state); let role_id = role_repo .query_role_by_name("Student".to_string()) @@ -91,7 +92,7 @@ async fn test_login_should_succeed() { .nest("/v1/auth", auth_router()) .layer(Extension(state.clone())); let server = TestServer::new(app).unwrap(); - let repo = crate::apps::v1::users::UsersRepository::new(&state); + let repo = UsersRepository::new(&state); let role_repo = RolesRepository::new(&state); let role_id = role_repo .query_role_by_name("Student".to_string()) @@ -183,7 +184,7 @@ async fn test_register_should_fail_if_email_already_taken() { .nest("/v1/auth", auth_router()) .layer(Extension(state.clone())); let server = TestServer::new(app).unwrap(); - let repo = crate::apps::v1::users::UsersRepository::new(&state); + let repo = UsersRepository::new(&state); let role_repo = RolesRepository::new(&state); let role_id = role_repo .query_role_by_name("Student".to_string()) @@ -353,7 +354,7 @@ async fn test_forgot_password_should_succeed() { let mut user = create_test_user("forgot@example.com", "Forgot User", true, &role_id); user.password = crate::hash_password("secret").unwrap(); - let user_repo = crate::apps::v1::users::UsersRepository::new(&state); + let user_repo = UsersRepository::new(&state); user_repo.query_create_user(user).await.unwrap(); let payload = json!({ "email": "forgot@example.com" }); let res = server.post("/v1/auth/forgot").json(&payload).await; @@ -463,8 +464,8 @@ async fn test_verify_email_should_succeed() { .id; let user = create_test_user("verify@example.com", "Verify User", false, &role_id); let otp = OtpManager::generate_otp(); - let user_repo = crate::apps::v1::users::UsersRepository::new(&state); - let auth_repo = crate::apps::v1::auth::AuthRepository::new(&state); + let user_repo = UsersRepository::new(&state); + let auth_repo = AuthRepository::new(&state); user_repo.query_create_user(user.clone()).await.unwrap(); auth_repo .query_store_otp(user.email.clone(), otp) @@ -497,8 +498,8 @@ async fn test_verify_email_should_fail_with_wrong_otp() { .id; let user = create_test_user("wrongotp@example.com", "Wrong OTP", false, &role_id); let otp = OtpManager::generate_otp(); - let user_repo = crate::apps::v1::users::UsersRepository::new(&state); - let auth_repo = crate::apps::v1::auth::AuthRepository::new(&state); + let user_repo = UsersRepository::new(&state); + let auth_repo = AuthRepository::new(&state); user_repo.query_create_user(user.clone()).await.unwrap(); auth_repo .query_store_otp(user.email.clone(), otp) @@ -530,10 +531,10 @@ async fn test_verify_email_should_fail_if_otp_expired() { .unwrap() .id; let user = create_test_user("expired@example.com", "Expired OTP", false, &role_id); - let user_repo = crate::apps::v1::users::UsersRepository::new(&state); + let user_repo = UsersRepository::new(&state); user_repo.query_create_user(user.clone()).await.unwrap(); use chrono::{Duration, Utc}; - let expired_otp = crate::apps::v1::auth::AuthOtpSchema { + let expired_otp = AuthOtpSchema { otp: 123456, expires_at: Utc::now() - Duration::minutes(1), }; @@ -576,7 +577,7 @@ async fn test_new_password_should_succeed() { ) .unwrap(); let email = "resetme@example.com"; - let repo = crate::apps::v1::users::UsersRepository::new(&state); + let repo = UsersRepository::new(&state); let role_repo = RolesRepository::new(&state); let role_id = role_repo .query_role_by_name("Student".to_string()) diff --git a/imphnen-apis/src/apps/v1/auth/auth_repository_test.rs b/tests/src/iam_service/auth/auth_repository_test.rs similarity index 100% rename from imphnen-apis/src/apps/v1/auth/auth_repository_test.rs rename to tests/src/iam_service/auth/auth_repository_test.rs diff --git a/tests/src/iam_service/auth/mod.rs b/tests/src/iam_service/auth/mod.rs new file mode 100644 index 0000000..63301aa --- /dev/null +++ b/tests/src/iam_service/auth/mod.rs @@ -0,0 +1,4 @@ +#[cfg(test)] +pub mod auth_controller_test; +#[cfg(test)] +pub mod auth_repository_test; diff --git a/tests/src/iam_service/mod.rs b/tests/src/iam_service/mod.rs new file mode 100644 index 0000000..4cbea86 --- /dev/null +++ b/tests/src/iam_service/mod.rs @@ -0,0 +1,4 @@ +pub mod auth; +pub mod permissions; +pub mod roles; +pub mod users; diff --git a/tests/src/iam_service/permissions/mod.rs b/tests/src/iam_service/permissions/mod.rs new file mode 100644 index 0000000..bfa4677 --- /dev/null +++ b/tests/src/iam_service/permissions/mod.rs @@ -0,0 +1,4 @@ +#[cfg(test)] +pub mod permissions_controller_test; +#[cfg(test)] +pub mod permissions_repository_test; diff --git a/imphnen-apis/src/apps/v1/permissions/permissions_controller_test.rs b/tests/src/iam_service/permissions/permissions_controller_test.rs similarity index 100% rename from imphnen-apis/src/apps/v1/permissions/permissions_controller_test.rs rename to tests/src/iam_service/permissions/permissions_controller_test.rs diff --git a/imphnen-apis/src/apps/v1/permissions/permissions_repository_test.rs b/tests/src/iam_service/permissions/permissions_repository_test.rs similarity index 98% rename from imphnen-apis/src/apps/v1/permissions/permissions_repository_test.rs rename to tests/src/iam_service/permissions/permissions_repository_test.rs index 71d84fb..b07befd 100644 --- a/imphnen-apis/src/apps/v1/permissions/permissions_repository_test.rs +++ b/tests/src/iam_service/permissions/permissions_repository_test.rs @@ -1,6 +1,6 @@ use crate::{ - apps::v1::permissions::{PermissionsRepository, PermissionsSchema}, create_mock_app_state, + permissions::{PermissionsRepository, PermissionsSchema}, }; use chrono::Utc; diff --git a/tests/src/iam_service/roles/mod.rs b/tests/src/iam_service/roles/mod.rs new file mode 100644 index 0000000..1623051 --- /dev/null +++ b/tests/src/iam_service/roles/mod.rs @@ -0,0 +1,4 @@ +#[cfg(test)] +pub mod roles_controller_test; +#[cfg(test)] +pub mod roles_repository_test; diff --git a/imphnen-apis/src/apps/v1/roles/roles_controller_test.rs b/tests/src/iam_service/roles/roles_controller_test.rs similarity index 100% rename from imphnen-apis/src/apps/v1/roles/roles_controller_test.rs rename to tests/src/iam_service/roles/roles_controller_test.rs diff --git a/imphnen-apis/src/apps/v1/roles/roles_repository_test.rs b/tests/src/iam_service/roles/roles_repository_test.rs similarity index 94% rename from imphnen-apis/src/apps/v1/roles/roles_repository_test.rs rename to tests/src/iam_service/roles/roles_repository_test.rs index 4c2e63e..a7de09e 100644 --- a/imphnen-apis/src/apps/v1/roles/roles_repository_test.rs +++ b/tests/src/iam_service/roles/roles_repository_test.rs @@ -1,18 +1,16 @@ use crate::{ - apps::v1::{ - permissions::{ - permissions_repository::PermissionsRepository, - permissions_schema::PermissionsSchema, - }, - roles::{ - roles_dto::{RolesRequestCreateDto, RolesRequestUpdateDto}, - roles_repository::RolesRepository, - }, + ResourceEnum, create_mock_app_state, get_iso_date, make_thing, + permissions::{ + permissions_repository::PermissionsRepository, + permissions_schema::PermissionsSchema, + }, + roles::{ + roles_dto::{RolesRequestCreateDto, RolesRequestUpdateDto}, + roles_repository::RolesRepository, }, - create_mock_app_state, get_iso_date, make_thing, ResourceEnum, }; -use surrealdb::sql::Thing; use surrealdb::Uuid; +use surrealdb::sql::Thing; #[tokio::test] async fn test_query_create_role_should_succeed() { @@ -133,8 +131,8 @@ async fn test_query_delete_role_should_soft_delete() { assert!(deleted.is_err()); } #[tokio::test] -async fn test_query_update_role_should_fallback_to_existing_permissions_if_none_provided( -) { +async fn test_query_update_role_should_fallback_to_existing_permissions_if_none_provided() + { let state = create_mock_app_state().await; let repo = RolesRepository::new(&state); let perm_repo = PermissionsRepository::new(&state); diff --git a/tests/src/iam_service/users/mod.rs b/tests/src/iam_service/users/mod.rs new file mode 100644 index 0000000..f0068cf --- /dev/null +++ b/tests/src/iam_service/users/mod.rs @@ -0,0 +1,4 @@ +#[cfg(test)] +pub mod users_controller_test; +#[cfg(test)] +pub mod users_repository_test; diff --git a/imphnen-apis/src/apps/v1/users/users_controller_test.rs b/tests/src/iam_service/users/users_controller_test.rs similarity index 98% rename from imphnen-apis/src/apps/v1/users/users_controller_test.rs rename to tests/src/iam_service/users/users_controller_test.rs index ad4eaed..69977de 100644 --- a/imphnen-apis/src/apps/v1/users/users_controller_test.rs +++ b/tests/src/iam_service/users/users_controller_test.rs @@ -1,10 +1,10 @@ use crate::{ - apps::v1::users_router, create_mock_app_state, RolesEnum, RolesRepository, - UsersActiveInactiveRequestDto, UsersCreateRequestDto, UsersRepository, - UsersUpdateRequestDto, + RolesEnum, RolesRepository, UsersActiveInactiveRequestDto, UsersCreateRequestDto, + UsersRepository, UsersUpdateRequestDto, users_router, }; -use axum::{http::StatusCode, Extension}; +use axum::{Extension, http::StatusCode}; use axum_test::TestServer; +use imphnen_utils::create_mock_app_state; use surrealdb::Uuid; #[tokio::test] diff --git a/imphnen-apis/src/apps/v1/users/users_repository_test.rs b/tests/src/iam_service/users/users_repository_test.rs similarity index 100% rename from imphnen-apis/src/apps/v1/users/users_repository_test.rs rename to tests/src/iam_service/users/users_repository_test.rs diff --git a/tests/src/lib.rs b/tests/src/lib.rs new file mode 100644 index 0000000..0c46bb0 --- /dev/null +++ b/tests/src/lib.rs @@ -0,0 +1,6 @@ +pub use imphnen_entities::*; +pub use imphnen_iam_service::*; +pub use imphnen_utils::*; + +#[cfg(test)] +pub mod iam_service;