""" Modelos ORM para gestión de tenants """ import enum from typing import TYPE_CHECKING, List from api.v1.common.base_models import TimestampMixin from core.database import Base from sqlalchemy import Boolean, Column from sqlalchemy import Enum as SQLEnum from sqlalchemy import Integer, String, Text from sqlalchemy.orm import Mapped, relationship if TYPE_CHECKING: from api.v1.modules.a76.user_tenant.models import UserTenant class TenantType(enum.Enum): """Tipo de tenant según tamaño y necesidades""" SHARED = "shared" # BD compartida DEDICATED = "dedicated" # BD dedicada class Tenant(Base, TimestampMixin): """ Modelo de Tenant - Cliente/Organización en el sistema Cada tenant puede tener BD compartida o dedicada """ __tablename__ = "tenants" __table_args__ = {"schema": "a76", "extend_existing": True} id = Column(Integer, primary_key=True, index=True) name = Column(String(255), nullable=False, index=True) slug = Column(String(100), unique=True, nullable=False, index=True) # Tipo de tenant (compartido o dedicado) type = Column(SQLEnum(TenantType), default=TenantType.SHARED, nullable=False) # Keycloak realm asociado keycloak_realm = Column(String(255), nullable=False) # Configuración de BD dedicada (JSON string o NULL si usa BD compartida) db_config = Column(Text, nullable=True) # JSON: {host, port, name, user, password} # Información de contacto contact_name = Column(String(255)) contact_email = Column(String(255)) contact_phone = Column(String(50)) # Estado is_active = Column(Boolean, default=True, nullable=False) # Relación con UserTenant user_relations: Mapped[List["UserTenant"]] = relationship( "UserTenant", back_populates="tenant" ) def __repr__(self): return f""