refactor(api): extract audit log input schemas

This commit is contained in:
2026-03-31 13:41:08 +02:00
parent 67b24443d0
commit 860d8e5855
2 changed files with 37 additions and 56 deletions
@@ -0,0 +1,26 @@
import { z } from "zod";
export const auditLogListInputSchema = z.object({
entityType: z.string().optional(),
entityId: z.string().optional(),
userId: z.string().optional(),
action: z.string().optional(),
source: z.string().optional(),
startDate: z.date().optional(),
endDate: z.date().optional(),
search: z.string().optional(),
limit: z.number().min(1).max(100).default(50),
cursor: z.string().optional(),
});
export const auditLogByEntityInputSchema = z.object({
entityType: z.string(),
entityId: z.string(),
limit: z.number().min(1).max(200).default(50),
});
export const auditLogTimelineInputSchema = z.object({
startDate: z.date().optional(),
endDate: z.date().optional(),
limit: z.number().min(1).max(500).default(200),
});
+11 -56
View File
@@ -1,5 +1,10 @@
import { z } from "zod"; import { z } from "zod";
import { createTRPCRouter, controllerProcedure } from "../trpc.js"; import { createTRPCRouter, controllerProcedure } from "../trpc.js";
import {
auditLogByEntityInputSchema,
auditLogListInputSchema,
auditLogTimelineInputSchema,
} from "./audit-log-inputs.js";
import { import {
formatAuditDetailEntry, formatAuditDetailEntry,
formatAuditListEntry, formatAuditListEntry,
@@ -20,20 +25,7 @@ export const auditLogRouter = createTRPCRouter({
* Cursor-based pagination using createdAt + id. * Cursor-based pagination using createdAt + id.
*/ */
list: controllerProcedure list: controllerProcedure
.input( .input(auditLogListInputSchema)
z.object({
entityType: z.string().optional(),
entityId: z.string().optional(),
userId: z.string().optional(),
action: z.string().optional(),
source: z.string().optional(),
startDate: z.date().optional(),
endDate: z.date().optional(),
search: z.string().optional(),
limit: z.number().min(1).max(100).default(50),
cursor: z.string().optional(), // id of the last item
}),
)
.query(async ({ ctx, input }) => { .query(async ({ ctx, input }) => {
return listAuditEntries(ctx.db, toAuditListInput({ return listAuditEntries(ctx.db, toAuditListInput({
entityType: input.entityType, entityType: input.entityType,
@@ -50,20 +42,7 @@ export const auditLogRouter = createTRPCRouter({
}), }),
listDetail: controllerProcedure listDetail: controllerProcedure
.input( .input(auditLogListInputSchema)
z.object({
entityType: z.string().optional(),
entityId: z.string().optional(),
userId: z.string().optional(),
action: z.string().optional(),
source: z.string().optional(),
startDate: z.date().optional(),
endDate: z.date().optional(),
search: z.string().optional(),
limit: z.number().min(1).max(100).default(50),
cursor: z.string().optional(),
}),
)
.query(async ({ ctx, input }) => { .query(async ({ ctx, input }) => {
const result = await listAuditEntries(ctx.db, toAuditListInput({ const result = await listAuditEntries(ctx.db, toAuditListInput({
entityType: input.entityType, entityType: input.entityType,
@@ -103,25 +82,13 @@ export const auditLogRouter = createTRPCRouter({
* Get all audit entries for a specific entity (e.g. a project or resource). * Get all audit entries for a specific entity (e.g. a project or resource).
*/ */
getByEntity: controllerProcedure getByEntity: controllerProcedure
.input( .input(auditLogByEntityInputSchema)
z.object({
entityType: z.string(),
entityId: z.string(),
limit: z.number().min(1).max(200).default(50),
}),
)
.query(async ({ ctx, input }) => { .query(async ({ ctx, input }) => {
return getAuditEntriesByEntity(ctx.db, input); return getAuditEntriesByEntity(ctx.db, input);
}), }),
getByEntityDetail: controllerProcedure getByEntityDetail: controllerProcedure
.input( .input(auditLogByEntityInputSchema)
z.object({
entityType: z.string(),
entityId: z.string(),
limit: z.number().min(1).max(200).default(50),
}),
)
.query(async ({ ctx, input }) => { .query(async ({ ctx, input }) => {
const entries = await getAuditEntriesByEntity(ctx.db, input); const entries = await getAuditEntriesByEntity(ctx.db, input);
return { return {
@@ -137,13 +104,7 @@ export const auditLogRouter = createTRPCRouter({
* Timeline view: entries grouped by date (YYYY-MM-DD). * Timeline view: entries grouped by date (YYYY-MM-DD).
*/ */
getTimeline: controllerProcedure getTimeline: controllerProcedure
.input( .input(auditLogTimelineInputSchema)
z.object({
startDate: z.date().optional(),
endDate: z.date().optional(),
limit: z.number().min(1).max(500).default(200),
}),
)
.query(async ({ ctx, input }) => { .query(async ({ ctx, input }) => {
return getAuditTimeline(ctx.db, toAuditTimelineInput({ return getAuditTimeline(ctx.db, toAuditTimelineInput({
startDate: input.startDate, startDate: input.startDate,
@@ -153,13 +114,7 @@ export const auditLogRouter = createTRPCRouter({
}), }),
getTimelineDetail: controllerProcedure getTimelineDetail: controllerProcedure
.input( .input(auditLogTimelineInputSchema)
z.object({
startDate: z.date().optional(),
endDate: z.date().optional(),
limit: z.number().min(1).max(500).default(200),
}),
)
.query(async ({ ctx, input }) => { .query(async ({ ctx, input }) => {
const timeline = await getAuditTimeline(ctx.db, toAuditTimelineInput({ const timeline = await getAuditTimeline(ctx.db, toAuditTimelineInput({
startDate: input.startDate, startDate: input.startDate,