from sqlalchemy import Boolean, Column, Integer, String, DateTime, Text, JSON, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.sql import func from app.database import Base class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) username = Column(String(50), unique=True, index=True, nullable=False) email = Column(String(100), unique=True, index=True, nullable=False) hashed_password = Column(String(255), nullable=False) full_name = Column(String(100)) is_active = Column(Boolean, default=True) is_superuser = Column(Boolean, default=False) is_verified = Column(Boolean, default=False) # تنظیمات کاربر risk_tolerance = Column(String(20), default="medium") # low, medium, high, extreme require_confirmation = Column(Boolean, default=True) max_concurrent_tasks = Column(Integer, default=3) # اطلاعات امنیتی login_attempts = Column(Integer, default=0) last_login = Column(DateTime(timezone=True)) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) # روابط sessions = relationship("UserSession", back_populates="user", cascade="all, delete-orphan") tasks = relationship("Task", back_populates="user", cascade="all, delete-orphan") logs = relationship("AuditLog", back_populates="user", cascade="all, delete-orphan") class UserSession(Base): __tablename__ = "user_sessions" id = Column(String(100), primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE")) access_token = Column(String(500)) refresh_token = Column(String(500)) ip_address = Column(String(45)) user_agent = Column(Text) is_active = Column(Boolean, default=True) created_at = Column(DateTime(timezone=True), server_default=func.now()) expires_at = Column(DateTime(timezone=True)) user = relationship("User", back_populates="sessions") class Task(Base): __tablename__ = "tasks" id = Column(String(50), primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE")) title = Column(String(200), nullable=False) description = Column(Text) goal = Column(Text, nullable=False) # وضعیت status = Column(String(20), default="pending") # pending, analyzing, executing, completed, failed, cancelled progress = Column(Integer, default=0) # 0-100 risk_level = Column(String(20)) # low, medium, high, extreme # نتیجه result_data = Column(JSON) error_message = Column(Text) execution_time = Column(Integer) # در ثانیه # زمان‌ها created_at = Column(DateTime(timezone=True), server_default=func.now()) started_at = Column(DateTime(timezone=True)) completed_at = Column(DateTime(timezone=True)) # روابط user = relationship("User", back_populates="tasks") actions = relationship("Action", back_populates="task", cascade="all, delete-orphan") class Action(Base): __tablename__ = "actions" id = Column(Integer, primary_key=True, index=True) task_id = Column(String(50), ForeignKey("tasks.id", ondelete="CASCADE")) action_type = Column(String(50), nullable=False) # typing, mouse, click, screenshot, etc. description = Column(Text, nullable=False) # پارامترها parameters = Column(JSON) risk_assessment = Column(JSON) # وضعیت status = Column(String(20), default="pending") result = Column(JSON) requires_confirmation = Column(Boolean, default=False) confirmed = Column(Boolean, default=False) # زمان‌ها created_at = Column(DateTime(timezone=True), server_default=func.now()) executed_at = Column(DateTime(timezone=True)) # روابط task = relationship("Task", back_populates="actions") class AuditLog(Base): __tablename__ = "audit_logs" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE")) event_type = Column(String(50), nullable=False) # login, logout, task_create, action_execute, etc. event_details = Column(JSON) ip_address = Column(String(45)) user_agent = Column(Text) severity = Column(String(20), default="info") # info, warning, error, critical created_at = Column(DateTime(timezone=True), server_default=func.now()) user = relationship("User", back_populates="logs") class SystemConfig(Base): __tablename__ = "system_configs" id = Column(Integer, primary_key=True, index=True) key = Column(String(100), unique=True, nullable=False) value = Column(JSON) description = Column(Text) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now())