use crate::{AppState, MetaRequestDto, v1::users_service::UsersService}; use crate::{ MessageResponseDto, PermissionsEnum, ResponseListSuccessDto, ResponseSuccessDto, UsersCreateRequestDto, UsersDetailItemDto, permissions_guard, }; use axum::extract::{Path, Query}; use axum::http::HeaderMap; use axum::response::IntoResponse; use axum::{Extension, Json}; use super::{ UsersActiveInactiveRequestDto, UsersListItemDto, UsersUpdateRequestDto, }; #[utoipa::path( get, security( ("Bearer" = []) ), path = "/v1/users", params( ("page" = Option, Query, description = "Page number"), ("per_page" = Option, Query, description = "Items per page"), ("search" = Option, Query, description = "Search keyword"), ("sort_by" = Option, Query, description = "Sort by field"), ("order" = Option, Query, description = "Order ASC or DESC"), ("filter" = Option, Query, description = "Filter value"), ("filter_by" = Option, Query, description = "Field to filter by"), ), responses( (status = 200, description = "Get user list", body = ResponseListSuccessDto>) ), tag = "Users" )] pub async fn get_user_list( headers: HeaderMap, Extension(state): Extension, Query(meta): Query, ) -> impl IntoResponse { match permissions_guard( &headers, state.clone(), vec![PermissionsEnum::ReadListUsers], ) .await { Ok(_) => UsersService::get_user_list(&state, meta).await, Err(response) => response, } } #[utoipa::path( get, security( ("Bearer" = []) ), path = "/v1/users/detail/{id}", params( ("id" = String, Path, description = "User ID") ), responses( (status = 200, description = "Get user by ID", body = ResponseSuccessDto) ), tag = "Users" )] pub async fn get_user_by_id( headers: HeaderMap, Extension(state): Extension, Path(id): Path, ) -> impl IntoResponse { match permissions_guard( &headers, state.clone(), vec![PermissionsEnum::ReadDetailUsers], ) .await { Ok(_) => UsersService::get_user_by_id(&state, id).await, Err(response) => response, } } #[utoipa::path( get, security( ("Bearer" = []) ), path = "/v1/users/me", responses( (status = 200, description = "Get user by ID", body = ResponseSuccessDto) ), tag = "Users" )] pub async fn get_user_me( Extension(state): Extension, headers: HeaderMap, ) -> impl IntoResponse { match permissions_guard(&headers, state.clone(), vec![]).await { Ok(_) => UsersService::get_user_me(headers, &state).await, Err(response) => response, } } #[utoipa::path( post, security( ("Bearer" = []) ), path = "/v1/users/create", request_body = UsersCreateRequestDto, responses( (status = 201, description = "Create new user", body = MessageResponseDto) ), tag = "Users" )] pub async fn post_create_user( headers: HeaderMap, Extension(state): Extension, Json(payload): Json, ) -> impl IntoResponse { match permissions_guard( &headers, state.clone(), vec![PermissionsEnum::CreateUsers], ) .await { Ok(_) => UsersService::create_user(&state, payload).await, Err(response) => response, } } #[utoipa::path( put, security( ("Bearer" = []) ), path = "/v1/users/update/{id}", request_body = UsersUpdateRequestDto, responses( (status = 200, description = "Update user", body = MessageResponseDto) ), tag = "Users" )] pub async fn put_update_user( headers: HeaderMap, Extension(state): Extension, Path(id): Path, Json(payload): Json, ) -> impl IntoResponse { match permissions_guard( &headers, state.clone(), vec![PermissionsEnum::UpdateUsers], ) .await { Ok(_) => UsersService::update_user(&state, id, payload).await, Err(response) => response, } } #[utoipa::path( put, security( ("Bearer" = []) ), path = "/v1/users/update/me", request_body = UsersUpdateRequestDto, responses( (status = 200, description = "Update user me", body = MessageResponseDto) ), tag = "Users" )] pub async fn put_update_user_me( headers: HeaderMap, Extension(state): Extension, Json(payload): Json, ) -> impl IntoResponse { match permissions_guard(&headers, state.clone(), vec![]).await { Ok(_) => UsersService::update_user_me(&state, headers, payload).await, Err(response) => response, } } #[utoipa::path( put, security( ("Bearer" = []) ), path = "/v1/users/activate/{id}", request_body = UsersActiveInactiveRequestDto, responses( (status = 200, description = "Set user active/inactive", body = MessageResponseDto) ), tag = "Users" )] pub async fn patch_user_active_status( headers: HeaderMap, Extension(state): Extension, Path(id): Path, Json(payload): Json, ) -> impl IntoResponse { match permissions_guard( &headers, state.clone(), vec![PermissionsEnum::ActivateUsers], ) .await { Ok(_) => UsersService::set_user_active_status(&state, id, payload).await, Err(response) => response, } } #[utoipa::path( delete, security( ("Bearer" = []) ), path = "/v1/users/delete/{id}", responses( (status = 200, description = "Soft delete user", body = MessageResponseDto) ), tag = "Users" )] pub async fn delete_user( headers: HeaderMap, Extension(state): Extension, Path(id): Path, ) -> impl IntoResponse { match permissions_guard( &headers, state.clone(), vec![PermissionsEnum::DeleteUsers], ) .await { Ok(_) => UsersService::delete_user(&state, id).await, Err(response) => response, } }