Audit Trail
Audit trail adalah catatan semua perubahan yang terjadi pada data. Penting untuk compliance, debugging, dan memahami riwayat data.
Implementasi Audit Trail
CREATE TABLE audit_logs (
id SERIAL PRIMARY KEY,
table_name VARCHAR(100) NOT NULL,
record_id INT NOT NULL,
action VARCHAR(10) NOT NULL, -- INSERT, UPDATE, DELETE
old_values JSONB,
new_values JSONB,
user_id INT,
created_at TIMESTAMP DEFAULT NOW()
);
-- Contoh data audit
-- | action | table | record_id | old_values | new_values |
-- | UPDATE | users | 1 | {"name": "Budi"} | {"name": "Budi S."} |
-- | DELETE | posts | 5 | {"title": "Draft"} | null |
Trigger-based Audit
-- PostgreSQL trigger untuk audit otomatis
CREATE OR REPLACE FUNCTION audit_trigger()
RETURNS TRIGGER AS $
BEGIN
INSERT INTO audit_logs (table_name, record_id, action, old_values, new_values)
VALUES (
TG_TABLE_NAME,
COALESCE(NEW.id, OLD.id),
TG_OP,
row_to_json(OLD),
row_to_json(NEW)
);
RETURN NEW;
END;
$ LANGUAGE plpgsql;
CREATE TRIGGER users_audit
AFTER INSERT OR UPDATE OR DELETE ON users
FOR EACH ROW EXECUTE FUNCTION audit_trigger();
Event Sourcing
Event sourcing menyimpan setiap event yang terjadi, bukan state akhir. State direkonstruksi dengan "replay" semua event.
-- Event store
CREATE TABLE events (
id SERIAL PRIMARY KEY,
aggregate_type VARCHAR(100),
aggregate_id INT,
event_type VARCHAR(100),
payload JSONB,
created_at TIMESTAMP DEFAULT NOW()
);
-- Contoh events untuk Order #1:
-- OrderCreated → {"total": 100000}
-- ItemAdded → {"product": "Laptop", "qty": 1}
-- PaymentMade → {"amount": 100000, "method": "transfer"}
-- OrderShipped → {"tracking": "JNE123"}
Audit Trail vs Event Sourcing
- Audit Trail — melengkapi CRUD biasa, simpan snapshot perubahan
- Event Sourcing — menggantikan CRUD, state = replay events. Lebih powerful tapi lebih kompleks
Laravel: spatie/laravel-activitylog
Package spatie/laravel-activitylog mempermudah implementasi audit trail di Laravel. Cukup tambahkan trait LogsActivity pada model, dan setiap perubahan otomatis tercatat.