From cb12536cdf64a018e7278504abdbd2f84f856357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hartmut=20N=C3=B6renberg?= Date: Tue, 31 Mar 2026 21:09:21 +0200 Subject: [PATCH] refactor(api): extract system role config procedures --- .../system-role-config-procedure-support.ts | 50 +++++++++++++++++++ packages/api/src/router/system-role-config.ts | 42 +++------------- 2 files changed, 56 insertions(+), 36 deletions(-) create mode 100644 packages/api/src/router/system-role-config-procedure-support.ts diff --git a/packages/api/src/router/system-role-config-procedure-support.ts b/packages/api/src/router/system-role-config-procedure-support.ts new file mode 100644 index 0000000..dc6d55c --- /dev/null +++ b/packages/api/src/router/system-role-config-procedure-support.ts @@ -0,0 +1,50 @@ +import { createAuditEntry } from "../lib/audit.js"; +import type { TRPCContext } from "../trpc.js"; +import { invalidateRoleDefaultsCache } from "../trpc.js"; +import { + buildSystemRoleConfigUpdateData, + systemRoleConfigUpdateInputSchema, + type SystemRoleConfigUpdateInput, +} from "./system-role-config-support.js"; + +type SystemRoleConfigProcedureContext = Pick; + +export { systemRoleConfigUpdateInputSchema }; + +export async function listSystemRoleConfigs( + ctx: SystemRoleConfigProcedureContext, +) { + return ctx.db.systemRoleConfig.findMany({ + orderBy: { sortOrder: "asc" }, + }); +} + +export async function updateSystemRoleConfig( + ctx: SystemRoleConfigProcedureContext, + input: SystemRoleConfigUpdateInput, +) { + const existing = await ctx.db.systemRoleConfig.findUnique({ + where: { role: input.role as never }, + }); + + const result = await ctx.db.systemRoleConfig.update({ + where: { role: input.role as never }, + data: buildSystemRoleConfigUpdateData(input), + }); + + invalidateRoleDefaultsCache(); + + void createAuditEntry({ + db: ctx.db, + entityType: "SystemRoleConfig", + entityId: input.role, + entityName: result.label, + action: "UPDATE", + userId: ctx.dbUser?.id, + before: (existing ?? {}) as unknown as Record, + after: result as unknown as Record, + source: "ui", + }); + + return result; +} diff --git a/packages/api/src/router/system-role-config.ts b/packages/api/src/router/system-role-config.ts index 6852f8e..48cbc4d 100644 --- a/packages/api/src/router/system-role-config.ts +++ b/packages/api/src/router/system-role-config.ts @@ -1,46 +1,16 @@ -import { adminProcedure, createTRPCRouter, invalidateRoleDefaultsCache } from "../trpc.js"; -import { createAuditEntry } from "../lib/audit.js"; +import { adminProcedure, createTRPCRouter } from "../trpc.js"; import { - buildSystemRoleConfigUpdateData, + listSystemRoleConfigs, systemRoleConfigUpdateInputSchema, -} from "./system-role-config-support.js"; + updateSystemRoleConfig, +} from "./system-role-config-procedure-support.js"; export const systemRoleConfigRouter = createTRPCRouter({ /** List all role configs (sorted by sortOrder) */ - list: adminProcedure.query(async ({ ctx }) => { - return ctx.db.systemRoleConfig.findMany({ - orderBy: { sortOrder: "asc" }, - }); - }), + list: adminProcedure.query(({ ctx }) => listSystemRoleConfigs(ctx)), /** Update a role's default permissions, label, description, and color */ update: adminProcedure .input(systemRoleConfigUpdateInputSchema) - .mutation(async ({ ctx, input }) => { - const existing = await ctx.db.systemRoleConfig.findUnique({ - where: { role: input.role as never }, - }); - - const result = await ctx.db.systemRoleConfig.update({ - where: { role: input.role as never }, - data: buildSystemRoleConfigUpdateData(input), - }); - - // Invalidate cached role defaults so changes take effect immediately - invalidateRoleDefaultsCache(); - - void createAuditEntry({ - db: ctx.db, - entityType: "SystemRoleConfig", - entityId: input.role, - entityName: result.label, - action: "UPDATE", - userId: ctx.dbUser?.id, - before: (existing ?? {}) as unknown as Record, - after: result as unknown as Record, - source: "ui", - }); - - return result; - }), + .mutation(({ ctx, input }) => updateSystemRoleConfig(ctx, input)), });