from enum import Enum from sqlalchemy import String, Boolean, Integer, ForeignKey, Enum as SAEnum, Text from sqlalchemy.orm import Mapped, mapped_column, relationship from app.core.db import Base class RouterMethod(str, Enum): AUTO = "auto" REST = "rest" SSH = "ssh" API = "api" class Router(Base): __tablename__ = "routers" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) name: Mapped[str] = mapped_column(String(200), unique=True, index=True) host: Mapped[str] = mapped_column(String(255)) port_rest: Mapped[int] = mapped_column(Integer, default=443) port_ssh: Mapped[int] = mapped_column(Integer, default=22) port_api: Mapped[int] = mapped_column(Integer, default=8728) verify_ssl: Mapped[bool] = mapped_column(Boolean, default=False) preferred_method: Mapped[RouterMethod] = mapped_column(SAEnum(RouterMethod), default=RouterMethod.AUTO) tags: Mapped[str] = mapped_column(Text, default="") class CredentialMethod(str, Enum): REST = "rest" SSH = "ssh" API = "api" class RouterCredential(Base): __tablename__ = "router_credentials" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) router_id: Mapped[int] = mapped_column(ForeignKey("routers.id", ondelete="CASCADE"), index=True) method: Mapped[CredentialMethod] = mapped_column(SAEnum(CredentialMethod)) username: Mapped[str] = mapped_column(String(255)) secret_encrypted: Mapped[str] = mapped_column(Text) extra_json: Mapped[str] = mapped_column(Text, default="{}") router = relationship("Router")