// frontend/src/services/shiftPlanService.ts import { authService } from './authService'; import { ShiftPlan, CreateShiftPlanRequest, Shift, CreateShiftFromTemplateRequest } from '../models/ShiftPlan'; import { TEMPLATE_PRESETS } from '../models/defaults/shiftPlanDefaults'; const API_BASE = 'http://localhost:3002/api/shift-plans'; // Helper function to get auth headers const getAuthHeaders = () => { const token = localStorage.getItem('token'); return { 'Content-Type': 'application/json', ...(token && { 'Authorization': `Bearer ${token}` }) }; }; // Helper function to handle responses const handleResponse = async (response: Response) => { if (!response.ok) { const errorData = await response.json().catch(() => ({ error: 'Unknown error' })); throw new Error(errorData.error || `HTTP error! status: ${response.status}`); } return response.json(); }; export const shiftPlanService = { async getShiftPlans(): Promise { const response = await fetch(API_BASE, { headers: { 'Content-Type': 'application/json', ...authService.getAuthHeaders() } }); if (!response.ok) { if (response.status === 401) { authService.logout(); throw new Error('Nicht authorisiert - bitte erneut anmelden'); } throw new Error('Fehler beim Laden der Schichtpläne'); } return await response.json(); }, async getShiftPlan(id: string): Promise { const response = await fetch(`${API_BASE}/${id}`, { headers: { 'Content-Type': 'application/json', ...authService.getAuthHeaders() } }); if (!response.ok) { if (response.status === 401) { authService.logout(); throw new Error('Nicht authorisiert - bitte erneut anmelden'); } throw new Error('Schichtplan nicht gefunden'); } return await response.json(); }, async createShiftPlan(plan: CreateShiftPlanRequest): Promise { const response = await fetch(API_BASE, { method: 'POST', headers: { 'Content-Type': 'application/json', ...authService.getAuthHeaders() }, body: JSON.stringify(plan) }); if (!response.ok) { if (response.status === 401) { authService.logout(); throw new Error('Nicht authorisiert - bitte erneut anmelden'); } throw new Error('Fehler beim Erstellen des Schichtplans'); } return response.json(); }, async updateShiftPlan(id: string, plan: Partial): Promise { const response = await fetch(`${API_BASE}/${id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json', ...authService.getAuthHeaders() }, body: JSON.stringify(plan) }); if (!response.ok) { if (response.status === 401) { authService.logout(); throw new Error('Nicht authorisiert - bitte erneut anmelden'); } throw new Error('Fehler beim Aktualisieren des Schichtplans'); } return response.json(); }, async deleteShiftPlan(id: string): Promise { const response = await fetch(`${API_BASE}/${id}`, { method: 'DELETE', headers: { 'Content-Type': 'application/json', ...authService.getAuthHeaders() } }); if (!response.ok) { if (response.status === 401) { authService.logout(); throw new Error('Nicht authorisiert - bitte erneut anmelden'); } throw new Error('Fehler beim Löschen des Schichtplans'); } }, getTemplates: async (): Promise => { const response = await fetch(`${API_BASE}/templates`, { headers: getAuthHeaders() }); return handleResponse(response); }, // Get specific template or plan getTemplate: async (id: string): Promise => { const response = await fetch(`${API_BASE}/${id}`, { headers: getAuthHeaders() }); return handleResponse(response); }, // Create plan from template createFromTemplate: async (data: CreateShiftFromTemplateRequest): Promise => { const response = await fetch(`${API_BASE}/from-template`, { method: 'POST', headers: getAuthHeaders(), body: JSON.stringify(data), }); return handleResponse(response); }, // Create new plan createPlan: async (data: CreateShiftPlanRequest): Promise => { const response = await fetch(`${API_BASE}`, { method: 'POST', headers: getAuthHeaders(), body: JSON.stringify(data), }); return handleResponse(response); }, createFromPreset: async (data: { presetName: string; name: string; startDate: string; endDate: string; isTemplate?: boolean; }): Promise => { const response = await fetch(`${API_BASE}/from-preset`, { method: 'POST', headers: getAuthHeaders(), body: JSON.stringify(data), }); if (!response.ok) { const errorData = await response.json().catch(() => ({ error: 'Unknown error' })); throw new Error(errorData.error || `HTTP error! status: ${response.status}`); } return response.json(); }, getTemplatePresets: async (): Promise<{name: string, label: string, description: string}[]> => { // name = label return Object.entries(TEMPLATE_PRESETS).map(([key, preset]) => ({ name: key, label: preset.name, description: preset.description })); }, };