Refactor code analysis workflow by adding gitleaks detection command and removing obsolete output files to streamline the build process and enhance security checks.
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 3m34s

This commit is contained in:
Torsten Schulz (local)
2025-12-20 15:29:58 +01:00
parent 9e5ccbe8a3
commit 111c8c239c
122 changed files with 6 additions and 22791 deletions

View File

@@ -1,152 +0,0 @@
import bcrypt from 'bcryptjs';
import jwt from 'jsonwebtoken';
import { promises } from 'fs';
import path from 'path';
import { d as decryptObject, a as encryptObject } from './encryption.mjs';
const JWT_SECRET = process.env.JWT_SECRET || "harheimertc-secret-key-change-in-production";
const getDataPath = (filename) => {
const cwd = process.cwd();
if (cwd.endsWith(".output")) {
return path.join(cwd, "../server/data", filename);
}
return path.join(cwd, "server/data", filename);
};
const USERS_FILE = getDataPath("users.json");
const SESSIONS_FILE = getDataPath("sessions.json");
function getEncryptionKey() {
return process.env.ENCRYPTION_KEY || "default-key-change-in-production";
}
function isEncrypted(data) {
try {
const parsed = JSON.parse(data.trim());
if (Array.isArray(parsed)) {
return false;
}
if (typeof parsed === "object" && parsed !== null && !parsed.encryptedData) {
return false;
}
return false;
} catch (e) {
return true;
}
}
async function readUsers() {
try {
const data = await promises.readFile(USERS_FILE, "utf-8");
const encrypted = isEncrypted(data);
if (encrypted) {
const encryptionKey = getEncryptionKey();
try {
return decryptObject(data, encryptionKey);
} catch (decryptError) {
console.error("Fehler beim Entschl\xFCsseln der Benutzerdaten:", decryptError);
try {
const plainData = JSON.parse(data);
console.warn("Entschl\xFCsselung fehlgeschlagen, versuche als unverschl\xFCsseltes Format zu lesen");
return plainData;
} catch (parseError) {
console.error("Konnte Benutzerdaten weder entschl\xFCsseln noch als JSON lesen");
return [];
}
}
} else {
const users = JSON.parse(data);
console.log("Migriere unverschl\xFCsselte Benutzerdaten zu verschl\xFCsselter Speicherung...");
await writeUsers(users);
return users;
}
} catch (error) {
if (error.code === "ENOENT") {
return [];
}
console.error("Fehler beim Lesen der Benutzerdaten:", error);
return [];
}
}
async function writeUsers(users) {
try {
const encryptionKey = getEncryptionKey();
const encryptedData = encryptObject(users, encryptionKey);
await promises.writeFile(USERS_FILE, encryptedData, "utf-8");
return true;
} catch (error) {
console.error("Fehler beim Schreiben der Benutzerdaten:", error);
return false;
}
}
async function readSessions() {
try {
const data = await promises.readFile(SESSIONS_FILE, "utf-8");
return JSON.parse(data);
} catch (error) {
console.error("Fehler beim Lesen der Sessions:", error);
return [];
}
}
async function writeSessions(sessions) {
try {
await promises.writeFile(SESSIONS_FILE, JSON.stringify(sessions, null, 2), "utf-8");
return true;
} catch (error) {
console.error("Fehler beim Schreiben der Sessions:", error);
return false;
}
}
async function hashPassword(password) {
const salt = await bcrypt.genSalt(10);
return await bcrypt.hash(password, salt);
}
async function verifyPassword(password, hash) {
return await bcrypt.compare(password, hash);
}
function generateToken(user) {
return jwt.sign(
{
id: user.id,
email: user.email,
role: user.role
},
JWT_SECRET,
{ expiresIn: "7d" }
);
}
function verifyToken(token) {
try {
return jwt.verify(token, JWT_SECRET);
} catch (error) {
return null;
}
}
async function getUserById(id) {
const users = await readUsers();
return users.find((u) => u.id === id);
}
async function getUserFromToken(token) {
const decoded = verifyToken(token);
if (!decoded) return null;
const users = await readUsers();
return users.find((u) => u.id === decoded.id);
}
async function createSession(userId, token) {
const sessions = await readSessions();
const session = {
id: Date.now().toString(),
userId,
token,
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1e3).toISOString()
// 7 days
};
sessions.push(session);
await writeSessions(sessions);
return session;
}
async function deleteSession(token) {
const sessions = await readSessions();
const filtered = sessions.filter((s) => s.token !== token);
await writeSessions(filtered);
}
export { getUserFromToken as a, verifyToken as b, createSession as c, deleteSession as d, getUserById as e, generateToken as g, hashPassword as h, readUsers as r, verifyPassword as v, writeUsers as w };
//# sourceMappingURL=auth.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"auth.mjs","sources":["../../../../server/utils/auth.js"],"sourcesContent":null,"names":["fs"],"mappings":"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"}

View File

@@ -1,10 +0,0 @@
import { escapeHtml } from '@vue/shared';
const _messages = { "appName": "Nuxt", "statusCode": 500, "statusMessage": "Internal server error", "description": "This page is temporarily unavailable.", "refresh": "Refresh this page" };
const template = (messages) => {
messages = { ..._messages, ...messages };
return '<!DOCTYPE html><html lang="en"><head><title>' + escapeHtml(messages.statusCode) + " - " + escapeHtml(messages.statusMessage) + " | " + escapeHtml(messages.appName) + `</title><meta charset="utf-8"><meta content="width=device-width,initial-scale=1.0,minimum-scale=1.0" name="viewport"><script>!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();<\/script><style>*,:after,:before{border-color:var(--un-default-border-color,#e5e7eb);border-style:solid;border-width:0;box-sizing:border-box}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}h1,h2{font-size:inherit;font-weight:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }.grid{display:grid}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.max-w-520px{max-width:520px}.min-h-screen{min-height:100vh}.place-content-center{place-content:center}.overflow-hidden{overflow:hidden}.bg-white{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-2{padding-left:.5rem;padding-right:.5rem}.text-center{text-align:center}.text-\\[80px\\]{font-size:80px}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\\[\\#020420\\]{--un-text-opacity:1;color:rgb(2 4 32/var(--un-text-opacity))}.text-\\[\\#64748B\\]{--un-text-opacity:1;color:rgb(100 116 139/var(--un-text-opacity))}.font-semibold{font-weight:600}.leading-none{line-height:1}.tracking-wide{letter-spacing:.025em}.font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.tabular-nums{--un-numeric-spacing:tabular-nums;font-variant-numeric:var(--un-ordinal) var(--un-slashed-zero) var(--un-numeric-figure) var(--un-numeric-spacing) var(--un-numeric-fraction)}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){.dark\\:bg-\\[\\#020420\\]{--un-bg-opacity:1;background-color:rgb(2 4 32/var(--un-bg-opacity))}.dark\\:text-white{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media (min-width:640px){.sm\\:text-\\[110px\\]{font-size:110px}.sm\\:text-3xl{font-size:1.875rem;line-height:2.25rem}}</style></head><body class="antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"><div class="max-w-520px text-center"><h1 class="font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]">` + escapeHtml(messages.statusCode) + '</h1><h2 class="font-semibold mb-2 sm:text-3xl text-2xl">' + escapeHtml(messages.statusMessage) + '</h2><p class="mb-4 px-2 text-[#64748B] text-md">' + escapeHtml(messages.description) + "</p></div></body></html>";
};
export { template };
//# sourceMappingURL=error-500.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"error-500.mjs","sources":["../../../../node_modules/nuxt/dist/core/runtime/nitro/templates/error-500.js"],"sourcesContent":null,"names":[],"mappings":"","x_google_ignoreList":[0]}

View File

@@ -1,144 +0,0 @@
import { promises } from 'fs';
import path from 'path';
import { randomUUID } from 'crypto';
import { d as decryptObject, a as encryptObject } from './encryption.mjs';
const getDataPath = (filename) => {
const cwd = process.cwd();
if (cwd.endsWith(".output")) {
return path.join(cwd, "../server/data", filename);
}
return path.join(cwd, "server/data", filename);
};
const MEMBERS_FILE = getDataPath("members.json");
function getEncryptionKey() {
return process.env.ENCRYPTION_KEY || "default-key-change-in-production";
}
function isEncrypted(data) {
try {
const parsed = JSON.parse(data.trim());
if (Array.isArray(parsed)) {
return false;
}
if (typeof parsed === "object" && parsed !== null && !parsed.encryptedData) {
return false;
}
return false;
} catch (e) {
return true;
}
}
async function readMembers() {
try {
const data = await promises.readFile(MEMBERS_FILE, "utf-8");
const encrypted = isEncrypted(data);
if (encrypted) {
const encryptionKey = getEncryptionKey();
try {
return decryptObject(data, encryptionKey);
} catch (decryptError) {
console.error("Fehler beim Entschl\xFCsseln der Mitgliederdaten:", decryptError);
try {
const plainData = JSON.parse(data);
console.warn("Entschl\xFCsselung fehlgeschlagen, versuche als unverschl\xFCsseltes Format zu lesen");
return plainData;
} catch (parseError) {
console.error("Konnte Mitgliederdaten weder entschl\xFCsseln noch als JSON lesen");
return [];
}
}
} else {
const members = JSON.parse(data);
console.log("Migriere unverschl\xFCsselte Mitgliederdaten zu verschl\xFCsselter Speicherung...");
await writeMembers(members);
return members;
}
} catch (error) {
if (error.code === "ENOENT") {
return [];
}
console.error("Fehler beim Lesen der Mitgliederdaten:", error);
return [];
}
}
async function writeMembers(members) {
try {
const encryptionKey = getEncryptionKey();
const encryptedData = encryptObject(members, encryptionKey);
await promises.writeFile(MEMBERS_FILE, encryptedData, "utf-8");
return true;
} catch (error) {
console.error("Fehler beim Schreiben der Mitgliederdaten:", error);
return false;
}
}
function normalizeDate(dateString) {
if (!dateString) return "";
try {
const date = new Date(dateString);
if (isNaN(date.getTime())) return dateString.trim();
return date.toISOString().split("T")[0];
} catch (e) {
return dateString.trim();
}
}
function findDuplicateMember(members, firstName, lastName, geburtsdatum) {
const normalizedFirstName = (firstName || "").trim().toLowerCase();
const normalizedLastName = (lastName || "").trim().toLowerCase();
const normalizedDate = normalizeDate(geburtsdatum);
return members.find((m) => {
const mFirstName = (m.firstName || "").trim().toLowerCase();
const mLastName = (m.lastName || "").trim().toLowerCase();
const mDate = normalizeDate(m.geburtsdatum);
return mFirstName === normalizedFirstName && mLastName === normalizedLastName && mDate === normalizedDate && mDate !== "";
});
}
async function saveMember(memberData) {
const members = await readMembers();
if (memberData.id) {
const index = members.findIndex((m) => m.id === memberData.id);
if (index !== -1) {
const duplicate = findDuplicateMember(
members.filter((m) => m.id !== memberData.id),
memberData.firstName,
memberData.lastName,
memberData.geburtsdatum
);
if (duplicate) {
throw new Error("Ein Mitglied mit diesem Namen und Geburtsdatum existiert bereits.");
}
members[index] = { ...members[index], ...memberData };
} else {
throw new Error("Mitglied nicht gefunden");
}
} else {
if (memberData.firstName && memberData.lastName && memberData.geburtsdatum) {
const duplicate = findDuplicateMember(
members,
memberData.firstName,
memberData.lastName,
memberData.geburtsdatum
);
if (duplicate) {
throw new Error("Ein Mitglied mit diesem Namen und Geburtsdatum existiert bereits.");
}
}
const newMember = {
...memberData,
id: randomUUID()
// Cryptographically secure unique ID
};
members.push(newMember);
}
await writeMembers(members);
return true;
}
async function deleteMember(id) {
const members = await readMembers();
const filtered = members.filter((m) => m.id !== id);
await writeMembers(filtered);
return true;
}
export { deleteMember as d, normalizeDate as n, readMembers as r, saveMember as s, writeMembers as w };
//# sourceMappingURL=members.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"members.mjs","sources":["../../../../server/utils/members.js"],"sourcesContent":null,"names":["fs"],"mappings":"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"}

View File

@@ -1,70 +0,0 @@
import { promises } from 'fs';
import path from 'path';
import { randomUUID } from 'crypto';
const getDataPath = (filename) => {
const cwd = process.cwd();
if (cwd.endsWith(".output")) {
return path.join(cwd, "../server/data", filename);
}
return path.join(cwd, "server/data", filename);
};
const NEWS_FILE = getDataPath("news.json");
async function readNews() {
try {
const data = await promises.readFile(NEWS_FILE, "utf-8");
return JSON.parse(data);
} catch (error) {
if (error.code === "ENOENT") {
return [];
}
console.error("Fehler beim Lesen der News:", error);
return [];
}
}
async function writeNews(news) {
try {
await promises.writeFile(NEWS_FILE, JSON.stringify(news, null, 2), "utf-8");
return true;
} catch (error) {
console.error("Fehler beim Schreiben der News:", error);
return false;
}
}
async function saveNews(newsData) {
const newsList = await readNews();
if (newsData.id) {
const index = newsList.findIndex((n) => n.id === newsData.id);
if (index !== -1) {
newsList[index] = {
...newsList[index],
...newsData,
updated: (/* @__PURE__ */ new Date()).toISOString()
};
} else {
throw new Error("News nicht gefunden");
}
} else {
const newItem = {
...newsData,
id: randomUUID(),
// Cryptographically secure unique ID
isPublic: newsData.isPublic || false,
// Default to internal
created: (/* @__PURE__ */ new Date()).toISOString(),
updated: (/* @__PURE__ */ new Date()).toISOString()
};
newsList.unshift(newItem);
}
await writeNews(newsList);
return true;
}
async function deleteNews(id) {
const newsList = await readNews();
const filtered = newsList.filter((n) => n.id !== id);
await writeNews(filtered);
return true;
}
export { deleteNews as d, readNews as r, saveNews as s };
//# sourceMappingURL=news.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"news.mjs","sources":["../../../../server/utils/news.js"],"sourcesContent":null,"names":["fs"],"mappings":";;;;AAKA,MAAM,WAAA,GAAc,CAAC,QAAA,KAAa;AAChC,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAGxB,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,gBAAA,EAAkB,QAAQ,CAAA;AAAA,EAClD;AAGA,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,aAAA,EAAe,QAAQ,CAAA;AAC/C,CAAA;AAEA,MAAM,SAAA,GAAY,YAAY,WAAW,CAAA;AAGzC,eAAsB,QAAA,GAAW;AAC/B,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAMA,QAAA,CAAG,QAAA,CAAS,WAAW,OAAO,CAAA;AACjD,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAClD,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAGA,eAAsB,UAAU,IAAA,EAAM;AACpC,EAAA,IAAI;AACF,IAAA,MAAMA,QAAA,CAAG,UAAU,SAAA,EAAW,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AASA,eAAsB,SAAS,QAAA,EAAU;AACvC,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,EAAS;AAEhC,EAAA,IAAI,SAAS,EAAA,EAAI;AAEf,IAAA,MAAM,QAAQ,QAAA,CAAS,SAAA,CAAU,OAAK,CAAA,CAAE,EAAA,KAAO,SAAS,EAAE,CAAA;AAC1D,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,QAAA,CAAS,KAAK,CAAA,GAAI;AAAA,QAChB,GAAG,SAAS,KAAK,CAAA;AAAA,QACjB,GAAG,QAAA;AAAA,QACH,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OAClC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,GAAG,QAAA;AAAA,MACH,IAAI,UAAA,EAAW;AAAA;AAAA,MACf,QAAA,EAAU,SAAS,QAAA,IAAY,KAAA;AAAA;AAAA,MAC/B,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAChC,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KAClC;AACA,IAAA,QAAA,CAAS,QAAQ,OAAO,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,UAAU,QAAQ,CAAA;AACxB,EAAA,OAAO,IAAA;AACT;AAGA,eAAsB,WAAW,EAAA,EAAI;AACnC,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,EAAS;AAChC,EAAA,MAAM,WAAW,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,EAAE,CAAA;AACjD,EAAA,MAAM,UAAU,QAAQ,CAAA;AACxB,EAAA,OAAO,IAAA;AACT;;;;"}

View File

@@ -1,104 +0,0 @@
import { promises } from 'fs';
import path from 'path';
import { randomUUID } from 'crypto';
const getDataPath = (filename) => {
const cwd = process.cwd();
if (cwd.endsWith(".output")) {
return path.join(cwd, "../public/data", filename);
}
return path.join(cwd, "public/data", filename);
};
const TERMINE_FILE = getDataPath("termine.csv");
async function readTermine() {
try {
const data = await promises.readFile(TERMINE_FILE, "utf-8");
const lines = data.split("\n").filter((line) => line.trim() !== "");
if (lines.length < 2) return [];
const termine = [];
for (let i = 1; i < lines.length; i++) {
const values = [];
let current = "";
let inQuotes = false;
for (let j = 0; j < lines[i].length; j++) {
const char = lines[i][j];
if (char === '"') {
inQuotes = !inQuotes;
} else if (char === "," && !inQuotes) {
values.push(current.trim());
current = "";
} else {
current += char;
}
}
values.push(current.trim());
if (values.length >= 4) {
termine.push({
id: randomUUID(),
// Generate ID on-the-fly for editing
datum: values[0],
uhrzeit: values[1] || "",
titel: values[2] || "",
beschreibung: values[3] || "",
kategorie: values[4] || "Sonstiges"
});
}
}
return termine;
} catch (error) {
if (error.code === "ENOENT") {
return [];
}
console.error("Fehler beim Lesen der Termine:", error);
return [];
}
}
async function writeTermine(termine) {
try {
let csv = '"datum","uhrzeit","titel","beschreibung","kategorie"\n';
for (const termin of termine) {
const datum = termin.datum || "";
const uhrzeit = termin.uhrzeit || "";
const titel = termin.titel || "";
const beschreibung = termin.beschreibung || "";
const kategorie = termin.kategorie || "";
const escapedDatum = datum.replace(/"/g, '""');
const escapedUhrzeit = uhrzeit.replace(/"/g, '""');
const escapedTitel = titel.replace(/"/g, '""');
const escapedBeschreibung = beschreibung.replace(/"/g, '""');
const escapedKategorie = kategorie.replace(/"/g, '""');
csv += `"${escapedDatum}","${escapedUhrzeit}","${escapedTitel}","${escapedBeschreibung}","${escapedKategorie}"
`;
}
await promises.writeFile(TERMINE_FILE, csv, "utf-8");
return true;
} catch (error) {
console.error("Fehler beim Schreiben der Termine:", error);
return false;
}
}
async function saveTermin(terminData) {
const termine = await readTermine();
const newTermin = {
datum: terminData.datum,
uhrzeit: terminData.uhrzeit || "",
titel: terminData.titel,
beschreibung: terminData.beschreibung || "",
kategorie: terminData.kategorie || "Sonstiges"
};
termine.push(newTermin);
termine.sort((a, b) => new Date(a.datum) - new Date(b.datum));
await writeTermine(termine);
return true;
}
async function deleteTermin(terminData) {
let termine = await readTermine();
termine = termine.filter(
(t) => !(t.datum === terminData.datum && (t.uhrzeit || "") === (terminData.uhrzeit || "") && t.titel === terminData.titel && t.beschreibung === terminData.beschreibung && t.kategorie === terminData.kategorie)
);
await writeTermine(termine);
return true;
}
export { deleteTermin as d, readTermine as r, saveTermin as s };
//# sourceMappingURL=termine.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"termine.mjs","sources":["../../../../server/utils/termine.js"],"sourcesContent":null,"names":["fs"],"mappings":"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"}

View File

@@ -1,10 +0,0 @@
const _export_sfc = (sfc, props) => {
const target = sfc.__vccOpts || sfc;
for (const [key, val] of props) {
target[key] = val;
}
return target;
};
export { _export_sfc as _ };
//# sourceMappingURL=_plugin-vue_export-helper-1tPrXgE0.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"_plugin-vue_export-helper-1tPrXgE0.mjs","sources":[],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;"}

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
{"version":3,"file":"client.manifest.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/client.manifest.mjs"],"sourcesContent":null,"names":[],"mappings":"","x_google_ignoreList":[0]}

View File

@@ -1,8 +0,0 @@
const error404_vue_vue_type_style_index_0_scoped_b728498f_lang = ".grid[data-v-b728498f]{display:grid}.mb-2[data-v-b728498f]{margin-bottom:.5rem}.mb-4[data-v-b728498f]{margin-bottom:1rem}.max-w-520px[data-v-b728498f]{max-width:520px}.min-h-screen[data-v-b728498f]{min-height:100vh}.w-full[data-v-b728498f]{width:100%}.flex[data-v-b728498f]{display:flex}.place-content-center[data-v-b728498f]{place-content:center}.items-center[data-v-b728498f]{align-items:center}.justify-center[data-v-b728498f]{justify-content:center}.overflow-hidden[data-v-b728498f]{overflow:hidden}.bg-white[data-v-b728498f]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-2[data-v-b728498f]{padding-left:.5rem;padding-right:.5rem}.text-center[data-v-b728498f]{text-align:center}.text-\\[80px\\][data-v-b728498f]{font-size:80px}.text-2xl[data-v-b728498f]{font-size:1.5rem;line-height:2rem}.text-sm[data-v-b728498f]{font-size:.875rem;line-height:1.25rem}.text-\\[\\#020420\\][data-v-b728498f]{--un-text-opacity:1;color:rgb(2 4 32/var(--un-text-opacity))}.text-\\[\\#64748B\\][data-v-b728498f]{--un-text-opacity:1;color:rgb(100 116 139/var(--un-text-opacity))}.hover\\:text-\\[\\#00DC82\\][data-v-b728498f]:hover{--un-text-opacity:1;color:rgb(0 220 130/var(--un-text-opacity))}.font-medium[data-v-b728498f]{font-weight:500}.font-semibold[data-v-b728498f]{font-weight:600}.leading-none[data-v-b728498f]{line-height:1}.tracking-wide[data-v-b728498f]{letter-spacing:.025em}.font-sans[data-v-b728498f]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.tabular-nums[data-v-b728498f]{--un-numeric-spacing:tabular-nums;font-variant-numeric:var(--un-ordinal) var(--un-slashed-zero) var(--un-numeric-figure) var(--un-numeric-spacing) var(--un-numeric-fraction)}.underline[data-v-b728498f]{text-decoration-line:underline}.underline-offset-3[data-v-b728498f]{text-underline-offset:3px}.antialiased[data-v-b728498f]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media(prefers-color-scheme:dark){.dark\\:bg-\\[\\#020420\\][data-v-b728498f]{--un-bg-opacity:1;background-color:rgb(2 4 32/var(--un-bg-opacity))}.dark\\:text-white[data-v-b728498f]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media(min-width:640px){.sm\\:text-\\[110px\\][data-v-b728498f]{font-size:110px}.sm\\:text-3xl[data-v-b728498f]{font-size:1.875rem;line-height:2.25rem}}";
const error404Styles_BsF5Lbhq = [
error404_vue_vue_type_style_index_0_scoped_b728498f_lang
];
export { error404Styles_BsF5Lbhq as default };
//# sourceMappingURL=error-404-styles.BsF5Lbhq.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"error-404-styles.BsF5Lbhq.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/error-404-styles.BsF5Lbhq.mjs"],"sourcesContent":null,"names":["style_0"],"mappings":"","x_google_ignoreList":[0]}

View File

@@ -1,8 +0,0 @@
const error500_vue_vue_type_style_index_0_scoped_70d84538_lang = ".grid[data-v-70d84538]{display:grid}.mb-2[data-v-70d84538]{margin-bottom:.5rem}.mb-4[data-v-70d84538]{margin-bottom:1rem}.max-w-520px[data-v-70d84538]{max-width:520px}.min-h-screen[data-v-70d84538]{min-height:100vh}.place-content-center[data-v-70d84538]{place-content:center}.overflow-hidden[data-v-70d84538]{overflow:hidden}.bg-white[data-v-70d84538]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-2[data-v-70d84538]{padding-left:.5rem;padding-right:.5rem}.text-center[data-v-70d84538]{text-align:center}.text-\\[80px\\][data-v-70d84538]{font-size:80px}.text-2xl[data-v-70d84538]{font-size:1.5rem;line-height:2rem}.text-\\[\\#020420\\][data-v-70d84538]{--un-text-opacity:1;color:rgb(2 4 32/var(--un-text-opacity))}.text-\\[\\#64748B\\][data-v-70d84538]{--un-text-opacity:1;color:rgb(100 116 139/var(--un-text-opacity))}.font-semibold[data-v-70d84538]{font-weight:600}.leading-none[data-v-70d84538]{line-height:1}.tracking-wide[data-v-70d84538]{letter-spacing:.025em}.font-sans[data-v-70d84538]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.tabular-nums[data-v-70d84538]{--un-numeric-spacing:tabular-nums;font-variant-numeric:var(--un-ordinal) var(--un-slashed-zero) var(--un-numeric-figure) var(--un-numeric-spacing) var(--un-numeric-fraction)}.antialiased[data-v-70d84538]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media(prefers-color-scheme:dark){.dark\\:bg-\\[\\#020420\\][data-v-70d84538]{--un-bg-opacity:1;background-color:rgb(2 4 32/var(--un-bg-opacity))}.dark\\:text-white[data-v-70d84538]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media(min-width:640px){.sm\\:text-\\[110px\\][data-v-70d84538]{font-size:110px}.sm\\:text-3xl[data-v-70d84538]{font-size:1.875rem;line-height:2.25rem}}";
const error500Styles_Dccc6iq5 = [
error500_vue_vue_type_style_index_0_scoped_70d84538_lang
];
export { error500Styles_Dccc6iq5 as default };
//# sourceMappingURL=error-500-styles.Dccc6iq5.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"error-500-styles.Dccc6iq5.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/error-500-styles.Dccc6iq5.mjs"],"sourcesContent":null,"names":["style_0"],"mappings":"","x_google_ignoreList":[0]}

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
{"version":3,"file":"server.mjs","sources":["../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Ffetch.mjs","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fglobal-polyfills.mjs","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fnuxt.config.mjs","../../../../node_modules/nuxt/dist/app/nuxt.js","../../../../node_modules/nuxt/dist/app/components/injections.js","../../../../node_modules/nuxt/dist/app/utils.js","../../../../node_modules/nuxt/dist/app/composables/router.js","../../../../node_modules/nuxt/dist/app/composables/error.js","../../../../node_modules/nuxt/dist/app/composables/manifest.js","../../../../node_modules/nuxt/dist/app/composables/payload.js","../../../../node_modules/@pinia/nuxt/dist/runtime/payload-plugin.js","../../../../node_modules/nuxt/dist/head/runtime/plugins/unhead.js","../../../../node_modules/nuxt/dist/pages/runtime/utils.js","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Froutes.mjs","../../../../node_modules/nuxt/dist/app/components/utils.js","../../../../node_modules/nuxt/dist/pages/runtime/router.options.js","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Frouter.options.mjs","../../../../node_modules/nuxt/dist/pages/runtime/validate.js","../../../../stores/auth.js","../../../../middleware/auth.global.js","../../../../node_modules/nuxt/dist/app/middleware/manifest-route-rule.js","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fmiddleware.mjs","../../../../node_modules/nuxt/dist/pages/runtime/plugins/router.js","../../../../node_modules/nuxt/dist/app/plugins/revive-payload.server.js","../../../../node_modules/nuxt/dist/app/components/server-placeholder.js","../../../../node_modules/nuxt/dist/app/components/client-only.js","../../../../node_modules/nuxt/dist/app/components/nuxt-link.js","../../../../node_modules/@pinia/nuxt/dist/runtime/plugin.vue3.js","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fcomponents.plugin.mjs","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fplugins.server.mjs","../../../../node_modules/nuxt/dist/app/components/route-provider.js","../../../../node_modules/nuxt/dist/pages/runtime/page.js","../../../../assets/images/logos/Harheimer TC.svg","../../../../components/Navigation.vue","../../../../components/Footer.vue","../../../../components/ModalDialog.vue","../../../../app.vue","../../../../node_modules/nuxt/dist/app/components/nuxt-error-page.vue","../../../../node_modules/nuxt/dist/app/components/nuxt-root.vue","../../../../node_modules/nuxt/dist/app/entry.js"],"sourcesContent":null,"names":["$fetch","plugin","provide","plugins","createH3Error","createRadixRouter","login1RYyYL8mxx17qR_nmdKvywxx7lKOLXMFu8pTLfvTLYwMeta","indexBAhz9QmEiLA6QGDd6cSKraFX9E0RhZLvBUZorkJgAVkMeta","termineaIqWCm431cOVikspmAA3_6UhrHiffuFLM_t95ydtEd4Meta","einstellungen3Fhl_VQPzY4eklctozY70Drhj8cWMt_FVlyEKQh9aAAMeta","apis3_Iku1IZkQQ3FilRpoRZFd20ZCr3RAgIorGyDHhuNIMeta","newsPHTXuxdDl4fgPHQQbukE_XsTEemyPOWVSYs64f8qjC4Meta","indexqVbusfljIJ04j42RIA_KP4bSP7XytQIXdqcVfR3kPUAMeta","profilyVBy_UvZ8KvchY44_0SJbB0NHOad6MC_S9C8wfDdUWEMeta","mitglieder9TWncRC_sSS_zPWzxBDlRiNjjFojXSJny_uernMe_tAMeta","__executeAsync","createRouter","entry","payload_plugin_1_bEQpMjikuQhbV8UJ0PxUqmSvPdmV1jDa5DURnKW4M","router_GNCWhvtYfLTYRZZ135CdFAEjxdMexN0ixiUYCAN_tpw","plugin_vue3_CQ_pO3THrTGIeYc0dvC91V75hY8qpo9B_8yZzOW5SFs","useRoute","_ssrRenderAttrs","_mergeProps","_push","_parent","_ssrRenderAttr","_imports_0","_createVNode","_ssrRenderClass","_unref","_ssrRenderList","_ssrInterpolate","_createTextVNode","_toDisplayString","useRouter","_ssrRenderComponent","showError","ErrorComponent","RootComponent"],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,20,21,22,23,24,25,26,27,28,29,30,31,37,38,39]}

View File

@@ -1,14 +0,0 @@
const interopDefault = r => r.default || r || [];
const styles = {
"node_modules/nuxt/dist/app/components/error-404.vue": () => import('./error-404-styles.BsF5Lbhq.mjs').then(interopDefault),
"node_modules/nuxt/dist/app/components/error-500.vue": () => import('./error-500-styles.Dccc6iq5.mjs').then(interopDefault),
"components/Hero.vue": () => import('./Hero-styles.CNXkzfUC.mjs').then(interopDefault),
"components/PublicNews.vue": () => import('./PublicNews-styles.Muc48wAK.mjs').then(interopDefault),
"components/Hero.vue?vue&type=style&index=0&scoped=28200092&lang.css": () => import('./Hero-styles.CNXkzfUC.mjs').then(interopDefault),
"node_modules/nuxt/dist/app/components/error-404.vue?vue&type=style&index=0&scoped=b728498f&lang.css": () => import('./error-404-styles.BsF5Lbhq.mjs').then(interopDefault),
"node_modules/nuxt/dist/app/components/error-500.vue?vue&type=style&index=0&scoped=70d84538&lang.css": () => import('./error-500-styles.Dccc6iq5.mjs').then(interopDefault),
"components/PublicNews.vue?vue&type=style&index=0&scoped=c57f605c&lang.css": () => import('./PublicNews-styles.Muc48wAK.mjs').then(interopDefault)
};
export { styles as default };
//# sourceMappingURL=styles.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"styles.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/styles.mjs"],"sourcesContent":null,"names":[],"mappings":"","x_google_ignoreList":[0]}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
{"version":3,"file":"nitro.mjs","sources":["../../../../node_modules/destr/dist/index.mjs","../../../../node_modules/ufo/dist/index.mjs","../../../../node_modules/cookie-es/dist/index.mjs","../../../../node_modules/radix3/dist/index.mjs","../../../../node_modules/defu/dist/defu.mjs","../../../../node_modules/node-mock-http/dist/index.mjs","../../../../node_modules/h3/dist/index.mjs","../../../../node_modules/hookable/dist/index.mjs","../../../../node_modules/node-fetch-native/dist/native.mjs","../../../../node_modules/ofetch/dist/shared/ofetch.03887fc3.mjs","../../../../node_modules/ofetch/dist/node.mjs","../../../../node_modules/unstorage/dist/shared/unstorage.zVDD2mZo.mjs","../../../../node_modules/unstorage/dist/index.mjs","../../../../node_modules/unstorage/drivers/utils/index.mjs","../../../../node_modules/unstorage/drivers/utils/node-fs.mjs","../../../../node_modules/unstorage/drivers/fs-lite.mjs","../../../../node_modules/nitropack/dist/runtime/internal/storage.mjs","../../../../node_modules/ohash/dist/shared/ohash.D__AXeF1.mjs","../../../../node_modules/ohash/dist/crypto/node/index.mjs","../../../../node_modules/ohash/dist/index.mjs","../../../../node_modules/nitropack/dist/runtime/internal/hash.mjs","../../../../node_modules/nitropack/dist/runtime/internal/cache.mjs","../../../../node_modules/klona/dist/index.mjs","../../../../node_modules/scule/dist/index.mjs","../../../../node_modules/nitropack/dist/runtime/internal/utils.env.mjs","../../../../node_modules/nitropack/dist/runtime/internal/config.mjs","../../../../node_modules/unctx/dist/index.mjs","../../../../node_modules/nitropack/dist/runtime/internal/context.mjs","../../../../node_modules/nitropack/dist/runtime/internal/route-rules.mjs","../../../../node_modules/nitropack/dist/runtime/internal/utils.mjs","../../../../node_modules/nuxt/dist/core/runtime/nitro/utils/error.js","../../../../node_modules/nuxt/dist/core/runtime/nitro/handlers/error.js","../../../../node_modules/nitropack/dist/runtime/internal/error/utils.mjs","../../../../node_modules/nitropack/dist/runtime/internal/error/prod.mjs","../../../../node_modules/pathe/dist/shared/pathe.M-eThtNZ.mjs","../../../../node_modules/nitropack/dist/runtime/internal/static.mjs","../../../../node_modules/nitropack/dist/runtime/internal/app.mjs","../../../../node_modules/nitropack/dist/runtime/internal/renderer.mjs","../../../../node_modules/nitropack/dist/runtime/internal/lib/http-graceful-shutdown.mjs","../../../../node_modules/nitropack/dist/runtime/internal/shutdown.mjs","../../../../node_modules/nitropack/dist/presets/node/runtime/node-server.mjs"],"sourcesContent":null,"names":["decode","getQuery","serialize","createRouter","f","h","c","i","l","createError","parse$1","mergeHeaders","s","nodeFetch","Headers","Headers$1","AbortController$1","normalizeKey","defineDriver","DRIVER_NAME","dirname","fsPromises","resolve","fsp","hash","_inlineAppConfig","createRadixRouter","nitroApp","callNodeRequestHandler","fetchNodeRequestHandler","gracefulShutdown","HttpsServer","HttpServer"],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]}

View File

@@ -1,80 +0,0 @@
import { d as defineEventHandler, r as readBody, c as createError, s as setCookie } from '../../../nitro/nitro.mjs';
import { r as readUsers, v as verifyPassword, g as generateToken, c as createSession, w as writeUsers } from '../../../_/auth.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../../_/encryption.mjs';
import 'crypto';
const login_post = defineEventHandler(async (event) => {
try {
const body = await readBody(event);
const { email, password } = body;
if (!email || !password) {
throw createError({
statusCode: 400,
message: "E-Mail und Passwort sind erforderlich"
});
}
const users = await readUsers();
const user = users.find((u) => u.email.toLowerCase() === email.toLowerCase());
if (!user) {
throw createError({
statusCode: 401,
message: "Ung\xFCltige Anmeldedaten"
});
}
if (user.active === false) {
throw createError({
statusCode: 403,
message: "Ihr Konto wurde noch nicht freigeschaltet. Bitte warten Sie auf die Best\xE4tigung des Vorstands."
});
}
const isValid = await verifyPassword(password, user.password);
if (!isValid) {
throw createError({
statusCode: 401,
message: "Ung\xFCltige Anmeldedaten"
});
}
const token = generateToken(user);
await createSession(user.id, token);
user.lastLogin = (/* @__PURE__ */ new Date()).toISOString();
const updatedUsers = users.map((u) => u.id === user.id ? user : u);
await writeUsers(updatedUsers);
setCookie(event, "auth_token", token, {
httpOnly: true,
secure: false,
// Auch in Production false, da wir HTTPS über Apache terminieren
sameSite: "lax",
maxAge: 60 * 60 * 24 * 7
// 7 days
});
return {
success: true,
token,
// Token auch im Body für externe API-Clients
user: {
id: user.id,
email: user.email,
name: user.name,
role: user.role
}
};
} catch (error) {
console.error("Login-Fehler:", error);
throw error;
}
});
export { login_post as default };
//# sourceMappingURL=login.post.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"login.post.mjs","sources":["../../../../../../server/api/auth/login.post.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,mBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,IAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,KAAA,EAAA,QAAA,EAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,KAAA,IAAA,CAAA,QAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAGA,IAAA,MAAA,KAAA,GAAA,MAAA,SAAA,EAAA;AACA,IAAA,MAAA,IAAA,GAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,MAAA,WAAA,EAAA,KAAA,KAAA,CAAA,WAAA,EAAA,CAAA;AAEA,IAAA,IAAA,CAAA,IAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAGA,IAAA,IAAA,IAAA,CAAA,WAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAGA,IAAA,MAAA,OAAA,GAAA,MAAA,cAAA,CAAA,QAAA,EAAA,KAAA,QAAA,CAAA;AACA,IAAA,IAAA,CAAA,OAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAGA,IAAA,MAAA,KAAA,GAAA,cAAA,IAAA,CAAA;AAGA,IAAA,MAAA,aAAA,CAAA,IAAA,CAAA,EAAA,EAAA,KAAA,CAAA;AAGA,IAAA,IAAA,CAAA,SAAA,GAAA,iBAAA,IAAA,IAAA,EAAA,EAAA,WAAA,EAAA;AACA,IAAA,MAAA,YAAA,GAAA,MAAA,GAAA,CAAA,CAAA,CAAA,KAAA,EAAA,EAAA,KAAA,IAAA,CAAA,EAAA,GAAA,IAAA,GAAA,CAAA,CAAA;AACA,IAAA,MAAA,WAAA,YAAA,CAAA;AAGA,IAAA,SAAA,CAAA,KAAA,EAAA,cAAA,KAAA,EAAA;AAAA,MACA,QAAA,EAAA,IAAA;AAAA,MACA,MAAA,EAAA,KAAA;AAAA;AAAA,MACA,QAAA,EAAA,KAAA;AAAA,MACA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA;AAAA;AAAA,KACA,CAAA;AAGA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,KAAA;AAAA;AAAA,MACA,IAAA,EAAA;AAAA,QACA,IAAA,IAAA,CAAA,EAAA;AAAA,QACA,OAAA,IAAA,CAAA,KAAA;AAAA,QACA,MAAA,IAAA,CAAA,IAAA;AAAA,QACA,MAAA,IAAA,CAAA;AAAA;AACA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,iBAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,39 +0,0 @@
import { d as defineEventHandler, g as getCookie, a as deleteCookie, c as createError } from '../../../nitro/nitro.mjs';
import { d as deleteSession } from '../../../_/auth.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../../_/encryption.mjs';
import 'crypto';
const logout_post = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
if (token) {
await deleteSession(token);
}
deleteCookie(event, "auth_token");
return {
success: true,
message: "Erfolgreich abgemeldet"
};
} catch (error) {
console.error("Logout-Fehler:", error);
throw createError({
statusCode: 500,
message: "Abmeldung fehlgeschlagen"
});
}
});
export { logout_post as default };
//# sourceMappingURL=logout.post.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"logout.post.mjs","sources":["../../../../../../server/api/auth/logout.post.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,oBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AAEA,IAAA,IAAA,KAAA,EAAA;AACA,MAAA,MAAA,cAAA,KAAA,CAAA;AAAA,IACA;AAGA,IAAA,YAAA,CAAA,OAAA,YAAA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,kBAAA,KAAA,CAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,110 +0,0 @@
import { d as defineEventHandler, r as readBody, c as createError } from '../../../nitro/nitro.mjs';
import { r as readUsers, h as hashPassword, w as writeUsers } from '../../../_/auth.mjs';
import nodemailer from 'nodemailer';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../../_/encryption.mjs';
import 'crypto';
const register_post = defineEventHandler(async (event) => {
try {
const body = await readBody(event);
const { name, email, phone, password } = body;
if (!name || !email || !password) {
throw createError({
statusCode: 400,
message: "Name, E-Mail und Passwort sind erforderlich"
});
}
if (password.length < 8) {
throw createError({
statusCode: 400,
message: "Das Passwort muss mindestens 8 Zeichen lang sein"
});
}
const users = await readUsers();
const existingUser = users.find((u) => u.email.toLowerCase() === email.toLowerCase());
if (existingUser) {
throw createError({
statusCode: 409,
message: "Ein Benutzer mit dieser E-Mail-Adresse existiert bereits"
});
}
const hashedPassword = await hashPassword(password);
const newUser = {
id: Date.now().toString(),
email: email.toLowerCase(),
password: hashedPassword,
name,
phone: phone || "",
role: "mitglied",
active: false,
// Requires admin approval
created: (/* @__PURE__ */ new Date()).toISOString(),
lastLogin: null
};
users.push(newUser);
await writeUsers(users);
try {
const transporter = nodemailer.createTransport({
host: process.env.SMTP_HOST || "smtp.gmail.com",
port: process.env.SMTP_PORT || 587,
secure: false,
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS
}
});
await transporter.sendMail({
from: process.env.SMTP_FROM || "noreply@harheimertc.de",
to: process.env.SMTP_ADMIN || "j.dichmann@gmx.de",
subject: "Neue Registrierung - Harheimer TC",
html: `
<h2>Neue Registrierung</h2>
<p>Ein neuer Benutzer hat sich registriert und wartet auf Freigabe:</p>
<ul>
<li><strong>Name:</strong> ${name}</li>
<li><strong>E-Mail:</strong> ${email}</li>
<li><strong>Telefon:</strong> ${phone || "Nicht angegeben"}</li>
</ul>
<p>Bitte pr\xFCfen Sie die Registrierung im CMS.</p>
`
});
await transporter.sendMail({
from: process.env.SMTP_FROM || "noreply@harheimertc.de",
to: email,
subject: "Registrierung erhalten - Harheimer TC",
html: `
<h2>Registrierung erhalten</h2>
<p>Hallo ${name},</p>
<p>vielen Dank f\xFCr Ihre Registrierung beim Harheimer TC!</p>
<p>Ihre Anfrage wird vom Vorstand gepr\xFCft. Sie erhalten eine E-Mail, sobald Ihr Zugang freigeschaltet wurde.</p>
<br>
<p>Mit sportlichen Gr\xFC\xDFen,<br>Ihr Harheimer TC</p>
`
});
} catch (emailError) {
console.error("E-Mail-Versand fehlgeschlagen:", emailError);
}
return {
success: true,
message: "Registrierung erfolgreich. Sie erhalten eine E-Mail, sobald Ihr Zugang freigeschaltet wurde."
};
} catch (error) {
console.error("Registrierungs-Fehler:", error);
throw error;
}
});
export { register_post as default };
//# sourceMappingURL=register.post.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"register.post.mjs","sources":["../../../../../../server/api/auth/register.post.js"],"sourcesContent":null,"names":[],"mappings":"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"}

View File

@@ -1,83 +0,0 @@
import { d as defineEventHandler, r as readBody, c as createError } from '../../../nitro/nitro.mjs';
import { r as readUsers, h as hashPassword, w as writeUsers } from '../../../_/auth.mjs';
import nodemailer from 'nodemailer';
import crypto from 'crypto';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../../_/encryption.mjs';
const resetPassword_post = defineEventHandler(async (event) => {
try {
const body = await readBody(event);
const { email } = body;
if (!email) {
throw createError({
statusCode: 400,
message: "E-Mail-Adresse ist erforderlich"
});
}
const users = await readUsers();
const user = users.find((u) => u.email.toLowerCase() === email.toLowerCase());
if (!user) {
return {
success: true,
message: "Falls ein Konto mit dieser E-Mail existiert, wurde eine E-Mail gesendet."
};
}
const tempPassword = crypto.randomBytes(8).toString("hex");
const hashedPassword = await hashPassword(tempPassword);
user.password = hashedPassword;
user.passwordResetRequired = true;
const updatedUsers = users.map((u) => u.id === user.id ? user : u);
await writeUsers(updatedUsers);
const transporter = nodemailer.createTransport({
host: process.env.SMTP_HOST || "smtp.gmail.com",
port: process.env.SMTP_PORT || 587,
secure: false,
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS
}
});
const mailOptions = {
from: process.env.SMTP_FROM || "noreply@harheimertc.de",
to: user.email,
subject: "Passwort zur\xFCcksetzen - Harheimer TC",
html: `
<h2>Passwort zur\xFCcksetzen</h2>
<p>Hallo ${user.name},</p>
<p>Sie haben eine Anfrage zum Zur\xFCcksetzen Ihres Passworts gestellt.</p>
<p>Ihr tempor\xE4res Passwort lautet: <strong>${tempPassword}</strong></p>
<p>Bitte melden Sie sich damit an und \xE4ndern Sie Ihr Passwort im Mitgliederbereich.</p>
<br>
<p>Falls Sie diese Anfrage nicht gestellt haben, ignorieren Sie diese E-Mail.</p>
<br>
<p>Mit sportlichen Gr\xFC\xDFen,<br>Ihr Harheimer TC</p>
`
};
await transporter.sendMail(mailOptions);
return {
success: true,
message: "Falls ein Konto mit dieser E-Mail existiert, wurde eine E-Mail gesendet."
};
} catch (error) {
console.error("Password-Reset-Fehler:", error);
return {
success: true,
message: "Falls ein Konto mit dieser E-Mail existiert, wurde eine E-Mail gesendet."
};
}
});
export { resetPassword_post as default };
//# sourceMappingURL=reset-password.post.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"reset-password.post.mjs","sources":["../../../../../../server/api/auth/reset-password.post.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAIA,2BAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,IAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,OAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAGA,IAAA,MAAA,KAAA,GAAA,MAAA,SAAA,EAAA;AACA,IAAA,MAAA,IAAA,GAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,MAAA,WAAA,EAAA,KAAA,KAAA,CAAA,WAAA,EAAA,CAAA;AAGA,IAAA,IAAA,CAAA,IAAA,EAAA;AACA,MAAA,OAAA;AAAA,QACA,OAAA,EAAA,IAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA;AAAA,IACA;AAGA,IAAA,MAAA,eAAA,MAAA,CAAA,WAAA,CAAA,CAAA,CAAA,CAAA,SAAA,KAAA,CAAA;AACA,IAAA,MAAA,cAAA,GAAA,MAAA,YAAA,CAAA,YAAA,CAAA;AAGA,IAAA,IAAA,CAAA,QAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,qBAAA,GAAA,IAAA;AACA,IAAA,MAAA,YAAA,GAAA,MAAA,GAAA,CAAA,CAAA,CAAA,KAAA,EAAA,EAAA,KAAA,IAAA,CAAA,EAAA,GAAA,IAAA,GAAA,CAAA,CAAA;AACA,IAAA,MAAA,WAAA,YAAA,CAAA;AAGA,IAAA,MAAA,WAAA,GAAA,WAAA,eAAA,CAAA;AAAA,MACA,IAAA,EAAA,OAAA,CAAA,GAAA,CAAA,SAAA,IAAA,gBAAA;AAAA,MACA,IAAA,EAAA,OAAA,CAAA,GAAA,CAAA,SAAA,IAAA,GAAA;AAAA,MACA,MAAA,EAAA,KAAA;AAAA,MACA,IAAA,EAAA;AAAA,QACA,IAAA,EAAA,QAAA,GAAA,CAAA,SAAA;AAAA,QACA,IAAA,EAAA,QAAA,GAAA,CAAA;AAAA;AACA,KACA,CAAA;AAEA,IAAA,MAAA,WAAA,GAAA;AAAA,MACA,IAAA,EAAA,OAAA,CAAA,GAAA,CAAA,SAAA,IAAA,wBAAA;AAAA,MACA,IAAA,IAAA,CAAA,KAAA;AAAA,MACA,OAAA,EAAA,yCAAA;AAAA,MACA,IAAA,EAAA;AAAA;AAAA,iBAAA,EAEA,KAAA,IAAA,CAAA;AAAA;AAAA,sDAAA,EAEA,YAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA;AAAA,KAOA;AAEA,IAAA,MAAA,WAAA,CAAA,SAAA,WAAA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,0BAAA,KAAA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,58 +0,0 @@
import { d as defineEventHandler, g as getCookie, a as deleteCookie } from '../../../nitro/nitro.mjs';
import { a as getUserFromToken } from '../../../_/auth.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../../_/encryption.mjs';
import 'crypto';
const status_get = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
if (!token) {
return {
isLoggedIn: false,
user: null,
role: null
};
}
const user = await getUserFromToken(token);
if (!user) {
deleteCookie(event, "auth_token");
return {
isLoggedIn: false,
user: null,
role: null
};
}
return {
isLoggedIn: true,
user: {
id: user.id,
email: user.email,
name: user.name,
role: user.role
},
role: user.role
};
} catch (error) {
console.error("Auth-Status-Fehler:", error);
return {
isLoggedIn: false,
user: null,
role: null
};
}
});
export { status_get as default };
//# sourceMappingURL=status.get.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"status.get.mjs","sources":["../../../../../../server/api/auth/status.get.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,mBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AAEA,IAAA,IAAA,CAAA,KAAA,EAAA;AACA,MAAA,OAAA;AAAA,QACA,UAAA,EAAA,KAAA;AAAA,QACA,IAAA,EAAA,IAAA;AAAA,QACA,IAAA,EAAA;AAAA,OACA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,gBAAA,CAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,IAAA,EAAA;AACA,MAAA,YAAA,CAAA,OAAA,YAAA,CAAA;AACA,MAAA,OAAA;AAAA,QACA,UAAA,EAAA,KAAA;AAAA,QACA,IAAA,EAAA,IAAA;AAAA,QACA,IAAA,EAAA;AAAA,OACA;AAAA,IACA;AAEA,IAAA,OAAA;AAAA,MACA,UAAA,EAAA,IAAA;AAAA,MACA,IAAA,EAAA;AAAA,QACA,IAAA,IAAA,CAAA,EAAA;AAAA,QACA,OAAA,IAAA,CAAA,KAAA;AAAA,QACA,MAAA,IAAA,CAAA,IAAA;AAAA,QACA,MAAA,IAAA,CAAA;AAAA,OACA;AAAA,MACA,MAAA,IAAA,CAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,uBAAA,KAAA,CAAA;AACA,IAAA,OAAA;AAAA,MACA,UAAA,EAAA,KAAA;AAAA,MACA,IAAA,EAAA,IAAA;AAAA,MACA,IAAA,EAAA;AAAA,KACA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,81 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError, r as readBody } from '../../../../nitro/nitro.mjs';
import { a as getUserFromToken, r as readUsers, w as writeUsers } from '../../../../_/auth.mjs';
import nodemailer from 'nodemailer';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../../../_/encryption.mjs';
import 'crypto';
const approve_post = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
const currentUser = await getUserFromToken(token);
if (!currentUser || currentUser.role !== "admin" && currentUser.role !== "vorstand") {
throw createError({
statusCode: 403,
message: "Zugriff verweigert"
});
}
const body = await readBody(event);
const { userId, role } = body;
const users = await readUsers();
const user = users.find((u) => u.id === userId);
if (!user) {
throw createError({
statusCode: 404,
message: "Benutzer nicht gefunden"
});
}
user.active = true;
user.role = role || "mitglied";
const updatedUsers = users.map((u) => u.id === userId ? user : u);
await writeUsers(updatedUsers);
try {
const transporter = nodemailer.createTransporter({
host: process.env.SMTP_HOST || "smtp.gmail.com",
port: process.env.SMTP_PORT || 587,
secure: false,
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS
}
});
await transporter.sendMail({
from: process.env.SMTP_FROM || "noreply@harheimertc.de",
to: user.email,
subject: "Zugang freigeschaltet - Harheimer TC",
html: `
<h2>Zugang freigeschaltet</h2>
<p>Hallo ${user.name},</p>
<p>Ihr Zugang zum Mitgliederbereich wurde freigeschaltet!</p>
<p>Sie k\xF6nnen sich jetzt mit Ihrer E-Mail-Adresse und Ihrem Passwort anmelden.</p>
<p><a href="https://harheimertc.tsschulz.de/login">Zum Login</a></p>
<br>
<p>Mit sportlichen Gr\xFC\xDFen,<br>Ihr Harheimer TC</p>
`
});
} catch (emailError) {
console.error("E-Mail-Versand fehlgeschlagen:", emailError);
}
return {
success: true,
message: "Benutzer wurde freigeschaltet"
};
} catch (error) {
console.error("Fehler beim Freischalten:", error);
throw error;
}
});
export { approve_post as default };
//# sourceMappingURL=approve.post.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"approve.post.mjs","sources":["../../../../../../../server/api/cms/users/approve.post.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAGA,qBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AACA,IAAA,MAAA,WAAA,GAAA,MAAA,gBAAA,CAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,WAAA,IAAA,WAAA,CAAA,SAAA,OAAA,IAAA,WAAA,CAAA,SAAA,UAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,MAAA,EAAA,IAAA,EAAA,GAAA,IAAA;AAEA,IAAA,MAAA,KAAA,GAAA,MAAA,SAAA,EAAA;AACA,IAAA,MAAA,OAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,MAAA,CAAA;AAEA,IAAA,IAAA,CAAA,IAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAGA,IAAA,IAAA,CAAA,MAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,IAAA,IAAA,UAAA;AAEA,IAAA,MAAA,YAAA,GAAA,MAAA,GAAA,CAAA,CAAA,CAAA,KAAA,EAAA,EAAA,KAAA,MAAA,GAAA,OAAA,CAAA,CAAA;AACA,IAAA,MAAA,WAAA,YAAA,CAAA;AAGA,IAAA,IAAA;AACA,MAAA,MAAA,WAAA,GAAA,WAAA,iBAAA,CAAA;AAAA,QACA,IAAA,EAAA,OAAA,CAAA,GAAA,CAAA,SAAA,IAAA,gBAAA;AAAA,QACA,IAAA,EAAA,OAAA,CAAA,GAAA,CAAA,SAAA,IAAA,GAAA;AAAA,QACA,MAAA,EAAA,KAAA;AAAA,QACA,IAAA,EAAA;AAAA,UACA,IAAA,EAAA,QAAA,GAAA,CAAA,SAAA;AAAA,UACA,IAAA,EAAA,QAAA,GAAA,CAAA;AAAA;AACA,OACA,CAAA;AAEA,MAAA,MAAA,YAAA,QAAA,CAAA;AAAA,QACA,IAAA,EAAA,OAAA,CAAA,GAAA,CAAA,SAAA,IAAA,wBAAA;AAAA,QACA,IAAA,IAAA,CAAA,KAAA;AAAA,QACA,OAAA,EAAA,sCAAA;AAAA,QACA,IAAA,EAAA;AAAA;AAAA,mBAAA,EAEA,KAAA,IAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA;AAAA,OAOA,CAAA;AAAA,IACA,SAAA,UAAA,EAAA;AACA,MAAA,OAAA,CAAA,KAAA,CAAA,kCAAA,UAAA,CAAA;AAAA,IACA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,6BAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,58 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError, r as readBody } from '../../../../nitro/nitro.mjs';
import { a as getUserFromToken, r as readUsers, w as writeUsers } from '../../../../_/auth.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../../../_/encryption.mjs';
import 'crypto';
const deactivate_post = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
const currentUser = await getUserFromToken(token);
if (!currentUser || currentUser.role !== "admin" && currentUser.role !== "vorstand") {
throw createError({
statusCode: 403,
message: "Zugriff verweigert"
});
}
const body = await readBody(event);
const { userId } = body;
if (userId === currentUser.id) {
throw createError({
statusCode: 400,
message: "Sie k\xF6nnen sich nicht selbst deaktivieren"
});
}
const users = await readUsers();
const user = users.find((u) => u.id === userId);
if (!user) {
throw createError({
statusCode: 404,
message: "Benutzer nicht gefunden"
});
}
user.active = false;
const updatedUsers = users.map((u) => u.id === userId ? user : u);
await writeUsers(updatedUsers);
return {
success: true,
message: "Benutzer wurde deaktiviert"
};
} catch (error) {
console.error("Fehler beim Deaktivieren:", error);
throw error;
}
});
export { deactivate_post as default };
//# sourceMappingURL=deactivate.post.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"deactivate.post.mjs","sources":["../../../../../../../server/api/cms/users/deactivate.post.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,wBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AACA,IAAA,MAAA,WAAA,GAAA,MAAA,gBAAA,CAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,WAAA,IAAA,WAAA,CAAA,SAAA,OAAA,IAAA,WAAA,CAAA,SAAA,UAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,QAAA,GAAA,IAAA;AAEA,IAAA,IAAA,MAAA,KAAA,YAAA,EAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,KAAA,GAAA,MAAA,SAAA,EAAA;AACA,IAAA,MAAA,OAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,MAAA,CAAA;AAEA,IAAA,IAAA,CAAA,IAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,IAAA,CAAA,MAAA,GAAA,KAAA;AACA,IAAA,MAAA,YAAA,GAAA,MAAA,GAAA,CAAA,CAAA,CAAA,KAAA,EAAA,EAAA,KAAA,MAAA,GAAA,OAAA,CAAA,CAAA;AACA,IAAA,MAAA,WAAA,YAAA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,6BAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,49 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError } from '../../../../nitro/nitro.mjs';
import { a as getUserFromToken, r as readUsers } from '../../../../_/auth.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../../../_/encryption.mjs';
import 'crypto';
const list_get = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
const currentUser = await getUserFromToken(token);
if (!currentUser || currentUser.role !== "admin" && currentUser.role !== "vorstand") {
throw createError({
statusCode: 403,
message: "Zugriff verweigert"
});
}
const users = await readUsers();
const safeUsers = users.map((u) => ({
id: u.id,
email: u.email,
name: u.name,
role: u.role,
phone: u.phone || "",
active: u.active,
created: u.created,
lastLogin: u.lastLogin
}));
return {
users: safeUsers
};
} catch (error) {
console.error("Fehler beim Laden der Benutzer:", error);
throw error;
}
});
export { list_get as default };
//# sourceMappingURL=list.get.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"list.get.mjs","sources":["../../../../../../../server/api/cms/users/list.get.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,iBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AACA,IAAA,MAAA,WAAA,GAAA,MAAA,gBAAA,CAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,WAAA,IAAA,WAAA,CAAA,SAAA,OAAA,IAAA,WAAA,CAAA,SAAA,UAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,KAAA,GAAA,MAAA,SAAA,EAAA;AAGA,IAAA,MAAA,SAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAA,CAAA,MAAA;AAAA,MACA,IAAA,CAAA,CAAA,EAAA;AAAA,MACA,OAAA,CAAA,CAAA,KAAA;AAAA,MACA,MAAA,CAAA,CAAA,IAAA;AAAA,MACA,MAAA,CAAA,CAAA,IAAA;AAAA,MACA,KAAA,EAAA,EAAA,KAAA,IAAA,EAAA;AAAA,MACA,QAAA,CAAA,CAAA,MAAA;AAAA,MACA,SAAA,CAAA,CAAA,OAAA;AAAA,MACA,WAAA,CAAA,CAAA;AAAA,KACA,CAAA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,KAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,mCAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,44 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError, r as readBody } from '../../../../nitro/nitro.mjs';
import { a as getUserFromToken, r as readUsers, w as writeUsers } from '../../../../_/auth.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../../../_/encryption.mjs';
import 'crypto';
const reject_post = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
const currentUser = await getUserFromToken(token);
if (!currentUser || currentUser.role !== "admin" && currentUser.role !== "vorstand") {
throw createError({
statusCode: 403,
message: "Zugriff verweigert"
});
}
const body = await readBody(event);
const { userId } = body;
const users = await readUsers();
const updatedUsers = users.filter((u) => u.id !== userId);
await writeUsers(updatedUsers);
return {
success: true,
message: "Registrierung wurde abgelehnt und gel\xF6scht"
};
} catch (error) {
console.error("Fehler beim Ablehnen:", error);
throw error;
}
});
export { reject_post as default };
//# sourceMappingURL=reject.post.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"reject.post.mjs","sources":["../../../../../../../server/api/cms/users/reject.post.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,oBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AACA,IAAA,MAAA,WAAA,GAAA,MAAA,gBAAA,CAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,WAAA,IAAA,WAAA,CAAA,SAAA,OAAA,IAAA,WAAA,CAAA,SAAA,UAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,QAAA,GAAA,IAAA;AAEA,IAAA,MAAA,KAAA,GAAA,MAAA,SAAA,EAAA;AACA,IAAA,MAAA,eAAA,KAAA,CAAA,MAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,MAAA,CAAA;AAEA,IAAA,MAAA,WAAA,YAAA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,yBAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,58 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError, r as readBody } from '../../../../nitro/nitro.mjs';
import { a as getUserFromToken, r as readUsers, w as writeUsers } from '../../../../_/auth.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../../../_/encryption.mjs';
import 'crypto';
const updateRole_post = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
const currentUser = await getUserFromToken(token);
if (!currentUser || currentUser.role !== "admin" && currentUser.role !== "vorstand") {
throw createError({
statusCode: 403,
message: "Zugriff verweigert"
});
}
const body = await readBody(event);
const { userId, role } = body;
if (!["mitglied", "vorstand", "admin"].includes(role)) {
throw createError({
statusCode: 400,
message: "Ung\xFCltige Rolle"
});
}
const users = await readUsers();
const user = users.find((u) => u.id === userId);
if (!user) {
throw createError({
statusCode: 404,
message: "Benutzer nicht gefunden"
});
}
user.role = role;
const updatedUsers = users.map((u) => u.id === userId ? user : u);
await writeUsers(updatedUsers);
return {
success: true,
message: "Rolle wurde aktualisiert"
};
} catch (error) {
console.error("Fehler beim Aktualisieren der Rolle:", error);
throw error;
}
});
export { updateRole_post as default };
//# sourceMappingURL=update-role.post.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"update-role.post.mjs","sources":["../../../../../../../server/api/cms/users/update-role.post.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,wBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AACA,IAAA,MAAA,WAAA,GAAA,MAAA,gBAAA,CAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,WAAA,IAAA,WAAA,CAAA,SAAA,OAAA,IAAA,WAAA,CAAA,SAAA,UAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,MAAA,EAAA,IAAA,EAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,CAAA,UAAA,EAAA,UAAA,EAAA,OAAA,CAAA,CAAA,QAAA,CAAA,IAAA,CAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,KAAA,GAAA,MAAA,SAAA,EAAA;AACA,IAAA,MAAA,OAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,MAAA,CAAA;AAEA,IAAA,IAAA,CAAA,IAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,MAAA,YAAA,GAAA,MAAA,GAAA,CAAA,CAAA,CAAA,KAAA,EAAA,EAAA,KAAA,MAAA,GAAA,OAAA,CAAA,CAAA;AACA,IAAA,MAAA,WAAA,YAAA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,wCAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,105 +0,0 @@
import { d as defineEventHandler, r as readBody, c as createError } from '../../nitro/nitro.mjs';
import nodemailer from 'nodemailer';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
const contact_post = defineEventHandler(async (event) => {
try {
const body = await readBody(event);
if (!body.name || !body.email || !body.subject || !body.message) {
throw createError({
statusCode: 400,
statusMessage: "Alle Pflichtfelder m\xFCssen ausgef\xFCllt werden"
});
}
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(body.email)) {
throw createError({
statusCode: 400,
statusMessage: "Ung\xFCltige E-Mail-Adresse"
});
}
const transporter = nodemailer.createTransporter({
host: process.env.SMTP_HOST || "smtp.gmail.com",
port: process.env.SMTP_PORT || 587,
secure: false,
// true für 465, false für andere Ports
auth: {
user: process.env.SMTP_USER || "j.dichmann@gmx.de",
pass: process.env.SMTP_PASS || process.env.EMAIL_PASSWORD
}
});
const emailHtml = `
<div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
<h2 style="color: #dc2626; border-bottom: 2px solid #dc2626; padding-bottom: 10px;">
Neue Kontaktanfrage - Harheimer TC
</h2>
<div style="background-color: #f9fafb; padding: 20px; border-radius: 8px; margin: 20px 0;">
<h3 style="color: #374151; margin-top: 0;">Kontaktdaten:</h3>
<p><strong>Name:</strong> ${body.name}</p>
<p><strong>E-Mail:</strong> ${body.email}</p>
<p><strong>Telefon:</strong> ${body.phone || "Nicht angegeben"}</p>
<p><strong>Betreff:</strong> ${body.subject}</p>
</div>
<div style="background-color: #ffffff; padding: 20px; border: 1px solid #e5e7eb; border-radius: 8px;">
<h3 style="color: #374151; margin-top: 0;">Nachricht:</h3>
<p style="white-space: pre-wrap; line-height: 1.6;">${body.message}</p>
</div>
<div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #e5e7eb; color: #6b7280; font-size: 14px;">
<p>Diese Nachricht wurde \xFCber das Kontaktformular der Harheimer TC Website gesendet.</p>
<p>Zeitstempel: ${(/* @__PURE__ */ new Date()).toLocaleString("de-DE")}</p>
</div>
</div>
`;
const emailText = `
Neue Kontaktanfrage - Harheimer TC
Kontaktdaten:
Name: ${body.name}
E-Mail: ${body.email}
Telefon: ${body.phone || "Nicht angegeben"}
Betreff: ${body.subject}
Nachricht:
${body.message}
---
Diese Nachricht wurde \xFCber das Kontaktformular der Harheimer TC Website gesendet.
Zeitstempel: ${(/* @__PURE__ */ new Date()).toLocaleString("de-DE")}
`;
const mailOptions = {
from: `"Harheimer TC Website" <${process.env.SMTP_USER || "j.dichmann@gmx.de"}>`,
to: "j.dichmann@gmx.de",
replyTo: body.email,
subject: `Kontaktanfrage: ${body.subject}`,
text: emailText,
html: emailHtml
};
await transporter.sendMail(mailOptions);
return {
success: true,
message: "E-Mail wurde erfolgreich gesendet!"
};
} catch (error) {
console.error("Fehler beim Senden der E-Mail:", error);
if (error.statusCode) {
throw error;
}
throw createError({
statusCode: 500,
statusMessage: "Fehler beim Senden der E-Mail. Bitte versuchen Sie es sp\xE4ter erneut."
});
}
});
export { contact_post as default };
//# sourceMappingURL=contact.post.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"contact.post.mjs","sources":["../../../../../server/api/contact.post.js"],"sourcesContent":null,"names":[],"mappings":"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"}

View File

@@ -1,42 +0,0 @@
import { d as defineEventHandler } from '../../nitro/nitro.mjs';
import { promises } from 'fs';
import path from 'path';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
const galerie_get = defineEventHandler(async (event) => {
try {
const galerieDir = path.join(process.cwd(), "public", "galerie");
try {
await promises.access(galerieDir);
} catch {
return [];
}
const dateien = await promises.readdir(galerieDir);
const erlaubteExtensions = [".jpg", ".jpeg", ".png", ".gif", ".webp", ".svg"];
const bilder = dateien.filter((datei) => {
const ext = path.extname(datei).toLowerCase();
return erlaubteExtensions.includes(ext);
});
return bilder.map((filename) => {
const nameWithoutExt = path.parse(filename).name;
const title = nameWithoutExt.replace(/[-_]/g, " ").replace(/\b\w/g, (l) => l.toUpperCase());
return {
filename,
title
};
});
} catch (error) {
console.error("Fehler beim Lesen der Galerie:", error);
return [];
}
});
export { galerie_get as default };
//# sourceMappingURL=galerie.get.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"galerie.get.mjs","sources":["../../../../../server/api/galerie.get.js"],"sourcesContent":null,"names":["fs"],"mappings":";;;;;;;;;;;;AAGA,oBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,aAAA,IAAA,CAAA,IAAA,CAAA,QAAA,GAAA,EAAA,EAAA,UAAA,SAAA,CAAA;AAGA,IAAA,IAAA;AACA,MAAA,MAAAA,QAAA,CAAA,OAAA,UAAA,CAAA;AAAA,IACA,CAAA,CAAA,MAAA;AACA,MAAA,OAAA,EAAA;AAAA,IACA;AAGA,IAAA,MAAA,OAAA,GAAA,MAAAA,QAAA,CAAA,OAAA,CAAA,UAAA,CAAA;AAGA,IAAA,MAAA,qBAAA,CAAA,MAAA,EAAA,SAAA,MAAA,EAAA,MAAA,EAAA,SAAA,MAAA,CAAA;AACA,IAAA,MAAA,MAAA,GAAA,OAAA,CAAA,MAAA,CAAA,CAAA,KAAA,KAAA;AACA,MAAA,MAAA,GAAA,GAAA,IAAA,CAAA,OAAA,CAAA,KAAA,EAAA,WAAA,EAAA;AACA,MAAA,OAAA,kBAAA,CAAA,SAAA,GAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAGA,IAAA,OAAA,MAAA,CAAA,IAAA,CAAA,QAAA,KAAA;AACA,MAAA,MAAA,cAAA,GAAA,IAAA,CAAA,KAAA,CAAA,QAAA,CAAA,CAAA,IAAA;AACA,MAAA,MAAA,KAAA,GAAA,cAAA,CACA,OAAA,CAAA,OAAA,EAAA,GAAA,CAAA,CACA,OAAA,CAAA,OAAA,EAAA,CAAA,CAAA,KAAA,CAAA,CAAA,WAAA,EAAA,CAAA;AAEA,MAAA,OAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACA;AAAA,IACA,CAAA,CAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,kCAAA,KAAA,CAAA;AACA,IAAA,OAAA,EAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,62 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError, r as readBody } from '../../nitro/nitro.mjs';
import { b as verifyToken, e as getUserById } from '../../_/auth.mjs';
import { d as deleteMember } from '../../_/members.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../_/encryption.mjs';
import 'crypto';
const members_delete = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
if (!token) {
throw createError({
statusCode: 401,
message: "Nicht authentifiziert."
});
}
const decoded = verifyToken(token);
if (!decoded) {
throw createError({
statusCode: 401,
message: "Ung\xFCltiges Token."
});
}
const user = await getUserById(decoded.id);
if (!user || user.role !== "admin" && user.role !== "vorstand") {
throw createError({
statusCode: 403,
message: "Keine Berechtigung zum L\xF6schen von Mitgliedern."
});
}
const body = await readBody(event);
const { id } = body;
if (!id) {
throw createError({
statusCode: 400,
message: "Mitglieds-ID ist erforderlich."
});
}
await deleteMember(id);
return {
success: true,
message: "Mitglied erfolgreich gel\xF6scht."
};
} catch (error) {
console.error("Fehler beim L\xF6schen des Mitglieds:", error);
throw error;
}
});
export { members_delete as default };
//# sourceMappingURL=members.delete.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"members.delete.mjs","sources":["../../../../../server/api/members.delete.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAGA,uBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AAEA,IAAA,IAAA,CAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,OAAA,GAAA,YAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,OAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,WAAA,CAAA,OAAA,CAAA,EAAA,CAAA;AAGA,IAAA,IAAA,CAAA,IAAA,IAAA,IAAA,CAAA,SAAA,OAAA,IAAA,IAAA,CAAA,SAAA,UAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,IAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,EAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,aAAA,EAAA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,yCAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,114 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError } from '../../nitro/nitro.mjs';
import { b as verifyToken, r as readUsers } from '../../_/auth.mjs';
import { r as readMembers } from '../../_/members.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../_/encryption.mjs';
import 'crypto';
const members_get = defineEventHandler(async (event) => {
var _a, _b, _c;
try {
const token = getCookie(event, "auth_token");
if (!token) {
throw createError({
statusCode: 401,
message: "Nicht authentifiziert."
});
}
const decoded = verifyToken(token);
if (!decoded) {
throw createError({
statusCode: 401,
message: "Ung\xFCltiges Token."
});
}
const manualMembers = await readMembers();
const registeredUsers = await readUsers();
const mergedMembers = [];
const processedEmails = /* @__PURE__ */ new Set();
const processedNames = /* @__PURE__ */ new Set();
for (const member of manualMembers) {
const normalizedEmail = ((_a = member.email) == null ? void 0 : _a.toLowerCase().trim()) || "";
const fullName = `${member.firstName || ""} ${member.lastName || ""}`.trim();
const normalizedName = fullName.toLowerCase();
mergedMembers.push({
...member,
name: fullName,
// Computed for display
source: "manual",
editable: true,
hasLogin: false
});
if (normalizedEmail) processedEmails.add(normalizedEmail);
if (normalizedName) processedNames.add(normalizedName);
}
for (const user of registeredUsers) {
if (!user.active) continue;
const normalizedEmail = ((_b = user.email) == null ? void 0 : _b.toLowerCase().trim()) || "";
const normalizedName = ((_c = user.name) == null ? void 0 : _c.toLowerCase().trim()) || "";
let matchedManualIndex = -1;
if (normalizedEmail) {
matchedManualIndex = mergedMembers.findIndex(
(m) => {
var _a2;
return m.source === "manual" && ((_a2 = m.email) == null ? void 0 : _a2.toLowerCase().trim()) === normalizedEmail;
}
);
}
if (matchedManualIndex === -1 && normalizedName) {
matchedManualIndex = mergedMembers.findIndex(
(m) => {
var _a2;
return m.source === "manual" && ((_a2 = m.name) == null ? void 0 : _a2.toLowerCase().trim()) === normalizedName;
}
);
}
if (matchedManualIndex !== -1) {
mergedMembers[matchedManualIndex] = {
...mergedMembers[matchedManualIndex],
hasLogin: true,
loginEmail: user.email,
loginRole: user.role,
lastLogin: user.lastLogin
};
} else {
mergedMembers.push({
id: user.id,
name: user.name,
email: user.email,
phone: user.phone || "",
address: "",
notes: `Rolle: ${user.role}`,
source: "login",
editable: false,
hasLogin: true,
loginEmail: user.email,
loginRole: user.role,
lastLogin: user.lastLogin
});
}
}
mergedMembers.sort((a, b) => a.name.localeCompare(b.name));
return {
success: true,
members: mergedMembers
};
} catch (error) {
console.error("Fehler beim Abrufen der Mitgliederliste:", error);
throw error;
}
});
export { members_get as default };
//# sourceMappingURL=members.get.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"members.get.mjs","sources":["../../../../../server/api/members.get.js"],"sourcesContent":null,"names":["_a"],"mappings":"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"}

View File

@@ -1,105 +0,0 @@
import { d as defineEventHandler, g as getCookie, b as getHeader, c as createError, r as readBody } from '../../nitro/nitro.mjs';
import { b as verifyToken, e as getUserById } from '../../_/auth.mjs';
import { s as saveMember } from '../../_/members.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../_/encryption.mjs';
import 'crypto';
const members_post = defineEventHandler(async (event) => {
try {
let token = getCookie(event, "auth_token");
if (!token) {
const authHeader = getHeader(event, "authorization");
if (authHeader && authHeader.startsWith("Bearer ")) {
token = authHeader.substring(7);
}
}
if (!token) {
throw createError({
statusCode: 401,
message: "Nicht authentifiziert. Bitte Token im Cookie oder Authorization-Header bereitstellen."
});
}
const decoded = verifyToken(token);
if (!decoded) {
throw createError({
statusCode: 401,
message: "Ung\xFCltiges Token."
});
}
const user = await getUserById(decoded.id);
if (!user) {
throw createError({
statusCode: 401,
message: "Benutzer nicht gefunden."
});
}
if (user.role !== "admin" && user.role !== "vorstand") {
throw createError({
statusCode: 403,
message: "Keine Berechtigung zum Hinzuf\xFCgen/Bearbeiten von Mitgliedern. Erforderlich: admin oder vorstand Rolle."
});
}
const body = await readBody(event);
const { id, firstName, lastName, geburtsdatum, email, phone, address, notes } = body;
if (!firstName || !lastName) {
throw createError({
statusCode: 400,
message: "Vorname und Nachname sind erforderlich."
});
}
if (!geburtsdatum) {
throw createError({
statusCode: 400,
message: "Geburtsdatum ist erforderlich, um Duplikate zu vermeiden."
});
}
try {
await saveMember({
id: id || void 0,
firstName,
lastName,
geburtsdatum: geburtsdatum || "",
email: email || "",
phone: phone || "",
address: address || "",
notes: notes || ""
});
return {
success: true,
message: "Mitglied erfolgreich gespeichert."
};
} catch (memberError) {
if (memberError.message && memberError.message.includes("existiert bereits")) {
throw createError({
statusCode: 409,
message: memberError.message
});
}
throw memberError;
}
} catch (error) {
console.error("Fehler beim Speichern des Mitglieds:", error);
if (error.statusCode) {
throw error;
}
throw createError({
statusCode: error.statusCode || 500,
message: error.message || "Fehler beim Speichern des Mitglieds."
});
}
});
export { members_post as default };
//# sourceMappingURL=members.post.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"members.post.mjs","sources":["../../../../../server/api/members.post.js"],"sourcesContent":null,"names":[],"mappings":"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"}

View File

@@ -1,41 +0,0 @@
import { d as defineEventHandler } from '../../nitro/nitro.mjs';
import { r as readNews } from '../../_/news.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'fs';
import 'path';
import 'crypto';
const newsPublic_get = defineEventHandler(async (event) => {
try {
const allNews = await readNews();
const now = /* @__PURE__ */ new Date();
const publicNews = allNews.filter((item) => {
if (!item.isPublic) return false;
if (item.isHidden) return false;
if (item.expiresAt) {
const expiresAt = new Date(item.expiresAt);
if (expiresAt <= now) return false;
}
return true;
});
publicNews.sort((a, b) => new Date(b.created) - new Date(a.created));
const latestNews = publicNews.slice(0, 3);
return {
success: true,
news: latestNews
};
} catch (error) {
console.error("Fehler beim Abrufen der \xF6ffentlichen News:", error);
throw error;
}
});
export { newsPublic_get as default };
//# sourceMappingURL=news-public.get.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"news-public.get.mjs","sources":["../../../../../server/api/news-public.get.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;AAEA,uBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,OAAA,GAAA,MAAA,QAAA,EAAA;AACA,IAAA,MAAA,GAAA,uBAAA,IAAA,EAAA;AAGA,IAAA,MAAA,UAAA,GAAA,OAAA,CAAA,MAAA,CAAA,CAAA,IAAA,KAAA;AAEA,MAAA,IAAA,CAAA,IAAA,CAAA,QAAA,EAAA,OAAA,KAAA;AAGA,MAAA,IAAA,IAAA,CAAA,UAAA,OAAA,KAAA;AAGA,MAAA,IAAA,KAAA,SAAA,EAAA;AACA,QAAA,MAAA,SAAA,GAAA,IAAA,IAAA,CAAA,IAAA,CAAA,SAAA,CAAA;AACA,QAAA,IAAA,SAAA,IAAA,KAAA,OAAA,KAAA;AAAA,MACA;AAEA,MAAA,OAAA,IAAA;AAAA,IACA,CAAA,CAAA;AAGA,IAAA,UAAA,CAAA,IAAA,CAAA,CAAA,CAAA,EAAA,CAAA,KAAA,IAAA,IAAA,CAAA,CAAA,CAAA,OAAA,CAAA,GAAA,IAAA,IAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA;AAGA,IAAA,MAAA,UAAA,GAAA,UAAA,CAAA,KAAA,CAAA,CAAA,EAAA,CAAA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,IAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,iDAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,62 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError, h as getQuery } from '../../nitro/nitro.mjs';
import { b as verifyToken, e as getUserById } from '../../_/auth.mjs';
import { d as deleteNews } from '../../_/news.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../_/encryption.mjs';
import 'crypto';
const news_delete = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
if (!token) {
throw createError({
statusCode: 401,
message: "Nicht authentifiziert."
});
}
const decoded = verifyToken(token);
if (!decoded) {
throw createError({
statusCode: 401,
message: "Ung\xFCltiges Token."
});
}
const user = await getUserById(decoded.id);
if (!user || user.role !== "admin" && user.role !== "vorstand") {
throw createError({
statusCode: 403,
message: "Keine Berechtigung zum L\xF6schen von News."
});
}
const query = getQuery(event);
const id = query.id;
if (!id) {
throw createError({
statusCode: 400,
message: "News-ID ist erforderlich."
});
}
await deleteNews(id);
return {
success: true,
message: "News erfolgreich gel\xF6scht."
};
} catch (error) {
console.error("Fehler beim L\xF6schen der News:", error);
throw error;
}
});
export { news_delete as default };
//# sourceMappingURL=news.delete.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"news.delete.mjs","sources":["../../../../../server/api/news.delete.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAGA,oBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AAEA,IAAA,IAAA,CAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,OAAA,GAAA,YAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,OAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,WAAA,CAAA,OAAA,CAAA,EAAA,CAAA;AAGA,IAAA,IAAA,CAAA,IAAA,IAAA,IAAA,CAAA,SAAA,OAAA,IAAA,IAAA,CAAA,SAAA,UAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAGA,IAAA,MAAA,KAAA,GAAA,SAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA,KAAA,CAAA,EAAA;AAEA,IAAA,IAAA,CAAA,EAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,WAAA,EAAA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,oCAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,48 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError } from '../../nitro/nitro.mjs';
import { b as verifyToken } from '../../_/auth.mjs';
import { r as readNews } from '../../_/news.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../_/encryption.mjs';
import 'crypto';
const news_get = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
if (!token) {
throw createError({
statusCode: 401,
message: "Nicht authentifiziert."
});
}
const decoded = verifyToken(token);
if (!decoded) {
throw createError({
statusCode: 401,
message: "Ung\xFCltiges Token."
});
}
const news = await readNews();
news.sort((a, b) => new Date(b.created) - new Date(a.created));
return {
success: true,
news
};
} catch (error) {
console.error("Fehler beim Abrufen der News:", error);
throw error;
}
});
export { news_get as default };
//# sourceMappingURL=news.get.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"news.get.mjs","sources":["../../../../../server/api/news.get.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAGA,iBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AAEA,IAAA,IAAA,CAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,OAAA,GAAA,YAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,OAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,QAAA,EAAA;AAGA,IAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,EAAA,CAAA,KAAA,IAAA,IAAA,CAAA,CAAA,CAAA,OAAA,CAAA,GAAA,IAAA,IAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,iCAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,70 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError, r as readBody } from '../../nitro/nitro.mjs';
import { b as verifyToken, e as getUserById } from '../../_/auth.mjs';
import { s as saveNews } from '../../_/news.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../_/encryption.mjs';
import 'crypto';
const news_post = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
if (!token) {
throw createError({
statusCode: 401,
message: "Nicht authentifiziert."
});
}
const decoded = verifyToken(token);
if (!decoded) {
throw createError({
statusCode: 401,
message: "Ung\xFCltiges Token."
});
}
const user = await getUserById(decoded.id);
if (!user || user.role !== "admin" && user.role !== "vorstand") {
throw createError({
statusCode: 403,
message: "Keine Berechtigung zum Erstellen/Bearbeiten von News."
});
}
const body = await readBody(event);
const { id, title, content, isPublic, expiresAt, isHidden } = body;
if (!title || !content) {
throw createError({
statusCode: 400,
message: "Titel und Inhalt sind erforderlich."
});
}
await saveNews({
id: id || void 0,
title,
content,
isPublic: isPublic || false,
expiresAt: expiresAt || void 0,
isHidden: isHidden || false,
author: user.name
});
return {
success: true,
message: "News erfolgreich gespeichert."
};
} catch (error) {
console.error("Fehler beim Speichern der News:", error);
throw error;
}
});
export { news_post as default };
//# sourceMappingURL=news.post.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"news.post.mjs","sources":["../../../../../server/api/news.post.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAGA,kBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AAEA,IAAA,IAAA,CAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,OAAA,GAAA,YAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,OAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,WAAA,CAAA,OAAA,CAAA,EAAA,CAAA;AAGA,IAAA,IAAA,CAAA,IAAA,IAAA,IAAA,CAAA,SAAA,OAAA,IAAA,IAAA,CAAA,SAAA,UAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,SAAA,QAAA,EAAA,SAAA,EAAA,UAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,KAAA,IAAA,CAAA,OAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,QAAA,CAAA;AAAA,MACA,IAAA,EAAA,IAAA,KAAA,CAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA,QAAA,IAAA,KAAA;AAAA,MACA,WAAA,SAAA,IAAA,KAAA,CAAA;AAAA,MACA,UAAA,QAAA,IAAA,KAAA;AAAA,MACA,QAAA,IAAA,CAAA;AAAA,KACA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,mCAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,58 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError } from '../../nitro/nitro.mjs';
import { b as verifyToken, e as getUserById } from '../../_/auth.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../_/encryption.mjs';
import 'crypto';
const profile_get = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
if (!token) {
throw createError({
statusCode: 401,
message: "Nicht authentifiziert."
});
}
const decoded = verifyToken(token);
if (!decoded) {
throw createError({
statusCode: 401,
message: "Ung\xFCltiges Token."
});
}
const user = await getUserById(decoded.id);
if (!user || user.active === false) {
throw createError({
statusCode: 403,
message: "Benutzer nicht gefunden oder inaktiv."
});
}
return {
success: true,
user: {
id: user.id,
email: user.email,
name: user.name,
phone: user.phone || "",
role: user.role
}
};
} catch (error) {
console.error("Profil-Abruf-Fehler:", error);
throw error;
}
});
export { profile_get as default };
//# sourceMappingURL=profile.get.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"profile.get.mjs","sources":["../../../../../server/api/profile.get.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,oBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AAEA,IAAA,IAAA,CAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,OAAA,GAAA,YAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,OAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,WAAA,CAAA,OAAA,CAAA,EAAA,CAAA;AAEA,IAAA,IAAA,CAAA,IAAA,IAAA,IAAA,CAAA,MAAA,KAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAGA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,IAAA,EAAA;AAAA,QACA,IAAA,IAAA,CAAA,EAAA;AAAA,QACA,OAAA,IAAA,CAAA,KAAA;AAAA,QACA,MAAA,IAAA,CAAA,IAAA;AAAA,QACA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA;AAAA,QACA,MAAA,IAAA,CAAA;AAAA;AACA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,wBAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,98 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError, r as readBody } from '../../nitro/nitro.mjs';
import { b as verifyToken, r as readUsers, v as verifyPassword, h as hashPassword, w as writeUsers } from '../../_/auth.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../_/encryption.mjs';
import 'crypto';
const profile_put = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
if (!token) {
throw createError({
statusCode: 401,
message: "Nicht authentifiziert."
});
}
const decoded = verifyToken(token);
if (!decoded) {
throw createError({
statusCode: 401,
message: "Ung\xFCltiges Token."
});
}
const body = await readBody(event);
const { name, email, phone, currentPassword, newPassword } = body;
if (!name || !email) {
throw createError({
statusCode: 400,
message: "Name und E-Mail sind erforderlich."
});
}
const users = await readUsers();
const userIndex = users.findIndex((u) => u.id === decoded.id);
if (userIndex === -1) {
throw createError({
statusCode: 404,
message: "Benutzer nicht gefunden."
});
}
const user = users[userIndex];
if (email !== user.email) {
const emailExists = users.some((u) => u.email === email && u.id !== user.id);
if (emailExists) {
throw createError({
statusCode: 409,
message: "Diese E-Mail-Adresse wird bereits verwendet."
});
}
}
user.name = name;
user.email = email;
user.phone = phone || "";
if (currentPassword && newPassword) {
const isValid = await verifyPassword(currentPassword, user.password);
if (!isValid) {
throw createError({
statusCode: 401,
message: "Aktuelles Passwort ist falsch."
});
}
if (newPassword.length < 6) {
throw createError({
statusCode: 400,
message: "Das neue Passwort muss mindestens 6 Zeichen lang sein."
});
}
user.password = await hashPassword(newPassword);
}
await writeUsers(users);
return {
success: true,
message: "Profil erfolgreich aktualisiert.",
user: {
id: user.id,
email: user.email,
name: user.name,
phone: user.phone,
role: user.role
}
};
} catch (error) {
console.error("Profil-Update-Fehler:", error);
throw error;
}
});
export { profile_put as default };
//# sourceMappingURL=profile.put.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"profile.put.mjs","sources":["../../../../../server/api/profile.put.js"],"sourcesContent":null,"names":[],"mappings":"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"}

View File

@@ -1,41 +0,0 @@
import { d as defineEventHandler } from '../../nitro/nitro.mjs';
import { promises } from 'fs';
import path from 'path';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
const spielplaene_get = defineEventHandler(async (event) => {
try {
const spielplaeneDir = path.join(process.cwd(), "public", "spielplaene");
console.log("=== SPIELPL\xC4NE API ===");
console.log("Verzeichnis:", spielplaeneDir);
try {
await promises.access(spielplaeneDir);
} catch {
console.log("Verzeichnis nicht gefunden");
return [];
}
const dateien = await promises.readdir(spielplaeneDir);
console.log("Alle Dateien:", dateien);
const erlaubteExtensions = [".pdf", ".xlsx", ".xls", ".doc", ".docx"];
const gefiltert = dateien.filter((datei) => {
const ext = path.extname(datei).toLowerCase();
return erlaubteExtensions.includes(ext);
});
console.log("Gefilterte Dateien:", gefiltert);
console.log("Anzahl:", gefiltert.length);
return gefiltert;
} catch (error) {
console.error("Fehler beim Lesen der Spielpl\xE4ne:", error);
return [];
}
});
export { spielplaene_get as default };
//# sourceMappingURL=spielplaene.get.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"spielplaene.get.mjs","sources":["../../../../../server/api/spielplaene.get.js"],"sourcesContent":null,"names":["fs"],"mappings":";;;;;;;;;;;;AAGA,wBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,iBAAA,IAAA,CAAA,IAAA,CAAA,QAAA,GAAA,EAAA,EAAA,UAAA,aAAA,CAAA;AAEA,IAAA,OAAA,CAAA,IAAA,2BAAA,CAAA;AACA,IAAA,OAAA,CAAA,GAAA,CAAA,gBAAA,cAAA,CAAA;AAGA,IAAA,IAAA;AACA,MAAA,MAAAA,QAAA,CAAA,OAAA,cAAA,CAAA;AAAA,IACA,CAAA,CAAA,MAAA;AACA,MAAA,OAAA,CAAA,IAAA,4BAAA,CAAA;AACA,MAAA,OAAA,EAAA;AAAA,IACA;AAGA,IAAA,MAAA,OAAA,GAAA,MAAAA,QAAA,CAAA,OAAA,CAAA,cAAA,CAAA;AACA,IAAA,OAAA,CAAA,GAAA,CAAA,iBAAA,OAAA,CAAA;AAGA,IAAA,MAAA,qBAAA,CAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,OAAA,CAAA;AACA,IAAA,MAAA,SAAA,GAAA,OAAA,CAAA,MAAA,CAAA,CAAA,KAAA,KAAA;AACA,MAAA,MAAA,GAAA,GAAA,IAAA,CAAA,OAAA,CAAA,KAAA,EAAA,WAAA,EAAA;AACA,MAAA,OAAA,kBAAA,CAAA,SAAA,GAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAEA,IAAA,OAAA,CAAA,GAAA,CAAA,uBAAA,SAAA,CAAA;AACA,IAAA,OAAA,CAAA,GAAA,CAAA,SAAA,EAAA,SAAA,CAAA,MAAA,CAAA;AAEA,IAAA,OAAA,SAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,wCAAA,KAAA,CAAA;AACA,IAAA,OAAA,EAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,68 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError, h as getQuery } from '../../nitro/nitro.mjs';
import { b as verifyToken, e as getUserById } from '../../_/auth.mjs';
import { d as deleteTermin } from '../../_/termine.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../_/encryption.mjs';
import 'crypto';
const termineManage_delete = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
if (!token) {
throw createError({
statusCode: 401,
message: "Nicht authentifiziert."
});
}
const decoded = verifyToken(token);
if (!decoded) {
throw createError({
statusCode: 401,
message: "Ung\xFCltiges Token."
});
}
const user = await getUserById(decoded.id);
if (!user || user.role !== "admin" && user.role !== "vorstand") {
throw createError({
statusCode: 403,
message: "Keine Berechtigung zum L\xF6schen von Terminen."
});
}
const query = getQuery(event);
const { datum, uhrzeit, titel, beschreibung, kategorie } = query;
if (!datum || !titel) {
throw createError({
statusCode: 400,
message: "Datum und Titel sind erforderlich."
});
}
await deleteTermin({
datum,
uhrzeit: uhrzeit || "",
titel,
beschreibung: beschreibung || "",
kategorie: kategorie || "Sonstiges"
});
return {
success: true,
message: "Termin erfolgreich gel\xF6scht."
};
} catch (error) {
console.error("Fehler beim L\xF6schen des Termins:", error);
throw error;
}
});
export { termineManage_delete as default };
//# sourceMappingURL=termine-manage.delete.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"termine-manage.delete.mjs","sources":["../../../../../server/api/termine-manage.delete.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAGA,6BAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AAEA,IAAA,IAAA,CAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,OAAA,GAAA,YAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,OAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,WAAA,CAAA,OAAA,CAAA,EAAA,CAAA;AAGA,IAAA,IAAA,CAAA,IAAA,IAAA,IAAA,CAAA,SAAA,OAAA,IAAA,IAAA,CAAA,SAAA,UAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,KAAA,GAAA,SAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,YAAA,EAAA,WAAA,GAAA,KAAA;AAEA,IAAA,IAAA,CAAA,KAAA,IAAA,CAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,YAAA,CAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,OAAA,IAAA,EAAA;AAAA,MACA,KAAA;AAAA,MACA,cAAA,YAAA,IAAA,EAAA;AAAA,MACA,WAAA,SAAA,IAAA;AAAA,KACA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,uCAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,54 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError } from '../../nitro/nitro.mjs';
import { b as verifyToken, e as getUserById } from '../../_/auth.mjs';
import { r as readTermine } from '../../_/termine.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../_/encryption.mjs';
import 'crypto';
const termineManage_get = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
if (!token) {
throw createError({
statusCode: 401,
message: "Nicht authentifiziert."
});
}
const decoded = verifyToken(token);
if (!decoded) {
throw createError({
statusCode: 401,
message: "Ung\xFCltiges Token."
});
}
const user = await getUserById(decoded.id);
if (!user || user.role !== "admin" && user.role !== "vorstand") {
throw createError({
statusCode: 403,
message: "Keine Berechtigung zum Verwalten von Terminen."
});
}
const termine = await readTermine();
return {
success: true,
termine
};
} catch (error) {
console.error("Fehler beim Abrufen der Termine:", error);
throw error;
}
});
export { termineManage_get as default };
//# sourceMappingURL=termine-manage.get.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"termine-manage.get.mjs","sources":["../../../../../server/api/termine-manage.get.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAGA,0BAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AAEA,IAAA,IAAA,CAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,OAAA,GAAA,YAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,OAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,WAAA,CAAA,OAAA,CAAA,EAAA,CAAA;AAGA,IAAA,IAAA,CAAA,IAAA,IAAA,IAAA,CAAA,SAAA,OAAA,IAAA,IAAA,CAAA,SAAA,UAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,OAAA,GAAA,MAAA,WAAA,EAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,oCAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,68 +0,0 @@
import { d as defineEventHandler, g as getCookie, c as createError, r as readBody } from '../../nitro/nitro.mjs';
import { b as verifyToken, e as getUserById } from '../../_/auth.mjs';
import { s as saveTermin } from '../../_/termine.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
import '../../_/encryption.mjs';
import 'crypto';
const termineManage_post = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
if (!token) {
throw createError({
statusCode: 401,
message: "Nicht authentifiziert."
});
}
const decoded = verifyToken(token);
if (!decoded) {
throw createError({
statusCode: 401,
message: "Ung\xFCltiges Token."
});
}
const user = await getUserById(decoded.id);
if (!user || user.role !== "admin" && user.role !== "vorstand") {
throw createError({
statusCode: 403,
message: "Keine Berechtigung zum Erstellen von Terminen."
});
}
const body = await readBody(event);
const { datum, uhrzeit, titel, beschreibung, kategorie } = body;
if (!datum || !titel) {
throw createError({
statusCode: 400,
message: "Datum und Titel sind erforderlich."
});
}
await saveTermin({
datum,
uhrzeit: uhrzeit || "",
titel,
beschreibung: beschreibung || "",
kategorie: kategorie || "Sonstiges"
});
return {
success: true,
message: "Termin erfolgreich gespeichert."
};
} catch (error) {
console.error("Fehler beim Speichern des Termins:", error);
throw error;
}
});
export { termineManage_post as default };
//# sourceMappingURL=termine-manage.post.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"termine-manage.post.mjs","sources":["../../../../../server/api/termine-manage.post.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAGA,2BAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AAEA,IAAA,IAAA,CAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,OAAA,GAAA,YAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,OAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,WAAA,CAAA,OAAA,CAAA,EAAA,CAAA;AAGA,IAAA,IAAA,CAAA,IAAA,IAAA,IAAA,CAAA,SAAA,OAAA,IAAA,IAAA,CAAA,SAAA,UAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,YAAA,EAAA,WAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,KAAA,IAAA,CAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,UAAA,CAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,OAAA,IAAA,EAAA;AAAA,MACA,KAAA;AAAA,MACA,cAAA,YAAA,IAAA,EAAA;AAAA,MACA,WAAA,SAAA,IAAA;AAAA,KACA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,sCAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,65 +0,0 @@
import { d as defineEventHandler } from '../../nitro/nitro.mjs';
import { promises } from 'fs';
import path from 'path';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
const termine_get = defineEventHandler(async (event) => {
try {
const cwd = process.cwd();
let csvPath;
if (cwd.endsWith(".output")) {
csvPath = path.join(cwd, "../public/data/termine.csv");
} else {
csvPath = path.join(cwd, "public/data/termine.csv");
}
const csv = await promises.readFile(csvPath, "utf-8");
const lines = csv.split("\n").filter((line) => line.trim() !== "");
if (lines.length < 2) {
return { success: true, termine: [] };
}
const termine = [];
for (let i = 1; i < lines.length; i++) {
const values = [];
let current = "";
let inQuotes = false;
for (let j = 0; j < lines[i].length; j++) {
const char = lines[i][j];
if (char === '"') {
inQuotes = !inQuotes;
} else if (char === "," && !inQuotes) {
values.push(current.trim());
current = "";
} else {
current += char;
}
}
values.push(current.trim());
if (values.length >= 4) {
termine.push({
datum: values[0],
uhrzeit: values[1] || "",
titel: values[2] || "",
beschreibung: values[3] || "",
kategorie: values[4] || "Sonstiges"
});
}
}
return {
success: true,
termine
};
} catch (error) {
console.error("Fehler beim Laden der Termine:", error);
return { success: true, termine: [] };
}
});
export { termine_get as default };
//# sourceMappingURL=termine.get.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"termine.get.mjs","sources":["../../../../../server/api/termine.get.js"],"sourcesContent":null,"names":["fs"],"mappings":";;;;;;;;;;;;AAGA,oBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,GAAA,GAAA,QAAA,GAAA,EAAA;AAGA,IAAA,IAAA,OAAA;AACA,IAAA,IAAA,GAAA,CAAA,QAAA,CAAA,SAAA,CAAA,EAAA;AACA,MAAA,OAAA,GAAA,IAAA,CAAA,IAAA,CAAA,GAAA,EAAA,4BAAA,CAAA;AAAA,IACA,CAAA,MAAA;AACA,MAAA,OAAA,GAAA,IAAA,CAAA,IAAA,CAAA,GAAA,EAAA,yBAAA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,GAAA,GAAA,MAAAA,QAAA,CAAA,QAAA,CAAA,SAAA,OAAA,CAAA;AACA,IAAA,MAAA,KAAA,GAAA,GAAA,CAAA,KAAA,CAAA,IAAA,CAAA,CAAA,OAAA,CAAA,IAAA,KAAA,IAAA,CAAA,IAAA,EAAA,KAAA,EAAA,CAAA;AAEA,IAAA,IAAA,KAAA,CAAA,SAAA,CAAA,EAAA;AACA,MAAA,OAAA,EAAA,OAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA;AAAA,IACA;AAEA,IAAA,MAAA,UAAA,EAAA;AACA,IAAA,KAAA,IAAA,CAAA,GAAA,CAAA,EAAA,CAAA,GAAA,KAAA,CAAA,QAAA,CAAA,EAAA,EAAA;AACA,MAAA,MAAA,SAAA,EAAA;AACA,MAAA,IAAA,OAAA,GAAA,EAAA;AACA,MAAA,IAAA,QAAA,GAAA,KAAA;AAEA,MAAA,KAAA,IAAA,IAAA,CAAA,EAAA,CAAA,GAAA,MAAA,CAAA,CAAA,CAAA,QAAA,CAAA,EAAA,EAAA;AACA,QAAA,MAAA,IAAA,GAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEA,QAAA,IAAA,SAAA,GAAA,EAAA;AACA,UAAA,QAAA,GAAA,CAAA,QAAA;AAAA,QACA,CAAA,MAAA,IAAA,IAAA,KAAA,GAAA,IAAA,CAAA,QAAA,EAAA;AACA,UAAA,MAAA,CAAA,IAAA,CAAA,OAAA,CAAA,IAAA,EAAA,CAAA;AACA,UAAA,OAAA,GAAA,EAAA;AAAA,QACA,CAAA,MAAA;AACA,UAAA,OAAA,IAAA,IAAA;AAAA,QACA;AAAA,MACA;AACA,MAAA,MAAA,CAAA,IAAA,CAAA,OAAA,CAAA,IAAA,EAAA,CAAA;AAEA,MAAA,IAAA,MAAA,CAAA,UAAA,CAAA,EAAA;AACA,QAAA,OAAA,CAAA,IAAA,CAAA;AAAA,UACA,KAAA,EAAA,OAAA,CAAA,CAAA;AAAA,UACA,OAAA,EAAA,MAAA,CAAA,CAAA,CAAA,IAAA,EAAA;AAAA,UACA,KAAA,EAAA,MAAA,CAAA,CAAA,CAAA,IAAA,EAAA;AAAA,UACA,YAAA,EAAA,MAAA,CAAA,CAAA,CAAA,IAAA,EAAA;AAAA,UACA,SAAA,EAAA,MAAA,CAAA,CAAA,CAAA,IAAA;AAAA,SACA,CAAA;AAAA,MACA;AAAA,IACA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,kCAAA,KAAA,CAAA;AACA,IAAA,OAAA,EAAA,OAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -1,465 +0,0 @@
import { createRenderer, getRequestDependencies, getPreloadLinks, getPrefetchLinks } from 'vue-bundle-renderer/runtime';
import { j as joinRelativeURL, u as useRuntimeConfig, i as getResponseStatusText, k as getResponseStatus, l as defineRenderHandler, h as getQuery, c as createError, m as destr, n as getRouteRules, o as relative, p as joinURL, q as useNitroApp } from '../nitro/nitro.mjs';
import { renderToString } from 'vue/server-renderer';
import { createHead as createHead$1, propsToString, renderSSRHead } from 'unhead/server';
import { stringify, uneval } from 'devalue';
import { walkResolver } from 'unhead/utils';
import { toValue, isRef, hasInjectionContext, inject, ref, watchEffect, getCurrentInstance, onBeforeUnmount, onDeactivated, onActivated } from 'vue';
const VueResolver = (_, value) => {
return isRef(value) ? toValue(value) : value;
};
const headSymbol = "usehead";
// @__NO_SIDE_EFFECTS__
function vueInstall(head) {
const plugin = {
install(app) {
app.config.globalProperties.$unhead = head;
app.config.globalProperties.$head = head;
app.provide(headSymbol, head);
}
};
return plugin.install;
}
// @__NO_SIDE_EFFECTS__
function injectHead() {
if (hasInjectionContext()) {
const instance = inject(headSymbol);
if (!instance) {
throw new Error("useHead() was called without provide context, ensure you call it through the setup() function.");
}
return instance;
}
throw new Error("useHead() was called without provide context, ensure you call it through the setup() function.");
}
function useHead(input, options = {}) {
const head = options.head || /* @__PURE__ */ injectHead();
return head.ssr ? head.push(input || {}, options) : clientUseHead(head, input, options);
}
function clientUseHead(head, input, options = {}) {
const deactivated = ref(false);
let entry;
watchEffect(() => {
const i = deactivated.value ? {} : walkResolver(input, VueResolver);
if (entry) {
entry.patch(i);
} else {
entry = head.push(i, options);
}
});
const vm = getCurrentInstance();
if (vm) {
onBeforeUnmount(() => {
entry.dispose();
});
onDeactivated(() => {
deactivated.value = true;
});
onActivated(() => {
deactivated.value = false;
});
}
return entry;
}
// @__NO_SIDE_EFFECTS__
function createHead(options = {}) {
const head = createHead$1({
...options,
propResolvers: [VueResolver]
});
head.install = vueInstall(head);
return head;
}
const appHead = {"meta":[{"charset":"utf-8"},{"name":"viewport","content":"width=device-width, initial-scale=1"},{"name":"description","content":"Willkommen beim Harheimer Tischtennis Club - Ihr Tischtennisverein in Frankfurt-Harheim. Mitglied werden, Training buchen, Turniere und mehr."},{"name":"keywords","content":"Tischtennis, Tischtennisclub, Frankfurt, Harheim, Sport, Verein, Mitgliedschaft, Pingpong"}],"link":[{"rel":"preconnect","href":"https://fonts.googleapis.com"},{"rel":"preconnect","href":"https://fonts.gstatic.com","crossorigin":""},{"rel":"stylesheet","href":"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Montserrat:wght@700;800;900&display=swap"}],"style":[],"script":[],"noscript":[],"title":"Harheimer TC - Tischtennis in Frankfurt-Harheim"};
const appRootTag = "div";
const appRootAttrs = {"id":"__nuxt"};
const appTeleportTag = "div";
const appTeleportAttrs = {"id":"teleports"};
const appSpaLoaderTag = "div";
const appSpaLoaderAttrs = {"id":"__nuxt-loader"};
const appId = "nuxt-app";
function baseURL() {
return useRuntimeConfig().app.baseURL;
}
function buildAssetsDir() {
return useRuntimeConfig().app.buildAssetsDir;
}
function buildAssetsURL(...path) {
return joinRelativeURL(publicAssetsURL(), buildAssetsDir(), ...path);
}
function publicAssetsURL(...path) {
const app = useRuntimeConfig().app;
const publicBase = app.cdnURL || app.baseURL;
return path.length ? joinRelativeURL(publicBase, ...path) : publicBase;
}
const APP_ROOT_OPEN_TAG = `<${appRootTag}${propsToString(appRootAttrs)}>`;
const APP_ROOT_CLOSE_TAG = `</${appRootTag}>`;
const getServerEntry = () => import('../build/server.mjs').then((r) => r.default || r);
const getClientManifest = () => import('../build/client.manifest.mjs').then((r) => r.default || r).then((r) => typeof r === "function" ? r() : r);
const getSSRRenderer = lazyCachedFunction(async () => {
const manifest = await getClientManifest();
if (!manifest) {
throw new Error("client.manifest is not available");
}
const createSSRApp = await getServerEntry();
if (!createSSRApp) {
throw new Error("Server bundle is not available");
}
const options = {
manifest,
renderToString: renderToString$1,
buildAssetsURL
};
const renderer = createRenderer(createSSRApp, options);
async function renderToString$1(input, context) {
const html = await renderToString(input, context);
return APP_ROOT_OPEN_TAG + html + APP_ROOT_CLOSE_TAG;
}
return renderer;
});
const getSPARenderer = lazyCachedFunction(async () => {
const manifest = await getClientManifest();
const spaTemplate = await import('../virtual/_virtual_spa-template.mjs').then((r) => r.template).catch(() => "").then((r) => {
{
const APP_SPA_LOADER_OPEN_TAG = `<${appSpaLoaderTag}${propsToString(appSpaLoaderAttrs)}>`;
const APP_SPA_LOADER_CLOSE_TAG = `</${appSpaLoaderTag}>`;
const appTemplate = APP_ROOT_OPEN_TAG + APP_ROOT_CLOSE_TAG;
const loaderTemplate = r ? APP_SPA_LOADER_OPEN_TAG + r + APP_SPA_LOADER_CLOSE_TAG : "";
return appTemplate + loaderTemplate;
}
});
const options = {
manifest,
renderToString: () => spaTemplate,
buildAssetsURL
};
const renderer = createRenderer(() => () => {
}, options);
const result = await renderer.renderToString({});
const renderToString = (ssrContext) => {
const config = useRuntimeConfig(ssrContext.event);
ssrContext.modules ||= /* @__PURE__ */ new Set();
ssrContext.payload.serverRendered = false;
ssrContext.config = {
public: config.public,
app: config.app
};
return Promise.resolve(result);
};
return {
rendererContext: renderer.rendererContext,
renderToString
};
});
function lazyCachedFunction(fn) {
let res = null;
return () => {
if (res === null) {
res = fn().catch((err) => {
res = null;
throw err;
});
}
return res;
};
}
function getRenderer(ssrContext) {
return ssrContext.noSSR ? getSPARenderer() : getSSRRenderer();
}
const getSSRStyles = lazyCachedFunction(() => import('../build/styles.mjs').then((r) => r.default || r));
const getEntryIds = () => getClientManifest().then((r) => {
const entryIds = [];
for (const entry of Object.values(r)) {
if (entry._globalCSS) {
entryIds.push(entry.src);
}
}
return entryIds;
});
function renderPayloadResponse(ssrContext) {
return {
body: stringify(splitPayload(ssrContext).payload, ssrContext._payloadReducers) ,
statusCode: getResponseStatus(ssrContext.event),
statusMessage: getResponseStatusText(ssrContext.event),
headers: {
"content-type": "application/json;charset=utf-8" ,
"x-powered-by": "Nuxt"
}
};
}
function renderPayloadJsonScript(opts) {
const contents = opts.data ? stringify(opts.data, opts.ssrContext._payloadReducers) : "";
const payload = {
"type": "application/json",
"innerHTML": contents,
"data-nuxt-data": appId,
"data-ssr": !(opts.ssrContext.noSSR)
};
{
payload.id = "__NUXT_DATA__";
}
if (opts.src) {
payload["data-src"] = opts.src;
}
const config = uneval(opts.ssrContext.config);
return [
payload,
{
innerHTML: `window.__NUXT__={};window.__NUXT__.config=${config}`
}
];
}
function splitPayload(ssrContext) {
const { data, prerenderedAt, ...initial } = ssrContext.payload;
return {
initial: { ...initial, prerenderedAt },
payload: { data, prerenderedAt }
};
}
const unheadOptions = {
disableDefaults: true,
};
function createSSRContext(event) {
const ssrContext = {
url: event.path,
event,
runtimeConfig: useRuntimeConfig(event),
noSSR: event.context.nuxt?.noSSR || (false),
head: createHead(unheadOptions),
error: false,
nuxt: void 0,
/* NuxtApp */
payload: {},
_payloadReducers: /* @__PURE__ */ Object.create(null),
modules: /* @__PURE__ */ new Set()
};
return ssrContext;
}
function setSSRError(ssrContext, error) {
ssrContext.error = true;
ssrContext.payload = { error };
ssrContext.url = error.url;
}
async function renderInlineStyles(usedModules) {
const styleMap = await getSSRStyles();
const inlinedStyles = /* @__PURE__ */ new Set();
for (const mod of usedModules) {
if (mod in styleMap && styleMap[mod]) {
for (const style of await styleMap[mod]()) {
inlinedStyles.add(style);
}
}
}
return Array.from(inlinedStyles).map((style) => ({ innerHTML: style }));
}
const renderSSRHeadOptions = {"omitLineBreaks":true};
const entryFileName = "CxKxaas7.js";
globalThis.__buildAssetsURL = buildAssetsURL;
globalThis.__publicAssetsURL = publicAssetsURL;
const HAS_APP_TELEPORTS = !!(appTeleportAttrs.id);
const APP_TELEPORT_OPEN_TAG = HAS_APP_TELEPORTS ? `<${appTeleportTag}${propsToString(appTeleportAttrs)}>` : "";
const APP_TELEPORT_CLOSE_TAG = HAS_APP_TELEPORTS ? `</${appTeleportTag}>` : "";
const PAYLOAD_URL_RE = /^[^?]*\/_payload.json(?:\?.*)?$/ ;
let entryPath;
const renderer = defineRenderHandler(async (event) => {
const nitroApp = useNitroApp();
const ssrError = event.path.startsWith("/__nuxt_error") ? getQuery(event) : null;
if (ssrError && !("__unenv__" in event.node.req)) {
throw createError({
statusCode: 404,
statusMessage: "Page Not Found: /__nuxt_error"
});
}
const ssrContext = createSSRContext(event);
const headEntryOptions = { mode: "server" };
ssrContext.head.push(appHead, headEntryOptions);
if (ssrError) {
ssrError.statusCode &&= Number.parseInt(ssrError.statusCode);
if (typeof ssrError.data === "string") {
try {
ssrError.data = destr(ssrError.data);
} catch {
}
}
setSSRError(ssrContext, ssrError);
}
const isRenderingPayload = PAYLOAD_URL_RE.test(ssrContext.url);
if (isRenderingPayload) {
const url = ssrContext.url.substring(0, ssrContext.url.lastIndexOf("/")) || "/";
ssrContext.url = url;
event._path = event.node.req.url = url;
}
const routeOptions = getRouteRules(event);
if (routeOptions.ssr === false) {
ssrContext.noSSR = true;
}
const renderer = await getRenderer(ssrContext);
{
for (const id of await getEntryIds()) {
ssrContext.modules.add(id);
}
}
const _rendered = await renderer.renderToString(ssrContext).catch(async (error) => {
if (ssrContext._renderResponse && error.message === "skipping render") {
return {};
}
const _err = !ssrError && ssrContext.payload?.error || error;
await ssrContext.nuxt?.hooks.callHook("app:error", _err);
throw _err;
});
const inlinedStyles = !ssrContext._renderResponse && !isRenderingPayload ? await renderInlineStyles(ssrContext.modules ?? []) : [];
await ssrContext.nuxt?.hooks.callHook("app:rendered", { ssrContext, renderResult: _rendered });
if (ssrContext._renderResponse) {
return ssrContext._renderResponse;
}
if (ssrContext.payload?.error && !ssrError) {
throw ssrContext.payload.error;
}
if (isRenderingPayload) {
const response = renderPayloadResponse(ssrContext);
return response;
}
const NO_SCRIPTS = routeOptions.noScripts;
const { styles, scripts } = getRequestDependencies(ssrContext, renderer.rendererContext);
if (!NO_SCRIPTS) {
let path = entryPath;
if (!path) {
path = buildAssetsURL(entryFileName);
if (ssrContext.runtimeConfig.app.cdnURL || /^(?:\/|\.+\/)/.test(path)) {
entryPath = path;
} else {
path = relative(event.path.replace(/\/[^/]+$/, "/"), joinURL("/", path));
if (!/^(?:\/|\.+\/)/.test(path)) {
path = `./${path}`;
}
}
}
ssrContext.head.push({
script: [{
tagPosition: "head",
tagPriority: -2,
type: "importmap",
innerHTML: JSON.stringify({ imports: { "#entry": path } })
}]
}, headEntryOptions);
}
if (ssrContext._preloadManifest && !NO_SCRIPTS) {
ssrContext.head.push({
link: [
{ rel: "preload", as: "fetch", fetchpriority: "low", crossorigin: "anonymous", href: buildAssetsURL(`builds/meta/${ssrContext.runtimeConfig.app.buildId}.json`) }
]
}, { ...headEntryOptions, tagPriority: "low" });
}
if (inlinedStyles.length) {
ssrContext.head.push({ style: inlinedStyles });
}
const link = [];
for (const resource of Object.values(styles)) {
link.push({ rel: "stylesheet", href: renderer.rendererContext.buildAssetsURL(resource.file), crossorigin: "" });
}
if (link.length) {
ssrContext.head.push({ link }, headEntryOptions);
}
if (!NO_SCRIPTS) {
ssrContext.head.push({
link: getPreloadLinks(ssrContext, renderer.rendererContext)
}, headEntryOptions);
ssrContext.head.push({
link: getPrefetchLinks(ssrContext, renderer.rendererContext)
}, headEntryOptions);
ssrContext.head.push({
script: renderPayloadJsonScript({ ssrContext, data: ssrContext.payload })
}, {
...headEntryOptions,
// this should come before another end of body scripts
tagPosition: "bodyClose",
tagPriority: "high"
});
}
if (!routeOptions.noScripts) {
const tagPosition = "head";
ssrContext.head.push({
script: Object.values(scripts).map((resource) => ({
type: resource.module ? "module" : null,
src: renderer.rendererContext.buildAssetsURL(resource.file),
defer: resource.module ? null : true,
// if we are rendering script tag payloads that import an async payload
// we need to ensure this resolves before executing the Nuxt entry
tagPosition,
crossorigin: ""
}))
}, headEntryOptions);
}
const { headTags, bodyTags, bodyTagsOpen, htmlAttrs, bodyAttrs } = await renderSSRHead(ssrContext.head, renderSSRHeadOptions);
const htmlContext = {
htmlAttrs: htmlAttrs ? [htmlAttrs] : [],
head: normalizeChunks([headTags]),
bodyAttrs: bodyAttrs ? [bodyAttrs] : [],
bodyPrepend: normalizeChunks([bodyTagsOpen, ssrContext.teleports?.body]),
body: [
_rendered.html,
APP_TELEPORT_OPEN_TAG + (HAS_APP_TELEPORTS ? joinTags([ssrContext.teleports?.[`#${appTeleportAttrs.id}`]]) : "") + APP_TELEPORT_CLOSE_TAG
],
bodyAppend: [bodyTags]
};
await nitroApp.hooks.callHook("render:html", htmlContext, { event });
return {
body: renderHTMLDocument(htmlContext),
statusCode: getResponseStatus(event),
statusMessage: getResponseStatusText(event),
headers: {
"content-type": "text/html;charset=utf-8",
"x-powered-by": "Nuxt"
}
};
});
function normalizeChunks(chunks) {
const result = [];
for (const _chunk of chunks) {
const chunk = _chunk?.trim();
if (chunk) {
result.push(chunk);
}
}
return result;
}
function joinTags(tags) {
return tags.join("");
}
function joinAttrs(chunks) {
if (chunks.length === 0) {
return "";
}
return " " + chunks.join(" ");
}
function renderHTMLDocument(html) {
return `<!DOCTYPE html><html${joinAttrs(html.htmlAttrs)}><head>${joinTags(html.head)}</head><body${joinAttrs(html.bodyAttrs)}>${joinTags(html.bodyPrepend)}${joinTags(html.body)}${joinTags(html.bodyAppend)}</body></html>`;
}
const renderer$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
__proto__: null,
default: renderer
}, Symbol.toStringTag, { value: 'Module' }));
export { baseURL as b, headSymbol as h, renderer$1 as r, useHead as u };
//# sourceMappingURL=renderer.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"renderer.mjs","sources":["../../../../node_modules/@unhead/vue/dist/shared/vue.N9zWjxoK.mjs","../../../../node_modules/@unhead/vue/dist/shared/vue.Bm-NbY4b.mjs","../../../../node_modules/@unhead/vue/dist/server.mjs","../../../../node_modules/nuxt/dist/core/runtime/nitro/utils/paths.js","../../../../node_modules/nuxt/dist/core/runtime/nitro/utils/renderer/build-files.js","../../../../node_modules/nuxt/dist/core/runtime/nitro/utils/renderer/payload.js","../../../../node_modules/nuxt/dist/core/runtime/nitro/utils/renderer/app.js","../../../../node_modules/nuxt/dist/core/runtime/nitro/utils/renderer/inline-styles.js","../../../../node_modules/nuxt/dist/core/runtime/nitro/handlers/renderer.js"],"sourcesContent":null,"names":["renderToString","_renderToString"],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7,8]}

View File

@@ -1,4 +0,0 @@
const template = "";
export { template };
//# sourceMappingURL=_virtual_spa-template.mjs.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"_virtual_spa-template.mjs","sources":[],"sourcesContent":null,"names":[],"mappings":";;;;"}