feat: enhance session management with sharing capabilities, real-time event synchronization, and UI updates for session display

This commit is contained in:
Julien Froidefond
2025-11-27 13:34:03 +01:00
parent 9ce2b62bc6
commit 10ff15392f
15 changed files with 1127 additions and 84 deletions

69
src/actions/share.ts Normal file
View File

@@ -0,0 +1,69 @@
'use server';
import { revalidatePath } from 'next/cache';
import { auth } from '@/lib/auth';
import {
shareSession,
removeShare,
getSessionShares,
} from '@/services/sessions';
import type { ShareRole } from '@prisma/client';
export async function shareSessionAction(
sessionId: string,
email: string,
role: ShareRole = 'EDITOR'
) {
const session = await auth();
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié' };
}
try {
const share = await shareSession(sessionId, session.user.id, email, role);
revalidatePath(`/sessions/${sessionId}`);
return { success: true, data: share };
} catch (error) {
const message = error instanceof Error ? error.message : 'Erreur inconnue';
if (message === 'User not found') {
return { success: false, error: "Aucun utilisateur trouvé avec cet email" };
}
if (message === 'Cannot share session with yourself') {
return { success: false, error: "Vous ne pouvez pas partager avec vous-même" };
}
return { success: false, error: message };
}
}
export async function removeShareAction(sessionId: string, shareUserId: string) {
const session = await auth();
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié' };
}
try {
await removeShare(sessionId, session.user.id, shareUserId);
revalidatePath(`/sessions/${sessionId}`);
return { success: true };
} catch (error) {
const message = error instanceof Error ? error.message : 'Erreur inconnue';
return { success: false, error: message };
}
}
export async function getSharesAction(sessionId: string) {
const session = await auth();
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié', data: [] };
}
try {
const shares = await getSessionShares(sessionId, session.user.id);
return { success: true, data: shares };
} catch (error) {
const message = error instanceof Error ? error.message : 'Erreur inconnue';
return { success: false, error: message, data: [] };
}
}