pub mod mailing_ab_test;
pub mod mailing_audience;
pub mod mailing_contact;
pub mod mailing_subscription;
pub mod opt_out_reason;
pub mod mailing;
pub mod mailing_trace;
pub mod mailing_filter;
pub mod ab_winner_selection;
pub mod mailing_state;
pub mod mailing_schedule_type;
pub mod mailing_type;
pub mod mailing_target_model;
pub mod trace_type;
pub mod trace_status;
pub mod trace_failure_type;
pub use mailing_ab_test::MailingAbTest;
pub use mailing_ab_test::MailingAbTestBuilder;
pub use mailing_ab_test::MailingAbTestId;
pub use mailing_audience::MailingAudience;
pub use mailing_audience::MailingAudienceBuilder;
pub use mailing_audience::MailingAudienceId;
pub use mailing_contact::MailingContact;
pub use mailing_contact::MailingContactBuilder;
pub use mailing_contact::MailingContactId;
pub use mailing_subscription::MailingSubscription;
pub use mailing_subscription::MailingSubscriptionBuilder;
pub use mailing_subscription::MailingSubscriptionId;
pub use opt_out_reason::OptOutReason;
pub use opt_out_reason::OptOutReasonBuilder;
pub use opt_out_reason::OptOutReasonId;
pub use mailing::Mailing;
pub use mailing::MailingBuilder;
pub use mailing::MailingId;
pub use mailing_trace::MailingTrace;
pub use mailing_trace::MailingTraceBuilder;
pub use mailing_trace::MailingTraceId;
pub use mailing_filter::MailingFilter;
pub use mailing_filter::MailingFilterBuilder;
pub use mailing_filter::MailingFilterId;
pub use ab_winner_selection::AbWinnerSelection;
pub use mailing_state::MailingState;
pub use mailing_schedule_type::MailingScheduleType;
pub use mailing_type::MailingType;
pub use mailing_target_model::MailingTargetModel;
pub use trace_type::TraceType;
pub use trace_status::TraceStatus;
pub use trace_failure_type::TraceFailureType;
use std::fmt::Debug;
pub trait Entity: Debug + Clone {
type Id: Debug + Clone + PartialEq;
fn entity_id(&self) -> &Self::Id;
fn entity_type() -> &'static str;
}
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[cfg(feature = "openapi")]
use utoipa::ToSchema;
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct AuditMetadata {
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_by: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_by: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted_by: Option<Uuid>,
}
impl AuditMetadata {
pub fn new() -> Self {
Self {
created_at: Some(Utc::now()),
..Default::default()
}
}
pub fn with_creator(creator_id: Uuid) -> Self {
Self {
created_at: Some(Utc::now()),
created_by: Some(creator_id),
..Default::default()
}
}
pub fn touch(&mut self) {
self.updated_at = Some(Utc::now());
}
pub fn touch_by(&mut self, updater_id: Uuid) {
self.updated_at = Some(Utc::now());
self.updated_by = Some(updater_id);
}
pub fn soft_delete(&mut self) {
self.deleted_at = Some(Utc::now());
}
pub fn soft_delete_by(&mut self, deleter_id: Uuid) {
self.deleted_at = Some(Utc::now());
self.deleted_by = Some(deleter_id);
}
pub fn restore(&mut self) {
self.deleted_at = None;
self.deleted_by = None;
}
pub fn is_deleted(&self) -> bool {
self.deleted_at.is_some()
}
pub fn is_active(&self) -> bool {
self.deleted_at.is_none()
}
}