51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
import uuid
|
|
|
|
import bcrypt
|
|
from sqlalchemy import Column, ForeignKey, String, func
|
|
from sqlalchemy.orm import relationship, validates
|
|
from sqlalchemy.sql.expression import select
|
|
from sqlalchemy.sql.sqltypes import UUID, BigInteger, Enum, DateTime
|
|
|
|
from helpers.admin.enums import AccessLevel
|
|
from .base import Base
|
|
from ..types.fields import Password
|
|
|
|
|
|
class User(Base):
|
|
__tablename__ = "users"
|
|
|
|
id = Column(BigInteger, primary_key=True, index=True, unique=True, nullable=False)
|
|
username = Column(String(50), nullable=False, unique=True)
|
|
password = Column(Password(length=156), nullable=False)
|
|
access_level = Column(Enum(AccessLevel))
|
|
|
|
sessions = relationship("UserSession", back_populates="user")
|
|
|
|
@validates("password")
|
|
def _validate_password(self, key, password):
|
|
return getattr(type(self), key).type.validator(password)
|
|
|
|
def verify_password(self, password):
|
|
return bcrypt.checkpw(password.encode(), self.password.hash.encode())
|
|
|
|
|
|
class UserSession(Base):
|
|
__tablename__ = "user_sessions"
|
|
|
|
token = Column(
|
|
UUID(as_uuid=True),
|
|
default=uuid.uuid4,
|
|
nullable=False,
|
|
index=True,
|
|
primary_key=True,
|
|
)
|
|
user_id = Column(BigInteger, ForeignKey("users.id"), index=True, nullable=False)
|
|
|
|
user = relationship("User", back_populates="sessions")
|
|
created_at = Column(DateTime, default=func.now(), nullable=False)
|
|
|
|
@classmethod
|
|
def _filter_session_by_user_id(cls, user_id: int):
|
|
query = select(cls).where(cls.user_id == user_id)
|
|
return query
|