Skip to content
Clone
a06673b
57 lines 1.6 KB Rust
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<IssueView> {
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))
}