from datetime import datetime from app.core.utils import now_tw from sqlalchemy import Boolean, Column, Integer, String, Text, DateTime, Float, ForeignKey from sqlalchemy.orm import relationship from app.core.database import Base class Server(Base): __tablename__ = "servers" id = Column(Integer, primary_key=True, index=True, autoincrement=True) name = Column(String(100), nullable=False) ip_address = Column(String(50), unique=True, nullable=False) description = Column(String(200)) sort_order = Column(Integer, nullable=False, default=0) is_active = Column(Boolean, nullable=False, default=True) recorded_at = Column(DateTime, nullable=False, default=now_tw) status_logs = relationship("ServerStatusLog", back_populates="server") class ServerStatusLog(Base): __tablename__ = "server_status_logs" id = Column(Integer, primary_key=True, index=True, autoincrement=True) schedule_log_id = Column(Integer, ForeignKey("schedule_logs.id"), nullable=False, index=True) server_id = Column(Integer, ForeignKey("servers.id"), nullable=False, index=True) result = Column(Boolean, nullable=False) response_time = Column(Float) # ms fail_reason = Column(Text) recorded_at = Column(DateTime, nullable=False, default=now_tw) schedule_log = relationship("ScheduleLog", back_populates="server_status_logs") server = relationship("Server", back_populates="status_logs") class SystemStatusLog(Base): __tablename__ = "system_status_logs" id = Column(Integer, primary_key=True, index=True, autoincrement=True) schedule_log_id = Column(Integer, ForeignKey("schedule_logs.id"), nullable=False, index=True) environment = Column(String(10), nullable=False) # test / prod service_name = Column(String(50), nullable=False) # traefik / keycloak / mail / db service_desc = Column(String(100)) result = Column(Boolean, nullable=False) fail_reason = Column(Text) recorded_at = Column(DateTime, nullable=False, default=now_tw) schedule_log = relationship("ScheduleLog", back_populates="system_status_logs")