2025-12-04 10:04:21 +08:00

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,
)