Skip to content
Extraits de code Groupes Projets
Valider c2fbca55 rédigé par Steel's avatar Steel
Parcourir les fichiers

cache promotion

parent 97b3a204
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -17,24 +17,9 @@ export default {
}
},
scalars: {
Date: {
type: 'string'
},
DateTime: {
type: 'string'
},
Url: {
type: 'string'
},
SmolStr: {
type: 'string'
},
UUID: {
type: 'string'
},
Identifier: {
type: 'string'
},
Base64: {
type: 'string'
}
......
// import { GetPromotionStore, UserDetailsStore } from '$houdini';
// import { pageIterator } from '$lib/graphql/query';
import { GetPromotionStore } from '$houdini';
import { pageIterator } from '$lib/graphql/query';
import type { RequestEvent } from '@sveltejs/kit';
// type Promotion = unknown[];
type UserId = string;
type PromoCache = {
lastUpdateMs: number;
promo: Set<UserId>;
};
// const cache = new Map<number, Promotion>();
const cache = new Map<number, PromoCache>();
// 1 hour
const CACHE_DURATION_MS = 1000 * 60 * 60;
// function fetchPromotion(promotion: number) {
// return Array.fromAsync(pageIterator(event, GetPromotionStore, { promotion }));
// }
async function fetchPromotion(promotion: number, event: RequestEvent): Promise<PromoCache> {
const array = await Array.fromAsync(pageIterator(GetPromotionStore, { promotion }, event));
return {
lastUpdateMs: new Date().getTime(),
promo: new Set(array.map((node) => node.id))
};
}
// export async function getPromotion(promo: number): Promise<Promotion> {
// if (cache.has(promo)) {
// return cache.get(promo)!;
// }
// const promotion = await fetchPromotion(promo);
// cache.set(promo, promotion);
// return promotion;
// }
export async function getPromotion(promo: number, event: RequestEvent): Promise<Set<UserId>> {
if (cache.has(promo)) {
const data = cache.get(promo)!;
if (new Date().getTime() - data.lastUpdateMs < CACHE_DURATION_MS) return data.promo;
}
const freshData = await fetchPromotion(promo, event);
cache.set(promo, freshData);
return freshData.promo;
}
// export async function* promotionIterator(
// min: number,
// max: number
// ): AsyncGenerator<Promotion, void, unknown> {
// for (let i = min; i <= max; i++) {
// yield getPromotion(i);
// }
// }
export async function* promotionIterator(
min: number,
max: number,
event: RequestEvent
): AsyncGenerator<UserId, void, undefined> {
for (let i = min; i <= max; i++) {
const promo = await getPromotion(i, event);
yield* promo;
}
}
// export function getPromotionRange(min: number, max: number): Promise<Promotion> {
// return Array.fromAsync(promotionIterator(min, max));
// }
export function getPromotionRange(
min: number,
max: number,
event: RequestEvent
): Promise<Set<UserId>> {
return Array.fromAsync(promotionIterator(min, max, event)).then((array) => new Set(array));
}
......@@ -22,9 +22,9 @@ export async function* pageIterator<
Data extends Page<GraphQLValue>,
Input extends PageArgs | GraphQLVariables
>(
event: RequestEvent,
queryStore: new () => QueryStore<Data, Input>,
variables: Omit<Input, 'first' | 'after'>,
event: RequestEvent,
pageSize = 100
): AsyncGenerator<NodeType<Data>, void, undefined> {
const store = new queryStore();
......
Ce diff est replié.
......@@ -2,10 +2,10 @@ import { superValidate } from 'sveltekit-superforms';
import { zod } from 'sveltekit-superforms/adapters';
import { schema } from './schema';
import { fail, redirect } from '@sveltejs/kit';
import { GetPromotionStore, UserDetailsStore } from '$houdini';
import { pageIterator } from '$lib/graphql/query';
import { UserDetailsStore } from '$houdini';
import { getRandomItems } from '$lib/utils';
import { GameStage, Game } from '$lib/game';
import { getPromotion } from '$lib/data';
type Option = {
value: string;
......@@ -18,10 +18,7 @@ export async function load(event) {
if (game.state.stage === GameStage.GAME_OVER) redirect(303, '/quiz/game-over');
if (game.state.stage === GameStage.NEXT) {
const pagination = pageIterator(event, GetPromotionStore, { promotion: 2023 });
const promotion = await Array.fromAsync(pagination);
const all = new Set(promotion.map((p) => p.id));
const all = await getPromotion(2023, event);
const previous = new Set(game.state.history);
const available = all.difference(previous);
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter