feat(issues): add issue_stopwatch usecase start
zhenyi committed
Added lib/issues/features/issue_stopwatch/usecase/start.rs lib/issues/features/issue_stopwatch/usecase/start.rs +43 −0 View lib/issues/features/issue_stopwatch/usecase/start.rs
@@ -0,0 +1,43 @@
1use db::conn::sea_orm::*;
2use db::issue::stopwatch as sw_entity;
3use time::OffsetDateTime;
4use uuid::Uuid;
5
6use crate::error::{IssueError, IssueResult};
7use crate::features::IssueService;
8
9use super::super::types::StopwatchView;
10use super::helpers::require_authenticated;
11
12pub async fn start_watch(
13 svc: &IssueService,
14 actor: Uuid,
15 channel_id: Uuid,
16 issue_id: Uuid,
17) -> IssueResult<StopwatchView> {
18 require_authenticated(actor)?;
19 crate::features::issue::usecase::load_issue(svc, channel_id, issue_id).await?;
20 let db = svc.db.reader();
21 let existing = sw_entity::Entity::find()
22 .filter(sw_entity::COLUMN.issue_id.eq(issue_id))
23 .filter(sw_entity::COLUMN.user_id.eq(actor))
24 .one(&db)
25 .await?;
26 if existing.is_some() {
27 return Err(IssueError::Conflict(
28 "stopwatch already running for this issue".into(),
29 ));
30 }
31 let db = svc.db.writer();
32 let now = OffsetDateTime::now_utc();
33 let id = Uuid::new_v4();
34 let active: sw_entity::ActiveModel = sw_entity::ActiveModel::builder()
35 .set_id(id)
36 .set_issue_id(issue_id)
37 .set_user_id(actor)
38 .set_started_at(now)
39 .set_created_at(now)
40 .into();
41 let saved = active.insert(&db).await?;
42 Ok(StopwatchView::from(saved))
43}