lomavuokraus/app/api/listings/[id]/availability/route.ts
Tero Halla-aho 0bb709d9c5
Some checks failed
CI / checks (push) Has been cancelled
chore: fix audit alerts and formatting
2026-02-04 12:43:03 +02:00

51 lines
1.6 KiB
TypeScript

import { NextResponse } from "next/server";
import { prisma } from "../../../../../lib/prisma";
import {
expandBlockedDates,
getCalendarRanges,
} from "../../../../../lib/calendar";
export async function GET(_: Request, { params }: { params: { id: string } }) {
const monthParam = Number(
new URL(_.url).searchParams.get("month") ?? new Date().getUTCMonth(),
);
const yearParam = Number(
new URL(_.url).searchParams.get("year") ?? new Date().getUTCFullYear(),
);
const monthsParam = Math.min(
Number(new URL(_.url).searchParams.get("months") ?? 1),
12,
);
const forceRefresh = new URL(_.url).searchParams.get("refresh") === "1";
const month = Number.isFinite(monthParam)
? monthParam
: new Date().getUTCMonth();
const year = Number.isFinite(yearParam)
? yearParam
: new Date().getUTCFullYear();
const months =
Number.isFinite(monthsParam) && monthsParam > 0 ? monthsParam : 1;
const listing = await prisma.listing.findUnique({
where: { id: params.id },
select: { calendarUrls: true },
});
if (!listing) {
return NextResponse.json({ error: "Listing not found" }, { status: 404 });
}
const urls = (listing.calendarUrls ?? []).filter(Boolean);
if (!urls.length) {
return NextResponse.json({ blockedDates: [] });
}
const start = new Date(Date.UTC(year, month, 1));
const end = new Date(start);
end.setUTCMonth(end.getUTCMonth() + months);
const ranges = await getCalendarRanges(urls, { forceRefresh });
const blockedDates = expandBlockedDates(ranges, start, end);
return NextResponse.json({ blockedDates });
}