All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 6m24s
334 lines
9.2 KiB
TypeScript
334 lines
9.2 KiB
TypeScript
'use server';
|
|
|
|
import { revalidatePath } from 'next/cache';
|
|
import { auth } from '@/lib/auth';
|
|
import * as weeklyCheckInService from '@/services/weekly-checkin';
|
|
import type { WeeklyCheckInCategory, Emotion } from '@prisma/client';
|
|
|
|
// ============================================
|
|
// Session Actions
|
|
// ============================================
|
|
|
|
export async function createWeeklyCheckInSession(data: {
|
|
title: string;
|
|
participant: string;
|
|
date?: Date;
|
|
}) {
|
|
const session = await auth();
|
|
if (!session?.user?.id) {
|
|
return { success: false, error: 'Non autorisé' };
|
|
}
|
|
|
|
try {
|
|
const weeklyCheckInSession = await weeklyCheckInService.createWeeklyCheckInSession(
|
|
session.user.id,
|
|
data
|
|
);
|
|
revalidatePath('/weekly-checkin');
|
|
revalidatePath('/sessions');
|
|
return { success: true, data: weeklyCheckInSession };
|
|
} catch (error) {
|
|
console.error('Error creating weekly check-in session:', error);
|
|
return { success: false, error: 'Erreur lors de la création' };
|
|
}
|
|
}
|
|
|
|
export async function updateWeeklyCheckInSession(
|
|
sessionId: string,
|
|
data: { title?: string; participant?: string; date?: Date }
|
|
) {
|
|
const authSession = await auth();
|
|
if (!authSession?.user?.id) {
|
|
return { success: false, error: 'Non autorisé' };
|
|
}
|
|
|
|
try {
|
|
await weeklyCheckInService.updateWeeklyCheckInSession(sessionId, authSession.user.id, data);
|
|
|
|
// Emit event for real-time sync
|
|
await weeklyCheckInService.createWeeklyCheckInSessionEvent(
|
|
sessionId,
|
|
authSession.user.id,
|
|
'SESSION_UPDATED',
|
|
data
|
|
);
|
|
|
|
revalidatePath(`/weekly-checkin/${sessionId}`);
|
|
revalidatePath('/weekly-checkin');
|
|
revalidatePath('/sessions');
|
|
return { success: true };
|
|
} catch (error) {
|
|
console.error('Error updating weekly check-in session:', error);
|
|
return { success: false, error: 'Erreur lors de la mise à jour' };
|
|
}
|
|
}
|
|
|
|
export async function deleteWeeklyCheckInSession(sessionId: string) {
|
|
const authSession = await auth();
|
|
if (!authSession?.user?.id) {
|
|
return { success: false, error: 'Non autorisé' };
|
|
}
|
|
|
|
try {
|
|
await weeklyCheckInService.deleteWeeklyCheckInSession(sessionId, authSession.user.id);
|
|
revalidatePath('/weekly-checkin');
|
|
revalidatePath('/sessions');
|
|
return { success: true };
|
|
} catch (error) {
|
|
console.error('Error deleting weekly check-in session:', error);
|
|
return { success: false, error: 'Erreur lors de la suppression' };
|
|
}
|
|
}
|
|
|
|
// ============================================
|
|
// Item Actions
|
|
// ============================================
|
|
|
|
export async function createWeeklyCheckInItem(
|
|
sessionId: string,
|
|
data: { content: string; category: WeeklyCheckInCategory; emotion?: Emotion }
|
|
) {
|
|
const authSession = await auth();
|
|
if (!authSession?.user?.id) {
|
|
return { success: false, error: 'Non autorisé' };
|
|
}
|
|
|
|
// Check edit permission
|
|
const canEdit = await weeklyCheckInService.canEditWeeklyCheckInSession(
|
|
sessionId,
|
|
authSession.user.id
|
|
);
|
|
if (!canEdit) {
|
|
return { success: false, error: 'Permission refusée' };
|
|
}
|
|
|
|
try {
|
|
const item = await weeklyCheckInService.createWeeklyCheckInItem(sessionId, data);
|
|
|
|
// Emit event for real-time sync
|
|
await weeklyCheckInService.createWeeklyCheckInSessionEvent(
|
|
sessionId,
|
|
authSession.user.id,
|
|
'ITEM_CREATED',
|
|
{
|
|
itemId: item.id,
|
|
content: item.content,
|
|
category: item.category,
|
|
emotion: item.emotion,
|
|
}
|
|
);
|
|
|
|
revalidatePath(`/weekly-checkin/${sessionId}`);
|
|
return { success: true, data: item };
|
|
} catch (error) {
|
|
console.error('Error creating weekly check-in item:', error);
|
|
return { success: false, error: 'Erreur lors de la création' };
|
|
}
|
|
}
|
|
|
|
export async function updateWeeklyCheckInItem(
|
|
itemId: string,
|
|
sessionId: string,
|
|
data: { content?: string; category?: WeeklyCheckInCategory; emotion?: Emotion }
|
|
) {
|
|
const authSession = await auth();
|
|
if (!authSession?.user?.id) {
|
|
return { success: false, error: 'Non autorisé' };
|
|
}
|
|
|
|
// Check edit permission
|
|
const canEdit = await weeklyCheckInService.canEditWeeklyCheckInSession(
|
|
sessionId,
|
|
authSession.user.id
|
|
);
|
|
if (!canEdit) {
|
|
return { success: false, error: 'Permission refusée' };
|
|
}
|
|
|
|
try {
|
|
const item = await weeklyCheckInService.updateWeeklyCheckInItem(itemId, data);
|
|
|
|
// Emit event for real-time sync
|
|
await weeklyCheckInService.createWeeklyCheckInSessionEvent(
|
|
sessionId,
|
|
authSession.user.id,
|
|
'ITEM_UPDATED',
|
|
{
|
|
itemId: item.id,
|
|
...data,
|
|
}
|
|
);
|
|
|
|
revalidatePath(`/weekly-checkin/${sessionId}`);
|
|
return { success: true, data: item };
|
|
} catch (error) {
|
|
console.error('Error updating weekly check-in item:', error);
|
|
return { success: false, error: 'Erreur lors de la mise à jour' };
|
|
}
|
|
}
|
|
|
|
export async function deleteWeeklyCheckInItem(itemId: string, sessionId: string) {
|
|
const authSession = await auth();
|
|
if (!authSession?.user?.id) {
|
|
return { success: false, error: 'Non autorisé' };
|
|
}
|
|
|
|
// Check edit permission
|
|
const canEdit = await weeklyCheckInService.canEditWeeklyCheckInSession(
|
|
sessionId,
|
|
authSession.user.id
|
|
);
|
|
if (!canEdit) {
|
|
return { success: false, error: 'Permission refusée' };
|
|
}
|
|
|
|
try {
|
|
await weeklyCheckInService.deleteWeeklyCheckInItem(itemId);
|
|
|
|
// Emit event for real-time sync
|
|
await weeklyCheckInService.createWeeklyCheckInSessionEvent(
|
|
sessionId,
|
|
authSession.user.id,
|
|
'ITEM_DELETED',
|
|
{ itemId }
|
|
);
|
|
|
|
revalidatePath(`/weekly-checkin/${sessionId}`);
|
|
return { success: true };
|
|
} catch (error) {
|
|
console.error('Error deleting weekly check-in item:', error);
|
|
return { success: false, error: 'Erreur lors de la suppression' };
|
|
}
|
|
}
|
|
|
|
export async function moveWeeklyCheckInItem(
|
|
itemId: string,
|
|
sessionId: string,
|
|
newCategory: WeeklyCheckInCategory,
|
|
newOrder: number
|
|
) {
|
|
const authSession = await auth();
|
|
if (!authSession?.user?.id) {
|
|
return { success: false, error: 'Non autorisé' };
|
|
}
|
|
|
|
// Check edit permission
|
|
const canEdit = await weeklyCheckInService.canEditWeeklyCheckInSession(
|
|
sessionId,
|
|
authSession.user.id
|
|
);
|
|
if (!canEdit) {
|
|
return { success: false, error: 'Permission refusée' };
|
|
}
|
|
|
|
try {
|
|
await weeklyCheckInService.moveWeeklyCheckInItem(itemId, newCategory, newOrder);
|
|
|
|
// Emit event for real-time sync
|
|
await weeklyCheckInService.createWeeklyCheckInSessionEvent(
|
|
sessionId,
|
|
authSession.user.id,
|
|
'ITEM_MOVED',
|
|
{
|
|
itemId,
|
|
category: newCategory,
|
|
order: newOrder,
|
|
}
|
|
);
|
|
|
|
revalidatePath(`/weekly-checkin/${sessionId}`);
|
|
return { success: true };
|
|
} catch (error) {
|
|
console.error('Error moving weekly check-in item:', error);
|
|
return { success: false, error: 'Erreur lors du déplacement' };
|
|
}
|
|
}
|
|
|
|
export async function reorderWeeklyCheckInItems(
|
|
sessionId: string,
|
|
category: WeeklyCheckInCategory,
|
|
itemIds: string[]
|
|
) {
|
|
const authSession = await auth();
|
|
if (!authSession?.user?.id) {
|
|
return { success: false, error: 'Non autorisé' };
|
|
}
|
|
|
|
// Check edit permission
|
|
const canEdit = await weeklyCheckInService.canEditWeeklyCheckInSession(
|
|
sessionId,
|
|
authSession.user.id
|
|
);
|
|
if (!canEdit) {
|
|
return { success: false, error: 'Permission refusée' };
|
|
}
|
|
|
|
try {
|
|
await weeklyCheckInService.reorderWeeklyCheckInItems(sessionId, category, itemIds);
|
|
|
|
// Emit event for real-time sync
|
|
await weeklyCheckInService.createWeeklyCheckInSessionEvent(
|
|
sessionId,
|
|
authSession.user.id,
|
|
'ITEMS_REORDERED',
|
|
{ category, itemIds }
|
|
);
|
|
|
|
revalidatePath(`/weekly-checkin/${sessionId}`);
|
|
return { success: true };
|
|
} catch (error) {
|
|
console.error('Error reordering weekly check-in items:', error);
|
|
return { success: false, error: 'Erreur lors du réordonnancement' };
|
|
}
|
|
}
|
|
|
|
// ============================================
|
|
// Sharing Actions
|
|
// ============================================
|
|
|
|
export async function shareWeeklyCheckInSession(
|
|
sessionId: string,
|
|
targetEmail: string,
|
|
role: 'VIEWER' | 'EDITOR' = 'EDITOR'
|
|
) {
|
|
const authSession = await auth();
|
|
if (!authSession?.user?.id) {
|
|
return { success: false, error: 'Non autorisé' };
|
|
}
|
|
|
|
try {
|
|
const share = await weeklyCheckInService.shareWeeklyCheckInSession(
|
|
sessionId,
|
|
authSession.user.id,
|
|
targetEmail,
|
|
role
|
|
);
|
|
revalidatePath(`/weekly-checkin/${sessionId}`);
|
|
return { success: true, data: share };
|
|
} catch (error) {
|
|
console.error('Error sharing weekly check-in session:', error);
|
|
const message = error instanceof Error ? error.message : 'Erreur lors du partage';
|
|
return { success: false, error: message };
|
|
}
|
|
}
|
|
|
|
export async function removeWeeklyCheckInShare(sessionId: string, shareUserId: string) {
|
|
const authSession = await auth();
|
|
if (!authSession?.user?.id) {
|
|
return { success: false, error: 'Non autorisé' };
|
|
}
|
|
|
|
try {
|
|
await weeklyCheckInService.removeWeeklyCheckInShare(
|
|
sessionId,
|
|
authSession.user.id,
|
|
shareUserId
|
|
);
|
|
revalidatePath(`/weekly-checkin/${sessionId}`);
|
|
return { success: true };
|
|
} catch (error) {
|
|
console.error('Error removing weekly check-in share:', error);
|
|
return { success: false, error: 'Erreur lors de la suppression du partage' };
|
|
}
|
|
}
|