use rustlavel_db::migration::Migration;
use rustlavel_db::schema::{Schema, Table};
use rustlavel_core::Result;
pub const TABLE: &str = "audit_logs";
fn define(t: &mut Table) {
t.id();
t.big_integer("user_id").nullable().index();
t.string("user_name").nullable();
t.string("event").index();
t.string("model_type").nullable().index();
t.string("model_id").nullable();
t.text("description").nullable();
t.text("properties").nullable();
t.string("ip_address").nullable().index();
t.text("user_agent").nullable();
t.timestamps();
}
rustlavel_db::migration!(
CreateAuditLogsTable,
"2026_09_03_000001_create_audit_logs_table",
up: |schema| { schema.create(TABLE, define).await },
down: |schema| { schema.drop(TABLE).await },
);
pub fn migrations() -> Vec<&'static dyn Migration> {
vec![&CreateAuditLogsTable]
}
pub async fn drop_table(schema: &Schema<'_>) -> Result<()> {
schema.drop(TABLE).await
}
#[cfg(test)]
mod tests {
use super::*;
use rustlavel_db::dialect::{MySql, Postgres, SqlServer};
use rustlavel_db::schema::create_statements;
#[test]
fn the_table_renders_on_every_supported_database() {
for dialect in [
&Postgres as &dyn rustlavel_db::Dialect,
&MySql as &dyn rustlavel_db::Dialect,
&SqlServer as &dyn rustlavel_db::Dialect,
] {
let sql = create_statements(dialect, TABLE, define).expect("valid").join(";\n");
assert!(sql.contains("audit_logs"), "{sql}");
assert!(sql.contains("event"), "{sql}");
assert!(sql.contains("ip_address"), "{sql}");
assert!(!sql.to_lowercase().contains("user_id bigint not null"), "{sql}");
}
}
}