"""Report model for Trust & Safety.""" from datetime import datetime from typing import Optional from sqlalchemy import ( Column, Integer, String, Text, DateTime, ForeignKey, UniqueConstraint, ) from sqlalchemy.dialects.postgresql import ENUM from sqlalchemy.orm import relationship from sqlalchemy.sql import func import enum from app.database import Base class ReportTargetType(str, enum.Enum): USER = "user" WORLD = "world" ASSET = "asset" CHAT_MESSAGE = "chat_message" class ReasonCategory(str, enum.Enum): HARASSMENT = "harassment" HATE_SPEECH = "hate_speech" SEXUAL_CONTENT = "sexual_content" VIOLENCE = "violence" SPAM = "spam" SELF_HARM = "self_harm" OTHER = "other" class ReportStatus(str, enum.Enum): OPEN = "open" IN_REVIEW = "in_review" RESOLVED = "resolved" DISMISSED = "dismissed" class Resolution(str, enum.Enum): ACTION_TAKEN = "action_taken" NO_ACTION = "no_action" FALSE_POSITIVE = "false_positive" class Report(Base): __tablename__ = "reports" id = Column(Integer, primary_key=True, autoincrement=True) reporter_id = Column(Integer, ForeignKey("users.id"), nullable=False) target_type = Column( ENUM(ReportTargetType, name="report_target_type", create_type=False), nullable=False, ) target_id = Column(String(64), nullable=False) reason_category = Column( ENUM(ReasonCategory, name="reason_category", create_type=False), nullable=False, ) details = Column(Text, nullable=True) status = Column( ENUM(ReportStatus, name="report_status", create_type=False), default=ReportStatus.OPEN, ) resolved_by = Column(Integer, ForeignKey("users.id"), nullable=True) resolution = Column( ENUM(Resolution, name="resolution", create_type=False), nullable=True, ) resolved_at = Column(DateTime(timezone=True), nullable=True) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) # Relationships reporter = relationship("User", foreign_keys=[reporter_id]) resolved_by_user = relationship("User", foreign_keys=[resolved_by]) __table_args__ = ( UniqueConstraint("reporter_id", "target_type", "target_id", name="uq_reporter_target"), )