Skip to content
Clone
951a522
111 lines 4.3 KB Rust
use axum::extract::{Path, Query, State};
use export::rest::{AppResponseData, NoData};
use jwt::Session;
use crate::errors::ApiError;
use crate::services::join_requests::{
ExploreQuery, ExploreSpacePage, JoinRequestDto, JoinRequestPage, JoinRequestPath,
ListJoinRequestsQuery,
};
use crate::services::service::SpaceService;
use crate::services::spaces::SpaceNamePath;
use jwt::share::session::require_uid;
#[utoipa::path(
get,
path = "/spaces/explore",
tag = "space",
description = "分页列出公开的活跃空间;已登录时返回调用者的成员与申请状态。",
params(ExploreQuery),
responses(
(status = 200, description = "explore public spaces", body = AppResponseData<ExploreSpacePage>),
(status = 400, description = "bad request", body = AppResponseData<NoData>)
)
)]
pub async fn explore_spaces(
State(service): State<SpaceService>,
session: Session,
Query(query): Query<ExploreQuery>,
) -> Result<AppResponseData<ExploreSpacePage>, ApiError> {
let viewer = session.uid();
let page = service.explore_spaces(viewer, query).await?;
Ok(AppResponseData::ok(page))
}
#[utoipa::path(
get,
path = "/spaces/{space_name}/join-requests",
tag = "space",
description = "分页列出空间的加入申请,需要成员管理权限。",
params(SpaceNamePath, ListJoinRequestsQuery),
responses(
(status = 200, description = "list join requests", body = AppResponseData<JoinRequestPage>),
(status = 403, description = "forbidden", body = AppResponseData<NoData>),
(status = 404, description = "not found", body = AppResponseData<NoData>),
(status = 401, description = "authentication required", body = AppResponseData<NoData>)
)
)]
pub async fn list_join_requests(
State(service): State<SpaceService>,
session: Session,
Path(path): Path<SpaceNamePath>,
Query(query): Query<ListJoinRequestsQuery>,
) -> Result<AppResponseData<JoinRequestPage>, ApiError> {
let uid = require_uid(&session)?;
let page = service
.list_join_requests(uid, &path.space_name, query)
.await?;
Ok(AppResponseData::ok(page))
}
#[utoipa::path(
post,
path = "/spaces/{space_name}/join-requests/{request_id}/approve",
tag = "space",
description = "通过一条待审批的加入申请并把申请人加入空间,需要成员管理权限。",
params(JoinRequestPath),
responses(
(status = 200, description = "join request approved", body = AppResponseData<JoinRequestDto>),
(status = 403, description = "forbidden", body = AppResponseData<NoData>),
(status = 404, description = "not found", body = AppResponseData<NoData>),
(status = 409, description = "join request is not pending", body = AppResponseData<NoData>),
(status = 401, description = "authentication required", body = AppResponseData<NoData>)
)
)]
pub async fn approve_join_request(
State(service): State<SpaceService>,
session: Session,
Path(path): Path<JoinRequestPath>,
) -> Result<AppResponseData<JoinRequestDto>, ApiError> {
let uid = require_uid(&session)?;
let request = service
.approve_join_request(uid, &path.space_name, path.request_id)
.await?;
Ok(AppResponseData::ok(request))
}
#[utoipa::path(
post,
path = "/spaces/{space_name}/join-requests/{request_id}/reject",
tag = "space",
description = "驳回一条待审批的加入申请,需要成员管理权限。",
params(JoinRequestPath),
responses(
(status = 200, description = "join request rejected", body = AppResponseData<JoinRequestDto>),
(status = 403, description = "forbidden", body = AppResponseData<NoData>),
(status = 404, description = "not found", body = AppResponseData<NoData>),
(status = 409, description = "join request is not pending", body = AppResponseData<NoData>),
(status = 401, description = "authentication required", body = AppResponseData<NoData>)
)
)]
pub async fn reject_join_request(
State(service): State<SpaceService>,
session: Session,
Path(path): Path<JoinRequestPath>,
) -> Result<AppResponseData<JoinRequestDto>, ApiError> {
let uid = require_uid(&session)?;
let request = service
.reject_join_request(uid, &path.space_name, path.request_id)
.await?;
Ok(AppResponseData::ok(request))
}