97 lines
3.2 KiB
JavaScript
97 lines
3.2 KiB
JavaScript
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.",
|
|
},
|
|
});
|
|
}
|
|
}
|