This commit is contained in:
Mythie
2025-01-02 15:33:37 +11:00
committed by David Nguyen
parent 9183f668d3
commit f7a98180d7
413 changed files with 29538 additions and 1606 deletions

View File

@ -0,0 +1,33 @@
import type { Context } from 'hono';
import { createOpenApiFetchHandler } from 'trpc-to-openapi';
import { AppError, genericErrorCodeToTrpcErrorCodeMap } from '@documenso/lib/errors/app-error';
import { appRouter } from '@documenso/trpc/server/router';
import { handleTrpcRouterError } from '@documenso/trpc/utils/trpc-error-handler';
import { createHonoTrpcContext } from './trpc-context';
export const openApiTrpcServerHandler = async (c: Context) => {
return createOpenApiFetchHandler<typeof appRouter>({
endpoint: '/v2/api',
router: appRouter,
// Todo: Test this, since it's not using the createContext params.
createContext: async () => createHonoTrpcContext({ c, requestSource: 'apiV2' }),
req: c.req.raw,
onError: (opts) => handleTrpcRouterError(opts, 'apiV2'),
// Not sure why we need to do this since we handle it in errorFormatter which runs after this.
responseMeta: (opts) => {
if (opts.errors[0]?.cause instanceof AppError) {
const appError = AppError.parseError(opts.errors[0].cause);
const httpStatus = genericErrorCodeToTrpcErrorCodeMap[appError.code]?.status ?? 400;
return {
status: httpStatus,
};
}
return {};
},
});
};

View File

@ -0,0 +1,25 @@
import { trpcServer } from '@hono/trpc-server';
import { appRouter } from '@documenso/trpc/server/router';
import { handleTrpcRouterError } from '@documenso/trpc/utils/trpc-error-handler';
import { createHonoTrpcContext } from './trpc-context';
// export const config = {
// maxDuration: 120,
// api: {
// bodyParser: {
// sizeLimit: '50mb',
// },
// },
// };
/**
* Trpc server for internal routes like /api/trpc/*
*/
export const reactRouterTrpcServer = trpcServer({
router: appRouter,
endpoint: '/api/trpc',
createContext: async (_, c) => createHonoTrpcContext({ c, requestSource: 'app' }),
onError: (opts) => handleTrpcRouterError(opts, 'trpc'),
});

View File

@ -0,0 +1,66 @@
import type { Context } from 'hono';
import { z } from 'zod';
import { getSession } from '@documenso/auth/server/lib/utils/get-session';
import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
import { extractRequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
import type { TrpcContext } from '@documenso/trpc/server/context';
type CreateTrpcContextOptions = {
c: Context;
requestSource: 'app' | 'apiV1' | 'apiV2';
};
/**
* For trpc that uses @documenso/auth and Hono.
*/
export const createHonoTrpcContext = async ({
c,
requestSource,
}: CreateTrpcContextOptions): Promise<TrpcContext> => {
const { session, user } = await getSession(c);
const req = c.req.raw;
const metadata: ApiRequestMetadata = {
requestMetadata: extractRequestMetadata(req),
source: requestSource,
auth: null,
};
const rawTeamId = req.headers.get('x-team-id') || undefined;
const teamId = z.coerce
.number()
.optional()
.catch(() => undefined)
.parse(rawTeamId);
if (!session) {
return {
session: null,
user: null,
teamId,
req,
metadata,
};
}
if (!user) {
return {
session: null,
user: null,
teamId,
req,
metadata,
};
}
return {
session,
user, // Todo
teamId,
req,
metadata,
};
};