Compare commits

...

22 Commits

Author SHA1 Message Date
Torsten Schulz (local)
60257edde3 Update code analysis workflow to remove node_modules along with build artifacts before gitleaks scanning, improving security and ensuring a cleaner environment for analysis.
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 3m50s
2025-12-20 15:35:03 +01:00
Torsten Schulz (local)
111c8c239c 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
2025-12-20 15:29:58 +01:00
Torsten Schulz (local)
9e5ccbe8a3 Refine gitleaks download and extraction process in code analysis workflow by implementing dynamic asset URL retrieval, enhanced error handling for invalid downloads, and improved extraction methods.
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 3m16s
2025-12-20 15:22:30 +01:00
Torsten Schulz (local)
dd21174f1d Improve gitleaks download process in code analysis workflow by adding error handling for invalid downloads and ensuring proper extraction of the archive.
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 3m37s
2025-12-20 15:12:27 +01:00
Torsten Schulz (local)
6fda6ebad0 Enhance security and error handling in various components by refining error catch blocks to ignore specific errors, improving code clarity and consistency across the application.
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 4m10s
2025-12-20 15:05:49 +01:00
Torsten Schulz (local)
c9037fec45 Update path handling comments across multiple files to enhance security against path traversal vulnerabilities, ensuring consistent use of nosemgrep annotations for better code analysis.
All checks were successful
Code Analysis (JS/Vue) / analyze (push) Successful in 3m19s
2025-12-20 14:49:57 +01:00
Torsten Schulz (local)
e128e1a77c Enhance security by adding role-checking functions in ESLint configuration and updating Vue components to improve content sanitization comments, while refining error handling in API endpoints for better clarity.
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 3m40s
2025-12-20 14:19:55 +01:00
Torsten Schulz (local)
19024cd87e Enhance security by adding DOMPurify comments in Vue components and updating path handling comments in server utilities to mitigate path traversal risks.
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 46s
2025-12-20 11:15:31 +01:00
Torsten Schulz (local)
968c749fe3 Enhance security by adding DOMPurify sanitization comments in newsletter and Vereins components, and update path handling comments in server utilities to address potential path traversal vulnerabilities.
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 3m28s
2025-12-20 10:54:49 +01:00
Torsten Schulz (local)
316cce1b26 Enhance content sanitization across various components by integrating 'dompurify' for improved security and update package dependencies in package.json and package-lock.json.
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 4m56s
2025-12-20 10:49:20 +01:00
Torsten Schulz (local)
acfa842131 Add SMTP credentials for tests and enhance user role handling in CMS and Galerie endpoints
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 3m43s
2025-12-20 10:32:06 +01:00
Torsten Schulz (local)
4f453f77bc Update package dependencies to vitest v4.0.16 and enhance role management in auth utilities with new role-checking functions in tests
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 57s
2025-12-20 10:25:16 +01:00
Torsten Schulz (local)
42b9a10437 Refactor error handling in various components to ignore modal display failures and improve code clarity
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 51s
2025-12-20 10:19:29 +01:00
Torsten Schulz (local)
b20b89d333 Update package-lock.json and package.json to include 'globals' dependency and improve code formatting in various components for better readability.
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 54s
2025-12-20 10:17:16 +01:00
Torsten Schulz (local)
861802b716 Update package dependencies to include eslint-plugin-vue and vue-eslint-parser for enhanced linting support
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 33s
2025-12-19 17:32:56 +01:00
Torsten Schulz (local)
164c5d9297 Update code analysis workflow to run on ubuntu-latest for improved compatibility
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 52s
2025-12-19 17:28:47 +01:00
Torsten Schulz (local)
a323684f13 Update code analysis workflow to improve clarity and efficiency by renaming steps and simplifying Semgrep command execution.
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Has been cancelled
2025-12-19 16:53:09 +01:00
Torsten Schulz (local)
131edc0cb1 Add linting script to package.json for improved code quality
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Has been cancelled
2025-12-19 16:38:29 +01:00
6243db3020 Merge pull request 'Update dependency @babel/parser to v7.28.5' (#2) from renovate/babel-monorepo into main
Reviewed-on: #2
2025-12-19 16:13:11 +01:00
97742b24bb Merge pull request 'Update dependency @pinia/nuxt to v0.11.3' (#3) from renovate/pinia-nuxt-0.x-lockfile into main
Reviewed-on: #3
2025-12-19 16:12:58 +01:00
40c2139aa8 Update dependency @pinia/nuxt to v0.11.3 2025-12-19 16:11:56 +01:00
e05eb46bc5 Update dependency @babel/parser to v7.28.5 2025-12-19 16:11:48 +01:00
252 changed files with 7464 additions and 25705 deletions

View File

@@ -0,0 +1,75 @@
name: Code Analysis (JS/Vue)
on:
pull_request:
push:
branches: [ main ]
jobs:
analyze:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Node versions
run: |
node -v
npm -v
- name: Install dependencies
run: npm ci
- name: Lint
run: npm run lint
- name: Unit tests
run: npm test
- name: Build
run: npm run build --if-present
- name: Semgrep (SAST)
run: semgrep --config p/default --error .
- name: npm audit (high+)
run: npm audit --audit-level=high || true
- name: OSV-Scanner (SCA)
run: |
curl -L -o osv-scanner https://github.com/google/osv-scanner/releases/latest/download/osv-scanner_linux_amd64
chmod +x osv-scanner
./osv-scanner --lockfile package-lock.json
- name: gitleaks (Secrets Scanning)
run: |
# Try to get the latest release asset URL
ASSET_URL=$(curl -s https://api.github.com/repos/gitleaks/gitleaks/releases/latest | grep -o '"browser_download_url": "[^"]*linux_x64[^"]*"' | head -1 | cut -d'"' -f4)
if [ -z "$ASSET_URL" ]; then
# Fallback: construct URL manually
VERSION=$(curl -s https://api.github.com/repos/gitleaks/gitleaks/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
ASSET_URL="https://github.com/gitleaks/gitleaks/releases/download/${VERSION}/gitleaks_${VERSION}_linux_x64.tar.gz"
fi
echo "Downloading from: $ASSET_URL"
curl -sSL -L "$ASSET_URL" -o gitleaks.tar.gz
# Check if download was successful and file is not HTML
if [ ! -s gitleaks.tar.gz ] || head -1 gitleaks.tar.gz | grep -q "<!DOCTYPE html"; then
echo "Error: Downloaded file is not a valid archive (might be HTML page)"
head -5 gitleaks.tar.gz
exit 1
fi
# Try different extraction methods
if tar -tzf gitleaks.tar.gz >/dev/null 2>&1; then
tar -xzf gitleaks.tar.gz
elif tar -tf gitleaks.tar.gz >/dev/null 2>&1; then
tar -xf gitleaks.tar.gz
else
echo "Error: Cannot extract archive. File type:"
file gitleaks.tar.gz
exit 1
fi
chmod +x gitleaks
# Remove build artifacts and node_modules before scanning
rm -rf .next .output .nuxt node_modules 2>/dev/null || true
./gitleaks detect --source . --no-git --verbose --exit-code 1
rm -f gitleaks.tar.gz

View File

@@ -1,15 +0,0 @@
{
"date": "2025-11-05T13:24:50.100Z",
"preset": "node-server",
"framework": {
"name": "nuxt",
"version": "4.1.3"
},
"versions": {
"nitro": "2.12.7"
},
"commands": {
"preview": "node server/index.mjs"
},
"config": {}
}

View File

@@ -1,6 +0,0 @@
import{e as a}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const o=a("SquarePenIcon",[["path",{d:"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1m0v6g"}],["path",{d:"M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z",key:"1lpok0"}]]);export{o as S};

View File

@@ -1,6 +0,0 @@
import{e as c}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const r=c("TargetIcon",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"6",key:"1vlfrh"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]]);export{r as T};

View File

@@ -1,6 +0,0 @@
import{e}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const a=e("MailIcon",[["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}],["path",{d:"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7",key:"1ocrg3"}]]);export{a as M};

View File

@@ -1,6 +0,0 @@
import{e}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const t=e("FileTextIcon",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);export{t as F};

View File

@@ -1,11 +0,0 @@
import{e as c}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const o=c("ClockIcon",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const a=c("MapPinIcon",[["path",{d:"M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z",key:"2oe9fu"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]]);export{o as C,a as M};

View File

@@ -1,6 +0,0 @@
import{e}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const r=e("AlertCircleIcon",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);export{r as A};

View File

@@ -1,6 +0,0 @@
import{e as a}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const o=a("Loader2Icon",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);export{o as L};

View File

@@ -1,6 +0,0 @@
import{e}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const a=e("BookOpenIcon",[["path",{d:"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z",key:"vv98re"}],["path",{d:"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z",key:"1cyq3y"}]]);export{a as B};

View File

@@ -1,6 +0,0 @@
import{e as a}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const e=a("TrophyIcon",[["path",{d:"M6 9H4.5a2.5 2.5 0 0 1 0-5H6",key:"17hqa7"}],["path",{d:"M18 9h1.5a2.5 2.5 0 0 0 0-5H18",key:"lmptdp"}],["path",{d:"M4 22h16",key:"57wxv0"}],["path",{d:"M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20.24 7 22",key:"1nw9bq"}],["path",{d:"M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20.24 17 22",key:"1np0yb"}],["path",{d:"M18 2H6v7a6 6 0 0 0 12 0V2Z",key:"u46fv3"}]]);export{e as T};

View File

@@ -1,6 +0,0 @@
import{e as a}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const p=a("NewspaperIcon",[["path",{d:"M4 22h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16a2 2 0 0 1-2 2Zm0 0a2 2 0 0 1-2-2v-9c0-1.1.9-2 2-2h2",key:"7pis2x"}],["path",{d:"M18 14h-8",key:"sponae"}],["path",{d:"M15 18h-5",key:"95g1m2"}],["path",{d:"M10 6h8v4h-8V6Z",key:"smlsk5"}]]);export{p as N};

View File

@@ -1,6 +0,0 @@
import{e as c}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const o=c("CheckIcon",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);export{o as C};

View File

@@ -1,6 +0,0 @@
import{e as o}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const e=o("PhoneIcon",[["path",{d:"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z",key:"foiqr5"}]]);export{e as P};

View File

@@ -1,6 +0,0 @@
import{e}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const c=e("UsersIcon",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"1da9ce"}]]);export{c as U};

View File

@@ -1 +0,0 @@
const s=(t,r)=>{const o=t.__vccOpts||t;for(const[c,e]of r)o[c]=e;return o};export{s as _};

View File

@@ -1,6 +0,0 @@
import{e}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const c=e("Trash2Icon",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);export{c as T};

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1.8 MiB

View File

@@ -1,6 +0,0 @@
import{e}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const o=e("GlobeIcon",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);export{o as G};

View File

@@ -1,6 +0,0 @@
import{e}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const a=e("PlusIcon",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);export{a as P};

View File

@@ -1,6 +0,0 @@
import{e}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const a=e("CalendarIcon",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]]);export{a as C};

View File

@@ -1 +0,0 @@
{"id":"8af76f9e-6e85-416c-9e2f-92c68e0dfd76","timestamp":1762349079882}

View File

@@ -1 +0,0 @@
.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}}

View File

@@ -1 +0,0 @@
.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}}

View File

@@ -1,6 +0,0 @@
import{e}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const c=e("UserPlusIcon",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"19",x2:"19",y1:"8",y2:"14",key:"1bvyxn"}],["line",{x1:"22",x2:"16",y1:"11",y2:"11",key:"1shjgl"}]]);export{c as U};

View File

@@ -1,7 +0,0 @@
"mannschaft","liga","staffelleiter","telefon","heimspieltag","spielsystem","mannschaftsfuehrer","spieler","weitere_informationen_link","letzte_aktualisierung"
"Erwachsene 1","1.Kreisklasse Frankfurt, Gruppe 1","Michael Heck","069-40807763","Donnerstag, 20:15 Uhr","Bundessystem (4er-Mannschaft)","André Gilzinger","Josias Strobel; André Gilzinger; Ulf Heinzerling; Sven Baublies","https://www.mytischtennis.de/click-tt/HeTTV/25--26/ligen/1._Kreisklasse_Gr._1/gruppe/496101/tabelle/gesamt","16.07.2025"
"Erwachsene 2","1.Kreisklasse Frankfurt, Gruppe 2","Michael Heck","069-40807763","Dienstag, 20:15 Uhr","Bundessystem (4er-Mannschaft)","Michael Koch","Bernd Meyer; Detlef Alt; Michael Koch; Marco Reininger","https://click-tt.de/mannschaft/erwachsene-2","16.07.2025"
"Erwachsene 3","2.Kreisklasse Frankfurt, Gruppe 1","Michael Walter","0160-97800518","Donnerstag, 20:15 Uhr","Bundessystem (4er Mannschaft)","Jonas Völker","Olaf Nüßlein; Jürgen Kratz; Jonas Völker; Arno Krauß","https://click-tt.de/mannschaft/erwachsene-3","16.07.2025"
"Erwachsene 4","2.Kreisklasse Frankfurt, Gruppe 2","Michael Walter","0160-97800518","Dienstag, 20:15 Uhr","Bundessystem (4er Mannschaft)","Mark Möllenbruck","Melanie Bayer; Thomas Steinbrech; Mark Möllenbruck; Jacob Waltenberger","https://click-tt.de/mannschaft/erwachsene-4","16.07.2025"
"Erwachsene 5","3.Kreisklasse Frankfurt, Gruppe 1","Christian von Tresckow","0172 8858913","Donnerstag, 20:15 Uhr","Braunschweiger System (3er oder 4er Mannschaft möglich)","Johannes Binder","Torsten Schulz; Kristin von Rauchhaupt; Johannes Binder; Roger Dichmann; Matthias Schmidt; André Schindler; Sebastian Renker; Helge Stefan; Georg Gilzinger; Zhehao Shi; Birgit Haas-Schrödter; Jürgen Dichmann; Paul Fremer","https://click-tt.de/mannschaft/erwachsene-5","16.07.2025"
"Jugendmannschaft","Jungen (J 11), 1.Kreisklasse Frankfurt","Thosten Scherz","0171-9370881","Dienstag, 18:00 Uhr","Braunschweiger System (3/4er-Mannschaft)","Timo Wolf","Timo Wolf; Emilian Völker; Lukas Rusu Cara; Daniel Rusu Cara; Joschua Koch; Fred Swyter","https://click-tt.de/mannschaft/jugendmannschaft","16.07.2025"
1 mannschaft liga staffelleiter telefon heimspieltag spielsystem mannschaftsfuehrer spieler weitere_informationen_link letzte_aktualisierung
2 Erwachsene 1 1.Kreisklasse Frankfurt, Gruppe 1 Michael Heck 069-40807763 Donnerstag, 20:15 Uhr Bundessystem (4er-Mannschaft) André Gilzinger Josias Strobel; André Gilzinger; Ulf Heinzerling; Sven Baublies https://www.mytischtennis.de/click-tt/HeTTV/25--26/ligen/1._Kreisklasse_Gr._1/gruppe/496101/tabelle/gesamt 16.07.2025
3 Erwachsene 2 1.Kreisklasse Frankfurt, Gruppe 2 Michael Heck 069-40807763 Dienstag, 20:15 Uhr Bundessystem (4er-Mannschaft) Michael Koch Bernd Meyer; Detlef Alt; Michael Koch; Marco Reininger https://click-tt.de/mannschaft/erwachsene-2 16.07.2025
4 Erwachsene 3 2.Kreisklasse Frankfurt, Gruppe 1 Michael Walter 0160-97800518 Donnerstag, 20:15 Uhr Bundessystem (4er Mannschaft) Jonas Völker Olaf Nüßlein; Jürgen Kratz; Jonas Völker; Arno Krauß https://click-tt.de/mannschaft/erwachsene-3 16.07.2025
5 Erwachsene 4 2.Kreisklasse Frankfurt, Gruppe 2 Michael Walter 0160-97800518 Dienstag, 20:15 Uhr Bundessystem (4er Mannschaft) Mark Möllenbruck Melanie Bayer; Thomas Steinbrech; Mark Möllenbruck; Jacob Waltenberger https://click-tt.de/mannschaft/erwachsene-4 16.07.2025
6 Erwachsene 5 3.Kreisklasse Frankfurt, Gruppe 1 Christian von Tresckow 0172 8858913 Donnerstag, 20:15 Uhr Braunschweiger System (3er oder 4er Mannschaft möglich) Johannes Binder Torsten Schulz; Kristin von Rauchhaupt; Johannes Binder; Roger Dichmann; Matthias Schmidt; André Schindler; Sebastian Renker; Helge Stefan; Georg Gilzinger; Zhehao Shi; Birgit Haas-Schrödter; Jürgen Dichmann; Paul Fremer https://click-tt.de/mannschaft/erwachsene-5 16.07.2025
7 Jugendmannschaft Jungen (J 11), 1.Kreisklasse Frankfurt Thosten Scherz 0171-9370881 Dienstag, 18:00 Uhr Braunschweiger System (3/4er-Mannschaft) Timo Wolf Timo Wolf; Emilian Völker; Lukas Rusu Cara; Daniel Rusu Cara; Joschua Koch; Fred Swyter https://click-tt.de/mannschaft/jugendmannschaft 16.07.2025

View File

@@ -1,12 +0,0 @@
"name","description","mannschaftsgroesse","kategorie","details","spielabfolge","anzahl_spiele","besonderheiten"
"Sechser-Paarkreuz-System","Klassisches System für größere Mannschaften mit 3 Doppeln und 6 Einzeln","6er-Mannschaft","Klassisch","Paarweise Kreuzung der Spieler in drei Paarkreuzen","16 Spiele: 3 Doppel + 12 Einzel + 1 Doppel","16","9 Siege zum Gewinn"
"Braunschweiger System","Flexibles System für kleinere Mannschaften mit verschiedenen Varianten","3er oder 4er Mannschaft","Flexibel","Anpassbar an Mannschaftsgröße, immer 10 Spiele","10 Spiele: 1-2 Doppel + Einzel","10","Verschiedene Varianten möglich"
"Werner-Scheffler-System","Strukturiertes System für 4er-Mannschaften mit 2 Doppeln und 12 Einzeln","4er Mannschaft","Strukturiert","Systematische Paarung, auch Kombisystem des WTTV","14 Spiele: 2 Doppel + 12 Einzel","14","Seit 1968 in DTTB-Wettspielordnung"
"Modifiziertes Werner-Scheffler-System","Erweiterte Version des Werner-Scheffler-Systems","4er Mannschaft","Modifiziert","Verbesserte Paarungslogik","Variiert","Variiert","Anpassungen an moderne Anforderungen"
"Corbillon-Cup-System","Internationales System für Damenmannschaften","2er Mannschaft","International","FIT-System für Damen, benannt nach Marcel Corbillon","5 Spiele: 4 Einzel + 1 Doppel","5","3 Siege zum Gewinn"
"Swaythling-Cup-System","Internationales System für Herrenmannschaften","3er Mannschaft","International","FIT-System für Herren, Best of 9 Matches","9 Spiele: nur Einzel","9","5 Siege zum Gewinn"
"Modifiziertes Swaythling-Cup-System","Angepasste Version des Swaythling-Cup-Systems","3er Mannschaft","Modifiziert","Flexiblere Regeln, Best of 7 Matches","7 Spiele: 3 Einzel + 1 Doppel + 3 Einzel","7","4 Siege zum Gewinn"
"Bundessystem","Standard-System des DTTB für 4er-Mannschaften","4er Mannschaft","Standard","Deutscher Tischtennis-Bund Standard","10 Spiele: 2 Doppel + 8 Einzel","10","Alle Spiele werden ausgetragen"
"Tischtennis-Bundesliga-System","Professionelles System der Bundesliga","3er Mannschaft","Professionell","Höchste deutsche Spielklasse","5 Spiele: 5 Einzel","5","Seit 2011/12 in TTBL"
"Schweden-Liga-System","Skandinavisches Spielsystem für 3er-Mannschaften","3er Mannschaft","International","Schwedisches Ligasystem mit Doppel","10 Spiele: 9 Einzel + 1 Doppel","10","Doppel nach 3. Einzel"
"Schweizer System","VR-Cup System aus der Schweiz","Variabel","International","Schweizer Verbandssystem","Variiert","Variiert","Anpassbar an verschiedene Größen"
1 name description mannschaftsgroesse kategorie details spielabfolge anzahl_spiele besonderheiten
2 Sechser-Paarkreuz-System Klassisches System für größere Mannschaften mit 3 Doppeln und 6 Einzeln 6er-Mannschaft Klassisch Paarweise Kreuzung der Spieler in drei Paarkreuzen 16 Spiele: 3 Doppel + 12 Einzel + 1 Doppel 16 9 Siege zum Gewinn
3 Braunschweiger System Flexibles System für kleinere Mannschaften mit verschiedenen Varianten 3er oder 4er Mannschaft Flexibel Anpassbar an Mannschaftsgröße, immer 10 Spiele 10 Spiele: 1-2 Doppel + Einzel 10 Verschiedene Varianten möglich
4 Werner-Scheffler-System Strukturiertes System für 4er-Mannschaften mit 2 Doppeln und 12 Einzeln 4er Mannschaft Strukturiert Systematische Paarung, auch Kombisystem des WTTV 14 Spiele: 2 Doppel + 12 Einzel 14 Seit 1968 in DTTB-Wettspielordnung
5 Modifiziertes Werner-Scheffler-System Erweiterte Version des Werner-Scheffler-Systems 4er Mannschaft Modifiziert Verbesserte Paarungslogik Variiert Variiert Anpassungen an moderne Anforderungen
6 Corbillon-Cup-System Internationales System für Damenmannschaften 2er Mannschaft International FIT-System für Damen, benannt nach Marcel Corbillon 5 Spiele: 4 Einzel + 1 Doppel 5 3 Siege zum Gewinn
7 Swaythling-Cup-System Internationales System für Herrenmannschaften 3er Mannschaft International FIT-System für Herren, Best of 9 Matches 9 Spiele: nur Einzel 9 5 Siege zum Gewinn
8 Modifiziertes Swaythling-Cup-System Angepasste Version des Swaythling-Cup-Systems 3er Mannschaft Modifiziert Flexiblere Regeln, Best of 7 Matches 7 Spiele: 3 Einzel + 1 Doppel + 3 Einzel 7 4 Siege zum Gewinn
9 Bundessystem Standard-System des DTTB für 4er-Mannschaften 4er Mannschaft Standard Deutscher Tischtennis-Bund Standard 10 Spiele: 2 Doppel + 8 Einzel 10 Alle Spiele werden ausgetragen
10 Tischtennis-Bundesliga-System Professionelles System der Bundesliga 3er Mannschaft Professionell Höchste deutsche Spielklasse 5 Spiele: 5 Einzel 5 Seit 2011/12 in TTBL
11 Schweden-Liga-System Skandinavisches Spielsystem für 3er-Mannschaften 3er Mannschaft International Schwedisches Ligasystem mit Doppel 10 Spiele: 9 Einzel + 1 Doppel 10 Doppel nach 3. Einzel
12 Schweizer System VR-Cup System aus der Schweiz Variabel International Schweizer Verbandssystem Variiert Variiert Anpassbar an verschiedene Größen

View File

@@ -1,2 +0,0 @@
"datum","uhrzeit","titel","beschreibung","kategorie"
"2025-12-18","19:00","Weihnachtsfeier 2025 im Gasthaus Zum Einhorn in Frankfurt - Bonames","","Veranstaltung"
1 datum uhrzeit titel beschreibung kategorie
2 2025-12-18 19:00 Weihnachtsfeier 2025 im Gasthaus Zum Einhorn in Frankfurt - Bonames Veranstaltung

View File

@@ -1,49 +0,0 @@
Jahr,Kategorie,Platz,Spieler1,Spieler2,Bemerkung
"2024","Einzel","1","Michael Koch","",""
"2024","Einzel","2","Olaf Nüßlein","",""
"2024","Einzel","3","Bernd Meyer","",""
"2024","Doppel","1","Sven Baublies","Johannes Binder",""
"2024","Doppel","2","Bernd Meyer","Jürgen Dichmann",""
"2024","Doppel","3","Michael Koch","Jacob Waltenberger",""
"2023","Einzel","1","André Gilzinger","",""
"2023","Einzel","2","Olaf Nüßlein","",""
"2023","Einzel","3","Michael Koch","",""
"2023","Doppel","1","Olaf Nüßlein","Johannes Binder",""
"2023","Doppel","2","Renate Nebel","André Gilzinger",""
"2023","Doppel","3","Ute Puschmann","Jürgen Kratz",""
"2022","Einzel","1","Sven Baublies","",""
"2022","Einzel","2","Thomas Steinbrech","",""
"2022","Einzel","3","André Gilzinger","",""
"2022","Doppel","1","Sven Baublies","Kristin von Rauchhaupt",""
"2022","Doppel","2","Michael Weber","Johannes Binder",""
"2022","Doppel","3","Michael Koch","Renate Nebel",""
"2021","","","","","coronabedingter Ausfall"
"2020","","","","","coronabedingter Ausfall"
"2019","Einzel","1","André Gilzinger","",""
"2019","Einzel","2","Thomas Steinbrech","",""
"2019","Einzel","3","Jürgen Kratz","",""
"2019","Doppel","1","André Gilzinger","Volker Marx",""
"2019","Doppel","2","Jürgen Kratz","Marko Wiedau",""
"2019","Doppel","3","Bernd Meyer","Kristin von Rauchhaupt",""
"2018","Einzel","1","André Gilzinger","",""
"2018","Einzel","2","Jürgen Kratz","",""
"2018","Einzel","3","Sven Baublies","",""
"2018","Doppel","1","André Gilzinger","Volker Marx",""
"2018","Doppel","2","Sven Baublies","Helge Stefan",""
"2018","Doppel","3","Jürgen Kratz","Renate Nebel",""
"2017","Einzel","1","André Gilzinger","",""
"2017","Einzel","2","Sven Baublies","",""
"2017","Einzel","3","Olaf Nüßlein","",""
"2017","Doppel","1","Olaf Nüßlein","Helge Stefan",""
"2017","Doppel","2","André Gilzinger","Renate Nebel",""
"2017","Doppel","3","Jürgen Kratz","Kristin von Rauchhaupt",""
"2016","Herren-Einzel","1","André Gilzinger","",""
"2016","Herren-Einzel","2","Sven Baublies","",""
"2016","Herren-Einzel","3","Olaf Nüßlein","",""
"2016","Damen-Einzel","1","Birgit Haas-Schrödter","",""
"2016","Damen-Einzel","2","Kristin von Rauchhaupt","",""
"2016","Damen-Einzel","3","Renate Nebel","",""
"2016","Doppel","1","Jürgen Kratz","Matthias Schmidt",""
"2016","Doppel","2","André Gilzinger","Bernd Meyer",""
"2016","Doppel","3","Sven Baublies","Dagmar Bereksasi",""
"2025","Doppel","1","a","b",""
1 Jahr Kategorie Platz Spieler1 Spieler2 Bemerkung
2 2024 Einzel 1 Michael Koch
3 2024 Einzel 2 Olaf Nüßlein
4 2024 Einzel 3 Bernd Meyer
5 2024 Doppel 1 Sven Baublies Johannes Binder
6 2024 Doppel 2 Bernd Meyer Jürgen Dichmann
7 2024 Doppel 3 Michael Koch Jacob Waltenberger
8 2023 Einzel 1 André Gilzinger
9 2023 Einzel 2 Olaf Nüßlein
10 2023 Einzel 3 Michael Koch
11 2023 Doppel 1 Olaf Nüßlein Johannes Binder
12 2023 Doppel 2 Renate Nebel André Gilzinger
13 2023 Doppel 3 Ute Puschmann Jürgen Kratz
14 2022 Einzel 1 Sven Baublies
15 2022 Einzel 2 Thomas Steinbrech
16 2022 Einzel 3 André Gilzinger
17 2022 Doppel 1 Sven Baublies Kristin von Rauchhaupt
18 2022 Doppel 2 Michael Weber Johannes Binder
19 2022 Doppel 3 Michael Koch Renate Nebel
20 2021 coronabedingter Ausfall
21 2020 coronabedingter Ausfall
22 2019 Einzel 1 André Gilzinger
23 2019 Einzel 2 Thomas Steinbrech
24 2019 Einzel 3 Jürgen Kratz
25 2019 Doppel 1 André Gilzinger Volker Marx
26 2019 Doppel 2 Jürgen Kratz Marko Wiedau
27 2019 Doppel 3 Bernd Meyer Kristin von Rauchhaupt
28 2018 Einzel 1 André Gilzinger
29 2018 Einzel 2 Jürgen Kratz
30 2018 Einzel 3 Sven Baublies
31 2018 Doppel 1 André Gilzinger Volker Marx
32 2018 Doppel 2 Sven Baublies Helge Stefan
33 2018 Doppel 3 Jürgen Kratz Renate Nebel
34 2017 Einzel 1 André Gilzinger
35 2017 Einzel 2 Sven Baublies
36 2017 Einzel 3 Olaf Nüßlein
37 2017 Doppel 1 Olaf Nüßlein Helge Stefan
38 2017 Doppel 2 André Gilzinger Renate Nebel
39 2017 Doppel 3 Jürgen Kratz Kristin von Rauchhaupt
40 2016 Herren-Einzel 1 André Gilzinger
41 2016 Herren-Einzel 2 Sven Baublies
42 2016 Herren-Einzel 3 Olaf Nüßlein
43 2016 Damen-Einzel 1 Birgit Haas-Schrödter
44 2016 Damen-Einzel 2 Kristin von Rauchhaupt
45 2016 Damen-Einzel 3 Renate Nebel
46 2016 Doppel 1 Jürgen Kratz Matthias Schmidt
47 2016 Doppel 2 André Gilzinger Bernd Meyer
48 2016 Doppel 3 Sven Baublies Dagmar Bereksasi
49 2025 Doppel 1 a b

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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;;;;"}

Some files were not shown because too many files have changed in this diff Show More