backbone_bucket/domain/value_objects/
timestamps.rs1use chrono::{DateTime, Utc};
8use serde::{Deserialize, Serialize};
9#[cfg(feature = "openapi")]
10use utoipa::ToSchema;
11
12#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
13#[cfg_attr(feature = "openapi", derive(ToSchema))]
14pub struct Timestamps {
15 pub created_at: DateTime<Utc>,
16 pub updated_at: DateTime<Utc>,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub deleted_at: Option<DateTime<Utc>>,
19}
20
21impl Timestamps {
22 pub fn new(created_at: DateTime<Utc>, updated_at: DateTime<Utc>, deleted_at: Option<DateTime<Utc>>) -> Self {
24 Self {
25 created_at,
26 updated_at,
27 deleted_at,
28 }
29 }
30
31 pub fn builder() -> TimestampsBuilder {
33 <TimestampsBuilder as Default>::default()
34 }
35
36}
37
38#[derive(Debug, Clone, Default)]
40pub struct TimestampsBuilder {
41 created_at: Option<DateTime<Utc>>,
42 updated_at: Option<DateTime<Utc>>,
43 deleted_at: Option<DateTime<Utc>>,
44}
45
46impl TimestampsBuilder {
47 pub fn created_at(mut self, value: DateTime<Utc>) -> Self {
49 self.created_at = Some(value);
50 self
51 }
52
53 pub fn updated_at(mut self, value: DateTime<Utc>) -> Self {
55 self.updated_at = Some(value);
56 self
57 }
58
59 pub fn deleted_at(mut self, value: DateTime<Utc>) -> Self {
61 self.deleted_at = Some(value);
62 self
63 }
64
65 pub fn build(self) -> Result<Timestamps, String> {
67 let updated_at = self.updated_at.ok_or_else(|| "updated_at is required".to_string())?;
68
69 let value = Timestamps {
70 created_at: self.created_at.unwrap_or(chrono::Utc::now()),
71 updated_at,
72 deleted_at: self.deleted_at,
73 };
74
75 Ok(value)
76 }
77
78}