use adminx_core::authz::Action;
use adminx_core::error::CoreError;
use adminx_core::filters::{FilterField, FilterOption};
use adminx_core::request::ReqCtx;
use adminx_core::resource::Resource;
use adminx_core::response::ApiResponse;
use async_trait::async_trait;
use serde_json::Value;
#[derive(Clone)]
pub struct AuditVersionResource;
fn append_only() -> ApiResponse {
ApiResponse::json(
405,
serde_json::json!({
"success": false,
"message": "The audit log is append-only; entries cannot be created, \
edited or deleted from the panel.",
}),
)
}
#[async_trait]
impl Resource for AuditVersionResource {
fn resource_name(&self) -> &'static str {
"Audit Log"
}
fn base_path(&self) -> &'static str {
"adminx-audit-versions"
}
fn table_name(&self) -> &'static str {
crate::store::TABLE
}
fn clone_box(&self) -> Box<dyn Resource> {
Box::new(self.clone())
}
fn menu(&self) -> &'static str {
"Audit Log"
}
fn permit_keys(&self) -> Vec<&'static str> {
vec![]
}
fn filterable_fields(&self) -> Vec<FilterField> {
vec![
FilterField::text("item_type", "Resource"),
FilterField::text("item_id", "Record ID"),
FilterField::select(
"event",
"Event",
vec![
FilterOption::new("create", "Created"),
FilterOption::new("update", "Updated"),
FilterOption::new("delete", "Deleted"),
],
),
FilterField::text("whodunnit_email", "Changed by"),
FilterField::date_range("created_at", "When"),
]
}
async fn create(&self, _ctx: &ReqCtx, _body: Value) -> ApiResponse {
append_only()
}
async fn update(&self, _ctx: &ReqCtx, _id: &str, _body: Value) -> ApiResponse {
append_only()
}
async fn delete(&self, _ctx: &ReqCtx, _id: &str) -> ApiResponse {
append_only()
}
async fn new_page(&self, ctx: &ReqCtx) -> ApiResponse {
if !self.authorize(ctx, Action::Read) {
return CoreError::Unauthorized.into();
}
append_only()
}
async fn edit_page(&self, ctx: &ReqCtx, _id: &str) -> ApiResponse {
if !self.authorize(ctx, Action::Read) {
return CoreError::Unauthorized.into();
}
append_only()
}
}