"""Moderation action model.""" from datetime import datetime from enum import Enum as PyEnum from typing import Optional from sqlalchemy import ( Column, Enum, ForeignKey, Integer, String, Text, DateTime, func, ) from sqlalchemy.dialects.postgresql import TIMESTAMPTZ from sqlalchemy.orm import relationship from app.database import Base class TargetType(str, PyEnum): """Type of entity being reported or moderated.""" USER = "user" WORLD = "world" ASSET = "asset" CHAT_MESSAGE = "chat_message" class ReasonCategory(str, PyEnum): """Category of report reason.""" HARASSMENT = "harassment" HATE_SPEECH = "hate_speech" SEXUAL_CONTENT = "sexual_content" VIOLENCE = "violence" SPAM = "spam" SELF_HARM = "self_harm" OTHER = "other" class ReportStatus(str, PyEnum): """Status of a report.""" OPEN = "open" IN_REVIEW = "in_review" RESOLVED = "resolved" DISMISSED = "dismissed" class Resolution(str, PyEnum): """Resolution outcome of a report.""" ACTION_TAKEN = "action_taken" NO_ACTION = "no_action" class ModerationActionType(str, PyEnum): """Type of moderation action.""" WARN = "warn" SUSPEND = "suspend" BAN = "ban" RESTRICT = "restrict" REMOVE = "remove" RESTORE = "restore" class ModerationAction(Base): __tablename__ = "moderation_actions" id = Column(Integer, primary_key=True, index=True) moderator_id = Column( Integer, ForeignKey("users.id", ondelete="SET NULL"), nullable=True, ) target_user_id = Column( Integer, ForeignKey("users.id", ondelete="SET NULL"), nullable=True, ) target_type = Column( Enum(TargetType, name="target_type_enum", create_type=False), nullable=False, ) target_id = Column(String(64), nullable=False) action = Column( Enum(ModerationActionType, name="moderation_action_type_enum", create_type=False), nullable=False, ) reason = Column(Text, nullable=True) report_id = Column( Integer, ForeignKey("reports.id", ondelete="SET NULL"), nullable=True, ) expires_at = Column(TIMESTAMPTZ, nullable=True) revoked_at = Column(TIMESTAMPTZ, nullable=True) created_at = Column( DateTime(timezone=True), server_default=func.now(), ) # Relationships moderator = relationship( "User", foreign_keys=[moderator_id], back_populates="moderation_actions_given", ) target_user = relationship( "User", foreign_keys=[target_user_id], back_populates="moderation_actions_received", ) report = relationship("Report", back_populates="moderation_actions")