Skip to content
Clone

feat(issues): add milestone usecase list

zhenyi committed
parent 76b14a1 commit 8f092a3 Browse files

1 file changed

+47 −0

Added lib/issues/features/milestone/usecase/list.rs View lib/issues/features/milestone/usecase/list.rs
@@ -0,0 +1,47 @@
1use db::conn::sea_orm::*;
2use db::issue::milestone as milestone_entity;
3use uuid::Uuid;
4
5use crate::error::{IssueError, IssueResult};
6use crate::features::IssueService;
7
8use super::super::super::issue::usecase::load_issue_collection;
9use super::super::types::{ListMilestoneQuery, MilestonePage, MilestoneView};
10use super::helpers::require_authenticated;
11
12pub async fn list_milestones(
13 svc: &IssueService,
14 actor: Uuid,
15 channel_id: Uuid,
16 q: ListMilestoneQuery,
17) -> IssueResult<MilestonePage> {
18 require_authenticated(actor)?;
19
20 let limit = q.limit.unwrap_or(svc.config.default_pagination);
21 let offset = q.offset.unwrap_or(0);
22 if limit == 0 || limit > svc.config.max_pagination {
23 return Err(IssueError::BadRequest(format!(
24 "limit must be in 1..={}",
25 svc.config.max_pagination
26 )));
27 }
28
29 let collection = load_issue_collection(svc, channel_id).await?;
30 let db = svc.db.reader();
31
32 let finder = milestone_entity::Entity::find()
33 .filter(milestone_entity::COLUMN.collection_id.eq(collection.id))
34 .apply_if(q.is_closed, |f, closed| f.filter(milestone_entity::COLUMN.is_closed.eq(closed)))
35 .apply_if(q.q, |f, s| f.filter(milestone_entity::COLUMN.name.contains(&s)));
36
37 let total = finder.clone().count(&db).await? as i64;
38 let rows = finder
39 .order_by_desc(milestone_entity::COLUMN.created_at)
40 .limit(limit)
41 .offset(offset)
42 .all(&db)
43 .await?;
44
45 let items = rows.into_iter().map(MilestoneView::from).collect();
46 Ok(MilestonePage { items, total })
47}
No newline at end of file