Files
web/middlewares/dateFormat.ts
2024-12-03 16:14:58 +01:00

48 lines
1.5 KiB
TypeScript

import { NextMiddleware, NextResponse } from "next/server"
import { MiddlewareMatcher } from "@/types/middleware"
/*
Middleware function to normalize date formats to support
YYYY-MM-D and YYYY-MM-DD since the current web uses YYYY-MM-D
in the URL as parameters (toDate and fromDate)
*/
const legacyDatePattern = /^([12]\d{3}-(0[1-9]|1[0-2])-([1-9]))$/
function normalizeDate(date: string): string {
const datePattern = /^\d{4}-\d{1,2}-\d{1,2}$/
if (datePattern.test(date)) {
const [year, month, day] = date.split("-").map(Number)
return `${year}-${String(month).padStart(2, "0")}-${String(day).padStart(2, "0")}`
}
return date
}
export const middleware: NextMiddleware = (request) => {
const url = request.nextUrl.clone()
const { searchParams } = url
if (
legacyDatePattern.test(searchParams.get("fromDate")!) ||
legacyDatePattern.test(searchParams.get("toDate")!)
) {
const fromDate = searchParams.get("fromDate")!
url.searchParams.set("fromDate", normalizeDate(fromDate))
const toDate = searchParams.get("toDate")!
url.searchParams.set("toDate", normalizeDate(toDate))
return NextResponse.redirect(url)
} else {
const headers = new Headers(request.headers)
headers.set("x-continue", "1")
return NextResponse.next({
headers,
})
}
}
export const matcher: MiddlewareMatcher = (request) => {
const { searchParams } = request.nextUrl
return searchParams.has("fromDate") || searchParams.has("toDate")
}