diff --git a/backend/app/models/report.py b/backend/app/models/report.py new file mode 100644 index 0000000..eadc6be --- /dev/null +++ b/backend/app/models/report.py @@ -0,0 +1,88 @@ +"""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"), + )