feat(project): add activities usecase
zhenyi committed
Added lib/project/features/activities/usecase.rs lib/project/features/activities/usecase.rs +53 −0 View lib/project/features/activities/usecase.rs
@@ -0,0 +1,53 @@
1use db::project::project_activities as activity_entity;
2use db::project::project_activities::Column as Ac;
3use sea_orm::{ColumnTrait, EntityTrait, QueryFilter, QueryOrder, PaginatorTrait};
4use uuid::Uuid;
5
6use crate::error::ProjectResult;
7use crate::features::ProjectService;
8use crate::permission;
9
10use super::{ActivityPage, ActivityView, ListActivityQuery};
11
12pub async fn list_activities(
13 svc: &ProjectService,
14 actor: Uuid,
15 space_id: Uuid,
16 project_id: Uuid,
17 q: ListActivityQuery,
18) -> ProjectResult<ActivityPage> {
19 crate::features::authz::require(svc, actor, space_id, project_id, permission::VIEW_PROJECT)
20 .await?;
21
22 let page = q.page.max(1);
23 let per_page = q.per_page.clamp(1, svc.config.max_page_size);
24 let offset = (page - 1) * per_page;
25
26 let mut query = activity_entity::Entity::find()
27 .filter(Ac::ProjectId.eq(project_id))
28 .order_by_desc(Ac::CreatedAt);
29
30 if let Some(verb) = q.verb {
31 query = query.filter(Ac::Verb.eq(verb));
32 }
33
34 let reader = svc.db.reader();
35 let paginator = query.paginate(&reader, per_page);
36 let total = paginator.num_items().await?;
37 let rows = paginator.fetch_page(offset / per_page).await?;
38 let items = rows.iter().map(activity_view).collect();
39 Ok(ActivityPage { total, items })
40}
41
42fn activity_view(m: &activity_entity::Model) -> ActivityView {
43 ActivityView {
44 id: m.id,
45 project_id: m.project_id,
46 actor_id: m.actor_id,
47 verb: m.verb.clone(),
48 target_kind: m.target_kind.clone(),
49 target_id: m.target_id,
50 payload: m.payload.clone(),
51 created_at: m.created_at,
52 }
53}
No newline at end of file