feat(issues): add issue_stopwatch usecase delete
zhenyi committed
Added lib/issues/features/issue_stopwatch/usecase/delete.rs lib/issues/features/issue_stopwatch/usecase/delete.rs +37 −0 View lib/issues/features/issue_stopwatch/usecase/delete.rs
@@ -0,0 +1,37 @@
1use db::conn::sea_orm::*;
2use time::OffsetDateTime;
3use uuid::Uuid;
4
5use crate::error::IssueResult;
6use crate::features::IssueService;
7
8use super::helpers::{load_my_stopwatch, require_authenticated};
9
10pub async fn stop_watch(
11 svc: &IssueService,
12 actor: Uuid,
13 channel_id: Uuid,
14 issue_id: Uuid,
15) -> IssueResult<()> {
16 require_authenticated(actor)?;
17 crate::features::issue::usecase::load_issue(svc, channel_id, issue_id).await?;
18 let cur = load_my_stopwatch(svc, issue_id, actor).await?;
19 let elapsed = (OffsetDateTime::now_utc() - cur.started_at).whole_seconds();
20 let db = svc.db.writer();
21
22 let txn = db.begin().await?;
23 let active_sw: db::issue::stopwatch::ActiveModel = cur.into();
24 active_sw.delete(&txn).await?;
25 let tt_id = Uuid::new_v4();
26 let now = OffsetDateTime::now_utc();
27 let active_tt: db::issue::tracked_time::ActiveModel = db::issue::tracked_time::ActiveModel {
28 id: Set(tt_id),
29 issue_id: Set(issue_id),
30 user_id: Set(actor),
31 seconds: Set(std::cmp::max(elapsed, 0_i64)),
32 created_at: Set(now),
33 };
34 active_tt.insert(&txn).await?;
35 txn.commit().await?;
36 Ok(())
37}