76 lines
1.6 KiB
TypeScript
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,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
}
|