from __future__ import annotations from typing import TYPE_CHECKING from sqlalchemy import ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column, relationship from ..core.database import Base if TYPE_CHECKING: from .menu import Menu from .user import User class Role(Base): __tablename__ = "roles" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) code: Mapped[str] = mapped_column(String(64), unique=True, index=True) name: Mapped[str] = mapped_column(String(128)) users: Mapped[list[User]] = relationship( "User", secondary="user_roles", back_populates="roles", lazy="selectin", ) permissions: Mapped[list[Permission]] = relationship( "Permission", secondary="role_permissions", back_populates="roles", lazy="selectin", ) menus: Mapped[list[Menu]] = relationship( "Menu", secondary="role_menus", back_populates="roles", lazy="selectin", ) class Permission(Base): __tablename__ = "permissions" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) code: Mapped[str] = mapped_column(String(64), unique=True, index=True) name: Mapped[str] = mapped_column(String(128)) roles: Mapped[list[Role]] = relationship( "Role", secondary="role_permissions", back_populates="permissions", lazy="selectin", ) class UserRole(Base): __tablename__ = "user_roles" user_id: Mapped[str] = mapped_column( String(36), ForeignKey("users.user_id", ondelete="CASCADE"), primary_key=True, ) role_id: Mapped[int] = mapped_column( ForeignKey("roles.id", ondelete="CASCADE"), primary_key=True, ) class RolePermission(Base): __tablename__ = "role_permissions" role_id: Mapped[int] = mapped_column( ForeignKey("roles.id", ondelete="CASCADE"), primary_key=True, ) permission_id: Mapped[int] = mapped_column( ForeignKey("permissions.id", ondelete="CASCADE"), primary_key=True, )