135 lines
3.7 KiB
TypeScript
135 lines
3.7 KiB
TypeScript
import { checkAdminAuth } from '@/lib/auth';
|
|
import fs from 'fs';
|
|
import { NextRequest, NextResponse } from 'next/server';
|
|
import path from 'path';
|
|
|
|
// Path to the editable text file
|
|
const TEXT_FILE = path.join(process.cwd(), 'data', 'editable_text.json');
|
|
export type EditableText = { id: string; content: string };
|
|
// Ensure the data directory exists
|
|
function ensureDataDirectory() {
|
|
const dataDir = path.join(process.cwd(), 'data');
|
|
if (!fs.existsSync(dataDir)) {
|
|
fs.mkdirSync(dataDir, { recursive: true });
|
|
}
|
|
}
|
|
|
|
// Get all editable texts
|
|
function getEditableTexts() {
|
|
ensureDataDirectory();
|
|
|
|
if (!fs.existsSync(TEXT_FILE)) {
|
|
// Default texts
|
|
const defaultTexts = [
|
|
{
|
|
id: 'welcome-text',
|
|
content: '<p>Herzlich willkommen bei der Online-Abstimmungsplattform des SCHAFWASCHENER SEGELVEREIN CHIEMSEE E.V. RIMSTING.</p><p>Diese Plattform ermöglicht es Mitgliedern, sicher und bequem über Vereinsangelegenheiten abzustimmen.</p>'
|
|
},
|
|
{
|
|
id: 'current-vote-text',
|
|
content: '<p>Derzeit läuft eine Abstimmung zur Änderung der Vereinssatzung.</p><p>Bitte nutzen Sie den Ihnen zugesandten Link, um an der Abstimmung teilzunehmen.</p><p>Bei Fragen wenden Sie sich bitte an den Vorstand.</p>'
|
|
},
|
|
{
|
|
id: 'vote-question',
|
|
content: '<p>Stimmen Sie der vorgeschlagenen Änderung der Vereinssatzung zu?</p>'
|
|
},
|
|
{
|
|
id: 'vote-options',
|
|
content: [
|
|
{
|
|
id: 'yes',
|
|
label: 'Ja, ich stimme zu'
|
|
},
|
|
{
|
|
id: 'no',
|
|
label: 'Nein, ich stimme nicht zu'
|
|
},
|
|
{
|
|
id: 'abstain',
|
|
label: 'Ich enthalte mich'
|
|
}
|
|
]
|
|
}
|
|
];
|
|
|
|
fs.writeFileSync(TEXT_FILE, JSON.stringify(defaultTexts, null, 2));
|
|
return defaultTexts;
|
|
}
|
|
|
|
const data = fs.readFileSync(TEXT_FILE, 'utf-8');
|
|
return JSON.parse(data);
|
|
}
|
|
|
|
// Save editable texts
|
|
|
|
function saveEditableTexts(texts: EditableText[]) {
|
|
ensureDataDirectory();
|
|
fs.writeFileSync(TEXT_FILE, JSON.stringify(texts, null, 2));
|
|
}
|
|
|
|
// GET handler to retrieve all editable texts
|
|
export async function GET() {
|
|
try {
|
|
const texts = getEditableTexts();
|
|
return NextResponse.json({ texts });
|
|
} catch (error) {
|
|
console.error('Error getting editable texts:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Failed to get editable texts' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|
|
// POST handler to update an editable text (requires admin authentication)
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const body = await request.json();
|
|
// Check for admin auth
|
|
const { password, } = body;
|
|
const isAuthenticated = await checkAdminAuth(password);
|
|
if (!isAuthenticated) {
|
|
return NextResponse.json(
|
|
{ error: 'Unauthorized' },
|
|
{ status: 401 }
|
|
);
|
|
}
|
|
|
|
const { id, content } = body;
|
|
|
|
if (!id || !content) {
|
|
return NextResponse.json(
|
|
{ error: 'ID and content are required' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
// Get current texts
|
|
const texts = getEditableTexts();
|
|
|
|
// Find and update the text with the given ID
|
|
const textIndex = texts.findIndex((text: EditableText
|
|
|
|
) => text.id === id);
|
|
|
|
if (textIndex === -1) {
|
|
// Text not found, add new
|
|
texts.push({ id, content });
|
|
} else {
|
|
// Update existing text
|
|
texts[textIndex].content = content;
|
|
}
|
|
|
|
// Save updated texts
|
|
saveEditableTexts(texts);
|
|
|
|
return NextResponse.json({ success: true });
|
|
} catch (error) {
|
|
console.error('Error updating editable text:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Failed to update editable text' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|