use db::conn::sea_orm::*; use time::OffsetDateTime; use uuid::Uuid; use crate::error::IssueResult; use crate::features::IssueService; use super::helpers::{load_my_stopwatch, require_authenticated}; pub async fn stop_watch( svc: &IssueService, actor: Uuid, channel_id: Uuid, issue_id: Uuid, ) -> IssueResult<()> { require_authenticated(actor)?; crate::features::issue::usecase::load_issue(svc, channel_id, issue_id).await?; let cur = load_my_stopwatch(svc, issue_id, actor).await?; let elapsed = (OffsetDateTime::now_utc() - cur.started_at).whole_seconds(); let db = svc.db.writer(); let txn = db.begin().await?; let active_sw: db::issue::stopwatch::ActiveModel = cur.into(); active_sw.delete(&txn).await?; let tt_id = Uuid::new_v4(); let now = OffsetDateTime::now_utc(); let active_tt: db::issue::tracked_time::ActiveModel = db::issue::tracked_time::ActiveModel { id: Set(tt_id), issue_id: Set(issue_id), user_id: Set(actor), seconds: Set(std::cmp::max(elapsed, 0_i64)), created_at: Set(now), }; active_tt.insert(&txn).await?; txn.commit().await?; Ok(()) }