fix: clear unread notification cache after inserting new notifications in comments, follows, messages, votes, and mentions

This commit is contained in:
2026-05-16 00:49:53 +00:00
parent 85acc0f481
commit 9e2bfd271b
8 changed files with 252 additions and 2 deletions
+3
View File
@@ -4,6 +4,7 @@ from fastapi import APIRouter, Request
from fastapi.responses import RedirectResponse
from devplacepy.database import get_table, resolve_by_slug
from devplacepy.attachments import link_attachments, delete_target_attachments
from devplacepy.templating import clear_unread_cache
from devplacepy.utils import generate_uid, require_user, create_mention_notifications
logger = logging.getLogger(__name__)
@@ -91,6 +92,7 @@ async def create_comment(request: Request):
"read": False,
"created_at": datetime.now(timezone.utc).isoformat(),
})
clear_unread_cache(parent["user_uid"])
else:
posts = get_table("posts")
post = posts.find_one(uid=target_uid)
@@ -107,6 +109,7 @@ async def create_comment(request: Request):
"read": False,
"created_at": datetime.now(timezone.utc).isoformat(),
})
clear_unread_cache(post["user_uid"])
create_mention_notifications(content, user["uid"], redirect_url)
logger.info(f"Comment by {user['username']} on {target_type} {target_uid}")
+2
View File
@@ -3,6 +3,7 @@ from datetime import datetime, timezone
from fastapi import APIRouter, Request
from fastapi.responses import RedirectResponse
from devplacepy.database import get_table
from devplacepy.templating import clear_unread_cache
from devplacepy.utils import generate_uid, require_user
logger = logging.getLogger(__name__)
@@ -39,6 +40,7 @@ async def follow_user(request: Request, username: str):
"read": False,
"created_at": datetime.now(timezone.utc).isoformat(),
})
clear_unread_cache(target["uid"])
logger.info(f"{user['username']} followed {username}")
return RedirectResponse(url=f"/profile/{username}", status_code=302)
+2 -1
View File
@@ -4,7 +4,7 @@ from fastapi import APIRouter, Request
from fastapi.responses import HTMLResponse, RedirectResponse, JSONResponse
from devplacepy.database import get_table, db
from devplacepy.attachments import get_attachments_batch
from devplacepy.templating import templates
from devplacepy.templating import templates, clear_unread_cache
from devplacepy.utils import generate_uid, require_user, time_ago, create_mention_notifications
from devplacepy.seo import base_seo_context
@@ -179,6 +179,7 @@ async def send_message(request: Request):
"read": False,
"created_at": datetime.now(timezone.utc).isoformat(),
})
clear_unread_cache(receiver_uid)
create_mention_notifications(content, user["uid"], f"/messages?with_uid={receiver_uid}")
+1
View File
@@ -183,5 +183,6 @@ async def create_project(request: Request):
if attachment_uids:
link_attachments(attachment_uids, "project", uid)
create_mention_notifications(description, user["uid"], f"/projects/{project_slug}")
logger.info(f"Project {uid} created by {user['username']}")
return RedirectResponse(url=f"/projects/{project_slug}", status_code=302)
+2
View File
@@ -3,6 +3,7 @@ from datetime import datetime, timezone
from fastapi import APIRouter, Request
from fastapi.responses import RedirectResponse
from devplacepy.database import get_table
from devplacepy.templating import clear_unread_cache
from devplacepy.utils import generate_uid, require_user
logger = logging.getLogger(__name__)
@@ -79,6 +80,7 @@ async def vote(request: Request, target_type: str, target_uid: str):
"read": False,
"created_at": datetime.now(timezone.utc).isoformat(),
})
clear_unread_cache(target_owner_uid)
referer = request.headers.get("Referer", "/feed")
return RedirectResponse(url=referer, status_code=302)
+4
View File
@@ -16,6 +16,10 @@ templates = Jinja2Templates(directory=str(TEMPLATES_DIR))
_unread_cache = {}
_UNREAD_CACHE_TTL = 60
def clear_unread_cache(user_uid: str) -> None:
_unread_cache.pop(user_uid, None)
def jinja_unread_count(user_uid: str) -> int:
cached = _unread_cache.get(user_uid)
if cached:
+2
View File
@@ -134,6 +134,7 @@ def create_mention_notifications(content: str, actor_uid: str, target_url: str)
usernames = extract_mentions(content)
if not usernames:
return
from devplacepy.templating import clear_unread_cache
users = get_table("users")
notifs = get_table("notifications")
seen = set()
@@ -153,6 +154,7 @@ def create_mention_notifications(content: str, actor_uid: str, target_url: str)
"read": False,
"created_at": datetime.now(timezone.utc).isoformat(),
})
clear_unread_cache(mentioned["uid"])
def format_date(dt_str: str, include_time: bool = False) -> str: