feat(api): add cache + busting for admin

This commit is contained in:
2026-05-10 04:00:53 +02:00
parent 2264401a91
commit 5aeff9c218
11 changed files with 175 additions and 8 deletions
+25 -2
View File
@@ -1,5 +1,6 @@
from django.http import HttpRequest
from django.core.files.base import ContentFile
from django.core.cache import cache
from django.db.models import (
F,
Case,
@@ -32,6 +33,11 @@ def get_my_objectives(request: HttpRequest):
@router.get("results", response=ResultsOut)
def get_results(request: HttpRequest):
cache_key = f"api:noita:results:{request.user.id}"
cached_data = cache.get(cache_key)
if cached_data is not None:
return cached_data
"""
Get the user's score based on their objectives.
@@ -92,11 +98,14 @@ def get_results(request: HttpRequest):
for obj in user_objectives.order_by("-total_points")
]
return {
data = {
"total_score": total_score,
"objectives": objectives_with_points,
}
cache.set(f"api:noita:results:{request.user.id}", data, 300)
return data
@router.get("leaderboard", response=LeaderboardOut)
def get_leaderboard(request: HttpRequest):
@@ -105,6 +114,12 @@ def get_leaderboard(request: HttpRequest):
Uses Window functions to rank users by their total score in descending order.
"""
cache_key = "api:noita:leaderboard"
cached_data = cache.get(cache_key)
if cached_data is not None:
return cached_data
from django.contrib.auth import get_user_model
User = get_user_model()
@@ -174,7 +189,7 @@ def get_leaderboard(request: HttpRequest):
.order_by("rank")
)
return {
data = {
"leaderboard": [
{
"rank": entry["rank"],
@@ -186,6 +201,9 @@ def get_leaderboard(request: HttpRequest):
]
}
cache.set("api:noita:leaderboard", data, 300)
return data
@router.post("submit", response={200: NoitaSubmissionOut, 400: dict})
def submit_log_file(request: HttpRequest, file: UploadedFile = File(...)):
@@ -232,6 +250,11 @@ def submit_log_file(request: HttpRequest, file: UploadedFile = File(...)):
except Exception:
pass
# Invalidate caches on successful submission
if submission.user:
cache.delete(f"api:noita:results:{submission.user.id}")
cache.delete("api:noita:leaderboard")
return {
"id": str(submission.id),
"user_id": submission.user_id,