Skip to main content

backbone_core/
entity.rs

1//! Entity traits and common entity implementations
2
3use serde::{Serialize, Deserialize};
4use uuid::Uuid;
5use chrono::{DateTime, Utc};
6
7/// Base trait for all entities in Backbone Framework
8pub trait Entity: Serialize + for<'de> Deserialize<'de> {
9    fn id(&self) -> &Uuid;
10    fn created_at(&self) -> DateTime<Utc>;
11    fn updated_at(&self) -> DateTime<Utc>;
12    fn deleted_at(&self) -> Option<DateTime<Utc>>;
13    fn is_deleted(&self) -> bool {
14        self.deleted_at().is_some()
15    }
16}
17
18/// Base entity struct with common fields
19#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
20pub struct BaseEntity {
21    pub id: Uuid,
22    pub created_at: DateTime<Utc>,
23    pub updated_at: DateTime<Utc>,
24    pub deleted_at: Option<DateTime<Utc>>,
25}
26
27impl Default for BaseEntity {
28    fn default() -> Self {
29        Self::new()
30    }
31}
32
33impl BaseEntity {
34    pub fn new() -> Self {
35        let now = Utc::now();
36        Self {
37            id: Uuid::new_v4(),
38            created_at: now,
39            updated_at: now,
40            deleted_at: None,
41        }
42    }
43
44    pub fn delete(&mut self) {
45        self.deleted_at = Some(Utc::now());
46        self.updated_at = Utc::now();
47    }
48
49    pub fn restore(&mut self) {
50        self.deleted_at = None;
51        self.updated_at = Utc::now();
52    }
53
54    pub fn touch(&mut self) {
55        self.updated_at = Utc::now();
56    }
57}
58
59impl Entity for BaseEntity {
60    fn id(&self) -> &Uuid {
61        &self.id
62    }
63
64    fn created_at(&self) -> DateTime<Utc> {
65        self.created_at
66    }
67
68    fn updated_at(&self) -> DateTime<Utc> {
69        self.updated_at
70    }
71
72    fn deleted_at(&self) -> Option<DateTime<Utc>> {
73        self.deleted_at
74    }
75}