From fe215efbd1507dc6c0ab10581edff676a88c19ac Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 28 Jul 2026 14:35:36 +0000 Subject: [PATCH] Add audit start and end dates to audits ISO audits often span a window distinct from certificate validity. Store optional audit_start_date and audit_end_date on the audit record and expose them through GraphQL, MCP, CLI, n8n, and console. Signed-off-by: Cursor Agent Co-authored-by: Bryan FRIMIN --- apps/console/src/_locales/en-US.json | 4 +- apps/console/src/_locales/fr-FR.json | 8 +- apps/console/src/hooks/graph/AuditGraph.ts | 12 +++ .../organizations/audits/AuditDetailsPage.tsx | 14 +++ .../audits/dialogs/CreateAuditDialog.tsx | 14 +++ e2e/console/audit_test.go | 87 +++++++++++++++++++ .../Probo/actions/audit/create.operation.ts | 20 +++++ .../actions/audit/deleteReport.operation.ts | 2 + .../Probo/actions/audit/get.operation.ts | 2 + .../Probo/actions/audit/getAll.operation.ts | 2 + .../Probo/actions/audit/update.operation.ts | 20 +++++ .../actions/audit/uploadReport.operation.ts | 2 + pkg/cmd/audit/create/create.go | 26 ++++-- pkg/cmd/audit/list/list.go | 28 ++++-- pkg/cmd/audit/update/update.go | 26 ++++-- pkg/cmd/audit/view/view.go | 28 ++++-- pkg/coredata/audit.go | 30 +++++++ pkg/coredata/migrations/20260728T142906Z.sql | 22 +++++ pkg/probo/audit_service.go | 16 ++++ pkg/server/api/console/v1/audit_resolvers.go | 4 + .../api/console/v1/graphql/audit.graphql | 6 ++ pkg/server/api/console/v1/types/audit.go | 2 + pkg/server/api/mcp/v1/schema.resolvers.go | 4 + pkg/server/api/mcp/v1/specification.yaml | 32 +++++++ pkg/server/api/mcp/v1/types/audit.go | 2 + 25 files changed, 385 insertions(+), 28 deletions(-) create mode 100644 pkg/coredata/migrations/20260728T142906Z.sql diff --git a/apps/console/src/_locales/en-US.json b/apps/console/src/_locales/en-US.json index 3eabecb88..53acca3f3 100644 --- a/apps/console/src/_locales/en-US.json +++ b/apps/console/src/_locales/en-US.json @@ -1670,7 +1670,7 @@ "messages": { "success": "Success", "error": "Error", "updated": "Audit updated successfully" }, "deleteReportConfirmation": "This will permanently delete the audit report \"{{name}}\". This action cannot be undone.", "states": { "not_started": "Not Started", "in_progress": "In Progress", "completed": "Completed", "rejected": "Rejected", "outdated": "Outdated" }, - "fields": { "name": "Name", "namePlaceholder": "Audit name", "state": "State", "validFrom": "Valid From", "validUntil": "Valid Until" }, + "fields": { "name": "Name", "namePlaceholder": "Audit name", "state": "State", "validFrom": "Valid From", "validUntil": "Valid Until", "auditStartDate": "Audit Start Date", "auditEndDate": "Audit End Date" }, "actions": { "delete": "Delete", "update": "Update", "updating": "Updating...", "download": "Download" }, "report": { "title": "Audit Report", "uploaded": "Uploaded {{date}}", "uploadDescription": "Upload the final audit report document (PDF recommended)", "dropzoneDescription": "Only PDF up to 25MB are allowed" } }, @@ -1691,7 +1691,7 @@ "errors": { "create": "Failed to create audit" }, "fileSize": "{{value}} MB", "loading": "Loading...", - "fields": { "framework": "Framework", "frameworkPlaceholder": "Select a framework", "name": "Name", "namePlaceholder": "Audit name", "state": "State", "validFrom": "Valid From", "validUntil": "Valid Until" }, + "fields": { "framework": "Framework", "frameworkPlaceholder": "Select a framework", "name": "Name", "namePlaceholder": "Audit name", "state": "State", "validFrom": "Valid From", "validUntil": "Valid Until", "auditStartDate": "Audit Start Date", "auditEndDate": "Audit End Date" }, "states": { "not_started": "Not Started", "in_progress": "In Progress", "completed": "Completed", "rejected": "Rejected", "outdated": "Outdated" }, "actions": { "create": "Create" } }, diff --git a/apps/console/src/_locales/fr-FR.json b/apps/console/src/_locales/fr-FR.json index d54de3541..84a875106 100644 --- a/apps/console/src/_locales/fr-FR.json +++ b/apps/console/src/_locales/fr-FR.json @@ -3441,7 +3441,9 @@ "namePlaceholder": "Nom de l’audit", "state": "État", "validFrom": "Valide à partir de", - "validUntil": "Valide jusqu’au" + "validUntil": "Valide jusqu’au", + "auditStartDate": "Date de début de l’audit", + "auditEndDate": "Date de fin de l’audit" }, "actions": { "delete": "Supprimer", @@ -3519,7 +3521,9 @@ "namePlaceholder": "Nom de l’audit", "state": "État", "validFrom": "Valide à partir de", - "validUntil": "Valide jusqu’au" + "validUntil": "Valide jusqu’au", + "auditStartDate": "Date de début de l’audit", + "auditEndDate": "Date de fin de l’audit" }, "states": { "not_started": "Non commencé", diff --git a/apps/console/src/hooks/graph/AuditGraph.ts b/apps/console/src/hooks/graph/AuditGraph.ts index 23ec33004..e3c2ed772 100644 --- a/apps/console/src/hooks/graph/AuditGraph.ts +++ b/apps/console/src/hooks/graph/AuditGraph.ts @@ -47,6 +47,8 @@ export const auditNodeQuery = graphql` name validFrom validUntil + auditStartDate + auditEndDate reportFile { id fileName @@ -91,6 +93,8 @@ export const createAuditMutation = graphql` name validFrom validUntil + auditStartDate + auditEndDate reportFile { id fileName @@ -117,6 +121,8 @@ export const updateAuditMutation = graphql` name validFrom validUntil + auditStartDate + auditEndDate reportFile { id fileName @@ -186,6 +192,8 @@ export const useCreateAudit = (connectionId: string) => { name?: string | null; validFrom?: string; validUntil?: string; + auditStartDate?: string; + auditEndDate?: string; reportKey?: string; state?: string; file?: File | null; @@ -205,6 +213,8 @@ export const useCreateAudit = (connectionId: string) => { name: input.name, validFrom: input.validFrom, validUntil: input.validUntil, + auditStartDate: input.auditStartDate, + auditEndDate: input.auditEndDate, reportKey: input.reportKey, state: input.state || "NOT_STARTED", file: input.file ? null : undefined, @@ -226,6 +236,8 @@ export const useUpdateAudit = () => { name?: string | null; validFrom?: string | null; validUntil?: string | null; + auditStartDate?: string | null; + auditEndDate?: string | null; state?: string; }) => { if (!input.id) { diff --git a/apps/console/src/pages/organizations/audits/AuditDetailsPage.tsx b/apps/console/src/pages/organizations/audits/AuditDetailsPage.tsx index 698724cb2..55adba80d 100644 --- a/apps/console/src/pages/organizations/audits/AuditDetailsPage.tsx +++ b/apps/console/src/pages/organizations/audits/AuditDetailsPage.tsx @@ -69,6 +69,8 @@ const updateAuditSchema = z.object({ name: z.string().nullable().optional(), validFrom: z.string().optional(), validUntil: z.string().optional(), + auditStartDate: z.string().optional(), + auditEndDate: z.string().optional(), state: z.enum([ "NOT_STARTED", "IN_PROGRESS", @@ -104,6 +106,8 @@ export default function AuditDetailsPage(props: Props) { name: auditEntry.name || null, validFrom: auditEntry.validFrom?.split("T")[0] || "", validUntil: auditEntry.validUntil?.split("T")[0] || "", + auditStartDate: auditEntry.auditStartDate?.split("T")[0] || "", + auditEndDate: auditEntry.auditEndDate?.split("T")[0] || "", state: auditEntry.state || "NOT_STARTED", }, }); @@ -123,6 +127,8 @@ export default function AuditDetailsPage(props: Props) { name: formData.name || null, validFrom: formatDatetime(formData.validFrom) ?? null, validUntil: formatDatetime(formData.validUntil) ?? null, + auditStartDate: formatDatetime(formData.auditStartDate) ?? null, + auditEndDate: formatDatetime(formData.auditEndDate) ?? null, state: formData.state, }); reset(formData); @@ -243,6 +249,14 @@ export default function AuditDetailsPage(props: Props) { + + + + + + + +
{formState.isDirty && auditEntry.canUpdate && (