From bb3c389e24d55ff5f2d37ac2635502d0db6a2f40 Mon Sep 17 00:00:00 2001 From: MarioYellowy Date: Mon, 10 Nov 2025 19:51:47 -0600 Subject: [PATCH 1/2] Add get and post endpoint controller --- vaultara/src/users/users_controller.rs | 25 +++++++++++++++++++++++++ vaultara/src/users/users_dto.rs | 3 ++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/vaultara/src/users/users_controller.rs b/vaultara/src/users/users_controller.rs index 8b13789..c16e04a 100644 --- a/vaultara/src/users/users_controller.rs +++ b/vaultara/src/users/users_controller.rs @@ -1 +1,26 @@ +use spring_web::nest; +#[nest("/users")] +pub mod users_controller { + use spring_web::{axum::{Json, http::StatusCode, response::IntoResponse}, extractor::Component, get, post}; + + use crate::users::{users_dto::RequestDto, users_service::UserService}; + + use crate::users::{users_dto::ResponseDto, users_service::UserService}; + + #[get("")] + pub async fn get_users(Component(user_service): Component) -> Result { + let users = user_service.get_all_users().await?; + Ok((StatusCode::OK, Json(users))) + } + + #[post("/create")] + pub async fn create_user ( + Component(user_service): Component, + Json(payload): Json) -> Result { + let user = user_service.create_user(payload).await?; + + Ok((StatusCode::CREATED, Json(user))) + } + +} diff --git a/vaultara/src/users/users_dto.rs b/vaultara/src/users/users_dto.rs index 42a2af8..97611a3 100644 --- a/vaultara/src/users/users_dto.rs +++ b/vaultara/src/users/users_dto.rs @@ -1,9 +1,10 @@ use serde::{Deserialize, Serialize}; +use sqlx::prelude::FromRow; use uuid::Uuid; use chrono::{DateTime, Utc}; use common::status::Status; -#[derive(Debug, Clone, Deserialize)] +#[derive(Debug, Clone, Deserialize, FromRow)] pub struct RequestDto { pub realm_id: Uuid, pub username: String, From d4f4723c7575392fe9dee7c0fb6b3ef61c7417b5 Mon Sep 17 00:00:00 2001 From: MarioYellowy Date: Mon, 10 Nov 2025 20:16:12 -0600 Subject: [PATCH 2/2] Implement basic logic for user service --- vaultara/src/users/users_service.rs | 50 +++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/vaultara/src/users/users_service.rs b/vaultara/src/users/users_service.rs index e69de29..5c9b34b 100644 --- a/vaultara/src/users/users_service.rs +++ b/vaultara/src/users/users_service.rs @@ -0,0 +1,50 @@ +use spring::plugin::Service; +use spring_sqlx::ConnectPool; +use common::user::User; + +use crate::users::users_dto::RequestDto; + +#[derive(Clone, Service)] +pub struct UserService { + #[inject(component)] + db: ConnectPool, +} + +impl UserService { + pub async fn get_all_users(&self) -> Result, String> { + let users = sqlx::query_as!( + User, + r#"SELECT id, realm_id, username, email, phone, email_verified, phone_verified, status, last_login_at, created_at, versioning FROM users"#) + .fetch_all(&self.db) + .await + .map_err(|e| e.to_string())?; + Ok(users) + } + + pub async fn create_user(&self, dto: RequestDto) -> Result { + let user = sqlx::query_as!( + User, + r#" + INSERT INTO users ( + id, realm_id, username, email, phone, status, created_at + ) + VALUES ($1, $2, $3, $4, $5, $6, NOW()) + RETURNING id, realm_id, username, email, phone, + email_verified, phone_verified, status, + last_login_at, created_at, versioning + "#, + dto.id, + dto.realm_id, + dto.username, + dto.email, + dto.phone, + Status::Activate as _ + ) + .fetch_one(&self.db) + .await + .map_err(|e| e.to_string())?; + + Ok(user) + } + + }