From e08c47c8cccb298148ef6a821553ad900627e98a Mon Sep 17 00:00:00 2001
From: Steel <mael.acier@ensiie.fr>
Date: Fri, 6 Sep 2024 14:08:33 +0200
Subject: [PATCH] better caching

---
 src/app.html                    |   1 -
 src/lib/data.ts                 |  23 ++++++++++++++++++-----
 src/routes/quiz/+page.server.ts |   2 +-
 static/favicon.png              | Bin 1571 -> 0 bytes
 4 files changed, 19 insertions(+), 7 deletions(-)
 delete mode 100644 static/favicon.png

diff --git a/src/app.html b/src/app.html
index ec070ff..fba6fdb 100644
--- a/src/app.html
+++ b/src/app.html
@@ -2,7 +2,6 @@
 <html lang="fr" class="h-full">
   <head>
     <meta charset="utf-8" />
-    <link rel="icon" href="%sveltekit.assets%/favicon.png" />
     <meta name="viewport" content="width=device-width, initial-scale=1" />
 
     <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
diff --git a/src/lib/data.ts b/src/lib/data.ts
index 2e536e0..b4db74a 100644
--- a/src/lib/data.ts
+++ b/src/lib/data.ts
@@ -12,7 +12,8 @@ const cache = new Map<number, PromoCache>();
 // 1 hour
 const CACHE_DURATION_MS = 1000 * 60 * 60;
 
-async function cacheImages(users: UserId[]): Promise<void> {
+async function cacheImages(users: Iterable<UserId>): Promise<void> {
+  let count = 0;
   for (const user of users) {
     const response = await client.query(USER_DETAILS_QUERY, { idList: [user] });
 
@@ -23,17 +24,22 @@ async function cacheImages(users: UserId[]): Promise<void> {
     const photo = response.data?.page.nodes[0].photo;
     if (!photo?.url) continue;
     await fetch(photo.url, { method: "HEAD" });
+    count++;
   }
-  console.log("cached", users.length, "images");
+  console.log("cached", count, "images");
+}
+
+// background task
+async function cachePromotionImages(year: number) {
+  const promo = cache.get(year);
+  if (!promo) return;
+  await cacheImages(promo.promotion);
 }
 
 async function fetchPromotion(year: number): Promise<PromoCache> {
   const array = await Array.fromAsync(pageIterator(PROMOTION_QUERY, { year }));
   const users = array.map((node) => node.id);
 
-  // background task
-  cacheImages(users);
-
   return {
     lastUpdateMs: new Date().getTime(),
     promotion: new Set(users),
@@ -49,6 +55,7 @@ export async function getPromotion(year: number): Promise<Set<UserId>> {
   console.log("year", year, "not in cache, fetching");
   const freshData = await fetchPromotion(year);
   cache.set(year, freshData);
+  cachePromotionImages(year);
   return freshData.promotion;
 }
 
@@ -70,3 +77,9 @@ export function getPromotionRange(
     (array) => new Set(array),
   );
 }
+
+setInterval(() => {
+  for (const year of cache.keys()) {
+    cachePromotionImages(year);
+  }
+}, CACHE_DURATION_MS / 2);
diff --git a/src/routes/quiz/+page.server.ts b/src/routes/quiz/+page.server.ts
index 90b3993..933b6e2 100644
--- a/src/routes/quiz/+page.server.ts
+++ b/src/routes/quiz/+page.server.ts
@@ -66,7 +66,7 @@ export async function load(event) {
 }
 
 const MAX_POINTS = 10;
-const MIN_POINTS = 0;
+const MIN_POINTS = 3;
 // Durée maximale pour obtenir le score maximal
 const SERVER_DELAY_MAX = 3;
 
diff --git a/static/favicon.png b/static/favicon.png
deleted file mode 100644
index 825b9e65af7c104cfb07089bb28659393b4f2097..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1571
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
VHuiSbmk|H}002ovPDHLkV1f%e^4kCa

-- 
GitLab