This commit is contained in:
Aman Varshney
2025-04-14 21:45:28 +05:30
parent 8b03441909
commit 7f441ef670
268 changed files with 3513 additions and 3039 deletions

View File

@@ -0,0 +1,105 @@
{{#if (eq backend 'next')}}
import type { NextRequest } from "next/server";
{{#if auth}}
import { auth } from "./auth";
{{/if}}
export async function createContext(req: NextRequest) {
{{#if auth}}
const session = await auth.api.getSession({
headers: req.headers,
});
return {
session,
};
{{else}}
return {}
{{/if}}
}
{{else if (eq backend 'hono')}}
import type { Context as HonoContext } from "hono";
{{#if auth}}
import { auth } from "./auth";
{{/if}}
export type CreateContextOptions = {
context: HonoContext;
};
export async function createContext({ context }: CreateContextOptions) {
{{#if auth}}
const session = await auth.api.getSession({
headers: context.req.raw.headers,
});
return {
session,
};
{{else}}
// No auth configured
return {
session: null,
};
{{/if}}
}
{{else if (eq backend 'elysia')}}
import type { Context as ElysiaContext } from "elysia";
{{#if auth}}
import { auth } from "./auth";
{{/if}}
export type CreateContextOptions = {
context: ElysiaContext;
};
export async function createContext({ context }: CreateContextOptions) {
{{#if auth}}
const session = await auth.api.getSession({
headers: context.request.headers,
});
return {
session,
};
{{else}}
// No auth configured
return {
session: null,
};
{{/if}}
}
{{else if (eq backend 'express')}}
import type { CreateExpressContextOptions } from "@trpc/server/adapters/express";
{{#if auth}}
import { fromNodeHeaders } from "better-auth/node";
import { auth } from "./auth";
{{/if}}
export async function createContext(opts: CreateExpressContextOptions) {
{{#if auth}}
const session = await auth.api.getSession({
headers: fromNodeHeaders(opts.req.headers),
});
return {
session,
};
{{else}}
// No auth configured
return {
session: null,
};
{{/if}}
}
{{else}}
// Default or fallback context if backend is not recognized or none
// This might need adjustment based on your default behavior
export async function createContext() {
return {
session: null,
};
}
{{/if}}
export type Context = Awaited<ReturnType<typeof createContext>>;

View File

@@ -0,0 +1,17 @@
import { ORPCError, os } from "@orpc/server";
import type { Context } from "./context";
export const o = os.$context<Context>();
export const publicProcedure = o;
{{#if auth}}
const requireAuth = o.middleware(async ({ context, next }) => {
if (!context.session?.user) {
throw new ORPCError("UNAUTHORIZED");
}
return next({ context });
});
export const protectedProcedure = publicProcedure.use(requireAuth);
{{/if}}

View File

@@ -0,0 +1,23 @@
{{#if auth}}
import { createContext } from '@/lib/context'
{{/if}}
import { appRouter } from '@/routers'
import { RPCHandler } from '@orpc/server/fetch'
import { NextRequest } from 'next/server'
const handler = new RPCHandler(appRouter)
async function handleRequest(req: NextRequest) {
const { response } = await handler.handle(req, {
prefix: '/rpc',
context: {{#if auth}}await createContext(req){{else}}{}{{/if}},
})
return response ?? new Response('Not found', { status: 404 })
}
export const GET = handleRequest
export const POST = handleRequest
export const PUT = handleRequest
export const PATCH = handleRequest
export const DELETE = handleRequest

View File

@@ -0,0 +1,57 @@
import { createORPCClient } from "@orpc/client";
import { RPCLink } from "@orpc/client/fetch";
import { createORPCReactQueryUtils } from "@orpc/react-query";
import { QueryCache, QueryClient } from "@tanstack/react-query";
import { toast } from "sonner";
import type { appRouter } from "../../../server/src/routers/index";
import type { RouterClient } from "@orpc/server";
import { createContext, use } from 'react'
import type { RouterUtils } from '@orpc/react-query'
type ORPCReactUtils = RouterUtils<RouterClient<typeof appRouter>>
export const queryClient = new QueryClient({
queryCache: new QueryCache({
onError: (error) => {
toast.error(`Error: ${error.message}`, {
action: {
label: "retry",
onClick: () => {
queryClient.invalidateQueries();
},
},
});
},
}),
});
export const link = new RPCLink({
{{#if (includes frontend "next")}}
url: `${process.env.NEXT_PUBLIC_SERVER_URL}/rpc`,
{{else}}
url: `${import.meta.env.VITE_SERVER_URL}/rpc`,
{{/if}}
{{#if auth}}
fetch(url, options) {
return fetch(url, {
...options,
credentials: "include",
});
},
{{/if}}
});
export const client: RouterClient<typeof appRouter> = createORPCClient(link)
export const orpc = createORPCReactQueryUtils(client)
export const ORPCContext = createContext<ORPCReactUtils | undefined>(undefined)
export function useORPC(): ORPCReactUtils {
const orpc = use(ORPCContext)
if (!orpc) {
throw new Error('ORPCContext is not set up properly')
}
return orpc
}