use chrono::{DateTime, Utc};
use indexmap::IndexMap;
use crate::action::Action;
use crate::actor::Actor;
use crate::changes::{AuditedChanges, ChangeValue, ValueMap};
use crate::id::AuditId;
#[derive(Clone, Debug, PartialEq)]
pub struct Audit {
pub id: i64,
pub auditable_type: String,
pub auditable_id: AuditId,
pub associated_type: Option<String>,
pub associated_id: Option<AuditId>,
pub user_type: Option<String>,
pub user_id: Option<AuditId>,
pub username: Option<String>,
pub action: Action,
pub audited_changes: AuditedChanges,
pub version: i32,
pub comment: Option<String>,
pub remote_address: Option<String>,
pub request_uuid: Option<String>,
pub created_at: DateTime<Utc>,
}
impl Audit {
pub fn user(&self) -> Option<Actor> {
Actor::from_columns(
self.user_id.clone(),
self.user_type.clone(),
self.username.clone(),
)
}
pub fn associated(&self) -> Option<(String, AuditId)> {
match (&self.associated_type, &self.associated_id) {
(Some(t), Some(i)) => Some((t.clone(), i.clone())),
_ => None,
}
}
pub fn new_attributes(&self) -> ValueMap {
self.audited_changes.new_attributes(self.action)
}
pub fn old_attributes(&self) -> ValueMap {
self.audited_changes.old_attributes(self.action)
}
pub fn changes(&self) -> IndexMap<String, ChangeValue> {
self.audited_changes.typed(self.action)
}
pub fn undo_plan(&self) -> crate::error::Result<UndoPlan> {
match self.action {
Action::Create => Ok(UndoPlan::Delete),
Action::Destroy => Ok(UndoPlan::Recreate(self.new_attributes())),
Action::Update => Ok(UndoPlan::Restore(self.old_attributes())),
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum UndoPlan {
Delete,
Recreate(ValueMap),
Restore(ValueMap),
}
#[derive(Clone, Debug)]
pub struct NewAudit {
pub auditable_type: String,
pub auditable_id: AuditId,
pub associated_type: Option<String>,
pub associated_id: Option<AuditId>,
pub user_type: Option<String>,
pub user_id: Option<AuditId>,
pub username: Option<String>,
pub action: Action,
pub audited_changes: AuditedChanges,
pub comment: Option<String>,
pub remote_address: Option<String>,
pub request_uuid: Option<String>,
pub created_at: DateTime<Utc>,
}