Files
sign/apps/remix/server/load-context.ts

91 lines
2.3 KiB
TypeScript
Raw Normal View History

2025-02-05 23:37:21 +11:00
import { extractSessionCookieFromHeaders } from '@documenso/auth/server/lib/session/session-cookies';
2025-01-31 18:57:45 +11:00
import { getSession } from '@documenso/auth/server/lib/utils/get-session';
2025-01-31 23:17:50 +11:00
import { type TGetTeamByUrlResponse, getTeamByUrl } from '@documenso/lib/server-only/team/get-team';
import { type TGetTeamsResponse, getTeams } from '@documenso/lib/server-only/team/get-teams';
2025-02-03 14:10:28 +11:00
import { extractRequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
2025-02-05 23:37:21 +11:00
import { AppLogger } from '@documenso/lib/utils/debugger';
2025-01-31 18:57:45 +11:00
type GetLoadContextArgs = {
request: Request;
};
declare module 'react-router' {
2025-01-31 23:17:50 +11:00
interface AppLoadContext extends Awaited<ReturnType<typeof getLoadContext>> {}
2025-01-31 18:57:45 +11:00
}
2025-02-06 01:57:23 +11:00
const logger = new AppLogger('Context');
2025-02-05 23:37:21 +11:00
2025-01-31 18:57:45 +11:00
export async function getLoadContext(args: GetLoadContextArgs) {
2025-01-31 23:17:50 +11:00
const initTime = Date.now();
const request = args.request;
const url = new URL(request.url);
2025-01-31 18:57:45 +11:00
2025-02-05 23:37:21 +11:00
const noSessionCookie = extractSessionCookieFromHeaders(request.headers) === null;
if (!isPageRequest(request) || noSessionCookie) {
logger.log('Pathname ignored', url.pathname);
2025-01-31 23:17:50 +11:00
return {
2025-02-03 14:10:28 +11:00
requestMetadata: extractRequestMetadata(request),
2025-01-31 23:17:50 +11:00
session: null,
};
}
2025-01-31 18:57:45 +11:00
const splitUrl = url.pathname.split('/');
2025-01-31 23:17:50 +11:00
let team: TGetTeamByUrlResponse | null = null;
2025-02-05 23:37:21 +11:00
let teams: TGetTeamsResponse = [];
2025-01-31 18:57:45 +11:00
const session = await getSession(args.request);
2025-02-05 23:37:21 +11:00
if (session.isAuthenticated) {
let teamUrl = null;
2025-01-31 18:57:45 +11:00
2025-02-05 23:37:21 +11:00
if (splitUrl[1] === 't' && splitUrl[2]) {
teamUrl = splitUrl[2];
}
2025-01-31 23:17:50 +11:00
2025-02-05 23:37:21 +11:00
const result = await Promise.all([
getTeams({ userId: session.user.id }),
teamUrl ? getTeamByUrl({ userId: session.user.id, teamUrl }) : null,
]);
2025-01-31 23:17:50 +11:00
2025-02-05 23:37:21 +11:00
teams = result[0];
team = result[1];
2025-01-31 23:17:50 +11:00
}
const endTime = Date.now();
2025-02-05 23:37:21 +11:00
logger.log(`Pathname accepted in ${endTime - initTime}ms`, url.pathname);
2025-01-31 18:57:45 +11:00
return {
2025-02-03 14:10:28 +11:00
requestMetadata: extractRequestMetadata(request),
2025-01-31 23:17:50 +11:00
session: session.isAuthenticated
? {
session: session.session,
user: session.user,
currentTeam: team,
teams,
}
: null,
2025-01-31 18:57:45 +11:00
};
}
2025-01-31 23:17:50 +11:00
2025-02-05 23:37:21 +11:00
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;
2025-01-31 23:17:50 +11:00
};