Files
sign/packages/trpc/server/context.ts

70 lines
1.5 KiB
TypeScript
Raw Normal View History

2025-03-03 14:49:28 +11:00
import type { Session } from '@prisma/client';
2025-01-02 15:33:37 +11:00
import type { Context } from 'hono';
import { z } from 'zod';
2023-06-09 18:21:18 +10:00
2025-01-02 15:33:37 +11:00
import type { SessionUser } from '@documenso/auth/server/lib/session/session';
2025-02-16 00:44:01 +11:00
import { getOptionalSession } from '@documenso/auth/server/lib/utils/get-session';
import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
2025-01-02 15:33:37 +11:00
import { extractRequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
2023-06-09 18:21:18 +10:00
2025-01-02 15:33:37 +11:00
type CreateTrpcContextOptions = {
c: Context;
requestSource: 'app' | 'apiV1' | 'apiV2';
};
export const createTrpcContext = async ({
2025-01-02 15:33:37 +11:00
c,
requestSource,
2025-01-02 15:33:37 +11:00
}: CreateTrpcContextOptions): Promise<TrpcContext> => {
2025-02-16 00:44:01 +11:00
const { session, user } = await getOptionalSession(c);
2025-01-02 15:33:37 +11:00
const req = c.req.raw;
2023-06-09 18:21:18 +10:00
const metadata: ApiRequestMetadata = {
2025-01-02 15:33:37 +11:00
requestMetadata: extractRequestMetadata(req),
source: requestSource,
auth: null,
};
2025-01-02 15:33:37 +11:00
const rawTeamId = req.headers.get('x-team-id') || undefined;
const teamId = z.coerce
.number()
.optional()
.catch(() => undefined)
2025-01-02 15:33:37 +11:00
.parse(rawTeamId);
2025-01-02 15:33:37 +11:00
if (!session || !user) {
return {
session: null,
user: null,
teamId,
2024-01-30 17:31:27 +11:00
req,
metadata,
};
}
2023-06-09 18:21:18 +10:00
return {
session,
user,
teamId,
2024-01-30 17:31:27 +11:00
req,
metadata,
2023-06-09 18:21:18 +10:00
};
};
2025-01-02 15:33:37 +11:00
export type TrpcContext = (
| {
session: null;
user: null;
}
| {
session: Session;
user: SessionUser;
}
) & {
teamId: number | undefined;
req: Request;
metadata: ApiRequestMetadata;
};