use axum::extract::{Path, Query}; use axum::http::HeaderMap; use axum::response::IntoResponse; use axum::{Extension, Json}; use crate::{v1::users_service::UsersService, AppState, MetaRequestDto}; use crate::{ MessageResponseDto, ResponseListSuccessDto, ResponseSuccessDto, UsersActiveInactiveRequestDto, UsersCreateRequestDto, UsersDetailItemDto, }; use super::{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( Extension(state): Extension, Query(meta): Query, ) -> impl IntoResponse { UsersService::get_user_list(&state, meta).await } #[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( Extension(state): Extension, Path(id): Path, ) -> impl IntoResponse { UsersService::get_user_by_id(&state, id).await } #[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, header: HeaderMap, ) -> impl IntoResponse { UsersService::get_user_me(header, &state).await } #[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( Extension(state): Extension, Json(payload): Json, ) -> impl IntoResponse { UsersService::create_user(&state, payload).await } #[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( Extension(state): Extension, Path(id): Path, Json(payload): Json, ) -> impl IntoResponse { UsersService::update_user(&state, id, payload).await } #[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( Extension(state): Extension, header: HeaderMap, Json(payload): Json, ) -> impl IntoResponse { UsersService::update_user_me(&state, header, payload).await } #[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( Extension(state): Extension, axum::extract::Path(id): axum::extract::Path, Json(payload): Json, ) -> impl IntoResponse { UsersService::set_user_active_status(&state, id, payload).await } #[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( Extension(state): Extension, Path(id): Path, ) -> impl IntoResponse { UsersService::delete_user(&state, id).await }