use chrono::{DateTime, Utc};
use crate::db::db_types::{Row, SqlValue};
use crate::db::error::Result;
pub trait Model: Send + Sync {
fn table_name() -> &'static str;
fn primary_key() -> &'static str {
"id"
}
fn id(&self) -> Option<String>;
fn set_id(&mut self, id: String);
fn created_at(&self) -> Option<DateTime<Utc>>;
fn updated_at(&self) -> Option<DateTime<Utc>>;
fn deleted_at(&self) -> Option<DateTime<Utc>>;
fn set_created_at(&mut self, timestamp: DateTime<Utc>);
fn set_updated_at(&mut self, timestamp: DateTime<Utc>);
fn set_deleted_at(&mut self, timestamp: Option<DateTime<Utc>>);
fn before_create(&mut self) -> Result<()> {
let now = Utc::now();
self.set_created_at(now);
self.set_updated_at(now);
Ok(())
}
fn after_create(&mut self) -> Result<()> {
Ok(())
}
fn before_update(&mut self) -> Result<()> {
self.set_updated_at(Utc::now());
Ok(())
}
fn after_update(&mut self) -> Result<()> {
Ok(())
}
fn before_delete(&mut self) -> Result<()> {
Ok(())
}
fn after_delete(&mut self) -> Result<()> {
Ok(())
}
fn before_find() -> Result<()> {
Ok(())
}
fn after_find(&mut self) -> Result<()> {
Ok(())
}
fn before_save(&mut self) -> Result<()> {
if self.id().is_some() {
self.before_update()
} else {
self.before_create()
}
}
fn after_save(&mut self) -> Result<()> {
if self.id().is_some() {
self.after_update()
} else {
self.after_create()
}
}
fn is_deleted(&self) -> bool {
self.deleted_at().is_some()
}
fn columns(&self) -> Vec<(&'static str, SqlValue)> {
Vec::new()
}
fn from_row(row: &Row) -> Option<Self>
where
Self: Sized,
{
let _ = row;
None
}
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Timestamps {
pub id: Option<String>,
pub created_at: Option<DateTime<Utc>>,
pub updated_at: Option<DateTime<Utc>>,
pub deleted_at: Option<DateTime<Utc>>,
}
impl Timestamps {
pub fn new() -> Self {
Self {
id: None,
created_at: None,
updated_at: None,
deleted_at: None,
}
}
pub fn with_id(mut self, id: String) -> Self {
self.id = Some(id);
self
}
pub fn with_created_at(mut self, timestamp: DateTime<Utc>) -> Self {
self.created_at = Some(timestamp);
self
}
pub fn with_updated_at(mut self, timestamp: DateTime<Utc>) -> Self {
self.updated_at = Some(timestamp);
self
}
pub fn with_deleted_at(mut self, timestamp: Option<DateTime<Utc>>) -> Self {
self.deleted_at = timestamp;
self
}
}
impl Default for Timestamps {
fn default() -> Self {
Self::new()
}
}