import json import os from dataclasses import dataclass from datetime import datetime, timedelta from typing import List @dataclass class FeedbackLog: transaction_id: str original_match: str correction: str reason: str timestamp: datetime user_id: str class FeedbackLogger: def __init__(self, log_file: str = "feedback_logs.json"): self.log_file = log_file self.logs: List[FeedbackLog] = self._load_logs() def _load_logs(self) -> List[FeedbackLog]: if not os.path.exists(self.log_file): return [] try: with open(self.log_file, "r") as f: data = json.load(f) return [FeedbackLog(**log) for log in data] except Exception: return [] def _save_logs(self): with open(self.log_file, "w") as f: json.dump( [ { "transaction_id": log.transaction_id, "original_match": log.original_match, "correction": log.correction, "reason": log.reason, "timestamp": log.timestamp.isoformat(), "user_id": log.user_id, } for log in self.logs ], f, indent=2, ) def log_override( self, transaction_id: str, original_match: str, correction: str, reason: str, user_id: str, ): log = FeedbackLog( transaction_id=transaction_id, original_match=original_match, correction=correction, reason=reason, timestamp=datetime.now(), user_id=user_id, ) self.logs.append(log) self._save_logs() def get_logs_by_transaction(self, transaction_id: str) -> List[FeedbackLog]: return [log for log in self.logs if log.transaction_id == transaction_id] def get_recent_logs(self, days: int = 30) -> List[FeedbackLog]: cutoff = datetime.now() - timedelta(days=days) return [log for log in self.logs if log.timestamp > cutoff]