Files
la-huasca-ts/src/app/api/calendar_events/route.ts
T

51 lines
1.7 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
import { requireRole } from '@/lib/auth';
import { db } from '@/lib/db';
export async function GET(request: NextRequest) {
try {
const year = parseInt(request.nextUrl.searchParams.get('year') || '', 10) || new Date().getFullYear();
const start = `${year}-01-01`;
const end = `${year}-12-31`;
const { rows } = await db.query(
`SELECT * FROM calendar_events
WHERE date BETWEEN $1 AND $2 AND active = TRUE
ORDER BY date`,
[start, end]
);
return NextResponse.json({ data: rows });
} catch (error: any) {
console.error('GET /api/calendar_events error:', error);
return NextResponse.json({ error: error.message || 'Failed to fetch events' }, { status: 500 });
}
}
export async function POST(request: NextRequest) {
try {
await requireRole('admin');
const body = await request.json();
const { date, title, type, description, color, active } = body;
if (!date || !title || !type) {
return NextResponse.json({ error: 'Missing required fields' }, { status: 400 });
}
const { rows } = await db.query(
`INSERT INTO calendar_events (date, title, type, description, color, active)
VALUES ($1, $2, $3, $4, $5, $6)
RETURNING *`,
[date, title, type, description || null, color || '#E8A849', active !== false]
);
return NextResponse.json({ data: rows[0] });
} catch (error: any) {
if ((error as Error).message === 'Unauthorized') {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
console.error('POST /api/calendar_events error:', error);
return NextResponse.json({ error: error.message || 'Failed to create event' }, { status: 500 });
}
}