use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use sqlx::FromRow;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct AccessLogProjection {
pub id: Uuid,
pub file_id: Uuid,
pub bucket_id: Option<Uuid>,
pub action: AccessAction,
pub user_id: Option<Uuid>,
pub share_id: Option<Uuid>,
pub is_owner: bool,
pub is_shared: bool,
pub is_public: bool,
pub ip_address: Option<String>,
pub user_agent: Option<String>,
pub referer: Option<String>,
pub country_code: Option<String>,
pub city: Option<String>,
pub bytes_transferred: Option<i64>,
pub duration_ms: Option<i32>,
pub success: bool,
pub error_message: Option<String>,
pub accessed_at: DateTime<Utc>,
pub metadata: serde_json::Value,
pub projection_version: i64,
pub last_event_sequence: i64,
pub projection_updated_at: DateTime<Utc>,
}
impl AccessLogProjection {
pub fn new(
id: Uuid,
file_id: Uuid,
bucket_id: Option<Uuid>,
action: AccessAction,
user_id: Option<Uuid>,
share_id: Option<Uuid>,
is_owner: bool,
is_shared: bool,
is_public: bool,
ip_address: Option<String>,
user_agent: Option<String>,
referer: Option<String>,
country_code: Option<String>,
city: Option<String>,
bytes_transferred: Option<i64>,
duration_ms: Option<i32>,
success: bool,
error_message: Option<String>,
accessed_at: DateTime<Utc>,
metadata: serde_json::Value
) -> Self {
Self {
id,
file_id,
bucket_id,
action,
user_id,
share_id,
is_owner,
is_shared,
is_public,
ip_address,
user_agent,
referer,
country_code,
city,
bytes_transferred,
duration_ms,
success,
error_message,
accessed_at,
metadata,
projection_version: 1,
last_event_sequence: 0,
projection_updated_at: Utc::now(),
}
}
pub fn id(&self) -> &Uuid {
&self.id
}
pub fn apply_event(&mut self, event_sequence: i64) {
self.projection_version += 1;
self.last_event_sequence = event_sequence;
self.projection_updated_at = Utc::now();
}
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct AccessLogSummary {
pub id: Uuid,
}