use crate::{AppState, MetaRequestDto}; use crate::{ MessageResponseDto, ResponseListSuccessDto, ResponseSuccessDto, TeamsCreateRequestDto, TeamsDetailItemDto, TeamsListItemDto, permissions_guard, TeamsUpdateRequestDto, TeamInviteRequestDto, TeamAcceptInvitationRequestDto, TeamMemberDto, TeamsSearchQueryDto }; use axum::extract::Path; use axum::http::HeaderMap; use axum::response::IntoResponse; use axum::{Extension, Json}; use super::teams_service::{TeamsServiceTrait, TeamsService}; #[utoipa::path( get, security( ("Bearer" = []) ), path = "/v1/teams", 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 team list", body = ResponseListSuccessDto>) ), tag = "Teams" )] pub async fn get_team_list( headers: HeaderMap, Extension(state): Extension, axum::extract::Query(meta): axum::extract::Query, ) -> impl IntoResponse { match permissions_guard( headers, Extension(state), vec![], ) .await { Ok((_claims, state)) => TeamsService::get_team_list(&state, meta).await, Err(response) => response, } } #[utoipa::path( get, security( ("Bearer" = []) ), path = "/v1/teams/detail/{id}", params( ("id" = String, Path, description = "Team ID") ), responses( (status = 200, description = "Get team by ID", body = ResponseSuccessDto) ), tag = "Teams" )] pub async fn get_team_by_id( headers: HeaderMap, Extension(state): Extension, Path(id): Path, ) -> impl IntoResponse { match permissions_guard( headers, Extension(state), vec![], ) .await { Ok((_claims, state)) => TeamsService::get_team_by_id(&state, id).await, Err(response) => response, } } #[utoipa::path( post, security( ("Bearer" = []) ), path = "/v1/teams/create", request_body = TeamsCreateRequestDto, responses( (status = 200, description = "Create new team", body = ResponseSuccessDto) ), tag = "Teams" )] pub async fn post_create_team( headers: HeaderMap, Extension(state): Extension, Json(payload): Json, ) -> impl IntoResponse { match permissions_guard( headers, Extension(state), vec![], ) .await { Ok((claims, state)) => TeamsService::create_team(&state, claims, payload).await, Err(response) => response, } } #[utoipa::path( put, security( ("Bearer" = []) ), path = "/v1/teams/update/{id}", params( ("id" = String, Path, description = "Team ID") ), request_body = TeamsUpdateRequestDto, responses( (status = 200, description = "Update team", body = MessageResponseDto) ), tag = "Teams" )] pub async fn put_update_team( headers: HeaderMap, Extension(state): Extension, Path(id): Path, Json(payload): Json, ) -> impl IntoResponse { match permissions_guard( headers, Extension(state), vec![], ) .await { Ok((claims, state)) => TeamsService::update_team(&state, claims, id, payload).await, Err(response) => response, } } #[utoipa::path( delete, security( ("Bearer" = []) ), path = "/v1/teams/delete/{id}", params( ("id" = String, Path, description = "Team ID") ), responses( (status = 200, description = "Delete team", body = MessageResponseDto) ), tag = "Teams" )] pub async fn delete_team( headers: HeaderMap, Extension(state): Extension, Path(id): Path, ) -> impl IntoResponse { match permissions_guard( headers, Extension(state), vec![], ) .await { Ok((claims, state)) => TeamsService::delete_team(&state, claims, id).await, Err(response) => response, } } #[utoipa::path( post, security( ("Bearer" = []) ), path = "/v1/teams/{id}/invite", params( ("id" = String, Path, description = "Team ID") ), request_body = TeamInviteRequestDto, responses( (status = 200, description = "Invite team members", body = ResponseSuccessDto) ), tag = "Teams" )] pub async fn post_invite_team_members( headers: HeaderMap, Extension(state): Extension, Path(team_id): Path, Json(payload): Json, ) -> impl IntoResponse { match permissions_guard( headers, Extension(state), vec![], ) .await { Ok((claims, state)) => TeamsService::invite_team_members(&state, claims, team_id, payload).await, Err(response) => response, } } #[utoipa::path( post, security( ("Bearer" = []) ), path = "/v1/teams/accept/{token}", params( ("token" = String, Path, description = "Invitation token") ), responses( (status = 200, description = "Accept team invitation", body = MessageResponseDto) ), tag = "Teams" )] pub async fn post_accept_invitation( headers: HeaderMap, Extension(state): Extension, Path(token): Path, ) -> impl IntoResponse { let accept_dto = TeamAcceptInvitationRequestDto { token }; match permissions_guard( headers, Extension(state), vec![], ) .await { Ok((claims, state)) => TeamsService::accept_invitation(&state, claims, accept_dto).await, Err(response) => response, } } #[utoipa::path( get, path = "/v1/teams/search", params( ("query" = Option, Query, description = "Search query"), ("open" = Option, Query, description = "Filter by open teams"), ("skills" = Option>, Query, description = "Filter by required skills"), ("location" = Option, Query, description = "Filter by location"), ("page" = Option, Query, description = "Page number"), ("per_page" = Option, Query, description = "Items per page"), ), responses( (status = 200, description = "Search teams", body = ResponseListSuccessDto>) ), tag = "Teams" )] pub async fn get_public_team_search( Extension(state): Extension, axum::extract::Query(search_params): axum::extract::Query, ) -> impl IntoResponse { TeamsService::search_teams(&state, search_params).await } #[utoipa::path( get, security( ("Bearer" = []) ), path = "/v1/teams/{id}/members", params( ("id" = String, Path, description = "Team ID") ), responses( (status = 200, description = "Get team members", body = ResponseSuccessDto>) ), tag = "Teams" )] pub async fn get_team_members( headers: HeaderMap, Extension(state): Extension, Path(id): Path, ) -> impl IntoResponse { match permissions_guard( headers, Extension(state), vec![], ) .await { Ok((claims, state)) => TeamsService::get_team_members(&state, claims, id).await, Err(response) => response, } } #[utoipa::path( post, security( ("Bearer" = []) ), path = "/v1/teams/{id}/leave", params( ("id" = String, Path, description = "Team ID") ), responses( (status = 200, description = "Leave team", body = MessageResponseDto) ), tag = "Teams" )] pub async fn post_leave_team( headers: HeaderMap, Extension(state): Extension, Path(id): Path, ) -> impl IntoResponse { match permissions_guard( headers, Extension(state), vec![], ) .await { Ok((claims, state)) => TeamsService::leave_team(&state, claims, id).await, Err(response) => response, } }