75 lines
2.2 KiB
Python
75 lines
2.2 KiB
Python
from typing import Optional, Union
|
|
|
|
from asyncpg import Connection
|
|
|
|
from app.db.queries.queries import queries
|
|
from app.db.repositories.base import BaseRepository
|
|
from app.db.repositories.users import UsersRepository
|
|
from app.models.domain.profiles import Profile
|
|
from app.models.domain.users import User
|
|
|
|
UserLike = Union[User, Profile]
|
|
|
|
|
|
class ProfilesRepository(BaseRepository):
|
|
def __init__(self, conn: Connection):
|
|
super().__init__(conn)
|
|
self._users_repo = UsersRepository(conn)
|
|
|
|
async def get_profile_by_username(
|
|
self,
|
|
*,
|
|
username: str,
|
|
requested_user: Optional[UserLike],
|
|
) -> Profile:
|
|
user = await self._users_repo.get_user_by_username(username=username)
|
|
|
|
profile = Profile(username=user.username, bio=user.bio, image=user.image)
|
|
if requested_user:
|
|
profile.following = await self.is_user_following_for_another_user(
|
|
target_user=user,
|
|
requested_user=requested_user,
|
|
)
|
|
|
|
return profile
|
|
|
|
async def is_user_following_for_another_user(
|
|
self,
|
|
*,
|
|
target_user: UserLike,
|
|
requested_user: UserLike,
|
|
) -> bool:
|
|
return (
|
|
await queries.is_user_following_for_another(
|
|
self.connection,
|
|
follower_username=requested_user.username,
|
|
following_username=target_user.username,
|
|
)
|
|
)["is_following"]
|
|
|
|
async def add_user_into_followers(
|
|
self,
|
|
*,
|
|
target_user: UserLike,
|
|
requested_user: UserLike,
|
|
) -> None:
|
|
async with self.connection.transaction():
|
|
await queries.subscribe_user_to_another(
|
|
self.connection,
|
|
follower_username=requested_user.username,
|
|
following_username=target_user.username,
|
|
)
|
|
|
|
async def remove_user_from_followers(
|
|
self,
|
|
*,
|
|
target_user: UserLike,
|
|
requested_user: UserLike,
|
|
) -> None:
|
|
async with self.connection.transaction():
|
|
await queries.unsubscribe_user_from_another(
|
|
self.connection,
|
|
follower_username=requested_user.username,
|
|
following_username=target_user.username,
|
|
)
|