use serde::{Serialize, Deserialize};
use uuid::Uuid;
use chrono::{DateTime, Utc};
pub trait Entity: Serialize + for<'de> Deserialize<'de> {
fn id(&self) -> &Uuid;
fn created_at(&self) -> DateTime<Utc>;
fn updated_at(&self) -> DateTime<Utc>;
fn deleted_at(&self) -> Option<DateTime<Utc>>;
fn is_deleted(&self) -> bool {
self.deleted_at().is_some()
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BaseEntity {
pub id: Uuid,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
impl Default for BaseEntity {
fn default() -> Self {
Self::new()
}
}
impl BaseEntity {
pub fn new() -> Self {
let now = Utc::now();
Self {
id: Uuid::new_v4(),
created_at: now,
updated_at: now,
deleted_at: None,
}
}
pub fn delete(&mut self) {
self.deleted_at = Some(Utc::now());
self.updated_at = Utc::now();
}
pub fn restore(&mut self) {
self.deleted_at = None;
self.updated_at = Utc::now();
}
pub fn touch(&mut self) {
self.updated_at = Utc::now();
}
}
impl Entity for BaseEntity {
fn id(&self) -> &Uuid {
&self.id
}
fn created_at(&self) -> DateTime<Utc> {
self.created_at
}
fn updated_at(&self) -> DateTime<Utc> {
self.updated_at
}
fn deleted_at(&self) -> Option<DateTime<Utc>> {
self.deleted_at
}
}