import m from "mithril" /** * Datenmodell für ein Projekt. * Die Feldnamen entsprechen den serverseitigen ORM-Spalten (snake_case). * kunden_name ist keine ORM-Spalte, sondern wird serverseitig aus der * Kunde-Relationship abgeleitet und im JSON ergänzt. */ export interface iProjekt { id: number kunden_id: number kunden_name: string projektname: string zweck: string verantwortlicher: string startdatum: string } /** * In-Memory-Datenspeicher für Projekte. Wird noch von call_log.ts und * kontaktadresse.ts verwendet, bis diese Entitäten ebenfalls auf REST * umgestellt sind. */ export const projektDaten: iProjekt[] = [ {id: 1, kunden_id: 1, kunden_name: "Musterfirma GmbH", projektname: "Website-Relaunch", zweck: "Neugestaltung der Unternehmenswebsite", verantwortlicher: "Max Mustermann", startdatum: "2024-01-15"}, {id: 2, kunden_id: 1, kunden_name: "Musterfirma GmbH", projektname: "E-Commerce Plattform", zweck: "Online-Shop Entwicklung", verantwortlicher: "Anna Schmidt", startdatum: "2024-03-01"}, {id: 3, kunden_id: 2, kunden_name: "Beispiel AG", projektname: "CRM-System", zweck: "Kundenbeziehungsmanagement", verantwortlicher: "Peter Müller", startdatum: "2024-02-20"}, {id: 4, kunden_id: 3, kunden_name: "Test Unternehmen", projektname: "Mobile App", zweck: "iOS und Android Entwicklung", verantwortlicher: "Lisa Bauer", startdatum: "2024-04-10"} ] /** * Liefert die nächste freie Projekt-ID auf Basis des In-Memory-Speichers. * Sobald die serverseitige ID-Vergabe verfügbar ist, entfällt diese Funktion. */ export function getNewProjektId(): number { if (projektDaten.length === 0) { return 1 } return Math.max(...projektDaten.map((projekt: iProjekt) => projekt.id)) + 1 } /** * Fügt ein neues Projekt dem In-Memory-Speicher hinzu. */ export function addProjekt(projekt: iProjekt): void { projektDaten.push(projekt) } /** * Aktualisiert ein bestehendes Projekt im In-Memory-Speicher. */ export function updateProjekt(projekt: iProjekt): void { const index = projektDaten.findIndex((p: iProjekt) => p.id === projekt.id) if (index !== -1) { projektDaten[index] = projekt } } /** * Liefert eine Kopie aller Projekte aus dem In-Memory-Speicher. */ export function getProjekte(): iProjekt[] { return [...projektDaten] } /** * Liefert die Projekte eines bestimmten Kunden. Ist kunden_id null, werden * alle Projekte zurückgegeben. */ export function getProjekteByKundenId(kunden_id: number | null): iProjekt[] { return kunden_id ? projektDaten.filter((p: iProjekt) => p.kunden_id === kunden_id) : [...projektDaten] } /** * Liefert ein einzelnes Projekt anhand seiner ID oder undefined. */ export function getProjektById(id: number): iProjekt | undefined { return projektDaten.find((p: iProjekt) => p.id === id) } /* ------------------------------------------------------------------ */ /* REST-API-Aufrufe (Client-Seite) */ /* ------------------------------------------------------------------ */ /* Die folgenden Funktionen kapseln die Kommunikation mit den */ /* serverseitigen REST-Endpunkten (/xhr/projekt/*). */ /* ------------------------------------------------------------------ */ /** * Basis-Pfad der Projekt-REST-Endpunkte. */ const PROJEKT_REST_BASE = "/xhr/projekt" /** * Lädt die Projektliste vom Server. */ export function fetchProjekte(): Promise { return m.request({ method: "GET", url: PROJEKT_REST_BASE + "/list" }).then((result) => result as iProjekt[]) } /** * Lädt ein einzelnes Projekt anhand seiner ID vom Server. */ export function fetchProjektById(id: number): Promise { return m.request({ method: "GET", url: PROJEKT_REST_BASE + "/get", params: {id: id} }).then((result) => result as iProjekt) } /** * Legt ein neues Projekt serverseitig an. */ export function createProjektREST(projekt: iProjekt): Promise { return m.request({ method: "POST", url: PROJEKT_REST_BASE + "/create", body: projekt }).then((result) => result as iProjekt) } /** * Aktualisiert ein bestehendes Projekt serverseitig. */ export function updateProjektREST(projekt: iProjekt): Promise { return m.request({ method: "PUT", url: PROJEKT_REST_BASE + "/update", body: projekt }).then((result) => result as iProjekt) } /** * Löscht ein Projekt serverseitig anhand seiner ID. */ export function deleteProjektREST(id: number): Promise { return m.request({ method: "DELETE", url: PROJEKT_REST_BASE + "/delete", params: {id: id} }).then(() => undefined) }