geraete/lib/auth.ts
2025-11-15 10:01:44 +01:00

76 lines
1.6 KiB
TypeScript

// lib/auth.ts
'use server';
import { headers } from 'next/headers';
import { prisma } from './prisma';
/**
* Liefert die aktuelle User-ID oder null,
* falls kein User ermittelt werden kann.
*
* Reihenfolge:
* 1. HTTP-Header: x-user-id
* 2. HTTP-Header: x-user-email
* 3. Fallback: DEFAULT_USER_EMAIL env oder "user@domain.local"
*/
export async function getCurrentUserId(): Promise<string | null> {
const h = await headers();
const headerUserId = h.get('x-user-id');
const headerUserEmail = h.get('x-user-email');
// 1) Direkt über ID (Header)
if (headerUserId) {
const userById = await prisma.user.findUnique({
where: { id: headerUserId },
select: { id: true },
});
if (userById) {
return userById.id;
}
}
// 2) Über Email (Header)
if (headerUserEmail) {
const userByEmail = await prisma.user.findUnique({
where: { email: headerUserEmail },
select: { id: true },
});
if (userByEmail) {
return userByEmail.id;
}
}
// 3) Fallback: Standard-User (z.B. dein Test-User)
const fallbackEmail =
process.env.DEFAULT_USER_EMAIL ?? 'user@domain.local';
const fallbackUser = await prisma.user.findUnique({
where: { email: fallbackEmail },
select: { id: true },
});
return fallbackUser?.id ?? null;
}
/**
* Optional: kompletten User holen (falls du später mehr brauchst)
*/
export async function getCurrentUser() {
const userId = await getCurrentUserId();
if (!userId) return null;
return prisma.user.findUnique({
where: { id: userId },
include: {
roles: {
include: {
role: true,
},
},
},
});
}