from sqlalchemy import Column, Integer, String, Float, DateTime, Text, JSON, ForeignKey, Boolean from sqlalchemy.sql import func from database import Base class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) username = Column(String, unique=True, nullable=False, index=True) password_hash = Column(String, nullable=False) role = Column(String, default="viewer", nullable=False) # admin | viewer created_at = Column(DateTime(timezone=True), server_default=func.now()) class Computer(Base): __tablename__ = "computers" id = Column(Integer, primary_key=True, index=True) hostname = Column(String, nullable=False, index=True) os_info = Column(String, nullable=True) first_seen = Column(DateTime(timezone=True), server_default=func.now()) last_seen = Column(DateTime(timezone=True), nullable=True) status = Column(String, default="offline", nullable=False) current_user = Column(String, nullable=True) current_ip = Column(String, nullable=True) current_uptime_sec = Column(Integer, nullable=True) current_cpu_percent = Column(Float, nullable=True) current_ram_percent = Column(Float, nullable=True) current_ram_total_gb = Column(Float, nullable=True) class Heartbeat(Base): __tablename__ = "heartbeats" id = Column(Integer, primary_key=True, index=True) computer_id = Column(Integer, ForeignKey("computers.id", ondelete="CASCADE"), nullable=False, index=True) timestamp = Column(DateTime(timezone=True), server_default=func.now(), index=True) username = Column(String, nullable=True) local_ip = Column(String, nullable=True) public_ip = Column(String, nullable=True) uptime_sec = Column(Integer, nullable=True) cpu_percent = Column(Float, nullable=True) ram_percent = Column(Float, nullable=True) ram_total_gb = Column(Float, nullable=True) disk_info = Column(JSON, nullable=True) cpu_temp = Column(Float, nullable=True) load_avg = Column(String, nullable=True) processes = Column(JSON, nullable=True) class AuditLog(Base): __tablename__ = "audit_log" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id", ondelete="SET NULL"), nullable=True) username = Column(String, nullable=True) action = Column(String, nullable=False) details = Column(Text, nullable=True) timestamp = Column(DateTime(timezone=True), server_default=func.now()) class Notification(Base): __tablename__ = "notifications" id = Column(Integer, primary_key=True, index=True) computer_id = Column(Integer, ForeignKey("computers.id", ondelete="CASCADE"), nullable=True, index=True) type = Column(String, default="offline", nullable=False) # offline | alert | info title = Column(String, nullable=False) message = Column(Text, nullable=False) is_read = Column(Boolean, default=False, nullable=False) sent_at = Column(DateTime(timezone=True), server_default=func.now()) read_at = Column(DateTime(timezone=True), nullable=True) class Setting(Base): __tablename__ = "settings" id = Column(Integer, primary_key=True, index=True) key = Column(String, unique=True, nullable=False, index=True) value = Column(Text, nullable=True) updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())