fix: MEDIUM — Cache-Control headers on admin GETs, Open Day past date validation
- Add Cache-Control headers to admin GET endpoints (sections 60s, team 60s, bookings 30s, unread 15s, open-day 60s) - Validate Open Day date is not in the past on both create (POST) and update (PUT) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,9 @@ import { getGroupBookings, toggleGroupBookingNotification, deleteGroupBooking }
|
|||||||
|
|
||||||
export async function GET() {
|
export async function GET() {
|
||||||
const bookings = getGroupBookings();
|
const bookings = getGroupBookings();
|
||||||
return NextResponse.json(bookings);
|
return NextResponse.json(bookings, {
|
||||||
|
headers: { "Cache-Control": "private, max-age=30" },
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function PUT(request: NextRequest) {
|
export async function PUT(request: NextRequest) {
|
||||||
|
|||||||
@@ -16,7 +16,9 @@ export async function GET(request: NextRequest) {
|
|||||||
if (!event) return NextResponse.json({ error: "Not found" }, { status: 404 });
|
if (!event) return NextResponse.json({ error: "Not found" }, { status: 404 });
|
||||||
return NextResponse.json(event);
|
return NextResponse.json(event);
|
||||||
}
|
}
|
||||||
return NextResponse.json(getOpenDayEvents());
|
return NextResponse.json(getOpenDayEvents(), {
|
||||||
|
headers: { "Cache-Control": "private, max-age=60" },
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function POST(request: NextRequest) {
|
export async function POST(request: NextRequest) {
|
||||||
@@ -25,6 +27,11 @@ export async function POST(request: NextRequest) {
|
|||||||
if (!body.date || typeof body.date !== "string") {
|
if (!body.date || typeof body.date !== "string") {
|
||||||
return NextResponse.json({ error: "date is required" }, { status: 400 });
|
return NextResponse.json({ error: "date is required" }, { status: 400 });
|
||||||
}
|
}
|
||||||
|
// Warn if date is in the past
|
||||||
|
const eventDate = new Date(body.date + "T23:59:59");
|
||||||
|
if (eventDate < new Date()) {
|
||||||
|
return NextResponse.json({ error: "Дата не может быть в прошлом" }, { status: 400 });
|
||||||
|
}
|
||||||
const id = createOpenDayEvent(body);
|
const id = createOpenDayEvent(body);
|
||||||
return NextResponse.json({ ok: true, id });
|
return NextResponse.json({ ok: true, id });
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@@ -38,6 +45,12 @@ export async function PUT(request: NextRequest) {
|
|||||||
const body = await request.json();
|
const body = await request.json();
|
||||||
if (!body.id) return NextResponse.json({ error: "id is required" }, { status: 400 });
|
if (!body.id) return NextResponse.json({ error: "id is required" }, { status: 400 });
|
||||||
const { id, ...data } = body;
|
const { id, ...data } = body;
|
||||||
|
if (data.date) {
|
||||||
|
const eventDate = new Date(data.date + "T23:59:59");
|
||||||
|
if (eventDate < new Date()) {
|
||||||
|
return NextResponse.json({ error: "Дата не может быть в прошлом" }, { status: 400 });
|
||||||
|
}
|
||||||
|
}
|
||||||
updateOpenDayEvent(id, data);
|
updateOpenDayEvent(id, data);
|
||||||
return NextResponse.json({ ok: true });
|
return NextResponse.json({ ok: true });
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
@@ -24,7 +24,9 @@ export async function GET(_request: NextRequest, { params }: Params) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NextResponse.json(data);
|
return NextResponse.json(data, {
|
||||||
|
headers: { "Cache-Control": "private, max-age=60" },
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function PUT(request: NextRequest, { params }: Params) {
|
export async function PUT(request: NextRequest, { params }: Params) {
|
||||||
|
|||||||
@@ -5,7 +5,9 @@ import type { RichListItem, VictoryItem } from "@/types/content";
|
|||||||
|
|
||||||
export async function GET() {
|
export async function GET() {
|
||||||
const members = getTeamMembers();
|
const members = getTeamMembers();
|
||||||
return NextResponse.json(members);
|
return NextResponse.json(members, {
|
||||||
|
headers: { "Cache-Control": "private, max-age=60" },
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function POST(request: NextRequest) {
|
export async function POST(request: NextRequest) {
|
||||||
|
|||||||
@@ -2,5 +2,7 @@ import { NextResponse } from "next/server";
|
|||||||
import { getUnreadBookingCounts } from "@/lib/db";
|
import { getUnreadBookingCounts } from "@/lib/db";
|
||||||
|
|
||||||
export async function GET() {
|
export async function GET() {
|
||||||
return NextResponse.json(getUnreadBookingCounts());
|
return NextResponse.json(getUnreadBookingCounts(), {
|
||||||
|
headers: { "Cache-Control": "private, max-age=15" },
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user