WIP: Testing and fixing api endpoints
This commit is contained in:
parent
c88162bb3e
commit
a2c494dbd2
7 changed files with 198 additions and 180 deletions
|
@ -1,90 +0,0 @@
|
||||||
import { json } from '@sveltejs/kit';
|
|
||||||
import prisma from '$lib/prismaClient';
|
|
||||||
import redisClient from '$lib/redisClient';
|
|
||||||
|
|
||||||
import { json } from '@sveltejs/kit';
|
|
||||||
import prisma from '$lib/prismaClient';
|
|
||||||
import redisClient from '$lib/redisClient';
|
|
||||||
|
|
||||||
// GET: Liste tous les canaux avec leur premier message
|
|
||||||
export async function GET() {
|
|
||||||
try {
|
|
||||||
const cachedCanaux = await redisClient.get('canaux');
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
console.log('❌ Cache miss');
|
|
||||||
|
|
||||||
// Si le cache est invalide ou vide, on charge les données depuis la base de données
|
|
||||||
let canaux = await prisma.channel.findMany({
|
|
||||||
include: {
|
|
||||||
messages: {
|
|
||||||
take: 1, // Récupère le dernier message
|
|
||||||
orderBy: { createdAt: 'desc' }, // Trie par date décroissante
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
canaux = canaux.sort((a, b) => {
|
|
||||||
const lastMessageA = a.messages[0]?.createdAt || a.createdAt ? a.createdAt : new Date();
|
|
||||||
const lastMessageB = b.messages[0]?.createdAt || b.createdAt ? b.createdAt : new Date();
|
|
||||||
return new Date(lastMessageB).getTime() - new Date(lastMessageA).getTime();
|
|
||||||
});
|
|
||||||
|
|
||||||
return json(canaux);
|
|
||||||
|
|
||||||
} catch (err) {
|
|
||||||
console.error('Erreur lors de la récupération des canaux:', err);
|
|
||||||
return json({ error: 'Erreur serveur' }, { status: 500 });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function POST({ request }) {
|
|
||||||
console.log('Création d’un canal');
|
|
||||||
const { name } = await request.json(); // Récupère le nom du canal depuis la requête
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 1. Créer le canal dans la base de données MongoDB avec Prisma
|
|
||||||
const canal = await prisma.channel.create({
|
|
||||||
data: {
|
|
||||||
name,
|
|
||||||
createdAt: new Date(),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log('Canal créé dans MongoDB:', canal);
|
|
||||||
|
|
||||||
// 2. Récupérer les canaux existants du cache Redis
|
|
||||||
let canaux = await redisClient.get('canaux');
|
|
||||||
|
|
||||||
// Si le cache est vide, initialiser un tableau vide
|
|
||||||
if (canaux) {
|
|
||||||
try {
|
|
||||||
canaux = JSON.parse(canaux); // Parser la liste existante dans Redis
|
|
||||||
} catch (parseError) {
|
|
||||||
console.error('Erreur lors du parsing du cache Redis:', parseError);
|
|
||||||
canaux = []; // Réinitialiser si parsing échoue
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
canaux = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. Ajouter le nouveau canal à la liste des canaux en mémoire (Redis)
|
|
||||||
canaux.push(canal); // Ajoute le canal créé dans la base de données à la liste Redis
|
|
||||||
|
|
||||||
// 4. Mettre à jour le cache Redis avec la liste des canaux
|
|
||||||
await redisClient.set('canaux', JSON.stringify(canaux), { EX: 600 }); // Le cache expire dans 10 minutes
|
|
||||||
console.log('Liste des canaux mise à jour dans Redis');
|
|
||||||
|
|
||||||
// 5. Retourner le canal créé dans la réponse
|
|
||||||
return json(canal, { status: 201 });
|
|
||||||
|
|
||||||
} catch (err) {
|
|
||||||
// Gérer les erreurs et les retourner
|
|
||||||
console.error('Erreur lors de la création du canal:', err);
|
|
||||||
return json({ error: 'Erreur lors de la création du canal' }, { status: 500 });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
75
src/routes/api/channels/+server.ts
Normal file
75
src/routes/api/channels/+server.ts
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
import { json } from '@sveltejs/kit';
|
||||||
|
import prisma from '$lib/prismaClient';
|
||||||
|
import redisClient from '$lib/redisClient';
|
||||||
|
import logger from '$lib/logger';
|
||||||
|
|
||||||
|
// GET: Liste tous les canaux avec leur premier message
|
||||||
|
export async function GET() {
|
||||||
|
try {
|
||||||
|
const cachedChannels = await redisClient.get('channels');
|
||||||
|
|
||||||
|
if (cachedChannels != null) {
|
||||||
|
logger.debug('Cache entry found, fetching channels from cache');
|
||||||
|
return json(JSON.parse(cachedChannels));
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.debug('No cache entry was found, fetching channels from database');
|
||||||
|
let canaux = await prisma.channel.findMany({
|
||||||
|
include: {
|
||||||
|
messages: {
|
||||||
|
take: 1, // Récupère le dernier message
|
||||||
|
orderBy: { createdAt: 'desc' }, // Trie par date décroissante
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
canaux = canaux.sort((a, b) => {
|
||||||
|
const lastMessageA = a.messages[0]?.createdAt || a.createdAt ? a.createdAt : new Date();
|
||||||
|
const lastMessageB = b.messages[0]?.createdAt || b.createdAt ? b.createdAt : new Date();
|
||||||
|
return new Date(lastMessageB).getTime() - new Date(lastMessageA).getTime();
|
||||||
|
});
|
||||||
|
|
||||||
|
logger.debug('Caching channels with EX of 3600 secs');
|
||||||
|
await redisClient.set('channels', JSON.stringify(canaux), { EX: 3600 });
|
||||||
|
|
||||||
|
return json(canaux);
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
logger.error(err)
|
||||||
|
return json({ error: 'Erreur serveur' }, { status: 500 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function POST({ request }) {
|
||||||
|
const { name } = await request.json();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const canal = await prisma.channel.create({
|
||||||
|
data: {
|
||||||
|
name,
|
||||||
|
createdAt: new Date(),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
logger.debug('Creating a new channel in database with id ' + canal.id);
|
||||||
|
|
||||||
|
const cachedChanels = await redisClient.get('channels');
|
||||||
|
const channels = cachedChanels != null ? JSON.parse(cachedChanels) : [];
|
||||||
|
|
||||||
|
channels.push(canal);
|
||||||
|
|
||||||
|
await redisClient.set('channels', JSON.stringify(channels), { EX: 600 });
|
||||||
|
console.log('Liste des canaux mise à jour dans Redis');
|
||||||
|
|
||||||
|
// 5. Retourner le canal créé dans la réponse
|
||||||
|
return json(canal, { status: 201 });
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
// Gérer les erreurs et les retourner
|
||||||
|
console.error('Erreur lors de la création du canal:', err);
|
||||||
|
return json({ error: 'Erreur lors de la création du canal' }, { status: 500 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,84 +0,0 @@
|
||||||
import { json } from '@sveltejs/kit';
|
|
||||||
import redisClient from '$lib/redisClient';
|
|
||||||
import prisma from '$lib/prismaClient';
|
|
||||||
|
|
||||||
export async function GET({ params }) {
|
|
||||||
const userId = params.id;
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Vérifier si l'utilisateur est dans le cache Redis
|
|
||||||
const cachedUser = await redisClient.get(`user:${userId}`);
|
|
||||||
if (cachedUser) {
|
|
||||||
console.log('✅ Cache hit');
|
|
||||||
return json(JSON.parse(cachedUser));
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('❌ Cache miss');
|
|
||||||
// Si non, récupérer depuis MongoDB via Prisma
|
|
||||||
const user = await prisma.user.findUnique({
|
|
||||||
where: { id: parseInt(userId) },
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!user) {
|
|
||||||
return json({ error: 'Utilisateur non trouvé' }, { status: 404 });
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mettre l'utilisateur en cache
|
|
||||||
await redisClient.set(`user:${userId}`, JSON.stringify(user), { EX: 3600 });
|
|
||||||
|
|
||||||
return json(user);
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err);
|
|
||||||
return json({ error: 'Erreur serveur' }, { status: 500 });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mettre à jour un utilisateur avec PUT
|
|
||||||
export async function PUT({ params, request }) {
|
|
||||||
const userId = parseInt(params.id);
|
|
||||||
const { username, surname, name, email, password } = await request.json(); // Assurez-vous d'envoyer tous les champs nécessaires dans le body
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Mettre à jour l'utilisateur dans la base de données
|
|
||||||
const updatedUser = await prisma.user.update({
|
|
||||||
where: { id: userId },
|
|
||||||
data: {
|
|
||||||
username,
|
|
||||||
surname,
|
|
||||||
name,
|
|
||||||
email,
|
|
||||||
password, // Attention à ne pas oublier de sécuriser le mot de passe avec bcrypt ou une autre méthode
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// Mettre à jour l'utilisateur dans le cache Redis
|
|
||||||
await redisClient.set(`user:${userId}`, JSON.stringify(updatedUser), 'EX', 3600); // Cache pendant 1 heure (3600 secondes)
|
|
||||||
|
|
||||||
return json(updatedUser);
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err);
|
|
||||||
return json({ error: 'Erreur lors de la mise à jour de l’utilisateur' }, { status: 500 });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
export async function DELETE({ params }) {
|
|
||||||
const userId = parseInt(params.id);
|
|
||||||
|
|
||||||
try {
|
|
||||||
await prisma.user.delete({
|
|
||||||
where: { id: userId },
|
|
||||||
});
|
|
||||||
|
|
||||||
// Supprimer l'utilisateur du cache Redis
|
|
||||||
await redisClient.del(`user:${userId}`);
|
|
||||||
|
|
||||||
return json({ message: 'Utilisateur supprimé avec succès' });
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err);
|
|
||||||
return json({ error: 'Erreur lors de la suppression de l’utilisateur' }, { status: 500 });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,26 +2,28 @@
|
||||||
import { json } from '@sveltejs/kit';
|
import { json } from '@sveltejs/kit';
|
||||||
import redisClient from '$lib/redisClient';
|
import redisClient from '$lib/redisClient';
|
||||||
import prisma from '$lib/prismaClient';
|
import prisma from '$lib/prismaClient';
|
||||||
|
import logger from '$lib/logger';
|
||||||
|
|
||||||
export async function GET() {
|
export async function GET() {
|
||||||
try {
|
try {
|
||||||
// Vérifier si les utilisateurs sont dans le cache Redis
|
// Vérifier si les utilisateurs sont dans le cache Redis
|
||||||
const cachedUsers = await redisClient.get('users');
|
const cachedUsers = await redisClient.get('users');
|
||||||
if (cachedUsers) {
|
if (cachedUsers) {
|
||||||
console.log('✅ Cache hit');
|
logger.debug('Cache entry found, fetching users from cache');
|
||||||
return json(JSON.parse(cachedUsers));
|
return json(JSON.parse(cachedUsers));
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('❌ Cache miss');
|
logger.debug('No cache entry was found, fetching users from database');
|
||||||
// Sinon, récupérer les utilisateurs depuis MongoDB
|
// Sinon, récupérer les utilisateurs depuis MongoDB
|
||||||
const users = await prisma.user.findMany();
|
const users = await prisma.user.findMany();
|
||||||
|
|
||||||
// Mettre les utilisateurs en cache
|
// Mettre les utilisateurs en cache
|
||||||
|
logger.debug('Caching users with EX of 600 secs');
|
||||||
await redisClient.set('users', JSON.stringify(users), { EX: 600 });
|
await redisClient.set('users', JSON.stringify(users), { EX: 600 });
|
||||||
|
|
||||||
return json(users);
|
return json(users);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err);
|
logger.error(err);
|
||||||
return json({ error: 'Erreur serveur' }, { status: 500 });
|
return json({ error: 'Erreur serveur' }, { status: 500 });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,20 +34,29 @@ export async function POST({ request }) {
|
||||||
try {
|
try {
|
||||||
const user = await prisma.user.create({
|
const user = await prisma.user.create({
|
||||||
data: {
|
data: {
|
||||||
username,
|
username: username.toLowerCase(),
|
||||||
surname,
|
surname,
|
||||||
name,
|
name,
|
||||||
email,
|
email: email.toLowerCase(),
|
||||||
password,
|
password,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
logger.debug('Creating a new user in database with id ' + user.id);
|
||||||
|
|
||||||
// Mettre le nouvel utilisateur dans le cache
|
// Mettre le nouvel utilisateur dans le cache
|
||||||
|
logger.debug(`Caching user (${user.id})`);
|
||||||
|
const cachedUsers = await redisClient.get('users');
|
||||||
|
const usersArray = cachedUsers != null ? JSON.parse(cachedUsers) : [];
|
||||||
|
usersArray.push(user);
|
||||||
|
|
||||||
|
logger.debug(`Added user (${user.id}) to users cache.`);
|
||||||
|
await redisClient.set('users', JSON.stringify(usersArray), { EX: 600 })
|
||||||
|
logger.debug(`Creating a new cache entry with key user:${user.id}, with EX of 3600 secs`);
|
||||||
await redisClient.set(`user:${user.id}`, JSON.stringify(user), { EX: 3600 });
|
await redisClient.set(`user:${user.id}`, JSON.stringify(user), { EX: 3600 });
|
||||||
|
|
||||||
return json(user, { status: 201 });
|
return json(user, { status: 201 });
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err);
|
logger.error(err)
|
||||||
return json({ error: 'Erreur lors de la création de l’utilisateur' }, { status: 500 });
|
return json({ error: 'Erreur lors de la création de l’utilisateur' }, { status: 500 });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
106
src/routes/api/users/[id]/+server.ts
Normal file
106
src/routes/api/users/[id]/+server.ts
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
import { json } from '@sveltejs/kit';
|
||||||
|
import redisClient from '$lib/redisClient';
|
||||||
|
import prisma from '$lib/prismaClient';
|
||||||
|
import logger from '$lib/logger';
|
||||||
|
|
||||||
|
export async function GET({ params }) {
|
||||||
|
const userId = params.id;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Vérifier si l'utilisateur est dans le cache Redis
|
||||||
|
const cachedUser = await redisClient.get(`user:${userId}`);
|
||||||
|
if (cachedUser) {
|
||||||
|
logger.debug(`Cache entry found, fetching user (${params.id}) from cache`);
|
||||||
|
return json(JSON.parse(cachedUser));
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.debug(`No cache entry was found, fetching user (${params.id}) from database`);
|
||||||
|
// Si non, récupérer depuis MongoDB via Prisma
|
||||||
|
const user = await prisma.user.findUnique({
|
||||||
|
where: { id: userId },
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!user) {
|
||||||
|
logger.debug(`No record of user (${params.id}) found in database`);
|
||||||
|
return json({ error: 'Utilisateur non trouvé' }, { status: 404 });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mettre l'utilisateur en cache
|
||||||
|
const cachedUsers = await redisClient.get('users');
|
||||||
|
const usersArray = cachedUsers != null ? JSON.parse(cachedUsers) : [];
|
||||||
|
usersArray.push(user);
|
||||||
|
logger.debug(`Added user (${user.id}) to users cache.`);
|
||||||
|
await redisClient.set('users', JSON.stringify(usersArray), { EX: 600 })
|
||||||
|
logger.debug(`Creating a new cache entry with key user:${user.id}, with EX of 3600 secs`);
|
||||||
|
await redisClient.set(`user:${userId}`, JSON.stringify(user), { EX: 3600 });
|
||||||
|
|
||||||
|
return json(user);
|
||||||
|
} catch (err) {
|
||||||
|
logger.error(err);
|
||||||
|
return json({ error: 'Erreur serveur' }, { status: 500 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mettre à jour un utilisateur avec PUT
|
||||||
|
export async function PUT({ params, request }) {
|
||||||
|
const userId = params.id;
|
||||||
|
const { username, surname, name, email, password } = await request.json();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const updatedUser = await prisma.user.update({
|
||||||
|
where: { id: userId },
|
||||||
|
data: {
|
||||||
|
username,
|
||||||
|
surname,
|
||||||
|
name,
|
||||||
|
email,
|
||||||
|
password, // Attention à ne pas oublier de sécuriser le mot de passe avec bcrypt ou une autre méthode
|
||||||
|
},
|
||||||
|
});
|
||||||
|
logger.debug(`Updated user (${updatedUser.id}) in database`);
|
||||||
|
|
||||||
|
// Mettre à jour l'utilisateur dans le cache Redis
|
||||||
|
const cachedUsers = await redisClient.get('users');
|
||||||
|
let usersArray = cachedUsers != null ? JSON.parse(cachedUsers) : [];
|
||||||
|
usersArray = usersArray.filter((u: { id: string }) => u.id !== updatedUser.id);
|
||||||
|
usersArray.push(updatedUser);
|
||||||
|
logger.debug(`Updated user (${updatedUser.id}) in users cache.`);
|
||||||
|
await redisClient.set('users', JSON.stringify(usersArray), { EX: 600 })
|
||||||
|
logger.debug(`Updated cache entry with key user:${updatedUser.id}`);
|
||||||
|
await redisClient.set(`user:${userId}`, JSON.stringify(updatedUser), { EX: 3600 }); // Cache pendant 1 heure (3600 secondes)
|
||||||
|
|
||||||
|
return json(updatedUser);
|
||||||
|
} catch (err) {
|
||||||
|
logger.error(err);
|
||||||
|
return json({ error: 'Erreur lors de la mise à jour de l’utilisateur' }, { status: 500 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function DELETE({ params }) {
|
||||||
|
const userId = params.id;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const deletedUser = await prisma.user.delete({
|
||||||
|
where: { id: userId },
|
||||||
|
});
|
||||||
|
logger.debug(`Deleted user (${deletedUser.id}) from database.`);
|
||||||
|
|
||||||
|
// Supprimer l'utilisateur du cache Redis
|
||||||
|
const cachedUsers = await redisClient.get('users');
|
||||||
|
let usersArray = cachedUsers != null ? JSON.parse(cachedUsers) : [];
|
||||||
|
usersArray = usersArray.filter((u: { id: string }) => u.id !== deletedUser.id);
|
||||||
|
logger.debug(`Deleted cache entry with key user:${deletedUser.id}`);
|
||||||
|
await redisClient.del(`user:${userId}`);
|
||||||
|
logger.debug(`Deleted user (${deletedUser.id}) from users cache.`);
|
||||||
|
await redisClient.set('users', JSON.stringify(usersArray), { EX: 600 })
|
||||||
|
|
||||||
|
return json({ message: 'Utilisateur supprimé avec succès' });
|
||||||
|
} catch (err) {
|
||||||
|
logger.error(err);
|
||||||
|
return json({ error: 'Erreur lors de la suppression de l’utilisateur' }, { status: 500 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue