use db::conn::sea_orm::*; use time::OffsetDateTime; use uuid::Uuid; use crate::error::{IssueError, IssueResult}; use crate::features::IssueService; use super::super::{IssueView, UpdateIssueOption}; use super::helpers::{load_issue, require_authenticated}; pub async fn update_issue( svc: &IssueService, actor: Uuid, channel_id: Uuid, issue_id: Uuid, input: UpdateIssueOption, ) -> IssueResult { require_authenticated(actor)?; let cur = load_issue(svc, channel_id, issue_id).await?; if let Some(ref t) = input.title && (t.trim().is_empty() || t.len() > svc.config.max_title_len) { return Err(IssueError::BadRequest(format!( "title length must be in 1..={}", svc.config.max_title_len ))); } if let Some(ref b) = input.body && b.len() > svc.config.max_body_len { return Err(IssueError::BadRequest(format!( "body too long (max {})", svc.config.max_body_len ))); } let db = svc.db.writer(); let mut active: db::issue::issue::ActiveModel = cur.into(); if let Some(t) = input.title { active.title = Set(t.trim().to_string()); } if let Some(opt) = input.description { active.description = Set(opt); } if let Some(b) = input.body { active.body = Set(b); } if let Some(opt) = input.milestone_id { active.milestone_id = Set(opt); } active.updated_at = Set(Some(OffsetDateTime::now_utc())); let saved = active.update(&db).await?; Ok(IssueView::from(saved)) }