projectlib/jsonb/
milestone.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use chrono::{NaiveDateTime};
use common::utils::serialize_option_naive_date;
use serde::{Deserialize, Serialize};
use uuid::Uuid;

use crate::dto::milestone_request::MilestoneRequest;
use crate::dto::milestone_response::MilestoneResponse;

#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct Milestone {
    pub id: Uuid,
    #[serde(default)]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(with = "serialize_option_naive_date")]
    pub datestart: Option<NaiveDateTime>,
    #[serde(default)]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(with = "serialize_option_naive_date")]
    pub dateend: Option<NaiveDateTime>,
    pub status: Option<String>,
    pub name: Option<String>,
}

impl Milestone {
    pub fn from_request(milestone: &MilestoneRequest) -> Milestone {
        Milestone {
            id: if milestone.id.is_none() {
                Uuid::new_v4()
            } else {
                milestone.id.unwrap()
            },
            datestart: milestone.datestart.clone(),
            dateend: milestone.dateend.clone(),
            status: milestone.status.clone(),
            name: milestone.name.clone(),
        }
    }

    pub fn to_response(&self) -> MilestoneResponse {
        MilestoneResponse {
            id: self.id,
            datestart: self.datestart,
            dateend: self.dateend,
            status: self.status.clone(),
            name: self.name.clone(),
        }
    }

    pub fn to_response_list(milestones: Vec<Milestone>) -> Vec<MilestoneResponse> {
        let mut res: Vec<MilestoneResponse> = vec![];
        if milestones.is_empty() {
            return res;
        }
        for milestone in milestones.iter() {
            res.push(Milestone::to_response(&milestone.clone()));
        }
        res
    }
}