mongodb_migrator/
migration_record.rs

1//! [`MigrationRecord`] describes the document which will be stored
2//! in the migrations collection.  
3//! It contains all useful attributes which might be used in order
4//! to understand the current state of a particular migration
5
6use 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}