From a865abcdb3476da485951eb84713db4fca4ee399 Mon Sep 17 00:00:00 2001 From: Jakub Miazek Date: Sat, 22 Jul 2023 14:24:06 +0200 Subject: [PATCH] add user model --- app/models/user.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 app/models/user.py diff --git a/app/models/user.py b/app/models/user.py new file mode 100644 index 0000000..de006b3 --- /dev/null +++ b/app/models/user.py @@ -0,0 +1,50 @@ +import uuid +from typing import Any + +from cryptography.fernet import Fernet +from sqlalchemy import Column, String, LargeBinary, select +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.ext.asyncio import AsyncSession + +from app import config +from app.models.base import Base + +global_settings = config.get_settings() + +cipher_suite = Fernet(global_settings.secret_key) + + +class User(Base): # type: ignore + uuid = Column( + UUID(as_uuid=True), + unique=True, + default=uuid.uuid4, + primary_key=True, + ) + email = Column(String, nullable=False) + first_name = Column(String, nullable=False) + last_name = Column(String, nullable=False) + _password = Column("password", LargeBinary, nullable=False) + + def __init__(self, email: str, first_name: str, last_name: str, password: str = None): + self.email = email + self.first_name = first_name + self.last_name = last_name + self.password = password + + @property + def password(self): + return cipher_suite.decrypt(self._password).decode() + + @password.setter + def password(self, password: str): + self._password = cipher_suite.encrypt(password.encode()) + + def check_password(self, password: str): + return self.password == password + + @classmethod + async def find(cls, database_session: AsyncSession, where_conditions: list[Any]): + _stmt = select(cls).where(*where_conditions) + _result = await database_session.execute(_stmt) + return _result.scalars().first()