mirror of
https://github.com/documenso/documenso.git
synced 2025-11-19 19:21:39 +10:00
fix: wip
This commit is contained in:
@ -1,7 +1,9 @@
|
||||
import { extractSessionCookieFromHeaders } from '@documenso/auth/server/lib/session/session-cookies';
|
||||
import { getSession } from '@documenso/auth/server/lib/utils/get-session';
|
||||
import { type TGetTeamByUrlResponse, getTeamByUrl } from '@documenso/lib/server-only/team/get-team';
|
||||
import { type TGetTeamsResponse, getTeams } from '@documenso/lib/server-only/team/get-teams';
|
||||
import { extractRequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
|
||||
import { AppLogger } from '@documenso/lib/utils/debugger';
|
||||
|
||||
type GetLoadContextArgs = {
|
||||
request: Request;
|
||||
@ -11,16 +13,19 @@ declare module 'react-router' {
|
||||
interface AppLoadContext extends Awaited<ReturnType<typeof getLoadContext>> {}
|
||||
}
|
||||
|
||||
const logger = new AppLogger('[Context]');
|
||||
|
||||
export async function getLoadContext(args: GetLoadContextArgs) {
|
||||
const initTime = Date.now();
|
||||
|
||||
const request = args.request;
|
||||
const url = new URL(request.url);
|
||||
|
||||
// Todo only make available for get requests (loaders) and non api routes
|
||||
// use config
|
||||
if (request.method !== 'GET' || !config.matcher.test(url.pathname)) {
|
||||
console.log('[Session]: Pathname ignored', url.pathname);
|
||||
const noSessionCookie = extractSessionCookieFromHeaders(request.headers) === null;
|
||||
|
||||
if (!isPageRequest(request) || noSessionCookie) {
|
||||
logger.log('Pathname ignored', url.pathname);
|
||||
|
||||
return {
|
||||
requestMetadata: extractRequestMetadata(request),
|
||||
session: null,
|
||||
@ -30,27 +35,28 @@ export async function getLoadContext(args: GetLoadContextArgs) {
|
||||
const splitUrl = url.pathname.split('/');
|
||||
|
||||
let team: TGetTeamByUrlResponse | null = null;
|
||||
let teams: TGetTeamsResponse = [];
|
||||
|
||||
const session = await getSession(args.request);
|
||||
|
||||
if (session.isAuthenticated && splitUrl[1] === 't' && splitUrl[2]) {
|
||||
const teamUrl = splitUrl[2];
|
||||
|
||||
team = await getTeamByUrl({ userId: session.user.id, teamUrl });
|
||||
}
|
||||
|
||||
let teams: TGetTeamsResponse = [];
|
||||
|
||||
if (session.isAuthenticated) {
|
||||
// This is always loaded for the header.
|
||||
teams = await getTeams({ userId: session.user.id });
|
||||
let teamUrl = null;
|
||||
|
||||
if (splitUrl[1] === 't' && splitUrl[2]) {
|
||||
teamUrl = splitUrl[2];
|
||||
}
|
||||
|
||||
const result = await Promise.all([
|
||||
getTeams({ userId: session.user.id }),
|
||||
teamUrl ? getTeamByUrl({ userId: session.user.id, teamUrl }) : null,
|
||||
]);
|
||||
|
||||
teams = result[0];
|
||||
team = result[1];
|
||||
}
|
||||
|
||||
const endTime = Date.now();
|
||||
console.log(`[Session]: Pathname accepted in ${endTime - initTime}ms`, url.pathname);
|
||||
|
||||
// Todo: Optimise and chain promises.
|
||||
// Todo: This is server only right?? Results not exposed?
|
||||
logger.log(`Pathname accepted in ${endTime - initTime}ms`, url.pathname);
|
||||
|
||||
return {
|
||||
requestMetadata: extractRequestMetadata(request),
|
||||
@ -65,17 +71,20 @@ export async function getLoadContext(args: GetLoadContextArgs) {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Route matcher configuration that excludes common non-route paths:
|
||||
* - /api/* (API routes)
|
||||
* - /assets/* (Static assets)
|
||||
* - /build/* (Build output)
|
||||
* - /favicon.* (Favicon files)
|
||||
* - *.webmanifest (Web manifest files)
|
||||
* - Paths starting with . (e.g. .well-known)
|
||||
*/
|
||||
const config = {
|
||||
matcher: new RegExp(
|
||||
'/((?!api|assets|static|build|favicon|__manifest|site.webmanifest|manifest.webmanifest|\\..*).*)',
|
||||
),
|
||||
const isPageRequest = (request: Request) => {
|
||||
const url = new URL(request.url);
|
||||
|
||||
if (request.method !== 'GET') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (url.pathname.endsWith('.data')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (request.headers.get('Accept')?.includes('text/html')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user