a06673b
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(())
}