from sqlalchemy import Boolean, Column, DateTime, ForeignKey, String, Text, text from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from sqlalchemy.sql import func from backend.app.db.base import Base class Role(Base): __tablename__ = "roles" id = Column(UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()")) name = Column(String, unique=True, nullable=False) external_role_id = Column(String, unique=True) description = Column(Text) is_system = Column(Boolean, nullable=False, server_default="true") created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False) permissions = relationship("RolePermission", back_populates="role", cascade="all, delete-orphan") class Permission(Base): __tablename__ = "permissions" code = Column(String, primary_key=True) name = Column(String, nullable=False) module = Column(String, nullable=False) created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) roles = relationship("RolePermission", back_populates="permission", cascade="all, delete-orphan") class RolePermission(Base): __tablename__ = "role_permissions" role_id = Column(UUID(as_uuid=True), ForeignKey("roles.id", ondelete="CASCADE"), primary_key=True) permission_code = Column(String, ForeignKey("permissions.code", ondelete="CASCADE"), primary_key=True) role = relationship("Role", back_populates="permissions") permission = relationship("Permission", back_populates="roles")