import { api } from './api'; import type { VeranstaltungKategorie, VeranstaltungListItem, Veranstaltung, GroupInfo, CreateVeranstaltungInput, ConflictEvent, } from '../types/events.types'; // --------------------------------------------------------------------------- // Response shapes from the backend // --------------------------------------------------------------------------- interface ApiResponse { success: boolean; data: T; message?: string; } // --------------------------------------------------------------------------- // Events API service // --------------------------------------------------------------------------- export const eventsApi = { // ------------------------------------------------------------------------- // Kategorien (Categories) // ------------------------------------------------------------------------- /** List all event categories */ getKategorien(): Promise { return api .get>('/api/events/kategorien') .then((r) => r.data.data); }, /** Create a new event category */ createKategorie(data: { name: string; beschreibung?: string; farbe?: string; icon?: string; zielgruppen?: string[]; }): Promise { return api .post>('/api/events/kategorien', data) .then((r) => r.data.data); }, /** Update an existing event category */ updateKategorie( id: string, data: Partial<{ name: string; beschreibung?: string; farbe?: string; icon?: string; zielgruppen?: string[] }> ): Promise { return api .patch>(`/api/events/kategorien/${id}`, data) .then((r) => r.data.data); }, /** Delete an event category */ deleteKategorie(id: string): Promise { return api .delete(`/api/events/kategorien/${id}`) .then(() => undefined); }, // ------------------------------------------------------------------------- // Groups // ------------------------------------------------------------------------- /** List all available target groups */ getGroups(): Promise { return api .get>('/api/events/groups') .then((r) => r.data.data); }, // ------------------------------------------------------------------------- // Event listing // ------------------------------------------------------------------------- /** Events in a date range for the month calendar view */ getCalendarRange(from: Date, to: Date): Promise { return api .get>('/api/events/calendar', { params: { from: from.toISOString(), to: to.toISOString(), }, }) .then((r) => r.data.data); }, /** Upcoming events (dashboard widget, list view) */ getUpcoming(limit = 10): Promise { return api .get>('/api/events/upcoming', { params: { limit }, }) .then((r) => r.data.data); }, /** Full event detail */ getById(id: string): Promise { return api .get>(`/api/events/${id}`) .then((r) => r.data.data); }, // ------------------------------------------------------------------------- // CRUD // ------------------------------------------------------------------------- /** Create a new event */ createEvent(data: CreateVeranstaltungInput): Promise { return api .post>('/api/events', data) .then((r) => r.data.data); }, /** Update an existing event */ updateEvent(id: string, data: Partial): Promise { return api .patch>(`/api/events/${id}`, data) .then((r) => r.data.data); }, /** Cancel (soft-delete) an event with a reason */ cancelEvent(id: string, abgesagt_grund: string): Promise { return api .delete(`/api/events/${id}`, { data: { abgesagt_grund } }) .then(() => undefined); }, /** Hard-delete an event permanently */ deleteEvent(id: string, mode: 'all' | 'single' | 'future' = 'all'): Promise { return api.post(`/api/events/${id}/delete`, { mode }).then(() => undefined); }, // ------------------------------------------------------------------------- // iCal // ------------------------------------------------------------------------- /** Get the user's personal calendar subscribe URL */ getCalendarToken(): Promise<{ token: string; subscribeUrl: string }> { return api .get>( '/api/events/calendar-token' ) .then((r) => r.data.data); }, /** Bulk-import events from CSV-parsed data */ importEvents(events: CreateVeranstaltungInput[]): Promise<{ created: number; errors: string[] }> { return api .post>('/api/events/import', { events }) .then((r) => r.data.data); }, /** Check for overlapping events in a time range */ checkConflicts(from: string, to: string, excludeId?: string): Promise { return api .get>('/api/events/conflicts', { params: { from, to, ...(excludeId ? { excludeId } : {}) }, }) .then((r) => r.data.data); }, };