61 lines
1.7 KiB
TypeScript
61 lines
1.7 KiB
TypeScript
import { createMiddleware } from "@tanstack/react-start";
|
|
import { z } from "zod";
|
|
import { AppError } from "@/server/lib/errors";
|
|
import { errorHandlingMiddleware } from "@/middleware/errorHandling";
|
|
import type { EnsuredUserContext } from "@/middleware/ensure-user/types";
|
|
import { ensureUserMiddleware } from "@/middleware/ensureUser";
|
|
|
|
const ensuredUserContextSchema: z.ZodType<EnsuredUserContext> = z.object({
|
|
userId: z.string(),
|
|
userEmail: z.string(),
|
|
organizationId: z.string(),
|
|
project: z.any().optional(),
|
|
});
|
|
|
|
function getAuthenticatedContext(context: unknown): EnsuredUserContext {
|
|
const result = ensuredUserContextSchema.safeParse(context);
|
|
if (!result.success) {
|
|
throw new AppError(
|
|
"INTERNAL_ERROR",
|
|
"Authenticated server function context missing",
|
|
);
|
|
}
|
|
return result.data;
|
|
}
|
|
|
|
export const globalServerFunctionMiddleware = [
|
|
errorHandlingMiddleware,
|
|
ensureUserMiddleware,
|
|
] as const;
|
|
|
|
export const requireAuthenticatedContext = [
|
|
createMiddleware({ type: "function" }).server(async ({ next, context }) => {
|
|
const authenticatedContext = getAuthenticatedContext(context);
|
|
|
|
return next({
|
|
context: authenticatedContext,
|
|
});
|
|
}),
|
|
] as const;
|
|
|
|
export const requireProjectContext = [
|
|
createMiddleware({ type: "function" }).server(async ({ next, context }) => {
|
|
const authenticatedContext = getAuthenticatedContext(context);
|
|
|
|
if (!authenticatedContext.project) {
|
|
throw new AppError(
|
|
"INTERNAL_ERROR",
|
|
"Project context missing from authenticated server function",
|
|
);
|
|
}
|
|
|
|
return next({
|
|
context: {
|
|
...authenticatedContext,
|
|
project: authenticatedContext.project,
|
|
projectId: authenticatedContext.project.id,
|
|
},
|
|
});
|
|
}),
|
|
] as const;
|