fraudshield/backend/fraudshield/models/alert.py
Felipe Domingues 989202648d feat: implement FraudShield MVP — backend API + frontend alerts
Backend (Python 3.12/FastAPI):
- 5 models: Transaction, DetectionRule, FraudAlert, AuditLog, RuleSnapshot
- Rule engine: 4 rule types (amount, location, time, pattern)
- 11 API routes: health, auth, transactions, alerts
- Sync ingestion pipeline with explanation generation
- JWT auth with 3 roles (analyst, admin, senior)
- Seed script with 5 default rules + 50 synthetic transactions

Frontend (React 19/TypeScript/Tailwind):
- Auth: login page, JWT token management, role-based routing
- Alerts: queue with filters, detail panel, decision workflow
- Layout: responsive sidebar, top bar, protected routes
- Full TypeScript, zero ts-ignore, Tailwind CSS

Build: Backend imports clean, Frontend tsc --noEmit passes,
vite build produces 296KB production bundle.
2026-05-12 16:54:03 -03:00

29 lines
1.3 KiB
Python

from sqlalchemy import Column, String, Integer, Text, DateTime, ForeignKey, Index, func
from sqlalchemy.dialects.postgresql import UUID, JSONB
from sqlalchemy.orm import relationship
from fraudshield.models.base import Base, UUIDPrimaryKeyMixin
class FraudAlert(Base, UUIDPrimaryKeyMixin):
__tablename__ = "fraud_alerts"
transaction_id = Column(UUID(as_uuid=True), ForeignKey("transactions.id"), nullable=False)
score = Column(Integer, nullable=False)
triggered_rules = Column(JSONB, nullable=False)
explanation = Column(Text, nullable=False)
status = Column(String(20), nullable=False, default="pending")
assigned_to = Column(String(255), nullable=True)
decision = Column(String(20), nullable=True)
decided_by = Column(String(255), nullable=True)
decided_at = Column(DateTime(timezone=True), nullable=True)
justification = Column(Text, nullable=True)
created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
ruleset_version = Column(String(20), nullable=True)
transaction = relationship("Transaction", back_populates="alert")
__table_args__ = (
Index("idx_alerts_status", "status"),
Index("idx_alerts_created_at", "created_at"),
Index("idx_alerts_transaction_id", "transaction_id"),
)