mirror of
https://github.com/domfelipe/fraudshield.git
synced 2026-08-07 06:36:52 +00:00
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.
29 lines
1.3 KiB
Python
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"),
|
|
)
|