-
Notifications
You must be signed in to change notification settings - Fork 0
/
middleware.ts
50 lines (40 loc) · 1.61 KB
/
middleware.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import type { NextRequest } from "next/server";
import { NextResponse, type NextMiddleware } from "next/server";
import { getCookieExpires } from "./utils/cookies";
const authPages = new Set<string>(["/signIn"]);
const publicPages = new Set<string>(["/", "/download", "/tutorial", "/help"]);
const requestPages = /^(.*?)(?:\/progress|\/check|\/uncheck)$/;
export const config = {
matcher: "/((?!api|static|.*\\..*|_next|favicon.ico).*)",
};
const extendCookies = (req: NextRequest, res: NextResponse) => {
const databaseId = req.cookies.get("database-id");
const notionToken = req.cookies.get("notion-token");
const expires = getCookieExpires();
if (databaseId)
res.cookies.set("database-id", databaseId?.value, { expires });
if (notionToken)
res.cookies.set("notion-token", notionToken?.value, { expires });
return res;
};
export const middleware: NextMiddleware = async (req) => {
const res = NextResponse.next();
const pathname = req.nextUrl.pathname;
const isRequestPage = requestPages.test(pathname);
if (isRequestPage) return res;
const isPublicPage = publicPages.has(pathname);
if (isPublicPage) return res;
const isAuthPage = authPages.has(pathname);
const notionToken = req.cookies.get("notion-token")?.value;
const isAuth = !!notionToken;
if (!isAuth && !isAuthPage) {
const toSignIn = NextResponse.redirect(new URL("/signIn", req.url));
toSignIn.cookies.delete("notion-token");
return toSignIn;
}
if (isAuth && isAuthPage) {
const toHome = NextResponse.redirect(new URL("/", req.url));
return extendCookies(req, toHome);
}
return extendCookies(req, res);
};