merge: PR8 Task 8 — admin multi-mentor UI + change-request inbox

This commit is contained in:
Matt
2026-05-22 17:13:02 +02:00
3 changed files with 744 additions and 316 deletions

View File

@@ -565,27 +565,45 @@ export const mentorRouter = router({
}),
/**
* Remove mentor assignment
* Remove mentor assignment.
*
* Multi-mentor (PR8): callers should pass `assignmentId` to target a
* specific co-mentor. Legacy callers passing only `projectId` get the
* most-recent assignment removed (kept for backward compatibility).
*/
unassign: adminProcedure
.input(z.object({ projectId: z.string() }))
.input(
z
.object({
assignmentId: z.string().optional(),
projectId: z.string().optional(),
})
.refine((v) => !!v.assignmentId || !!v.projectId, {
message: 'Either assignmentId or projectId is required',
}),
)
.mutation(async ({ ctx, input }) => {
// TODO(PR8 Task 8): admin UI should specify which mentor to drop when
// multiple are assigned. Legacy callers pass only projectId — we resolve
// to the most-recent assignment for backward compatibility.
const assignment = await ctx.prisma.mentorAssignment.findFirst({
where: { projectId: input.projectId },
orderBy: { assignedAt: 'desc' },
include: {
mentor: { select: { id: true, name: true } },
project: { select: { id: true, title: true } },
},
})
const assignment = input.assignmentId
? await ctx.prisma.mentorAssignment.findUnique({
where: { id: input.assignmentId },
include: {
mentor: { select: { id: true, name: true } },
project: { select: { id: true, title: true } },
},
})
: await ctx.prisma.mentorAssignment.findFirst({
where: { projectId: input.projectId! },
orderBy: { assignedAt: 'desc' },
include: {
mentor: { select: { id: true, name: true } },
project: { select: { id: true, title: true } },
},
})
if (!assignment) {
throw new TRPCError({
code: 'NOT_FOUND',
message: 'No mentor assignment found for this project',
message: 'No mentor assignment found',
})
}
@@ -602,7 +620,7 @@ export const mentorRouter = router({
entityType: 'MentorAssignment',
entityId: assignment.id,
detailsJson: {
projectId: input.projectId,
projectId: assignment.project.id,
projectTitle: assignment.project.title,
mentorId: assignment.mentor.id,
mentorName: assignment.mentor.name,