nxtgauge-backend-rust/crates/db/migrations/20260721050000_create_audit_logs.up.sql
Ashwin Kumar Sivakumar 68f659903c fix: audit_logs, tax_rules, reviews tables never existed; fix wrong column in review creation
Finished the sweep of every table referenced by live Rust code but not
created by any active migration:

- audit_logs / audit_log_changes — backs wallet::audit() (crates/wallet),
  called from every admin Tracecoin balance adjustment
  (apps/payments/src/admin.rs::adjust_credits). actor_type defaulted since
  the only caller doesn't supply it.
- tax_rules — backs the admin tax-rule CRUD in apps/payments/src/admin.rs.
  init-db.sql has a differently-named version (title/percentage/
  applicable_to); schema here matches the live code's actual columns
  (name/tax_rate/applies_to).
- reviews — backs the professional review/rating system
  (apps/users/src/handlers/reviews.rs).

Also fixed a real bug found while building the reviews schema:
admin_create_review's customer-lookup subquery selected
`lead_requests.user_id`, a column that has never existed (it's
`customer_user_id`) — would have failed on the very first review
creation attempt now that lead_requests actually exists.

Checked every other previously-flagged table (permissions, orders,
external_roles, internal_roles, kb_*, notification_*, order_items,
portfolio_images, smtp_configs, dashboard_widgets,
verification_documents) against actual Rust usage — none of them are
referenced by a real SQL query (grep hits were all Rust variable/type
names), so nothing to fix there. Full migration-chain sweep confirms
zero remaining "references a table before it's created" issues.
2026-07-21 03:05:14 +05:30

34 lines
1.5 KiB
SQL

-- Backs wallet::audit() (crates/wallet/src/lib.rs), called from every admin
-- Tracecoin balance adjustment (apps/payments/src/admin.rs::adjust_credits).
-- Never created by any active migration — only in scripts/init-db.sql (see
-- 20260718200000_create_verifications_and_approvals for why that file is
-- never actually applied). actor_type/request_id/ip_address/user_agent are
-- nullable/defaulted here since the only current caller doesn't supply them.
CREATE TABLE IF NOT EXISTS audit_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
actor_user_id UUID NOT NULL,
actor_type VARCHAR(20) NOT NULL DEFAULT 'USER',
action VARCHAR(100) NOT NULL,
entity_type VARCHAR(50) NOT NULL,
entity_id UUID NOT NULL,
module_key VARCHAR(100),
request_id UUID,
ip_address VARCHAR(45),
user_agent TEXT,
status VARCHAR(20) NOT NULL DEFAULT 'SUCCESS',
summary TEXT,
metadata_json JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_audit_logs_entity ON audit_logs(entity_type, entity_id);
CREATE INDEX IF NOT EXISTS idx_audit_logs_actor ON audit_logs(actor_type, actor_user_id);
CREATE INDEX IF NOT EXISTS idx_audit_logs_created_at ON audit_logs(created_at DESC);
CREATE TABLE IF NOT EXISTS audit_log_changes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
audit_log_id UUID NOT NULL REFERENCES audit_logs(id) ON DELETE CASCADE,
field_name VARCHAR(255) NOT NULL,
old_value TEXT,
new_value TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);