wip: only message and it's done

This commit is contained in:
Nabil Ould Hamou 2024-12-02 14:19:09 +01:00
parent 869762af25
commit a38e5f9c2c

View file

@ -1,32 +1,31 @@
import { json } from '@sveltejs/kit'; import { json } from '@sveltejs/kit';
import prisma from '$lib/prismaClient'; import prisma from '$lib/prismaClient';
import redisClient from '$lib/redisClient'; // Assure-toi d'importer ton client Redis import redisClient from '$lib/redisClient';
export async function GET({ params, url }) { export async function GET({ params, url }) {
const canalId = parseInt(params.id); const channelId = params.id;
// Gestion de la pagination avec des paramètres optionnels `page` et `limit` // @ts-ignore
const page = parseInt(url.searchParams.get('page')) || 1; const page = url.searchParams.get('page') != null ? parseInt(url.searchParams.get('page')) : 1;
const limit = parseInt(url.searchParams.get('limit')) || 10; // @ts-ignore
const limit = url.searchParams.get('limit') != null ? parseInt(url.searchParams.get('limit')) : 10;
const offset = (page - 1) * limit; const offset = (page - 1) * limit;
// Générer une clé cache Redis unique en fonction du canal et des paramètres de pagination // Générer une clé cache Redis unique en fonction du canal et des paramètres de pagination
const cacheKey = `canal:${canalId}:messages:page:${page}:limit:${limit}`; const cacheKey = `channel:${channelId}:messages:page:${page}:limit:${limit}`;
try { try {
// 1. Vérifier si les messages sont déjà dans le cache Redis
const cachedMessages = await redisClient.get(cacheKey); const cachedMessages = await redisClient.get(cacheKey);
if (cachedMessages) { if (cachedMessages) {
console.log('✅ Cache hit'); console.log('✅ Cache hit');
return json(JSON.parse(cachedMessages)); // Si les données sont en cache, les retourner return json(JSON.parse(cachedMessages)); // Si les données sont en cache, les retourner
} }
// 2. Si les messages ne sont pas en cache, récupérer depuis la base de données
const messages = await prisma.message.findMany({ const messages = await prisma.message.findMany({
where: { canalId }, where: { channelId },
include: { include: {
user: { user: {
select: { id: true, pseudo: true }, // Inclut uniquement lID et le pseudo de lutilisateur select: { id: true, username: true },
}, },
}, },
orderBy: { orderBy: {
@ -36,9 +35,9 @@ export async function GET({ params, url }) {
take: limit, take: limit,
}); });
// 3. Compter le nombre total de messages pour la pagination
const totalMessages = await prisma.message.count({ const totalMessages = await prisma.message.count({
where: { canalId }, where: { channelId },
}); });
const response = { const response = {
@ -51,11 +50,11 @@ export async function GET({ params, url }) {
}, },
}; };
// 4. Mettre en cache les messages avec une expiration (par exemple 5 minutes)
await redisClient.set(cacheKey, JSON.stringify(response), 'EX', 60 * 5); // Cache pendant 5 minutes await redisClient.set(cacheKey, JSON.stringify(response), { EX: 600 });
console.log('❌ Cache miss - Mise en cache des résultats'); console.log('❌ Cache miss - Mise en cache des résultats');
return json(response); // Retourner les données récupérées return json(response);
} catch (err) { } catch (err) {
console.error(err); console.error(err);
return json({ error: 'Erreur lors de la récupération des messages' }, { status: 500 }); return json({ error: 'Erreur lors de la récupération des messages' }, { status: 500 });
@ -63,7 +62,7 @@ export async function GET({ params, url }) {
} }
export async function POST({ params, request }) { export async function POST({ params, request }) {
const canalId = parseInt(params.id); const channelId = params.id;
const { userId, text } = await request.json(); const { userId, text } = await request.json();
try { try {
@ -71,10 +70,10 @@ export async function POST({ params, request }) {
const newMessage = await prisma.message.create({ const newMessage = await prisma.message.create({
data: { data: {
userId, userId,
canalId, channelId,
text, text,
}, },
include: { user: { select: { id: true, pseudo: true } } }, include: { user: { select: { id: true, username: true } } },
}); });
updateCaches(); // Mettre à jour les caches après la création dun nouveau message updateCaches(); // Mettre à jour les caches après la création dun nouveau message
@ -87,7 +86,7 @@ export async function POST({ params, request }) {
} }
export async function DELETE({ params }) { export async function DELETE({ params }) {
const messageId = parseInt(params.id); const messageId = params.id;
try { try {
// Supprimer le message de la base de données // Supprimer le message de la base de données
@ -105,14 +104,12 @@ export async function DELETE({ params }) {
} }
// Fonction pour mettre à jour tous les caches des messages // Fonction pour mettre à jour tous les caches des messages
function updateCaches(canalId) { function updateCaches(channelId: string) {
// Mettre à jour tous les caches
// Mettre à jour toutes les pages dans le cache
let page : number = 1; let page : number = 1;
let limit : number = 10; let limit : number = 10;
let offset : number = (page - 1) * limit; let offset : number = (page - 1) * limit;
while (true) { while (true) {
const cacheKey = `canal:${canalId}:messages:page:${page}:limit:${limit}`; const cacheKey = `channel:${channelId}:messages:page:${page}:limit:${limit}`;
const cachedMessages = await redisClient.get(cacheKey); const cachedMessages = await redisClient.get(cacheKey);
if (!cachedMessages) { if (!cachedMessages) {
break; break;