feat(api): add cache + busting for admin
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user