♻️ set default time to 7 days ago in API too

This commit is contained in:
Fred KISSIE
2025-12-09 00:17:34 +01:00
parent adf76bfb53
commit 9db2feff77
3 changed files with 34 additions and 13 deletions

View File

@@ -24,6 +24,7 @@ import { fromError } from "zod-validation-error";
import { QueryAccessAuditLogResponse } from "@server/routers/auditLogs/types"; import { QueryAccessAuditLogResponse } from "@server/routers/auditLogs/types";
import response from "@server/lib/response"; import response from "@server/lib/response";
import logger from "@server/logger"; import logger from "@server/logger";
import { getSevenDaysAgo } from "@app/lib/getSevenDaysAgo";
export const queryAccessAuditLogsQuery = z.object({ export const queryAccessAuditLogsQuery = z.object({
// iso string just validate its a parseable date // iso string just validate its a parseable date
@@ -32,7 +33,8 @@ export const queryAccessAuditLogsQuery = z.object({
.refine((val) => !isNaN(Date.parse(val)), { .refine((val) => !isNaN(Date.parse(val)), {
error: "timeStart must be a valid ISO date string" error: "timeStart must be a valid ISO date string"
}) })
.transform((val) => Math.floor(new Date(val).getTime() / 1000)), .transform((val) => Math.floor(new Date(val).getTime() / 1000))
.prefault(() => getSevenDaysAgo().toISOString()),
timeEnd: z timeEnd: z
.string() .string()
.refine((val) => !isNaN(Date.parse(val)), { .refine((val) => !isNaN(Date.parse(val)), {
@@ -44,7 +46,8 @@ export const queryAccessAuditLogsQuery = z.object({
.openapi({ .openapi({
type: "string", type: "string",
format: "date-time", format: "date-time",
description: "End time as ISO date string (defaults to current time)" description:
"End time as ISO date string (defaults to current time)"
}), }),
action: z action: z
.union([z.boolean(), z.string()]) .union([z.boolean(), z.string()])
@@ -181,9 +184,15 @@ async function queryUniqueFilterAttributes(
.where(baseConditions); .where(baseConditions);
return { return {
actors: uniqueActors.map(row => row.actor).filter((actor): actor is string => actor !== null), actors: uniqueActors
resources: uniqueResources.filter((row): row is { id: number; name: string | null } => row.id !== null), .map((row) => row.actor)
locations: uniqueLocations.map(row => row.locations).filter((location): location is string => location !== null) .filter((actor): actor is string => actor !== null),
resources: uniqueResources.filter(
(row): row is { id: number; name: string | null } => row.id !== null
),
locations: uniqueLocations
.map((row) => row.locations)
.filter((location): location is string => location !== null)
}; };
} }

View File

@@ -24,6 +24,7 @@ import { fromError } from "zod-validation-error";
import { QueryActionAuditLogResponse } from "@server/routers/auditLogs/types"; import { QueryActionAuditLogResponse } from "@server/routers/auditLogs/types";
import response from "@server/lib/response"; import response from "@server/lib/response";
import logger from "@server/logger"; import logger from "@server/logger";
import { getSevenDaysAgo } from "@app/lib/getSevenDaysAgo";
export const queryActionAuditLogsQuery = z.object({ export const queryActionAuditLogsQuery = z.object({
// iso string just validate its a parseable date // iso string just validate its a parseable date
@@ -32,7 +33,8 @@ export const queryActionAuditLogsQuery = z.object({
.refine((val) => !isNaN(Date.parse(val)), { .refine((val) => !isNaN(Date.parse(val)), {
error: "timeStart must be a valid ISO date string" error: "timeStart must be a valid ISO date string"
}) })
.transform((val) => Math.floor(new Date(val).getTime() / 1000)), .transform((val) => Math.floor(new Date(val).getTime() / 1000))
.prefault(() => getSevenDaysAgo().toISOString()),
timeEnd: z timeEnd: z
.string() .string()
.refine((val) => !isNaN(Date.parse(val)), { .refine((val) => !isNaN(Date.parse(val)), {
@@ -44,7 +46,8 @@ export const queryActionAuditLogsQuery = z.object({
.openapi({ .openapi({
type: "string", type: "string",
format: "date-time", format: "date-time",
description: "End time as ISO date string (defaults to current time)" description:
"End time as ISO date string (defaults to current time)"
}), }),
action: z.string().optional(), action: z.string().optional(),
actorType: z.string().optional(), actorType: z.string().optional(),
@@ -68,8 +71,9 @@ export const queryActionAuditLogsParams = z.object({
orgId: z.string() orgId: z.string()
}); });
export const queryActionAuditLogsCombined = export const queryActionAuditLogsCombined = queryActionAuditLogsQuery.merge(
queryActionAuditLogsQuery.merge(queryActionAuditLogsParams); queryActionAuditLogsParams
);
type Q = z.infer<typeof queryActionAuditLogsCombined>; type Q = z.infer<typeof queryActionAuditLogsCombined>;
function getWhere(data: Q) { function getWhere(data: Q) {
@@ -78,7 +82,9 @@ function getWhere(data: Q) {
lt(actionAuditLog.timestamp, data.timeEnd), lt(actionAuditLog.timestamp, data.timeEnd),
eq(actionAuditLog.orgId, data.orgId), eq(actionAuditLog.orgId, data.orgId),
data.actor ? eq(actionAuditLog.actor, data.actor) : undefined, data.actor ? eq(actionAuditLog.actor, data.actor) : undefined,
data.actorType ? eq(actionAuditLog.actorType, data.actorType) : undefined, data.actorType
? eq(actionAuditLog.actorType, data.actorType)
: undefined,
data.actorId ? eq(actionAuditLog.actorId, data.actorId) : undefined, data.actorId ? eq(actionAuditLog.actorId, data.actorId) : undefined,
data.action ? eq(actionAuditLog.action, data.action) : undefined data.action ? eq(actionAuditLog.action, data.action) : undefined
); );
@@ -135,8 +141,12 @@ async function queryUniqueFilterAttributes(
.where(baseConditions); .where(baseConditions);
return { return {
actors: uniqueActors.map(row => row.actor).filter((actor): actor is string => actor !== null), actors: uniqueActors
actions: uniqueActions.map(row => row.action).filter((action): action is string => action !== null), .map((row) => row.actor)
.filter((actor): actor is string => actor !== null),
actions: uniqueActions
.map((row) => row.action)
.filter((action): action is string => action !== null)
}; };
} }

View File

@@ -11,6 +11,7 @@ import { fromError } from "zod-validation-error";
import { QueryRequestAuditLogResponse } from "@server/routers/auditLogs/types"; import { QueryRequestAuditLogResponse } from "@server/routers/auditLogs/types";
import response from "@server/lib/response"; import response from "@server/lib/response";
import logger from "@server/logger"; import logger from "@server/logger";
import { getSevenDaysAgo } from "@app/lib/getSevenDaysAgo";
export const queryAccessAuditLogsQuery = z.object({ export const queryAccessAuditLogsQuery = z.object({
// iso string just validate its a parseable date // iso string just validate its a parseable date
@@ -19,7 +20,8 @@ export const queryAccessAuditLogsQuery = z.object({
.refine((val) => !isNaN(Date.parse(val)), { .refine((val) => !isNaN(Date.parse(val)), {
error: "timeStart must be a valid ISO date string" error: "timeStart must be a valid ISO date string"
}) })
.transform((val) => Math.floor(new Date(val).getTime() / 1000)), .transform((val) => Math.floor(new Date(val).getTime() / 1000))
.prefault(() => getSevenDaysAgo().toISOString()),
timeEnd: z timeEnd: z
.string() .string()
.refine((val) => !isNaN(Date.parse(val)), { .refine((val) => !isNaN(Date.parse(val)), {