from datetime import datetime from typing import Optional from sqlalchemy import BigInteger, Boolean, DateTime, Index, String, func from sqlalchemy.orm import Mapped, mapped_column from app.database.session import Base class Admin(Base): __tablename__ = "admin" __table_args__ = ( Index("idx_admin_username", "username", unique=True), Index("idx_admin_is_active", "is_active"), { "mysql_engine": "InnoDB", "mysql_charset": "utf8mb4", "mysql_collate": "utf8mb4_unicode_ci", }, ) id: Mapped[int] = mapped_column( BigInteger, primary_key=True, nullable=False, autoincrement=True, comment="고유 식별자", ) username: Mapped[str] = mapped_column( String(50), nullable=False, unique=True, comment="로그인 ID", ) password: Mapped[str] = mapped_column( String(255), nullable=False, comment="비밀번호", ) name: Mapped[Optional[str]] = mapped_column( String(50), nullable=True, comment="표시 이름", ) is_active: Mapped[bool] = mapped_column( Boolean, nullable=False, default=True, comment="활성화 상태 (비활성화 시 로그인 차단)", ) last_login_at: Mapped[Optional[datetime]] = mapped_column( DateTime, nullable=True, comment="마지막 로그인 일시", ) created_at: Mapped[datetime] = mapped_column( DateTime, nullable=False, server_default=func.now(), comment="생성 일시", ) updated_at: Mapped[datetime] = mapped_column( DateTime, nullable=False, server_default=func.now(), onupdate=func.now(), comment="수정 일시", ) def __repr__(self) -> str: return f""