feat(issues): add issue_tracked_time usecase list
zhenyi committed
Added lib/issues/features/issue_tracked_time/usecase/list.rs lib/issues/features/issue_tracked_time/usecase/list.rs +41 −0 View lib/issues/features/issue_tracked_time/usecase/list.rs
@@ -0,0 +1,41 @@
1use db::conn::sea_orm::*;
2use db::issue::tracked_time as tt_entity;
3use uuid::Uuid;
4
5use crate::error::{IssueError, IssueResult};
6use crate::features::IssueService;
7
8use super::super::types::{ListTrackedTimeQuery, TrackedTimePage, TrackedTimeView};
9use super::helpers::require_authenticated;
10
11pub async fn list_tracked_times(
12 svc: &IssueService,
13 actor: Uuid,
14 channel_id: Uuid,
15 issue_id: Uuid,
16 q: ListTrackedTimeQuery,
17) -> IssueResult<TrackedTimePage> {
18 require_authenticated(actor)?;
19 let limit = q.limit.unwrap_or(svc.config.default_pagination);
20 let offset = q.offset.unwrap_or(0);
21 if limit == 0 || limit > svc.config.max_pagination {
22 return Err(IssueError::BadRequest(format!(
23 "limit must be in 1..={}",
24 svc.config.max_pagination
25 )));
26 }
27 crate::features::issue::usecase::load_issue(svc, channel_id, issue_id).await?;
28 let db = svc.db.reader();
29 let finder = tt_entity::Entity::find()
30 .filter(tt_entity::COLUMN.issue_id.eq(issue_id))
31 .apply_if(q.user_id, |f, uid| f.filter(tt_entity::COLUMN.user_id.eq(uid)));
32 let total = finder.clone().count(&db).await? as i64;
33 let rows = finder
34 .order_by_desc(tt_entity::COLUMN.created_at)
35 .limit(limit)
36 .offset(offset)
37 .all(&db)
38 .await?;
39 let items = rows.into_iter().map(TrackedTimeView::from).collect();
40 Ok(TrackedTimePage { items, total })
41}