feat(issues): add milestone usecase update
zhenyi committed
Added lib/issues/features/milestone/usecase/update.rs lib/issues/features/milestone/usecase/update.rs +58 −0 View lib/issues/features/milestone/usecase/update.rs
@@ -0,0 +1,58 @@
1use db::conn::sea_orm::*;
2use time::OffsetDateTime;
3use time::format_description::well_known::Rfc3339;
4use uuid::Uuid;
5
6use crate::error::{IssueError, IssueResult};
7use crate::features::IssueService;
8
9use super::super::types::{MilestoneView, UpdateMilestoneOption};
10use super::helpers::{load_milestone, require_authenticated};
11
12pub async fn update_milestone(
13 svc: &IssueService,
14 actor: Uuid,
15 channel_id: Uuid,
16 milestone_id: Uuid,
17 input: UpdateMilestoneOption,
18) -> IssueResult<MilestoneView> {
19 require_authenticated(actor)?;
20 let cur = load_milestone(svc, channel_id, milestone_id).await?;
21
22 if let Some(ref n) = input.name {
23 let trimmed = n.trim().to_string();
24 if trimmed.is_empty() || trimmed.len() > svc.config.max_milestone_title_len {
25 return Err(IssueError::BadRequest("invalid milestone name".into()));
26 }
27 }
28 if let Some(Some(d)) = input.description.as_ref()
29 && d.len() > svc.config.max_milestone_description_len
30 {
31 return Err(IssueError::BadRequest("description too long".into()));
32 }
33 let due_at = match input.due_at {
34 Some(Some(s)) => Some(
35 OffsetDateTime::parse(&s, &Rfc3339)
36 .map_err(|e| IssueError::BadRequest(format!("invalid due_at: {e}")))?,
37 ),
38 Some(None) => None,
39 None => cur.due_at,
40 };
41
42 let db = svc.db.writer();
43 let mut active: db::issue::milestone::ActiveModel = cur.into();
44 if let Some(n) = input.name {
45 active.name = Set(n.trim().to_string());
46 }
47 if let Some(opt) = input.description {
48 active.description = Set(opt);
49 }
50 active.due_at = Set(due_at);
51 if let Some(c) = input.is_closed {
52 active.is_closed = Set(c);
53 }
54 active.updated_at = Set(Some(OffsetDateTime::now_utc()));
55
56 let saved = active.update(&db).await?;
57 Ok(MilestoneView::from(saved))
58}
No newline at end of file