Files
Homarr/src/middleware.ts

68 lines
1.6 KiB
TypeScript
Raw Normal View History

import Consola from 'consola';
import fs from 'fs/promises';
2023-08-05 12:26:50 +02:00
import { NextRequest, NextResponse } from 'next/server';
import { env } from 'process';
import { getUrl } from './tools/server/url';
2023-08-05 12:26:50 +02:00
import { client } from './utils/api';
const skippedUrls = [
'/onboard',
'/api/',
'/_next/',
'/favicon.ico',
'/404',
'/pages/_app',
'/imgs/',
];
let cachedUserCount = 0;
export async function middleware(req: NextRequest) {
const url = req.nextUrl.clone();
// Do not redirect if the url is in the skippedUrls array
if (skippedUrls.some((skippedUrl) => url.pathname.startsWith(skippedUrl))) {
return NextResponse.next();
}
// Do not redirect if we are on Vercel
if (env.VERCEL) {
return NextResponse.next();
}
// Do not redirect if there are users in the database
if (cachedUserCount > 0) {
return NextResponse.next();
}
// Do not redirect if there are users in the database
if (!(await shouldRedirectToOnboard())) {
2023-08-05 12:26:50 +02:00
return NextResponse.next();
}
return NextResponse.redirect(getUrl(req) + '/onboard');
2023-08-05 12:26:50 +02:00
}
const shouldRedirectToOnboard = async (): Promise<boolean> => {
const cacheAndGetUserCount = async () => {
cachedUserCount = await client.user.count.query();
return cachedUserCount === 0;
2023-10-25 15:29:45 +02:00
};
if (!env.DATABASE_URL?.startsWith('file:')) {
return await cacheAndGetUserCount();
}
const fileUri = env.DATABASE_URL.substring(4);
try {
await fs.access(fileUri, fs.constants.W_OK);
return await cacheAndGetUserCount();
} catch {
Consola.warn(
`detected that the path ${fileUri} was not readable. Showing onboarding page for setup...`
);
return true;
}
};