feat: add user endpoints
This commit is contained in:
@@ -45,6 +45,16 @@ class UserRepository(IUserRepository):
|
||||
provisioned_by=user.provisioned_by,
|
||||
provisioned_at=user.provisioned_at,
|
||||
)
|
||||
|
||||
async def get_by_id(self, user_id: str) -> UserEntity:
|
||||
try:
|
||||
user = await self._get_user(user_id)
|
||||
return self._to_entity(user)
|
||||
except ApplicationException:
|
||||
raise
|
||||
except SQLAlchemyError as exception:
|
||||
self._logger.exception(str(exception))
|
||||
raise InternalServerException(message=f'Database error: {str(exception)}')
|
||||
|
||||
async def create_legal_entity_user(
|
||||
self,
|
||||
@@ -104,9 +114,8 @@ class UserRepository(IUserRepository):
|
||||
self._logger.exception(str(exception))
|
||||
raise InternalServerException(message=f'Database error: {str(exception)}')
|
||||
|
||||
async def set_password(self, user_email: str, password_hash: str) -> UserEntity:
|
||||
user = await self.get_user_by_email(user_email)
|
||||
return await self._update_field(user.id, password_hash=password_hash)
|
||||
async def set_password(self, user_id: str, password_hash: str) -> UserEntity:
|
||||
return await self._update_field(user_id, password_hash=password_hash)
|
||||
|
||||
async def get_user_by_email(self, email: str) -> UserEntity:
|
||||
try:
|
||||
@@ -126,6 +135,41 @@ class UserRepository(IUserRepository):
|
||||
stmt = select(UserModel.id).where(UserModel.email == email, UserModel.is_deleted.is_(False)).limit(1)
|
||||
result = await self._session.execute(stmt)
|
||||
return result.scalar_one_or_none() is not None
|
||||
|
||||
def _search_filter(self, search: str | None):
|
||||
if not search or not search.strip():
|
||||
return None
|
||||
|
||||
pattern = f'%{search.strip()}%'
|
||||
return or_(
|
||||
UserModel.id.ilike(pattern),
|
||||
UserModel.email.ilike(pattern),
|
||||
UserModel.last_name.ilike(pattern),
|
||||
UserModel.first_name.ilike(pattern),
|
||||
UserModel.middle_name.ilike(pattern),
|
||||
UserModel.phone.ilike(pattern),
|
||||
UserModel.inn.ilike(pattern),
|
||||
)
|
||||
|
||||
async def list_all(
|
||||
self,
|
||||
*,
|
||||
limit: int,
|
||||
offset: int,
|
||||
search: str | None = None,
|
||||
) -> list[UserEntity]:
|
||||
stmt = (
|
||||
select(UserModel)
|
||||
.where(UserModel.is_deleted.is_(False))
|
||||
.order_by(UserModel.created_at.desc())
|
||||
.limit(limit)
|
||||
.offset(offset)
|
||||
)
|
||||
search_filter = self._search_filter(search)
|
||||
if search_filter is not None:
|
||||
stmt = stmt.where(search_filter)
|
||||
res = await self._session.execute(stmt)
|
||||
return [self._to_entity(m) for m in res.scalars().all()]
|
||||
|
||||
def _individual_search_filter(self, query: str):
|
||||
pattern = f'%{query.strip()}%'
|
||||
@@ -192,3 +236,14 @@ class UserRepository(IUserRepository):
|
||||
)
|
||||
result = await self._session.execute(stmt)
|
||||
return int(result.scalar_one())
|
||||
|
||||
async def count_all(self, *, search: str | None = None) -> int:
|
||||
stmt = (
|
||||
select(func.count(UserModel.id))
|
||||
.where(UserModel.is_deleted.is_(False))
|
||||
)
|
||||
search_filter = self._search_filter(search)
|
||||
if search_filter is not None:
|
||||
stmt = stmt.where(search_filter)
|
||||
res = await self._session.execute(stmt)
|
||||
return int(res.scalar_one())
|
||||
|
||||
Reference in New Issue
Block a user