From c4b5ad724c418de51c510792534fc5709dd3ebf4 Mon Sep 17 00:00:00 2001
From: Alexis <35.alexis.pele@gmail.com>
Date: Tue, 4 Jun 2024 18:47:54 +0200
Subject: [PATCH] Added delete functions for events
---
components/calendar/CalendarEventDetails.vue | 3 +-
models/CalendarEvent.ts | 2 +-
server/api/calendars/events/[id].delete.ts | 41 ++++++++++++++++++++
stores/EventStore.ts | 16 +++++++-
4 files changed, 59 insertions(+), 3 deletions(-)
create mode 100644 server/api/calendars/events/[id].delete.ts
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 }
})