feat(export): add issues milestone export
zhenyi committed
Added lib/export/issues/milestone.rs lib/export/issues/milestone.rs +73 −0 View lib/export/issues/milestone.rs
@@ -0,0 +1,73 @@
1use db::issue::milestone as milestone_entity;
2use serde::{Deserialize, Serialize};
3use time::OffsetDateTime;
4use time::format_description::well_known::Rfc3339;
5use utoipa::{IntoParams, ToSchema};
6use uuid::Uuid;
7
8fn fmt_ts(ts: OffsetDateTime) -> String {
9 ts.format(&Rfc3339).unwrap_or_default()
10}
11fn fmt_ts_opt(ts: Option<OffsetDateTime>) -> Option<String> {
12 ts.map(fmt_ts)
13}
14
15#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
16pub struct MilestoneView {
17 pub id: Uuid,
18 pub collection_id: Uuid,
19 pub name: String,
20 pub description: Option<String>,
21 pub is_closed: bool,
22 pub due_at: Option<String>,
23 pub num_issues: i32,
24 pub num_closed_issues: i32,
25 pub created_at: String,
26 pub updated_at: Option<String>,
27}
28
29impl From<milestone_entity::Model> for MilestoneView {
30 fn from(m: milestone_entity::Model) -> Self {
31 Self {
32 id: m.id,
33 collection_id: m.collection_id,
34 name: m.name,
35 description: m.description,
36 is_closed: m.is_closed,
37 due_at: fmt_ts_opt(m.due_at),
38 num_issues: m.num_issues,
39 num_closed_issues: m.num_closed_issues,
40 created_at: fmt_ts(m.created_at),
41 updated_at: fmt_ts_opt(m.updated_at),
42 }
43 }
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
47pub struct MilestonePage {
48 pub items: Vec<MilestoneView>,
49 pub total: i64,
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
53pub struct CreateMilestoneOption {
54 pub name: String,
55 pub description: Option<String>,
56 pub due_at: Option<String>,
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
60pub struct UpdateMilestoneOption {
61 pub name: Option<String>,
62 pub description: Option<Option<String>>,
63 pub due_at: Option<Option<String>>,
64 pub is_closed: Option<bool>,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, IntoParams)]
68pub struct ListMilestoneQuery {
69 pub is_closed: Option<bool>,
70 pub q: Option<String>,
71 pub limit: Option<u64>,
72 pub offset: Option<u64>,
73}
No newline at end of file