feat: add Go microservice, Dockerfile, docker-compose, and API submission endpoint

This commit is contained in:
2026-08-12 17:20:03 +02:00
parent ad02939b88
commit 0ee82eb673
24 changed files with 316 additions and 6 deletions
+100
View File
@@ -0,0 +1,100 @@
// Checkout & Bestätigungsseite
(function () {
const backLink = document.getElementById("backLink");
const summarySection = document.getElementById("summarySection");
const confirmationSection = document.getElementById("confirmationSection");
const summaryActivity = document.getElementById("summaryActivity");
const summaryDate = document.getElementById("summaryDate");
const summaryName = document.getElementById("summaryName");
const activityIcon = document.getElementById("activityIcon");
const checkoutBtn = document.getElementById("checkoutBtn");
const selectedActivity = localStorage.getItem("selectedActivity");
const selectedDate = localStorage.getItem("selectedDate");
const selectedName = localStorage.getItem("selectedName");
if (!selectedActivity || !selectedDate || !selectedName) {
window.location.href = "index.html";
return;
}
summaryActivity.textContent = selectedActivity;
summaryName.textContent = selectedName;
const dateObj = new Date(`${selectedDate}T00:00:00`);
const formattedDate = dateObj.toLocaleDateString("de-DE", {
weekday: "long",
day: "numeric",
month: "long",
year: "numeric",
});
summaryDate.textContent = formattedDate;
// Icons aus selectedActivities oder appsettings.json laden
let storedActivities = [];
try {
storedActivities = JSON.parse(localStorage.getItem("selectedActivities") || "[]");
} catch (e) {}
if (storedActivities.length > 0) {
activityIcon.textContent = storedActivities.map((a) => a.icon).join(" ");
} else {
fetch("appsettings.json")
.then((res) => res.json())
.then((settings) => {
const match = (settings.activities || []).find((a) => a.name === selectedActivity);
if (match && match.icon) {
activityIcon.textContent = match.icon;
}
})
.catch(() => {});
}
checkoutBtn.addEventListener("click", () => {
checkoutBtn.disabled = true;
const originalText = checkoutBtn.textContent;
checkoutBtn.textContent = "Wird übermittelt... 💌";
const payload = {
activity: selectedActivity,
activities: storedActivities,
date: selectedDate,
dateType: localStorage.getItem("selectedDateType") || "long",
name: selectedName,
};
fetch("/api/submit", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
})
.then((res) => {
if (!res.ok) {
throw new Error("Fehler beim Übermitteln.");
}
return res.json();
})
.then((data) => {
if (data.success) {
summarySection.classList.add("hidden");
if (backLink) {
backLink.classList.add("hidden");
}
confirmationSection.classList.remove("hidden");
} else {
alert(data.message || "Es gab ein Problem bei der Übermittlung.");
checkoutBtn.disabled = false;
checkoutBtn.textContent = originalText;
}
})
.catch((err) => {
console.error("Submission error:", err);
alert("Übermittlung fehlgeschlagen. Bitte versuche es erneut.");
checkoutBtn.disabled = false;
checkoutBtn.textContent = originalText;
});
});
})();