import { BookingError, emailPattern } from "../services/booking-service.js"; import { json, readJson } from "./bookings.js"; export async function handleReview(request, response, bookings, reviews) { if (request.method !== "POST") { response.setHeader("Allow", "POST"); return json(response, 405, { error: { message: "Bitte POST verwenden." }, }); } try { const input = await readJson(request); if (!input || typeof input !== "object" || Array.isArray(input)) { throw new BookingError( 400, "INVALID_INPUT", "Bitte das Formular ausfüllen.", ); } const fields = {}; const email = typeof input.email === "string" ? input.email.trim().toLowerCase() : ""; if (email.length > 254 || !emailPattern.test(email)) { fields.email = "Bitte eine gültige E-Mail-Adresse eingeben."; } const record = { email }; for (const [field, max, label] of [ ["title", 50, "Titel"], ["review", 500, "Bewertungstext"], ]) { const value = typeof input[field] === "string" ? input[field].trim() : ""; if (value.length < 10 || value.length > max) { fields[field] = `${label}: Bitte 10 bis ${max} Zeichen eingeben.`; } record[field] = value; } if ( !Number.isInteger(input.rating) || input.rating < 1 || input.rating > 5 ) { fields.rating = "Bitte 1 bis 5 Sterne auswählen."; } if (input.consent !== true) { fields.consent = "Bitte die Datenschutzbestimmungen akzeptieren."; } if (Object.keys(fields).length) { throw new BookingError( 400, "INVALID_INPUT", Object.values(fields).join(" "), fields, ); } const customers = await bookings.readAll(); if ( !customers.some( (booking) => booking.email.trim().toLowerCase() === email, ) ) { throw new BookingError( 403, "BOOKING_REQUIRED", "Unter dieser E-Mail-Adresse wurde keine Buchung gefunden. Bitte verwende die E-Mail-Adresse deiner Buchung.", ); } await reviews.append({ ...record, rating: input.rating, consent: true, createdAt: new Date().toISOString(), }); return json(response, 201, { saved: true }); } catch (error) { if (error instanceof BookingError) { return json(response, error.status, { error: { code: error.code, message: error.message, fields: error.fields, }, }); } return json(response, 503, { error: { code: "REVIEW_NOT_SAVED", message: "Die Bewertung konnte nicht gespeichert werden. Bitte versuche es später erneut.", }, }); } }