mongodb_migrator/
migration_record.rs1use chrono::DateTime;
7use chrono::Utc;
8use serde_derive::{Deserialize, Serialize};
9
10use crate::migration_status::MigrationStatus;
11
12#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
13pub struct MigrationRecord {
14 pub _id: String,
15 pub start_date: Option<chrono::DateTime<Utc>>,
16 pub end_date: Option<chrono::DateTime<Utc>>,
17 pub status: MigrationStatus,
18 pub duration: Option<i64>,
19}
20
21impl MigrationRecord {
22 pub fn migration_start(migration_name: String) -> Self {
23 MigrationRecord {
24 _id: migration_name.clone(),
25 start_date: Some(Utc::now()),
26 end_date: None,
27 status: MigrationStatus::InProgress,
28 duration: None,
29 }
30 }
31
32 pub fn migration_succeeded(self) -> Self {
33 let end_date = Utc::now();
34
35 MigrationRecord {
36 end_date: Some(end_date),
37 status: MigrationStatus::Success,
38 duration: Some(self.calc_migration_duration(end_date)),
39 ..self
40 }
41 }
42
43 pub fn migration_failed(self) -> Self {
44 let end_date = Utc::now();
45
46 MigrationRecord {
47 end_date: Some(end_date),
48 status: MigrationStatus::Fail,
49 duration: Some(self.calc_migration_duration(end_date)),
50 ..self
51 }
52 }
53
54 fn calc_migration_duration(&self, end_date: DateTime<Utc>) -> i64 {
55 if self.start_date.is_none() {
56 0
57 } else {
58 (end_date.time() - self.start_date.unwrap().time()).num_milliseconds()
59 }
60 }
61}