Compare commits
26 Commits
edb8d1c521
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8bd7ed76cd | ||
|
|
0afdfec33b | ||
|
|
ca204e6ef9 | ||
|
|
e55ca48de8 | ||
|
|
60257edde3 | ||
|
|
111c8c239c | ||
|
|
9e5ccbe8a3 | ||
|
|
dd21174f1d | ||
|
|
6fda6ebad0 | ||
|
|
c9037fec45 | ||
|
|
e128e1a77c | ||
|
|
19024cd87e | ||
|
|
968c749fe3 | ||
|
|
316cce1b26 | ||
|
|
acfa842131 | ||
|
|
4f453f77bc | ||
|
|
42b9a10437 | ||
|
|
b20b89d333 | ||
|
|
861802b716 | ||
|
|
164c5d9297 | ||
|
|
a323684f13 | ||
|
|
131edc0cb1 | ||
| 6243db3020 | |||
| 97742b24bb | |||
| 40c2139aa8 | |||
| e05eb46bc5 |
84
.gitea/workflows/code-analysis.yml
Normal file
84
.gitea/workflows/code-analysis.yml
Normal file
@@ -0,0 +1,84 @@
|
||||
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: Workspace sanity check
|
||||
run: |
|
||||
echo "PWD: $(pwd)"
|
||||
echo "LS:"
|
||||
ls -la
|
||||
echo "Lockfiles:"
|
||||
ls -la package-lock.json || true
|
||||
|
||||
- name: Node versions
|
||||
run: |
|
||||
node -v
|
||||
npm -v
|
||||
|
||||
- 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
|
||||
# Extract ONLY the gitleaks binary (the archive also contains README etc. which would trigger gitleaks itself)
|
||||
if tar -tzf gitleaks.tar.gz >/dev/null 2>&1; then
|
||||
tar -xzf gitleaks.tar.gz gitleaks
|
||||
elif tar -tf gitleaks.tar.gz >/dev/null 2>&1; then
|
||||
tar -xf gitleaks.tar.gz gitleaks
|
||||
else
|
||||
echo "Error: Cannot extract archive. File type:"
|
||||
file gitleaks.tar.gz
|
||||
exit 1
|
||||
fi
|
||||
chmod +x gitleaks
|
||||
# Run gitleaks scan BEFORE installing dependencies to avoid false positives from node_modules
|
||||
./gitleaks detect --source . --no-git --verbose --exit-code 1
|
||||
rm -f gitleaks.tar.gz
|
||||
|
||||
- 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
|
||||
|
||||
- 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 --version
|
||||
test -f ./package-lock.json
|
||||
./osv-scanner --lockfile ./package-lock.json
|
||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -144,6 +144,11 @@ Thumbs.db
|
||||
*.tmp
|
||||
*.temp
|
||||
|
||||
# Security tooling artifacts (CI downloads)
|
||||
gitleaks
|
||||
gitleaks.tar.gz
|
||||
osv-scanner
|
||||
|
||||
# Sensitive data (DO NOT commit production sessions!)
|
||||
# server/data/sessions.json - uncomment for production
|
||||
public/uploads
|
||||
|
||||
@@ -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": {}
|
||||
}
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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 _};
|
||||
@@ -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 |
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -1 +0,0 @@
|
||||
{"id":"8af76f9e-6e85-416c-9e2f-92c68e0dfd76","timestamp":1762349079882}
|
||||
@@ -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}}
|
||||
@@ -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}}
|
||||
@@ -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};
|
||||
@@ -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,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,2 +0,0 @@
|
||||
"datum","uhrzeit","titel","beschreibung","kategorie"
|
||||
"2025-12-18","19:00","Weihnachtsfeier 2025 im Gasthaus Zum Einhorn in Frankfurt - Bonames","","Veranstaltung"
|
||||
|
@@ -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",""
|
||||
|
Binary file not shown.
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
@@ -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
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"auth.mjs","sources":["../../../../server/utils/auth.js"],"sourcesContent":null,"names":["fs"],"mappings":"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"}
|
||||
@@ -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
|
||||
@@ -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]}
|
||||
@@ -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
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"members.mjs","sources":["../../../../server/utils/members.js"],"sourcesContent":null,"names":["fs"],"mappings":"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"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"termine.mjs","sources":["../../../../server/utils/termine.js"],"sourcesContent":null,"names":["fs"],"mappings":"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"}
|
||||
@@ -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
|
||||
@@ -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
@@ -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]}
|
||||
@@ -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
|
||||
@@ -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]}
|
||||
@@ -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
|
||||
@@ -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
@@ -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]}
|
||||
@@ -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
|
||||
@@ -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
@@ -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]}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"register.post.mjs","sources":["../../../../../../server/api/auth/register.post.js"],"sourcesContent":null,"names":[],"mappings":"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"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"contact.post.mjs","sources":["../../../../../server/api/contact.post.js"],"sourcesContent":null,"names":[],"mappings":"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"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"members.get.mjs","sources":["../../../../../server/api/members.get.js"],"sourcesContent":null,"names":["_a"],"mappings":"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"}
|
||||
@@ -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
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"members.post.mjs","sources":["../../../../../server/api/members.post.js"],"sourcesContent":null,"names":[],"mappings":"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"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user