import { api } from 'src/boot/axios'; import { AxiosError } from 'axios'; import { defineStore } from 'pinia'; interface UserService { user: FG.Service; } function fixJob(job: FG.Job) { job.start = new Date(job.start); if (job.end) job.end = new Date(job.end); } function fixEvent(event: FG.Event) { event.start = new Date(event.start); if (event.end) event.end = new Date(event.end); event.jobs.forEach((job) => fixJob(job)); } export const useScheduleStore = defineStore({ id: 'schedule', state: () => ({ jobTypes: [] as FG.JobType[], eventTypes: [] as FG.EventType[], templates: [] as FG.Event[], }), getters: {}, actions: { async getJobTypes(force = false) { if (force || this.jobTypes.length == 0) try { const { data } = await api.get('/schedule/job-types'); this.jobTypes = data; } catch (error) { throw error; } return this.jobTypes; }, async addJobType(name: string) { await api.post('/schedule/job-types', { name: name }); //TODO: HAndle new JT }, async removeJobType(id: number) { await api.delete(`/schedule/job-types/${id}`); //Todo Handle delete JT }, async renameJobType(id: number, newName: string) { await api.put(`/schedule/job-types/${id}`, { name: newName }); // TODO handle rename }, async getEventTypes(force = false) { if (force || this.eventTypes.length == 0) try { const { data } = await api.get('/schedule/event-types'); this.eventTypes = data; } catch (error) { throw error; } return this.eventTypes; }, /** Add new EventType * * @param name Name of new EventType * @returns EventType object or null if name already exists * @throws Exception if requests fails because of an other reason */ async addEventType(name: string) { try { const { data } = await api.post('/schedule/event-types', { name: name }); return data; } catch (error) { if ('response' in error) { const ae = error; if (ae.response && ae.response.status == 409 /* CONFLICT */) return null; } throw error; } }, async removeEventType(id: number) { await api.delete(`/schedule/event-types/${id}`); // TODO handle delete }, async renameEventType(id: number, newName: string) { try { await api.put(`/schedule/event-types/${id}`, { name: newName }); // TODO handle rename return true; } catch (error) { if ('response' in error) { const ae = error; if (ae.response && ae.response.status == 409 /* CONFLICT */) return false; } throw error; } }, async getTemplates(force = false) { if (force || this.templates.length == 0) { const { data } = await api.get('/schedule/templates'); data.forEach((element) => fixEvent(element)); this.templates = data; } return this.templates; }, async getEvents(filter: { from?: Date; to?: Date } | undefined = undefined) { try { const { data } = await api.get('/schedule/events', { params: filter }); data.forEach((element) => fixEvent(element)); return data; } catch (error) { throw error; } }, async updateJob(eventId: number, jobId: number, service: FG.Service | UserService) { try { const { data } = await api.put( `/schedule/events/${eventId}/jobs/${jobId}`, service ); fixJob(data); return data; } catch (error) { throw error; } }, async addEvent(event: FG.Event) { const { data } = await api.post('/schedule/events', event); if (data.is_template) this.templates.push(data); return data; }, }, });