mirror of
https://github.com/karakeep-app/karakeep.git
synced 2026-02-28 18:25:55 +01:00
* Attempt to upgrade expo 53 * Attempt upgrade nextjs * Fix a bunch of peer deps * upgrade some docs deps * fix typecheck * update the shadcn calendar component * more fixes * more fixes * revert ollama upgrade * update react version to use carets * remove react-select from landing * fix the typescript error caused by customFetch * upgrade the new grid user setting to nextjs 15 * mobile: enable react canary to support react 19.1 * upgrade react native menu * fix navigation context error
61 lines
1.7 KiB
TypeScript
61 lines
1.7 KiB
TypeScript
import { headers } from "next/headers";
|
|
import { getServerAuthSession } from "@/server/auth";
|
|
import requestIp from "request-ip";
|
|
|
|
import { db } from "@karakeep/db";
|
|
import { Context, createCallerFactory } from "@karakeep/trpc";
|
|
import { authenticateApiKey } from "@karakeep/trpc/auth";
|
|
import { appRouter } from "@karakeep/trpc/routers/_app";
|
|
|
|
export async function createContextFromRequest(req: Request) {
|
|
// TODO: This is a hack until we offer a proper REST API instead of the trpc based one.
|
|
// Check if the request has an Authorization token, if it does, assume that API key authentication is requested.
|
|
const ip = requestIp.getClientIp({
|
|
headers: Object.fromEntries(req.headers.entries()),
|
|
});
|
|
const authorizationHeader = req.headers.get("Authorization");
|
|
if (authorizationHeader && authorizationHeader.startsWith("Bearer ")) {
|
|
const token = authorizationHeader.split(" ")[1];
|
|
try {
|
|
const user = await authenticateApiKey(token, db);
|
|
return {
|
|
user,
|
|
db,
|
|
req: {
|
|
ip,
|
|
},
|
|
};
|
|
} catch {
|
|
// Fallthrough to cookie-based auth
|
|
}
|
|
}
|
|
|
|
return createContext(db, ip);
|
|
}
|
|
|
|
export const createContext = async (
|
|
database?: typeof db,
|
|
ip?: string | null,
|
|
): Promise<Context> => {
|
|
const session = await getServerAuthSession();
|
|
if (ip === undefined) {
|
|
const hdrs = await headers();
|
|
ip = requestIp.getClientIp({
|
|
headers: Object.fromEntries(hdrs.entries()),
|
|
});
|
|
}
|
|
return {
|
|
user: session?.user ?? null,
|
|
db: database ?? db,
|
|
req: {
|
|
ip,
|
|
},
|
|
};
|
|
};
|
|
|
|
const createCaller = createCallerFactory(appRouter);
|
|
|
|
export const api = createCaller(createContext);
|
|
|
|
export const createTrcpClientFromCtx = createCaller;
|