1use serde::{Serialize, Deserialize};
4use uuid::Uuid;
5use chrono::{DateTime, Utc};
6
7pub 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#[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}