use invoance::models::{CreateAuditOrgParams, IngestAuditEventParams};
use invoance::{verify_audit_event, InvoanceClient};
use serde_json::json;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = InvoanceClient::new()?;
let audit = client.audit();
audit
.orgs
.create(CreateAuditOrgParams {
organization_id: "org_customer_1".into(),
name: Some("Acme Corp".into()),
})
.await
.ok();
let ingested = audit
.events
.ingest(IngestAuditEventParams {
organization_id: "org_customer_1".into(),
action: "user.role.granted".into(),
actor: json!({ "type": "user", "id": "admin_1" })
.as_object()
.unwrap()
.clone(),
targets: Some(vec![json!({ "type": "user", "id": "u_9" })]),
..Default::default()
})
.await?;
println!("appended: {}", serde_json::to_string_pretty(&ingested)?);
let listed = audit
.events
.list(invoance::models::ListAuditEventsParams {
organization_id: Some("org_customer_1".into()),
limit: Some(1),
..Default::default()
})
.await?;
if let Some(first) = listed.events.first() {
let as_value = serde_json::to_value(first)?;
let res = verify_audit_event(&as_value, None);
println!(
"offline verify: valid={} reason={:?}",
res.valid, res.reason
);
}
Ok(())
}