Rollen-Fix
CI / Build (push) Successful in 1m21s
CI / Deploy (push) Successful in 53s

This commit is contained in:
Jan
2026-04-13 23:44:46 +02:00
parent 6acc2852d8
commit dfdff6bf99
3 changed files with 146 additions and 15 deletions
+48 -2
View File
@@ -21,6 +21,33 @@ const updateUserSchema = z.object({
approvalPermissions: z.array(approvalPermissionSchema).default([])
});
function serializeManagedUser(user: {
id: string;
name: string;
username: string;
role: "ADMIN" | "FINANCE" | "MEMBER";
workingGroupId: string | null;
workingGroup: { name: string } | null;
approvalPreference: "CHAIR_A" | "CHAIR_B" | "FINANCE" | null;
approvalPermissions: ("CHAIR_A" | "CHAIR_B" | "FINANCE")[];
_count: {
createdExpenses: number;
approvals: number;
};
}) {
return {
id: user.id,
name: user.username,
username: user.username,
role: user.role,
workingGroupId: user.workingGroupId,
workingGroupName: user.workingGroup?.name ?? null,
approvalPermissions: normalizeApprovalPermissions(user.role, user.approvalPermissions, user.approvalPreference),
createdExpensesCount: user._count.createdExpenses,
approvalsCount: user._count.approvals
};
}
type Context = {
params: {
id: string;
@@ -91,7 +118,26 @@ export async function PATCH(request: Request, { params }: Context) {
role: parsed.data.role,
workingGroupId,
approvalPreference,
approvalPermissions
approvalPermissions: {
set: approvalPermissions
}
}
});
const refreshedUser = await prisma.user.findUniqueOrThrow({
where: { id: updatedUser.id },
include: {
workingGroup: {
select: {
name: true
}
},
_count: {
select: {
approvals: true,
createdExpenses: true
}
}
}
});
@@ -113,7 +159,7 @@ export async function PATCH(request: Request, { params }: Context) {
}
});
return NextResponse.json({ ok: true });
return NextResponse.json({ user: serializeManagedUser(refreshedUser) });
}
export async function DELETE(_: Request, { params }: Context) {
+45 -6
View File
@@ -24,6 +24,33 @@ const createUserSchema = z.object({
approvalPermissions: z.array(approvalPermissionSchema).default([])
});
function serializeManagedUser(user: {
id: string;
name: string;
username: string;
role: "ADMIN" | "FINANCE" | "MEMBER";
workingGroupId: string | null;
workingGroup: { name: string } | null;
approvalPreference: "CHAIR_A" | "CHAIR_B" | "FINANCE" | null;
approvalPermissions: ("CHAIR_A" | "CHAIR_B" | "FINANCE")[];
_count: {
createdExpenses: number;
approvals: number;
};
}) {
return {
id: user.id,
name: user.username,
username: user.username,
role: user.role,
workingGroupId: user.workingGroupId,
workingGroupName: user.workingGroup?.name ?? null,
approvalPermissions: normalizeApprovalPermissions(user.role, user.approvalPermissions, user.approvalPreference),
createdExpensesCount: user._count.createdExpenses,
approvalsCount: user._count.approvals
};
}
export async function POST(request: Request) {
const viewer = await getCurrentViewer();
@@ -90,6 +117,23 @@ export async function POST(request: Request) {
}
});
const createdUser = await prisma.user.findUniqueOrThrow({
where: { id: user.id },
include: {
workingGroup: {
select: {
name: true
}
},
_count: {
select: {
approvals: true,
createdExpenses: true
}
}
}
});
await createAuditLog(prisma, {
actorId: viewer.id,
action: "user.create",
@@ -109,11 +153,6 @@ export async function POST(request: Request) {
});
return NextResponse.json({
user: {
id: user.id,
name: user.name,
username: user.username,
role: user.role
}
user: serializeManagedUser(createdUser)
});
}