# retoor <retoor@molodetz.nl>
from typing import Optional
from devplacepy.database import get_table, get_users_by_uids
from devplacepy.services.devrant.ids import to_unix, now_unix
DEVRANT_TYPE_MAP = {
"comment": "comment_discuss",
"reply": "comment_discuss",
"mention": "comment_mention",
"vote": "rant_vote",
"follow": "rant_sub",
}
UNREAD_BUCKET = {
"rant_vote": "upvotes",
"comment_mention": "mentions",
"comment_discuss": "comments",
"rant_sub": "subs",
}
FEED_LIMIT = 50
def build_notif_feed(user: dict) -> dict:
notifications = list(
get_table("notifications").find(
user_uid=user["uid"], order_by=["-created_at"], _limit=FEED_LIMIT
)
)
actor_uids = list(
{note.get("related_uid") for note in notifications if note.get("related_uid")}
)
actors = get_users_by_uids(actor_uids)
username_map: dict = {}
items = []
unread = {
"all": 0,
"upvotes": 0,
"mentions": 0,
"comments": 0,
"subs": 0,
"total": 0,
}
for note in notifications:
dr_type = DEVRANT_TYPE_MAP.get(note.get("type"))
if not dr_type:
continue
actor = actors.get(note.get("related_uid")) or {}
actor_id = int(actor.get("id") or 0)
if actor_id:
username_map[str(actor_id)] = actor.get("username") or ""
is_read = 1 if note.get("read") else 0
items.append(
{
"type": dr_type,
"rant_id": 0,
"comment_id": 0,
"created_time": to_unix(note.get("created_at")),
"read": is_read,
"uid": actor_id,
"username": actor.get("username") or "",
}
)
if not is_read:
bucket = UNREAD_BUCKET.get(dr_type)
if bucket:
unread[bucket] += 1
unread["all"] += 1
unread["total"] += 1
return {
"items": items,
"check_time": now_unix(),
"username_map": username_map,
"unread": unread,
"num_unread": unread["total"],
}
def clear_notifications(user: dict) -> None:
notifications = get_table("notifications")
for note in notifications.find(user_uid=user["uid"], read=False):
notifications.update({"id": note["id"], "read": True}, ["id"])