79 lines
1.9 KiB
Python
79 lines
1.9 KiB
Python
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"<Admin(id={self.id}, username='{self.username}', is_active={self.is_active})>"
|