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