75 lines
2.2 KiB
Python
Raw Permalink Normal View History

2025-12-04 10:04:21 +08:00
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,
)