use crate::domain::entities::Event;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Deserialize)]
pub struct IngestEventRequest {
pub event_type: String,
pub entity_id: String,
pub tenant_id: Option<String>, pub payload: serde_json::Value,
pub metadata: Option<serde_json::Value>,
}
#[derive(Debug, Serialize)]
pub struct IngestEventResponse {
pub event_id: Uuid,
pub timestamp: DateTime<Utc>,
}
impl IngestEventResponse {
pub fn from_event(event: &Event) -> Self {
Self {
event_id: event.id(),
timestamp: event.timestamp(),
}
}
}
#[derive(Debug, Deserialize)]
pub struct QueryEventsRequest {
pub entity_id: Option<String>,
pub event_type: Option<String>,
pub tenant_id: Option<String>,
pub as_of: Option<DateTime<Utc>>,
pub since: Option<DateTime<Utc>>,
pub until: Option<DateTime<Utc>>,
pub limit: Option<usize>,
}
#[derive(Debug, Serialize)]
pub struct QueryEventsResponse {
pub events: Vec<EventDto>,
pub count: usize,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct EventDto {
pub id: Uuid,
pub event_type: String,
pub entity_id: String,
pub tenant_id: String,
pub payload: serde_json::Value,
pub timestamp: DateTime<Utc>,
pub metadata: Option<serde_json::Value>,
pub version: i64,
}
impl From<&Event> for EventDto {
fn from(event: &Event) -> Self {
Self {
id: event.id(),
event_type: event.event_type().to_string(),
entity_id: event.entity_id().to_string(),
tenant_id: event.tenant_id().to_string(),
payload: event.payload().clone(),
timestamp: event.timestamp(),
metadata: event.metadata().cloned(),
version: event.version(),
}
}
}
impl From<Event> for EventDto {
fn from(event: Event) -> Self {
EventDto::from(&event)
}
}
#[derive(Debug, Deserialize)]
pub struct IngestEventsBatchRequest {
pub events: Vec<IngestEventRequest>,
}
#[derive(Debug, Serialize)]
pub struct IngestEventsBatchResponse {
pub total: usize,
pub ingested: usize,
pub events: Vec<IngestEventResponse>,
}