use domain_patterns::models::{Entity, AggregateRoot};
use domain_patterns::event::DomainEvent;
use domain_patterns::message::Message;
use chrono::Utc;
use serde::{Serialize, Deserialize};
use uuid::Uuid;
use crate::common::NaiveUser;
pub struct UserEventRecord {
pub id: String,
pub aggregate_id: String,
pub version: u64,
pub event_data: UserEvents,
}
#[derive(Serialize, Deserialize, Clone, DomainEvent)]
pub struct UserCreatedEvent {
pub aggregate_id: String,
pub first_name: String,
pub last_name: String,
pub email: String,
pub version: u64,
pub id: Uuid,
pub occurred: i64,
}
impl UserCreatedEvent {
pub fn new(user: &NaiveUser) -> UserCreatedEvent {
UserCreatedEvent {
aggregate_id: user.id(),
first_name: user.first_name().clone(),
last_name: user.last_name().clone(),
email: user.email().to_string(),
version: user.version(),
id: Uuid::new_v4(),
occurred: Utc::now().timestamp(),
}
}
}
#[derive(Serialize, Deserialize, Clone, DomainEvent)]
pub struct FirstNameUpdatedEvent {
pub id: Uuid,
pub aggregate_id: String,
pub first_name: String,
pub version: u64,
pub occurred: i64,
}
impl FirstNameUpdatedEvent {
fn new(user: &NaiveUser) -> FirstNameUpdatedEvent {
FirstNameUpdatedEvent {
aggregate_id: user.id(),
first_name: user.first_name().clone(),
version: user.version(),
id: Uuid::new_v4(),
occurred: Utc::now().timestamp(),
}
}
}
#[derive(Clone, DomainEvents)]
pub enum UserEvents {
UserCreated(UserCreatedEvent),
FirstNameUpdated(FirstNameUpdatedEvent),
}
impl From<&UserEvents> for UserEventRecord {
fn from(value: &UserEvents) -> Self {
use UserEvents::*;
match value {
UserCreated(e) => {
UserEventRecord {
id: e.id().to_string(),
aggregate_id: e.aggregate_id(),
version: e.version(),
event_data: UserCreated(e.clone()),
}
},
FirstNameUpdated(e) => {
UserEventRecord {
id: e.id().to_string(),
aggregate_id: e.aggregate_id(),
version: e.version(),
event_data: FirstNameUpdated(e.clone()),
}
}
}
}
}