feat: enhance session management with sharing capabilities, real-time event synchronization, and UI updates for session display
This commit is contained in:
69
src/actions/share.ts
Normal file
69
src/actions/share.ts
Normal 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: [] };
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,14 @@ export async function createSwotItem(
|
||||
|
||||
try {
|
||||
const item = await sessionsService.createSwotItem(sessionId, data);
|
||||
|
||||
// Emit event for real-time sync
|
||||
await sessionsService.createSessionEvent(sessionId, session.user.id, 'ITEM_CREATED', {
|
||||
itemId: item.id,
|
||||
content: item.content,
|
||||
category: item.category,
|
||||
});
|
||||
|
||||
revalidatePath(`/sessions/${sessionId}`);
|
||||
return { success: true, data: item };
|
||||
} catch (error) {
|
||||
@@ -40,6 +48,13 @@ export async function updateSwotItem(
|
||||
|
||||
try {
|
||||
const item = await sessionsService.updateSwotItem(itemId, data);
|
||||
|
||||
// Emit event for real-time sync
|
||||
await sessionsService.createSessionEvent(sessionId, session.user.id, 'ITEM_UPDATED', {
|
||||
itemId: item.id,
|
||||
...data,
|
||||
});
|
||||
|
||||
revalidatePath(`/sessions/${sessionId}`);
|
||||
return { success: true, data: item };
|
||||
} catch (error) {
|
||||
@@ -56,6 +71,12 @@ export async function deleteSwotItem(itemId: string, sessionId: string) {
|
||||
|
||||
try {
|
||||
await sessionsService.deleteSwotItem(itemId);
|
||||
|
||||
// Emit event for real-time sync
|
||||
await sessionsService.createSessionEvent(sessionId, session.user.id, 'ITEM_DELETED', {
|
||||
itemId,
|
||||
});
|
||||
|
||||
revalidatePath(`/sessions/${sessionId}`);
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
@@ -72,6 +93,15 @@ export async function duplicateSwotItem(itemId: string, sessionId: string) {
|
||||
|
||||
try {
|
||||
const item = await sessionsService.duplicateSwotItem(itemId);
|
||||
|
||||
// Emit event for real-time sync
|
||||
await sessionsService.createSessionEvent(sessionId, session.user.id, 'ITEM_CREATED', {
|
||||
itemId: item.id,
|
||||
content: item.content,
|
||||
category: item.category,
|
||||
duplicatedFrom: itemId,
|
||||
});
|
||||
|
||||
revalidatePath(`/sessions/${sessionId}`);
|
||||
return { success: true, data: item };
|
||||
} catch (error) {
|
||||
@@ -93,6 +123,14 @@ export async function moveSwotItem(
|
||||
|
||||
try {
|
||||
const item = await sessionsService.moveSwotItem(itemId, newCategory, newOrder);
|
||||
|
||||
// Emit event for real-time sync
|
||||
await sessionsService.createSessionEvent(sessionId, session.user.id, 'ITEM_MOVED', {
|
||||
itemId: item.id,
|
||||
newCategory,
|
||||
newOrder,
|
||||
});
|
||||
|
||||
revalidatePath(`/sessions/${sessionId}`);
|
||||
return { success: true, data: item };
|
||||
} catch (error) {
|
||||
@@ -121,6 +159,14 @@ export async function createAction(
|
||||
|
||||
try {
|
||||
const action = await sessionsService.createAction(sessionId, data);
|
||||
|
||||
// Emit event for real-time sync
|
||||
await sessionsService.createSessionEvent(sessionId, session.user.id, 'ACTION_CREATED', {
|
||||
actionId: action.id,
|
||||
title: action.title,
|
||||
linkedItemIds: data.linkedItemIds,
|
||||
});
|
||||
|
||||
revalidatePath(`/sessions/${sessionId}`);
|
||||
return { success: true, data: action };
|
||||
} catch (error) {
|
||||
@@ -146,6 +192,13 @@ export async function updateAction(
|
||||
|
||||
try {
|
||||
const action = await sessionsService.updateAction(actionId, data);
|
||||
|
||||
// Emit event for real-time sync
|
||||
await sessionsService.createSessionEvent(sessionId, session.user.id, 'ACTION_UPDATED', {
|
||||
actionId: action.id,
|
||||
...data,
|
||||
});
|
||||
|
||||
revalidatePath(`/sessions/${sessionId}`);
|
||||
return { success: true, data: action };
|
||||
} catch (error) {
|
||||
@@ -162,6 +215,12 @@ export async function deleteAction(actionId: string, sessionId: string) {
|
||||
|
||||
try {
|
||||
await sessionsService.deleteAction(actionId);
|
||||
|
||||
// Emit event for real-time sync
|
||||
await sessionsService.createSessionEvent(sessionId, session.user.id, 'ACTION_DELETED', {
|
||||
actionId,
|
||||
});
|
||||
|
||||
revalidatePath(`/sessions/${sessionId}`);
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
|
||||
Reference in New Issue
Block a user