# retoor from .core import _in_clause, db, get_table from .users import get_users_by_uids from .pagination import build_pagination def get_follow_counts(user_uid: str) -> dict: if "follows" not in db.tables: return {"followers": 0, "following": 0} follows = get_table("follows") return { "followers": follows.count(following_uid=user_uid, deleted_at=None), "following": follows.count(follower_uid=user_uid, deleted_at=None), } def get_follow_list( user_uid: str, mode: str, page: int = 1, per_page: int = 25 ) -> tuple: if "follows" not in db.tables: return [], build_pagination(page, 0, per_page) follows = get_table("follows") key = "following_uid" if mode == "followers" else "follower_uid" other = "follower_uid" if mode == "followers" else "following_uid" total = follows.count(deleted_at=None, **{key: user_uid}) pagination = build_pagination(page, total, per_page) offset = (pagination["page"] - 1) * pagination["per_page"] rows = list( follows.find( order_by=["-created_at"], _limit=pagination["per_page"], _offset=offset, deleted_at=None, **{key: user_uid}, ) ) users_map = get_users_by_uids([row[other] for row in rows]) people = [] for row in rows: person = users_map.get(row[other]) if person: people.append( { "uid": person["uid"], "username": person["username"], "bio": (person.get("bio") or "")[:140], "last_seen": person.get("last_seen"), "followed_at": row.get("created_at"), } ) return people, pagination def get_following_among(follower_uid: str, target_uids: list) -> set: if not follower_uid or not target_uids or "follows" not in db.tables: return set() placeholders, params = _in_clause(target_uids) params["f"] = follower_uid rows = db.query( f"SELECT following_uid FROM follows WHERE follower_uid = :f AND following_uid IN ({placeholders}) AND deleted_at IS NULL", **params, ) return {row["following_uid"] for row in rows}