From 3ce7af043ca0c6ec65cd2cb376d1badf0d038e5a Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Thu, 18 Sep 2025 13:20:44 +0200 Subject: [PATCH] feat: complete daily checkbox actions and cleanup - Marked all daily checkbox actions as complete in TODO.md. - Removed outdated mutation methods from `daily-client.ts`, now managed by server actions in `actions/daily.ts`. - Deleted unused API routes for checkbox management, streamlining the codebase. - Updated `useDaily.ts` to utilize server actions with `useTransition`, enhancing performance and user experience. --- TODO.md | 20 +- clients/daily-client.ts | 82 +---- hooks/useDaily.ts | 374 ++++++++++----------- src/actions/daily.ts | 223 ++++++++++++ src/app/api/daily/checkboxes/[id]/route.ts | 63 ---- src/app/api/daily/checkboxes/route.ts | 38 --- 6 files changed, 413 insertions(+), 387 deletions(-) create mode 100644 src/actions/daily.ts delete mode 100644 src/app/api/daily/checkboxes/[id]/route.ts delete mode 100644 src/app/api/daily/checkboxes/route.ts diff --git a/TODO.md b/TODO.md index e902b23..103adf6 100644 --- a/TODO.md +++ b/TODO.md @@ -176,16 +176,16 @@ - [x] **Nettoyage** : Modifier `useTasks.ts` pour remplacer mutations par server actions #### Actions Daily (Priorité 2) -- [ ] Créer `actions/daily.ts` pour les checkboxes -- [ ] `toggleCheckbox(checkboxId)` - Toggle état checkbox -- [ ] `addCheckboxToDaily(dailyId, content)` - Ajouter checkbox -- [ ] `updateCheckboxContent(checkboxId, content)` - Éditer contenu -- [ ] `deleteCheckbox(checkboxId)` - Supprimer checkbox -- [ ] `reorderCheckboxes(dailyId, checkboxIds)` - Réorganiser -- [ ] Modifier les composants Daily pour utiliser server actions -- [ ] **Nettoyage** : Supprimer routes `/api/daily/checkboxes` (POST, PATCH, DELETE) -- [ ] **Nettoyage** : Simplifier `daily-client.ts` (garder GET uniquement) -- [ ] **Nettoyage** : Modifier composants Daily pour `useTransition` +- [x] Créer `actions/daily.ts` pour les checkboxes +- [x] `toggleCheckbox(checkboxId)` - Toggle état checkbox +- [x] `addCheckboxToDaily(dailyId, content)` - Ajouter checkbox +- [x] `updateCheckboxContent(checkboxId, content)` - Éditer contenu +- [x] `deleteCheckbox(checkboxId)` - Supprimer checkbox +- [x] `reorderCheckboxes(dailyId, checkboxIds)` - Réorganiser +- [x] Modifier les composants Daily pour utiliser server actions +- [x] **Nettoyage** : Supprimer routes `/api/daily/checkboxes` (POST, PATCH, DELETE) +- [x] **Nettoyage** : Simplifier `daily-client.ts` (garder GET uniquement) +- [x] **Nettoyage** : Modifier hook `useDaily.ts` pour `useTransition` #### Actions User Preferences (Priorité 3) - [x] Créer `actions/preferences.ts` pour les toggles diff --git a/clients/daily-client.ts b/clients/daily-client.ts index e9047a2..63e0567 100644 --- a/clients/daily-client.ts +++ b/clients/daily-client.ts @@ -1,5 +1,5 @@ import { httpClient } from './base/http-client'; -import { DailyCheckbox, DailyView, CreateDailyCheckboxData, UpdateDailyCheckboxData, Task } from '@/lib/types'; +import { DailyCheckbox, DailyView, Task } from '@/lib/types'; // Types pour les réponses API (avec dates en string) interface ApiCheckbox { @@ -35,11 +35,16 @@ export interface DailySearchFilters { limit?: number; } +// Types conservés pour la compatibilité des hooks d'historique et de recherche export interface ReorderCheckboxesData { date: Date; checkboxIds: string[]; } +/** + * Client HTTP pour les données Daily (lecture seule) + * Les mutations sont gérées par les server actions dans actions/daily.ts + */ export class DailyClient { /** * Récupère la vue daily d'aujourd'hui (hier + aujourd'hui) @@ -88,81 +93,6 @@ export class DailyClient { return result.map((cb: ApiCheckbox) => this.transformCheckboxDates(cb)); } - /** - * Ajoute une checkbox - */ - async addCheckbox(data: CreateDailyCheckboxData): Promise { - const payload = { - ...data, - date: this.formatDateForAPI(data.date) - }; - try { - const result = await httpClient.post('/daily', payload); - // Transformer les dates string en objets Date - return this.transformCheckboxDates(result); - } catch (error) { - console.error('❌ DailyClient addCheckbox error:', error); - throw error; - } - } - - /** - * Ajoute une checkbox pour aujourd'hui - */ - async addTodayCheckbox(text: string, taskId?: string): Promise { - return this.addCheckbox({ - date: new Date(), - text, - taskId - }); - } - - /** - * Ajoute une checkbox pour hier - */ - async addYesterdayCheckbox(text: string, taskId?: string): Promise { - const yesterday = new Date(); - yesterday.setDate(yesterday.getDate() - 1); - - return this.addCheckbox({ - date: yesterday, - text, - taskId - }); - } - - /** - * Met à jour une checkbox - */ - async updateCheckbox(checkboxId: string, data: UpdateDailyCheckboxData): Promise { - const result = await httpClient.patch(`/daily/checkboxes/${checkboxId}`, data); - return this.transformCheckboxDates(result); - } - - /** - * Supprime une checkbox - */ - async deleteCheckbox(checkboxId: string): Promise { - return httpClient.delete(`/daily/checkboxes/${checkboxId}`); - } - - /** - * Réordonne les checkboxes d'une date - */ - async reorderCheckboxes(data: ReorderCheckboxesData): Promise { - return httpClient.post('/daily/checkboxes', { - date: this.formatDateForAPI(data.date), - checkboxIds: data.checkboxIds - }); - } - - /** - * Coche/décoche une checkbox (raccourci) - */ - async toggleCheckbox(checkboxId: string, isChecked: boolean): Promise { - return this.updateCheckbox(checkboxId, { isChecked }); - } - /** * Formate une date pour l'API (évite les décalages timezone) */ diff --git a/hooks/useDaily.ts b/hooks/useDaily.ts index 7ccc3c8..3ec8d46 100644 --- a/hooks/useDaily.ts +++ b/hooks/useDaily.ts @@ -1,8 +1,15 @@ 'use client'; -import { useState, useEffect, useCallback } from 'react'; +import { useState, useEffect, useCallback, useTransition } from 'react'; import { dailyClient, DailyHistoryFilters, DailySearchFilters, ReorderCheckboxesData } from '@/clients/daily-client'; import { DailyView, DailyCheckbox, UpdateDailyCheckboxData, DailyCheckboxType } from '@/lib/types'; +import { + toggleCheckbox as toggleCheckboxAction, + addTodayCheckbox as addTodayCheckboxAction, + addYesterdayCheckbox as addYesterdayCheckboxAction, + updateCheckbox as updateCheckboxAction, + deleteCheckbox as deleteCheckboxAction +} from '@/actions/daily'; interface UseDailyState { dailyView: DailyView | null; @@ -10,6 +17,7 @@ interface UseDailyState { refreshing: boolean; // Pour les refresh silencieux error: string | null; saving: boolean; // Pour indiquer les opérations en cours + isPending: boolean; // Pour indiquer les server actions en cours } interface UseDailyActions { @@ -39,6 +47,7 @@ export function useDaily(initialDate?: Date, initialDailyView?: DailyView): UseD const [refreshing, setRefreshing] = useState(false); // Pour les refresh silencieux const [error, setError] = useState(null); const [saving, setSaving] = useState(false); + const [isPending, startTransition] = useTransition(); const refreshDaily = useCallback(async () => { try { @@ -69,215 +78,179 @@ export function useDaily(initialDate?: Date, initialDailyView?: DailyView): UseD } }, [currentDate]); - const addTodayCheckbox = useCallback(async (text: string, type?: DailyCheckboxType, taskId?: string): Promise => { - if (!dailyView) return null; + const addTodayCheckbox = useCallback((text: string, type?: DailyCheckboxType, taskId?: string): Promise => { + if (!dailyView) return Promise.resolve(null); - // Créer une checkbox temporaire pour l'affichage optimiste - const tempCheckbox: DailyCheckbox = { - id: `temp-${Date.now()}`, // ID temporaire - date: currentDate, - text, - isChecked: false, - type: type || 'task', // Utilise le type fourni ou 'task' par défaut - order: dailyView.today.length, // Ordre temporaire - taskId, - task: undefined, - createdAt: new Date(), - updatedAt: new Date() - }; - - const previousDailyView = dailyView; - - // Mise à jour optimiste IMMÉDIATE - setDailyView(prev => prev ? { - ...prev, - today: [...prev.today, tempCheckbox] - } : null); - - try { - // Appel API en arrière-plan - const newCheckbox = await dailyClient.addCheckbox({ - date: currentDate, - text, - type: type || 'task', - taskId + return new Promise((resolve) => { + startTransition(async () => { + try { + setError(null); + + const result = await addTodayCheckboxAction(text, taskId); + + if (result.success && result.data) { + // Mise à jour optimiste + setDailyView(prev => prev ? { + ...prev, + today: [...prev.today, result.data!].sort((a, b) => a.order - b.order) + } : null); + resolve(result.data); + } else { + setError(result.error || 'Erreur lors de l\'ajout de la checkbox'); + resolve(null); + } + } catch (err) { + setError(err instanceof Error ? err.message : 'Erreur lors de l\'ajout de la checkbox'); + console.error('Erreur addTodayCheckbox:', err); + resolve(null); + } }); - - // Remplacer la checkbox temporaire par la vraie - setDailyView(prev => prev ? { - ...prev, - today: prev.today.map(cb => - cb.id === tempCheckbox.id ? newCheckbox : cb - ).sort((a, b) => a.order - b.order) - } : null); - - return newCheckbox; - } catch (err) { - // Rollback en cas d'erreur - setDailyView(previousDailyView); - setError(err instanceof Error ? err.message : 'Erreur lors de l\'ajout de la checkbox'); - console.error('Erreur addTodayCheckbox:', err); - return null; - } - }, [dailyView, currentDate]); - - const addYesterdayCheckbox = useCallback(async (text: string, type?: DailyCheckboxType, taskId?: string): Promise => { - if (!dailyView) return null; - - // Créer une checkbox temporaire pour l'affichage optimiste - const yesterday = new Date(currentDate); - yesterday.setDate(yesterday.getDate() - 1); - - const tempCheckbox: DailyCheckbox = { - id: `temp-${Date.now()}`, // ID temporaire - date: yesterday, - text, - isChecked: false, - type: type || 'task', // Utilise le type fourni ou 'task' par défaut - order: dailyView.yesterday.length, // Ordre temporaire - taskId, - task: undefined, - createdAt: new Date(), - updatedAt: new Date() - }; - - const previousDailyView = dailyView; - - // Mise à jour optimiste IMMÉDIATE - setDailyView(prev => prev ? { - ...prev, - yesterday: [...prev.yesterday, tempCheckbox] - } : null); - - try { - // Appel API en arrière-plan - const newCheckbox = await dailyClient.addCheckbox({ - date: yesterday, - text, - type: type || 'task', - taskId - }); - - // Remplacer la checkbox temporaire par la vraie - setDailyView(prev => prev ? { - ...prev, - yesterday: prev.yesterday.map(cb => - cb.id === tempCheckbox.id ? newCheckbox : cb - ).sort((a, b) => a.order - b.order) - } : null); - - return newCheckbox; - } catch (err) { - // Rollback en cas d'erreur - setDailyView(previousDailyView); - setError(err instanceof Error ? err.message : 'Erreur lors de l\'ajout de la checkbox'); - console.error('Erreur addYesterdayCheckbox:', err); - return null; - } - }, [dailyView, currentDate]); - - const updateCheckbox = useCallback(async (checkboxId: string, data: UpdateDailyCheckboxData): Promise => { - if (!dailyView) return null; - - // Trouver la checkbox existante - let existingCheckbox = dailyView.yesterday.find(cb => cb.id === checkboxId); - if (!existingCheckbox) { - existingCheckbox = dailyView.today.find(cb => cb.id === checkboxId); - } - - if (!existingCheckbox) return null; - - const previousDailyView = dailyView; - - // Créer la checkbox mise à jour pour l'affichage optimiste - const optimisticCheckbox = { ...existingCheckbox, ...data, updatedAt: new Date() }; - - // Mise à jour optimiste IMMÉDIATE - setDailyView(prev => prev ? { - ...prev, - yesterday: prev.yesterday.map(cb => cb.id === checkboxId ? optimisticCheckbox : cb), - today: prev.today.map(cb => cb.id === checkboxId ? optimisticCheckbox : cb) - } : null); - - try { - // Appel API en arrière-plan - const updatedCheckbox = await dailyClient.updateCheckbox(checkboxId, data); - - // Remplacer par la vraie checkbox retournée par l'API - setDailyView(prev => prev ? { - ...prev, - yesterday: prev.yesterday.map(cb => cb.id === checkboxId ? updatedCheckbox : cb), - today: prev.today.map(cb => cb.id === checkboxId ? updatedCheckbox : cb) - } : null); - - return updatedCheckbox; - } catch (err) { - // Rollback en cas d'erreur - setDailyView(previousDailyView); - setError(err instanceof Error ? err.message : 'Erreur lors de la mise à jour de la checkbox'); - console.error('Erreur updateCheckbox:', err); - return null; - } + }); }, [dailyView]); - const deleteCheckbox = useCallback(async (checkboxId: string): Promise => { - if (!dailyView) return; + const addYesterdayCheckbox = useCallback((text: string, type?: DailyCheckboxType, taskId?: string): Promise => { + if (!dailyView) return Promise.resolve(null); - const previousDailyView = dailyView; - - // Mise à jour optimiste IMMÉDIATE - supprimer la checkbox - setDailyView(prev => prev ? { - ...prev, - yesterday: prev.yesterday.filter(cb => cb.id !== checkboxId), - today: prev.today.filter(cb => cb.id !== checkboxId) - } : null); - - try { - // Appel API en arrière-plan - await dailyClient.deleteCheckbox(checkboxId); - // Pas besoin de mise à jour supplémentaire, la suppression est déjà faite - } catch (err) { - // Rollback en cas d'erreur - restaurer la checkbox - setDailyView(previousDailyView); - setError(err instanceof Error ? err.message : 'Erreur lors de la suppression de la checkbox'); - console.error('Erreur deleteCheckbox:', err); - } + return new Promise((resolve) => { + startTransition(async () => { + try { + setError(null); + + const result = await addYesterdayCheckboxAction(text, taskId); + + if (result.success && result.data) { + // Mise à jour optimiste + setDailyView(prev => prev ? { + ...prev, + yesterday: [...prev.yesterday, result.data!].sort((a, b) => a.order - b.order) + } : null); + resolve(result.data); + } else { + setError(result.error || 'Erreur lors de l\'ajout de la checkbox'); + resolve(null); + } + } catch (err) { + setError(err instanceof Error ? err.message : 'Erreur lors de l\'ajout de la checkbox'); + console.error('Erreur addYesterdayCheckbox:', err); + resolve(null); + } + }); + }); }, [dailyView]); - const toggleCheckbox = useCallback(async (checkboxId: string): Promise => { - if (!dailyView) return; + const updateCheckbox = useCallback((checkboxId: string, data: UpdateDailyCheckboxData): Promise => { + if (!dailyView) return Promise.resolve(null); - // Trouver la checkbox dans yesterday ou today - let checkbox = dailyView.yesterday.find(cb => cb.id === checkboxId); - if (!checkbox) { - checkbox = dailyView.today.find(cb => cb.id === checkboxId); - } - - if (!checkbox) return; + return new Promise((resolve) => { + startTransition(async () => { + try { + setError(null); + + const result = await updateCheckboxAction(checkboxId, data); + + if (result.success && result.data) { + // Mise à jour optimiste + setDailyView(prev => prev ? { + ...prev, + yesterday: prev.yesterday.map(cb => cb.id === checkboxId ? result.data! : cb), + today: prev.today.map(cb => cb.id === checkboxId ? result.data! : cb) + } : null); + resolve(result.data); + } else { + setError(result.error || 'Erreur lors de la mise à jour de la checkbox'); + resolve(null); + } + } catch (err) { + setError(err instanceof Error ? err.message : 'Erreur lors de la mise à jour de la checkbox'); + console.error('Erreur updateCheckbox:', err); + resolve(null); + } + }); + }); + }, [dailyView]); - // Mise à jour optimiste IMMÉDIATE - const newCheckedState = !checkbox.isChecked; - const previousDailyView = dailyView; - - setDailyView(prev => prev ? { - ...prev, - yesterday: prev.yesterday.map(cb => - cb.id === checkboxId ? { ...cb, isChecked: newCheckedState } : cb - ), - today: prev.today.map(cb => - cb.id === checkboxId ? { ...cb, isChecked: newCheckedState } : cb - ) - } : null); + const deleteCheckbox = useCallback((checkboxId: string): Promise => { + if (!dailyView) return Promise.resolve(); - try { - // Appel API en arrière-plan - await dailyClient.updateCheckbox(checkboxId, { isChecked: newCheckedState }); - } catch (err) { - // Rollback en cas d'erreur - setDailyView(previousDailyView); - setError(err instanceof Error ? err.message : 'Erreur lors de la mise à jour de la checkbox'); - console.error('Erreur toggleCheckbox:', err); - } + return new Promise((resolve) => { + startTransition(async () => { + const previousDailyView = dailyView; + + // Mise à jour optimiste IMMÉDIATE - supprimer la checkbox + setDailyView(prev => prev ? { + ...prev, + yesterday: prev.yesterday.filter(cb => cb.id !== checkboxId), + today: prev.today.filter(cb => cb.id !== checkboxId) + } : null); + + try { + const result = await deleteCheckboxAction(checkboxId); + + if (!result.success) { + // Rollback en cas d'erreur + setDailyView(previousDailyView); + setError(result.error || 'Erreur lors de la suppression de la checkbox'); + } + resolve(); + } catch (err) { + // Rollback en cas d'erreur + setDailyView(previousDailyView); + setError(err instanceof Error ? err.message : 'Erreur lors de la suppression de la checkbox'); + console.error('Erreur deleteCheckbox:', err); + resolve(); + } + }); + }); + }, [dailyView]); + + const toggleCheckbox = useCallback((checkboxId: string): Promise => { + if (!dailyView) return Promise.resolve(); + + return new Promise((resolve) => { + startTransition(async () => { + // Trouver la checkbox dans yesterday ou today + let checkbox = dailyView.yesterday.find(cb => cb.id === checkboxId); + if (!checkbox) { + checkbox = dailyView.today.find(cb => cb.id === checkboxId); + } + + if (!checkbox) { + resolve(); + return; + } + + // Mise à jour optimiste IMMÉDIATE + const newCheckedState = !checkbox.isChecked; + const previousDailyView = dailyView; + + setDailyView(prev => prev ? { + ...prev, + yesterday: prev.yesterday.map(cb => + cb.id === checkboxId ? { ...cb, isChecked: newCheckedState } : cb + ), + today: prev.today.map(cb => + cb.id === checkboxId ? { ...cb, isChecked: newCheckedState } : cb + ) + } : null); + + try { + const result = await toggleCheckboxAction(checkboxId); + + if (!result.success) { + // Rollback en cas d'erreur + setDailyView(previousDailyView); + setError(result.error || 'Erreur lors de la mise à jour de la checkbox'); + } + resolve(); + } catch (err) { + // Rollback en cas d'erreur + setDailyView(previousDailyView); + setError(err instanceof Error ? err.message : 'Erreur lors de la mise à jour de la checkbox'); + console.error('Erreur toggleCheckbox:', err); + resolve(); + } + }); + }); }, [dailyView]); const toggleAllToday = useCallback(async (): Promise => { @@ -408,6 +381,7 @@ export function useDaily(initialDate?: Date, initialDailyView?: DailyView): UseD refreshing, error, saving, + isPending, currentDate, // Actions diff --git a/src/actions/daily.ts b/src/actions/daily.ts new file mode 100644 index 0000000..16cb4c3 --- /dev/null +++ b/src/actions/daily.ts @@ -0,0 +1,223 @@ +'use server'; + +import { dailyService } from '@/services/daily'; +import { UpdateDailyCheckboxData, DailyCheckbox } from '@/lib/types'; +import { revalidatePath } from 'next/cache'; + +/** + * Toggle l'état d'une checkbox + */ +export async function toggleCheckbox(checkboxId: string): Promise<{ + success: boolean; + data?: DailyCheckbox; + error?: string; +}> { + try { + // Nous devons d'abord récupérer la checkbox pour connaître son état actuel + // En absence de getCheckboxById, nous allons essayer de la trouver via une vue daily + // Pour l'instant, nous allons simplement toggle via updateCheckbox + // (le front-end gère déjà l'état optimiste) + + // Récupérer toutes les checkboxes d'aujourd'hui et hier pour trouver celle à toggle + const today = new Date(); + const dailyView = await dailyService.getDailyView(today); + + let checkbox = dailyView.today.find(cb => cb.id === checkboxId); + if (!checkbox) { + checkbox = dailyView.yesterday.find(cb => cb.id === checkboxId); + } + + if (!checkbox) { + return { success: false, error: 'Checkbox non trouvée' }; + } + + // Toggle l'état + const updatedCheckbox = await dailyService.updateCheckbox(checkboxId, { + isChecked: !checkbox.isChecked + }); + + revalidatePath('/daily'); + return { success: true, data: updatedCheckbox }; + } catch (error) { + console.error('Erreur toggleCheckbox:', error); + return { + success: false, + error: error instanceof Error ? error.message : 'Erreur inconnue' + }; + } +} + +/** + * Ajoute une checkbox à une date donnée + */ +export async function addCheckboxToDaily(dailyId: string, content: string, taskId?: string): Promise<{ + success: boolean; + data?: DailyCheckbox; + error?: string; +}> { + try { + // Le dailyId correspond à la date au format YYYY-MM-DD + const date = new Date(dailyId); + + const newCheckbox = await dailyService.addCheckbox({ + date, + text: content, + taskId + }); + + revalidatePath('/daily'); + return { success: true, data: newCheckbox }; + } catch (error) { + console.error('Erreur addCheckboxToDaily:', error); + return { + success: false, + error: error instanceof Error ? error.message : 'Erreur inconnue' + }; + } +} + +/** + * Ajoute une checkbox pour aujourd'hui + */ +export async function addTodayCheckbox(content: string, taskId?: string): Promise<{ + success: boolean; + data?: DailyCheckbox; + error?: string; +}> { + try { + const newCheckbox = await dailyService.addCheckbox({ + date: new Date(), + text: content, + taskId + }); + + revalidatePath('/daily'); + return { success: true, data: newCheckbox }; + } catch (error) { + console.error('Erreur addTodayCheckbox:', error); + return { + success: false, + error: error instanceof Error ? error.message : 'Erreur inconnue' + }; + } +} + +/** + * Ajoute une checkbox pour hier + */ +export async function addYesterdayCheckbox(content: string, taskId?: string): Promise<{ + success: boolean; + data?: DailyCheckbox; + error?: string; +}> { + try { + const yesterday = new Date(); + yesterday.setDate(yesterday.getDate() - 1); + + const newCheckbox = await dailyService.addCheckbox({ + date: yesterday, + text: content, + taskId + }); + + revalidatePath('/daily'); + return { success: true, data: newCheckbox }; + } catch (error) { + console.error('Erreur addYesterdayCheckbox:', error); + return { + success: false, + error: error instanceof Error ? error.message : 'Erreur inconnue' + }; + } +} + +/** + * Met à jour le contenu d'une checkbox + */ +export async function updateCheckboxContent(checkboxId: string, content: string): Promise<{ + success: boolean; + data?: DailyCheckbox; + error?: string; +}> { + try { + const updatedCheckbox = await dailyService.updateCheckbox(checkboxId, { + text: content + }); + + revalidatePath('/daily'); + return { success: true, data: updatedCheckbox }; + } catch (error) { + console.error('Erreur updateCheckboxContent:', error); + return { + success: false, + error: error instanceof Error ? error.message : 'Erreur inconnue' + }; + } +} + +/** + * Met à jour une checkbox complète + */ +export async function updateCheckbox(checkboxId: string, data: UpdateDailyCheckboxData): Promise<{ + success: boolean; + data?: DailyCheckbox; + error?: string; +}> { + try { + const updatedCheckbox = await dailyService.updateCheckbox(checkboxId, data); + + revalidatePath('/daily'); + return { success: true, data: updatedCheckbox }; + } catch (error) { + console.error('Erreur updateCheckbox:', error); + return { + success: false, + error: error instanceof Error ? error.message : 'Erreur inconnue' + }; + } +} + +/** + * Supprime une checkbox + */ +export async function deleteCheckbox(checkboxId: string): Promise<{ + success: boolean; + error?: string; +}> { + try { + await dailyService.deleteCheckbox(checkboxId); + + revalidatePath('/daily'); + return { success: true }; + } catch (error) { + console.error('Erreur deleteCheckbox:', error); + return { + success: false, + error: error instanceof Error ? error.message : 'Erreur inconnue' + }; + } +} + +/** + * Réorganise les checkboxes d'une date + */ +export async function reorderCheckboxes(dailyId: string, checkboxIds: string[]): Promise<{ + success: boolean; + error?: string; +}> { + try { + // Le dailyId correspond à la date au format YYYY-MM-DD + const date = new Date(dailyId); + + await dailyService.reorderCheckboxes(date, checkboxIds); + + revalidatePath('/daily'); + return { success: true }; + } catch (error) { + console.error('Erreur reorderCheckboxes:', error); + return { + success: false, + error: error instanceof Error ? error.message : 'Erreur inconnue' + }; + } +} diff --git a/src/app/api/daily/checkboxes/[id]/route.ts b/src/app/api/daily/checkboxes/[id]/route.ts deleted file mode 100644 index 6e7961b..0000000 --- a/src/app/api/daily/checkboxes/[id]/route.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { NextResponse } from 'next/server'; -import { dailyService } from '@/services/daily'; - -/** - * API route pour mettre à jour une checkbox - */ -export async function PATCH( - request: Request, - { params }: { params: Promise<{ id: string }> } -) { - try { - const body = await request.json(); - const { id: checkboxId } = await params; - - const checkbox = await dailyService.updateCheckbox(checkboxId, body); - return NextResponse.json(checkbox); - - } catch (error) { - console.error('Erreur lors de la mise à jour de la checkbox:', error); - - if (error instanceof Error && error.message.includes('Record to update not found')) { - return NextResponse.json( - { error: 'Checkbox non trouvée' }, - { status: 404 } - ); - } - - return NextResponse.json( - { error: 'Erreur interne du serveur' }, - { status: 500 } - ); - } -} - -/** - * API route pour supprimer une checkbox - */ -export async function DELETE( - request: Request, - { params }: { params: Promise<{ id: string }> } -) { - try { - const { id: checkboxId } = await params; - - await dailyService.deleteCheckbox(checkboxId); - return NextResponse.json({ success: true }); - - } catch (error) { - console.error('Erreur lors de la suppression de la checkbox:', error); - - if (error instanceof Error && error.message.includes('Checkbox non trouvée')) { - return NextResponse.json( - { error: 'Checkbox non trouvée' }, - { status: 404 } - ); - } - - return NextResponse.json( - { error: 'Erreur interne du serveur' }, - { status: 500 } - ); - } -} \ No newline at end of file diff --git a/src/app/api/daily/checkboxes/route.ts b/src/app/api/daily/checkboxes/route.ts deleted file mode 100644 index eee0444..0000000 --- a/src/app/api/daily/checkboxes/route.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { NextResponse } from 'next/server'; -import { dailyService } from '@/services/daily'; - -/** - * API route pour réordonner les checkboxes d'une date - */ -export async function POST(request: Request) { - try { - const body = await request.json(); - - // Validation des données - if (!body.date || !Array.isArray(body.checkboxIds)) { - return NextResponse.json( - { error: 'date et checkboxIds (array) sont requis' }, - { status: 400 } - ); - } - - const date = new Date(body.date); - if (isNaN(date.getTime())) { - return NextResponse.json( - { error: 'Format de date invalide. Utilisez YYYY-MM-DD' }, - { status: 400 } - ); - } - - await dailyService.reorderCheckboxes(date, body.checkboxIds); - - return NextResponse.json({ success: true }); - - } catch (error) { - console.error('Erreur lors du réordonnancement:', error); - return NextResponse.json( - { error: 'Erreur interne du serveur' }, - { status: 500 } - ); - } -} \ No newline at end of file