use db::conn::sea_orm::*; use db::issue::stopwatch as sw_entity; use time::OffsetDateTime; use uuid::Uuid; use crate::error::{IssueError, IssueResult}; use crate::features::IssueService; use super::super::StopwatchView; use super::helpers::require_authenticated; pub async fn start_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 db = svc.db.reader(); let existing = sw_entity::Entity::find() .filter(sw_entity::COLUMN.issue_id.eq(issue_id)) .filter(sw_entity::COLUMN.user_id.eq(actor)) .one(&db) .await?; if existing.is_some() { return Err(IssueError::Conflict( "stopwatch already running for this issue".into(), )); } let db = svc.db.writer(); let now = OffsetDateTime::now_utc(); let id = Uuid::new_v4(); let active: sw_entity::ActiveModel = sw_entity::ActiveModel::builder() .set_id(id) .set_issue_id(issue_id) .set_user_id(actor) .set_started_at(now) .set_created_at(now) .into(); let saved = active.insert(&db).await?; Ok(StopwatchView::from(saved)) }