Skip to content
Clone

feat(issues): add issues get handler

zhenyi committed
parent 944ab4e commit 64d5625 Browse files

1 file changed

+44 −0

Added lib/issues/handler/issues/get.rs View lib/issues/handler/issues/get.rs
@@ -0,0 +1,44 @@
1use axum::Json;
2use axum::extract::{Path, Query, State};
3use jwt::extractor::AuthUser;
4use serde::Serialize;
5use serde_json::Value;
6use uuid::Uuid;
7
8use crate::error::IssueResult;
9use crate::features::IssueService;
10use crate::features::issue::ListIssueQuery;
11
12#[derive(Serialize)]
13#[serde(untagged)]
14enum GetChannelResponse {
15 Board(crate::features::issues::CollectionView),
16 IssueList { items: Vec<crate::features::issue::IssueView>, total: i64 },
17}
18
19#[utoipa::path(
20 get,
21 path = "/issues/{channel_id}",
22 tag = "issues",
23 responses((status = 200, description = "Default issue board OR issue list (when query.state/q/author_id/milestone_id is set)")),
24 security(("bearer_auth" = []))
25)]
26pub(crate) async fn handler(
27 State(svc): State<IssueService>,
28 AuthUser { claims }: AuthUser,
29 Path(channel_id): Path<Uuid>,
30 Query(q): Query<ListIssueQuery>,
31) -> IssueResult<Json<Value>> {
32 let wants_issue_list =
33 q.state.is_some() || q.q.is_some() || q.author_id.is_some() || q.milestone_id.is_some();
34 if wants_issue_list {
35 let page = svc.list_issues(claims.sub, channel_id, q).await?;
36 let resp = GetChannelResponse::IssueList { items: page.items, total: page.total };
37 Ok(Json(serde_json::to_value(resp).unwrap_or(Value::Null)))
38 } else {
39 let board = svc.load_default_collection(channel_id).await?;
40 let resp = GetChannelResponse::Board(board);
41 let _ = claims;
42 Ok(Json(serde_json::to_value(resp).unwrap_or(Value::Null)))
43 }
44}
No newline at end of file