diff --git a/components/calendar/CalendarEventDetails.vue b/components/calendar/CalendarEventDetails.vue index 793dcfe..9816ace 100644 --- a/components/calendar/CalendarEventDetails.vue +++ b/components/calendar/CalendarEventDetails.vue @@ -12,6 +12,7 @@ import { } from '@phosphor-icons/vue' const { defaultDate, getFormattedDateTitle, jumpToDate, revealEditEventModal, getRelativeString } = useCalendar() +const { deleteEvent } = useCalendarEvents() const { lastActiveEvent } = storeToRefs(useCalendarEvents()) const props = defineProps<{ @@ -145,7 +146,7 @@ function deployEditModal() { Modifier - Supprimer + Supprimer diff --git a/models/CalendarEvent.ts b/models/CalendarEvent.ts index 618ce65..e5f751a 100644 --- a/models/CalendarEvent.ts +++ b/models/CalendarEvent.ts @@ -24,7 +24,7 @@ export const postEventBodySchema = z.object({ startDate: dateSchema.required(), endDate: dateSchema.optional().nullable() }), - calendarId: z.number().int().positive() + calendarId: z.number({ coerce: true }).int().positive() }) // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/server/api/calendars/events/[id].delete.ts b/server/api/calendars/events/[id].delete.ts new file mode 100644 index 0000000..7a15913 --- /dev/null +++ b/server/api/calendars/events/[id].delete.ts @@ -0,0 +1,41 @@ +import { z } from 'zod' +import { serverSupabaseClient } from "#supabase/server" +import type { CalendarEvent } from "~/models/CalendarEvent" + +const paramsSchema = z.object({ + id: z.number({ coerce: true }).positive().int() +}) + +export default defineEventHandler(async (event) => { + const client = await serverSupabaseClient(event) + + const { data: params, error: paramsError} = await getValidatedRouterParams(event, paramsSchema.safeParse) + + if (paramsError) { + throw createError({ + cause: 'Utilisateur', + fatal: false, + message: "L'identifiant de l'évènement est manquant ou mal renseigné.", + status: 401, + }) + } + + try { + const { data, error } = await client + .from('calendar_events') + .delete() + .eq('id', params.id) + .single() + + if (error) throw error + + return data + } catch (err) { + throw createError({ + cause: 'Serveur', + status: 500, + fatal: false, + message: 'Une erreur inconnue est survenue.' + }) + } +}) diff --git a/stores/EventStore.ts b/stores/EventStore.ts index 4d48e47..d703b5a 100644 --- a/stores/EventStore.ts +++ b/stores/EventStore.ts @@ -205,5 +205,19 @@ export const useCalendarEvents = defineStore('calendar-events', () => { } } - return { allEvents, setEvents, currentEvents, getRelativeEventFromDate, getRelativeEventFromEvent, eventSkeleton, resetSkeleton, submitSkeleton, lastActiveEvent, updateEventFromSkeleton } + async function deleteEvent(eventId: number) { + if (!eventId) { + throw new Error('ID of the event is required') + } + + try { + await $fetch(`/api/calendars/events/${eventId}`, { method: 'DELETE' }) + const eventIndex = baseEvents.value.findIndex(e => e.id === eventId) + baseEvents.value.splice(eventIndex, 1) + } catch (err) { + console.log(err) + } + } + + return { allEvents, setEvents, currentEvents, getRelativeEventFromDate, getRelativeEventFromEvent, eventSkeleton, resetSkeleton, submitSkeleton, lastActiveEvent, updateEventFromSkeleton, deleteEvent } })