zenith-backend / core /constants.py
teoat
deploy: sync from main Sun Jan 11 18:43:53 WIT 2026
4a2ab42
"""
Centralized Constants and Configuration
Eliminates magic numbers and hardcoding throughout the codebase
"""
# ============================================================================
# SYSTEM CONSTANTS
# ============================================================================
# File and Data Limits
MAX_UPLOAD_SIZE = 10 * 1024 * 1024 # 10MB
DEFAULT_MAX_PROCESS_SIZE = 50 * 1024 * 1024 # 50MB
MAX_FILE_NAME_LENGTH = 255
MAX_TEXT_CONTENT_LENGTH = 10 * 1024 * 1024 # 10MB for text processing
# Performance Thresholds
DEFAULT_TIMEOUT_SECONDS = 30
API_REQUEST_TIMEOUT = 10
DATABASE_CONNECTION_TIMEOUT = 5
FILE_PROCESSING_TIMEOUT = 60
# Caching Configuration
PLUGIN_CACHE_TTL = 3600 # 1 hour
SESSION_CACHE_TTL = 1800 # 30 minutes
DATA_CACHE_TTL = 300 # 5 minutes
RESULT_CACHE_TTL = 600 # 10 minutes
# ============================================================================
# FRAUD DETECTION CONSTANTS
# ============================================================================
# Risk Scoring (0-100 scale)
RISK_SCORE_LOW = 25
RISK_SCORE_MEDIUM = 50
RISK_SCORE_HIGH = 75
RISK_SCORE_CRITICAL = 90
# Structuring Detection
STRUCTURING_THRESHOLD = 10000 # $10,000 USD
STRUCTURING_WINDOW_HOURS = 24
STRUCTURING_MIN_TRANSACTIONS = 2
# Velocity Analysis
VELOCITY_MAX_TRANSACTIONS = 10
VELOCITY_WINDOW_MINUTES = 60
VELOCITY_RISK_MULTIPLIER = 5
# Geographic Risk
HIGH_RISK_COUNTRIES = [
"IR",
"KP",
"CU",
"SY",
"VE",
"AF",
"IQ",
"LY",
"SD",
"YE",
"SO",
"MM",
]
# ============================================================================
# AI/ML CONSTANTS
# ============================================================================
# Model Confidence Thresholds
MIN_CONFIDENCE_THRESHOLD = 0.5
HIGH_CONFIDENCE_THRESHOLD = 0.8
CRITICAL_CONFIDENCE_THRESHOLD = 0.95
# Processing Limits
MAX_AI_PROCESSING_TIME = 300 # 5 minutes
MAX_BATCH_SIZE = 100
MAX_CONCURRENT_AI_REQUESTS = 5
# Quality Scores
OCR_QUALITY_THRESHOLD = 0.7
FORGERY_DETECTION_THRESHOLD = 0.85
FACE_RECOGNITION_THRESHOLD = 0.8
# ============================================================================
# EVIDENCE PROCESSING CONSTANTS
# ============================================================================
# File Type Categories
SUPPORTED_IMAGE_TYPES = ["jpg", "jpeg", "png", "bmp", "tiff", "webp"]
SUPPORTED_VIDEO_TYPES = ["mp4", "avi", "mov", "mkv", "webm"]
SUPPORTED_DOCUMENT_TYPES = ["pdf", "doc", "docx", "txt", "rtf"]
SUPPORTED_AUDIO_TYPES = ["mp3", "wav", "flac", "aac", "ogg"]
# Processing Quality Thresholds
MIN_IMAGE_RESOLUTION = 100 # pixels
MIN_VIDEO_DURATION = 1 # second
MAX_FILE_SIZE_FOR_OCR = 10 * 1024 * 1024 # 10MB
MAX_TEXT_EXTRACTION_LENGTH = 100000 # characters
# Forensic Analysis
ELA_THRESHOLD = 15 # Error Level Analysis threshold
MANIPULATION_THRESHOLD = 10 # Image manipulation detection
COMPRESSION_ARTIFACT_THRESHOLD = 50
BLUR_DETECTION_THRESHOLD = 100
# ============================================================================
# API AND NETWORKING CONSTANTS
# ============================================================================
# HTTP Status Codes (for reference)
HTTP_OK = 200
HTTP_CREATED = 201
HTTP_BAD_REQUEST = 400
HTTP_UNAUTHORIZED = 401
HTTP_FORBIDDEN = 403
HTTP_NOT_FOUND = 404
HTTP_CONFLICT = 409
HTTP_UNPROCESSABLE_ENTITY = 422
HTTP_TOO_MANY_REQUESTS = 429
HTTP_INTERNAL_SERVER_ERROR = 500
HTTP_SERVICE_UNAVAILABLE = 503
# Rate Limiting
DEFAULT_RATE_LIMIT_REQUESTS = 100
DEFAULT_RATE_LIMIT_WINDOW = 60 # seconds
API_RATE_LIMIT_REQUESTS = 1000
API_RATE_LIMIT_WINDOW = 60
# Pagination
DEFAULT_PAGE_SIZE = 50
MAX_PAGE_SIZE = 1000
MIN_PAGE_SIZE = 10
# ============================================================================
# SECURITY CONSTANTS
# ============================================================================
# Password Requirements
MIN_PASSWORD_LENGTH = 8
MAX_PASSWORD_LENGTH = 128
PASSWORD_COMPLEXITY_REQUIREMENTS = {
"uppercase": True,
"lowercase": True,
"digits": True,
"special_chars": True,
}
# JWT Configuration
JWT_ACCESS_TOKEN_EXPIRE_MINUTES = 15
JWT_REFRESH_TOKEN_EXPIRE_DAYS = 30
JWT_SECRET_KEY_MIN_LENGTH = 32
# Encryption
AES_KEY_SIZE = 32 # 256-bit
RSA_KEY_SIZE = 2048
HASH_ROUNDS = 100000 # For password hashing
# ============================================================================
# BUSINESS LOGIC CONSTANTS
# ============================================================================
# Case Management
CASE_PRIORITY_LEVELS = ["low", "medium", "high", "critical"]
CASE_STATUS_TRANSITIONS = {
"draft": ["open"],
"open": ["in_progress", "closed", "cancelled"],
"in_progress": ["open", "closed", "cancelled"],
"closed": ["reopened"],
"cancelled": ["reopened"],
}
# Alert Management
ALERT_SEVERITY_LEVELS = ["info", "low", "medium", "high", "critical"]
ALERT_AUTO_RESOLVE_HOURS = 24
ALERT_ESCALATION_THRESHOLDS = {
"high": 5, # Escalate after 5 high alerts
"critical": 1, # Escalate immediately on critical
}
# Compliance
SAR_FILING_DEADLINE_DAYS = 30
CTR_REPORTING_THRESHOLD = 10000 # $10,000 USD
SAR_RISK_THRESHOLDS = {"low": 25, "medium": 50, "high": 75, "critical": 90}
# ============================================================================
# MONITORING AND LOGGING CONSTANTS
# ============================================================================
# Log Levels
LOG_LEVEL_DEBUG = "DEBUG"
LOG_LEVEL_INFO = "INFO"
LOG_LEVEL_WARNING = "WARNING"
LOG_LEVEL_ERROR = "ERROR"
LOG_LEVEL_CRITICAL = "CRITICAL"
# Metrics Collection
METRICS_COLLECTION_INTERVAL = 60 # seconds
METRICS_RETENTION_DAYS = 30
PERFORMANCE_ALERT_THRESHOLD = 2000 # ms for API responses
# Health Checks
HEALTH_CHECK_INTERVAL = 30 # seconds
HEALTH_CHECK_TIMEOUT = 10 # seconds
HEALTH_CHECK_RETRIES = 3
# ============================================================================
# UTILITY FUNCTIONS
# ============================================================================
def get_risk_level(score: float) -> str:
"""Convert risk score to risk level"""
if score >= RISK_SCORE_CRITICAL:
return "critical"
elif score >= RISK_SCORE_HIGH:
return "high"
elif score >= RISK_SCORE_MEDIUM:
return "medium"
else:
return "low"
def get_priority_level(severity: str) -> str:
"""Convert severity to priority"""
severity_map = {
"critical": "high",
"high": "high",
"medium": "medium",
"low": "medium",
"info": "low",
}
return severity_map.get(severity, "medium")
def is_high_risk_country(country_code: str) -> bool:
"""Check if country is in high-risk list"""
return country_code.upper() in HIGH_RISK_COUNTRIES
def calculate_batch_size(total_items: int, max_batch_size: int = MAX_BATCH_SIZE) -> int:
"""Calculate optimal batch size for processing"""
return min(max_batch_size, max(1, total_items // 10))
# ============================================================================
# CONFIGURATION OBJECTS
# ============================================================================
# Database Configuration
DATABASE_CONFIG = {
"pool_size": 10,
"max_overflow": 20,
"pool_timeout": DATABASE_CONNECTION_TIMEOUT,
"pool_recycle": 3600, # 1 hour
"echo": False,
}
# Redis Configuration
REDIS_CONFIG = {
"max_connections": 20,
"retry_on_timeout": True,
"socket_timeout": 5,
"socket_connect_timeout": 5,
"socket_keepalive": True,
"socket_keepalive_options": {1: 60}, # TCP_KEEPIDLE: 60 seconds
"health_check_interval": 30,
}
# AI/ML Configuration
AI_CONFIG = {
"max_concurrent_requests": MAX_CONCURRENT_AI_REQUESTS,
"request_timeout": API_REQUEST_TIMEOUT,
"batch_size": MAX_BATCH_SIZE,
"cache_ttl": RESULT_CACHE_TTL,
"retry_attempts": 3,
"retry_delay": 1.0,
}
# Export all constants
__all__ = [
"AES_KEY_SIZE",
"AI_CONFIG",
"ALERT_AUTO_RESOLVE_HOURS",
"ALERT_ESCALATION_THRESHOLDS",
"ALERT_SEVERITY_LEVELS",
"API_RATE_LIMIT_REQUESTS",
"API_RATE_LIMIT_WINDOW",
"API_REQUEST_TIMEOUT",
"BLUR_DETECTION_THRESHOLD",
# Business Logic
"CASE_PRIORITY_LEVELS",
"CASE_STATUS_TRANSITIONS",
"COMPRESSION_ARTIFACT_THRESHOLD",
"CRITICAL_CONFIDENCE_THRESHOLD",
"CTR_REPORTING_THRESHOLD",
# Configuration Objects
"DATABASE_CONFIG",
"DATABASE_CONNECTION_TIMEOUT",
"DATA_CACHE_TTL",
"DEFAULT_MAX_PROCESS_SIZE",
"DEFAULT_PAGE_SIZE",
"DEFAULT_RATE_LIMIT_REQUESTS",
"DEFAULT_RATE_LIMIT_WINDOW",
"DEFAULT_TIMEOUT_SECONDS",
"ELA_THRESHOLD",
"FACE_RECOGNITION_THRESHOLD",
"FORGERY_DETECTION_THRESHOLD",
"HASH_ROUNDS",
"HEALTH_CHECK_INTERVAL",
"HEALTH_CHECK_RETRIES",
"HEALTH_CHECK_TIMEOUT",
"HIGH_CONFIDENCE_THRESHOLD",
"HIGH_RISK_COUNTRIES",
"HTTP_BAD_REQUEST",
"HTTP_CONFLICT",
"HTTP_CREATED",
"HTTP_FORBIDDEN",
"HTTP_INTERNAL_SERVER_ERROR",
"HTTP_NOT_FOUND",
# API & Networking
"HTTP_OK",
"HTTP_SERVICE_UNAVAILABLE",
"HTTP_TOO_MANY_REQUESTS",
"HTTP_UNAUTHORIZED",
"HTTP_UNPROCESSABLE_ENTITY",
"JWT_ACCESS_TOKEN_EXPIRE_MINUTES",
"JWT_REFRESH_TOKEN_EXPIRE_DAYS",
"JWT_SECRET_KEY_MIN_LENGTH",
"LOG_LEVEL_CRITICAL",
# Monitoring
"LOG_LEVEL_DEBUG",
"LOG_LEVEL_ERROR",
"LOG_LEVEL_INFO",
"LOG_LEVEL_WARNING",
"MANIPULATION_THRESHOLD",
"MAX_AI_PROCESSING_TIME",
"MAX_BATCH_SIZE",
"MAX_CONCURRENT_AI_REQUESTS",
"MAX_FILE_NAME_LENGTH",
"MAX_FILE_SIZE_FOR_OCR",
"MAX_PAGE_SIZE",
"MAX_PASSWORD_LENGTH",
"MAX_TEXT_EXTRACTION_LENGTH",
# System Constants
"MAX_UPLOAD_SIZE",
"METRICS_COLLECTION_INTERVAL",
"METRICS_RETENTION_DAYS",
# AI/ML
"MIN_CONFIDENCE_THRESHOLD",
"MIN_IMAGE_RESOLUTION",
"MIN_PAGE_SIZE",
# Security
"MIN_PASSWORD_LENGTH",
"MIN_VIDEO_DURATION",
"OCR_QUALITY_THRESHOLD",
"PASSWORD_COMPLEXITY_REQUIREMENTS",
"PERFORMANCE_ALERT_THRESHOLD",
"PLUGIN_CACHE_TTL",
"REDIS_CONFIG",
"RESULT_CACHE_TTL",
"RISK_SCORE_CRITICAL",
"RISK_SCORE_HIGH",
# Fraud Detection
"RISK_SCORE_LOW",
"RISK_SCORE_MEDIUM",
"RSA_KEY_SIZE",
"SAR_FILING_DEADLINE_DAYS",
"SAR_RISK_THRESHOLDS",
"SESSION_CACHE_TTL",
"STRUCTURING_MIN_TRANSACTIONS",
"STRUCTURING_THRESHOLD",
"STRUCTURING_WINDOW_HOURS",
"SUPPORTED_AUDIO_TYPES",
"SUPPORTED_DOCUMENT_TYPES",
# Evidence Processing
"SUPPORTED_IMAGE_TYPES",
"SUPPORTED_VIDEO_TYPES",
"VELOCITY_MAX_TRANSACTIONS",
"VELOCITY_RISK_MULTIPLIER",
"VELOCITY_WINDOW_MINUTES",
"calculate_batch_size",
"get_priority_level",
# Utility Functions
"get_risk_level",
"is_high_risk_country",
]