Files
lemonspace_app/convex/helpers.ts
Matthias ca40f5cb13 feat: enhance canvas and layout components with new features and improvements
- Added remote image patterns to the Next.js configuration for enhanced image handling.
- Updated TypeScript configuration to exclude the 'implement' directory.
- Refactored layout component to fetch initial authentication token and pass it to Providers.
- Replaced CanvasToolbar with CanvasSidebar for improved UI layout and functionality.
- Enhanced Canvas component with new drag-and-drop file upload capabilities and batch node movement.
- Updated various node components to support new status handling and improved user interactions.
- Added debounced saving for note and prompt nodes to optimize performance.
2026-03-25 17:58:58 +01:00

39 lines
1.3 KiB
TypeScript

import { QueryCtx, MutationCtx } from "./_generated/server";
import { authComponent } from "./auth";
type SafeAuthUser = NonNullable<
Awaited<ReturnType<typeof authComponent.safeGetAuthUser>>
>;
/** Better-Auth-User mit für die App garantierter userId (Convex-_id als Fallback). */
export type AuthUser = Omit<SafeAuthUser, "userId"> & { userId: string };
/**
* Erfordert einen authentifizierten User und gibt dessen userId zurück.
* Wirft einen Error wenn nicht eingeloggt — für Mutations und geschützte Queries.
*/
export async function requireAuth(
ctx: QueryCtx | MutationCtx
): Promise<AuthUser> {
const user = await authComponent.safeGetAuthUser(ctx);
if (!user) {
console.error("[requireAuth] safeGetAuthUser returned null");
throw new Error("Unauthenticated");
}
const userId = user.userId ?? String(user._id);
if (!userId) {
console.error("[requireAuth] safeGetAuthUser returned user without userId", {
userRecordId: String(user._id),
});
throw new Error("Unauthenticated");
}
return { ...user, userId };
}
/**
* Gibt den User zurück oder null — für optionale Auth-Checks (z.B. public Queries).
*/
export async function optionalAuth(ctx: QueryCtx | MutationCtx) {
return await authComponent.safeGetAuthUser(ctx);
}