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 <cursoragent@cursor.com> Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
This commit is contained in:
committed by
Bryan Frimin
parent
dcb7ffa945
commit
fe215efbd1
@@ -1670,7 +1670,7 @@
|
|||||||
"messages": { "success": "Success", "error": "Error", "updated": "Audit updated successfully" },
|
"messages": { "success": "Success", "error": "Error", "updated": "Audit updated successfully" },
|
||||||
"deleteReportConfirmation": "This will permanently delete the audit report \"{{name}}\". This action cannot be undone.",
|
"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" },
|
"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" },
|
"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" }
|
"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" },
|
"errors": { "create": "Failed to create audit" },
|
||||||
"fileSize": "{{value}} MB",
|
"fileSize": "{{value}} MB",
|
||||||
"loading": "Loading...",
|
"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" },
|
"states": { "not_started": "Not Started", "in_progress": "In Progress", "completed": "Completed", "rejected": "Rejected", "outdated": "Outdated" },
|
||||||
"actions": { "create": "Create" }
|
"actions": { "create": "Create" }
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3441,7 +3441,9 @@
|
|||||||
"namePlaceholder": "Nom de l’audit",
|
"namePlaceholder": "Nom de l’audit",
|
||||||
"state": "État",
|
"state": "État",
|
||||||
"validFrom": "Valide à partir de",
|
"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": {
|
"actions": {
|
||||||
"delete": "Supprimer",
|
"delete": "Supprimer",
|
||||||
@@ -3519,7 +3521,9 @@
|
|||||||
"namePlaceholder": "Nom de l’audit",
|
"namePlaceholder": "Nom de l’audit",
|
||||||
"state": "État",
|
"state": "État",
|
||||||
"validFrom": "Valide à partir de",
|
"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": {
|
"states": {
|
||||||
"not_started": "Non commencé",
|
"not_started": "Non commencé",
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ export const auditNodeQuery = graphql`
|
|||||||
name
|
name
|
||||||
validFrom
|
validFrom
|
||||||
validUntil
|
validUntil
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
reportFile {
|
reportFile {
|
||||||
id
|
id
|
||||||
fileName
|
fileName
|
||||||
@@ -91,6 +93,8 @@ export const createAuditMutation = graphql`
|
|||||||
name
|
name
|
||||||
validFrom
|
validFrom
|
||||||
validUntil
|
validUntil
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
reportFile {
|
reportFile {
|
||||||
id
|
id
|
||||||
fileName
|
fileName
|
||||||
@@ -117,6 +121,8 @@ export const updateAuditMutation = graphql`
|
|||||||
name
|
name
|
||||||
validFrom
|
validFrom
|
||||||
validUntil
|
validUntil
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
reportFile {
|
reportFile {
|
||||||
id
|
id
|
||||||
fileName
|
fileName
|
||||||
@@ -186,6 +192,8 @@ export const useCreateAudit = (connectionId: string) => {
|
|||||||
name?: string | null;
|
name?: string | null;
|
||||||
validFrom?: string;
|
validFrom?: string;
|
||||||
validUntil?: string;
|
validUntil?: string;
|
||||||
|
auditStartDate?: string;
|
||||||
|
auditEndDate?: string;
|
||||||
reportKey?: string;
|
reportKey?: string;
|
||||||
state?: string;
|
state?: string;
|
||||||
file?: File | null;
|
file?: File | null;
|
||||||
@@ -205,6 +213,8 @@ export const useCreateAudit = (connectionId: string) => {
|
|||||||
name: input.name,
|
name: input.name,
|
||||||
validFrom: input.validFrom,
|
validFrom: input.validFrom,
|
||||||
validUntil: input.validUntil,
|
validUntil: input.validUntil,
|
||||||
|
auditStartDate: input.auditStartDate,
|
||||||
|
auditEndDate: input.auditEndDate,
|
||||||
reportKey: input.reportKey,
|
reportKey: input.reportKey,
|
||||||
state: input.state || "NOT_STARTED",
|
state: input.state || "NOT_STARTED",
|
||||||
file: input.file ? null : undefined,
|
file: input.file ? null : undefined,
|
||||||
@@ -226,6 +236,8 @@ export const useUpdateAudit = () => {
|
|||||||
name?: string | null;
|
name?: string | null;
|
||||||
validFrom?: string | null;
|
validFrom?: string | null;
|
||||||
validUntil?: string | null;
|
validUntil?: string | null;
|
||||||
|
auditStartDate?: string | null;
|
||||||
|
auditEndDate?: string | null;
|
||||||
state?: string;
|
state?: string;
|
||||||
}) => {
|
}) => {
|
||||||
if (!input.id) {
|
if (!input.id) {
|
||||||
|
|||||||
@@ -69,6 +69,8 @@ const updateAuditSchema = z.object({
|
|||||||
name: z.string().nullable().optional(),
|
name: z.string().nullable().optional(),
|
||||||
validFrom: z.string().optional(),
|
validFrom: z.string().optional(),
|
||||||
validUntil: z.string().optional(),
|
validUntil: z.string().optional(),
|
||||||
|
auditStartDate: z.string().optional(),
|
||||||
|
auditEndDate: z.string().optional(),
|
||||||
state: z.enum([
|
state: z.enum([
|
||||||
"NOT_STARTED",
|
"NOT_STARTED",
|
||||||
"IN_PROGRESS",
|
"IN_PROGRESS",
|
||||||
@@ -104,6 +106,8 @@ export default function AuditDetailsPage(props: Props) {
|
|||||||
name: auditEntry.name || null,
|
name: auditEntry.name || null,
|
||||||
validFrom: auditEntry.validFrom?.split("T")[0] || "",
|
validFrom: auditEntry.validFrom?.split("T")[0] || "",
|
||||||
validUntil: auditEntry.validUntil?.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",
|
state: auditEntry.state || "NOT_STARTED",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -123,6 +127,8 @@ export default function AuditDetailsPage(props: Props) {
|
|||||||
name: formData.name || null,
|
name: formData.name || null,
|
||||||
validFrom: formatDatetime(formData.validFrom) ?? null,
|
validFrom: formatDatetime(formData.validFrom) ?? null,
|
||||||
validUntil: formatDatetime(formData.validUntil) ?? null,
|
validUntil: formatDatetime(formData.validUntil) ?? null,
|
||||||
|
auditStartDate: formatDatetime(formData.auditStartDate) ?? null,
|
||||||
|
auditEndDate: formatDatetime(formData.auditEndDate) ?? null,
|
||||||
state: formData.state,
|
state: formData.state,
|
||||||
});
|
});
|
||||||
reset(formData);
|
reset(formData);
|
||||||
@@ -243,6 +249,14 @@ export default function AuditDetailsPage(props: Props) {
|
|||||||
<Input {...register("validUntil")} type="date" />
|
<Input {...register("validUntil")} type="date" />
|
||||||
</Field>
|
</Field>
|
||||||
|
|
||||||
|
<Field label={t("auditDetailsPage.fields.auditStartDate")}>
|
||||||
|
<Input {...register("auditStartDate")} type="date" />
|
||||||
|
</Field>
|
||||||
|
|
||||||
|
<Field label={t("auditDetailsPage.fields.auditEndDate")}>
|
||||||
|
<Input {...register("auditEndDate")} type="date" />
|
||||||
|
</Field>
|
||||||
|
|
||||||
<div className="flex justify-end">
|
<div className="flex justify-end">
|
||||||
{formState.isDirty && auditEntry.canUpdate && (
|
{formState.isDirty && auditEntry.canUpdate && (
|
||||||
<Button type="submit" disabled={formState.isSubmitting}>
|
<Button type="submit" disabled={formState.isSubmitting}>
|
||||||
|
|||||||
@@ -92,6 +92,8 @@ export function CreateAuditDialog({
|
|||||||
name: z.string().optional(),
|
name: z.string().optional(),
|
||||||
validFrom: z.string().optional(),
|
validFrom: z.string().optional(),
|
||||||
validUntil: z.string().optional(),
|
validUntil: z.string().optional(),
|
||||||
|
auditStartDate: z.string().optional(),
|
||||||
|
auditEndDate: z.string().optional(),
|
||||||
state: z.enum([
|
state: z.enum([
|
||||||
"NOT_STARTED",
|
"NOT_STARTED",
|
||||||
"IN_PROGRESS",
|
"IN_PROGRESS",
|
||||||
@@ -107,6 +109,8 @@ export function CreateAuditDialog({
|
|||||||
name: "",
|
name: "",
|
||||||
validFrom: "",
|
validFrom: "",
|
||||||
validUntil: "",
|
validUntil: "",
|
||||||
|
auditStartDate: "",
|
||||||
|
auditEndDate: "",
|
||||||
state: "NOT_STARTED",
|
state: "NOT_STARTED",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -122,6 +126,8 @@ export function CreateAuditDialog({
|
|||||||
name: data.name || null,
|
name: data.name || null,
|
||||||
validFrom: formatDatetime(data.validFrom),
|
validFrom: formatDatetime(data.validFrom),
|
||||||
validUntil: formatDatetime(data.validUntil),
|
validUntil: formatDatetime(data.validUntil),
|
||||||
|
auditStartDate: formatDatetime(data.auditStartDate),
|
||||||
|
auditEndDate: formatDatetime(data.auditEndDate),
|
||||||
state: data.state,
|
state: data.state,
|
||||||
file: file ?? null,
|
file: file ?? null,
|
||||||
});
|
});
|
||||||
@@ -229,6 +235,12 @@ export function CreateAuditDialog({
|
|||||||
<Field label={t("createAuditDialog.fields.validUntil")}>
|
<Field label={t("createAuditDialog.fields.validUntil")}>
|
||||||
<Input {...register("validUntil")} type="date" />
|
<Input {...register("validUntil")} type="date" />
|
||||||
</Field>
|
</Field>
|
||||||
|
<Field label={t("createAuditDialog.fields.auditStartDate")}>
|
||||||
|
<Input {...register("auditStartDate")} type="date" />
|
||||||
|
</Field>
|
||||||
|
<Field label={t("createAuditDialog.fields.auditEndDate")}>
|
||||||
|
<Input {...register("auditEndDate")} type="date" />
|
||||||
|
</Field>
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
<DialogFooter>
|
<DialogFooter>
|
||||||
<Button disabled={formState.isSubmitting} type="submit">
|
<Button disabled={formState.isSubmitting} type="submit">
|
||||||
@@ -245,6 +257,8 @@ type FormSchema = {
|
|||||||
name?: string;
|
name?: string;
|
||||||
validFrom?: string;
|
validFrom?: string;
|
||||||
validUntil?: string;
|
validUntil?: string;
|
||||||
|
auditStartDate?: string;
|
||||||
|
auditEndDate?: string;
|
||||||
state: "NOT_STARTED" | "IN_PROGRESS" | "COMPLETED" | "REJECTED" | "OUTDATED";
|
state: "NOT_STARTED" | "IN_PROGRESS" | "COMPLETED" | "REJECTED" | "OUTDATED";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -151,6 +151,93 @@ func TestAudit_Create(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAudit_AuditDates(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
owner := testutil.NewClient(t, testutil.RoleOwner)
|
||||||
|
|
||||||
|
frameworkID := factory.NewFramework(owner).WithName("Framework for Audit Dates").Create()
|
||||||
|
|
||||||
|
const createQuery = `
|
||||||
|
mutation CreateAudit($input: CreateAuditInput!) {
|
||||||
|
createAudit(input: $input) {
|
||||||
|
auditEdge {
|
||||||
|
node {
|
||||||
|
id
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
input := map[string]any{
|
||||||
|
"organizationId": owner.GetOrganizationID().String(),
|
||||||
|
"frameworkId": frameworkID,
|
||||||
|
"name": "Audit with engagement dates",
|
||||||
|
"state": "NOT_STARTED",
|
||||||
|
"auditStartDate": "2026-03-01T00:00:00Z",
|
||||||
|
"auditEndDate": "2026-03-15T00:00:00Z",
|
||||||
|
}
|
||||||
|
|
||||||
|
var createResult struct {
|
||||||
|
CreateAudit struct {
|
||||||
|
AuditEdge struct {
|
||||||
|
Node struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
AuditStartDate *string `json:"auditStartDate"`
|
||||||
|
AuditEndDate *string `json:"auditEndDate"`
|
||||||
|
} `json:"node"`
|
||||||
|
} `json:"auditEdge"`
|
||||||
|
} `json:"createAudit"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := owner.Execute(createQuery, map[string]any{"input": input}, &createResult)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
node := createResult.CreateAudit.AuditEdge.Node
|
||||||
|
require.NotNil(t, node.AuditStartDate)
|
||||||
|
require.NotNil(t, node.AuditEndDate)
|
||||||
|
assert.True(t, strings.HasPrefix(*node.AuditStartDate, "2026-03-01"))
|
||||||
|
assert.True(t, strings.HasPrefix(*node.AuditEndDate, "2026-03-15"))
|
||||||
|
|
||||||
|
const updateQuery = `
|
||||||
|
mutation UpdateAudit($input: UpdateAuditInput!) {
|
||||||
|
updateAudit(input: $input) {
|
||||||
|
audit {
|
||||||
|
id
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
updateInput := map[string]any{
|
||||||
|
"id": node.ID,
|
||||||
|
"auditStartDate": "2026-04-01T00:00:00Z",
|
||||||
|
"auditEndDate": "2026-04-30T00:00:00Z",
|
||||||
|
}
|
||||||
|
|
||||||
|
var updateResult struct {
|
||||||
|
UpdateAudit struct {
|
||||||
|
Audit struct {
|
||||||
|
AuditStartDate *string `json:"auditStartDate"`
|
||||||
|
AuditEndDate *string `json:"auditEndDate"`
|
||||||
|
} `json:"audit"`
|
||||||
|
} `json:"updateAudit"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err = owner.Execute(updateQuery, map[string]any{"input": updateInput}, &updateResult)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
updated := updateResult.UpdateAudit.Audit
|
||||||
|
require.NotNil(t, updated.AuditStartDate)
|
||||||
|
require.NotNil(t, updated.AuditEndDate)
|
||||||
|
assert.True(t, strings.HasPrefix(*updated.AuditStartDate, "2026-04-01"))
|
||||||
|
assert.True(t, strings.HasPrefix(*updated.AuditEndDate, "2026-04-30"))
|
||||||
|
}
|
||||||
|
|
||||||
func TestAudit_Create_Validation(t *testing.T) {
|
func TestAudit_Create_Validation(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
owner := testutil.NewClient(t, testutil.RoleOwner)
|
owner := testutil.NewClient(t, testutil.RoleOwner)
|
||||||
|
|||||||
@@ -113,6 +113,20 @@ export const description: INodeProperties[] = [
|
|||||||
default: '',
|
default: '',
|
||||||
description: 'The end date of the audit validity period',
|
description: 'The end date of the audit validity period',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Audit Start Date',
|
||||||
|
name: 'auditStartDate',
|
||||||
|
type: 'dateTime',
|
||||||
|
default: '',
|
||||||
|
description: 'The start date of the audit engagement',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Audit End Date',
|
||||||
|
name: 'auditEndDate',
|
||||||
|
type: 'dateTime',
|
||||||
|
default: '',
|
||||||
|
description: 'The end date of the audit engagement',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
@@ -128,6 +142,8 @@ export async function execute(
|
|||||||
state?: string;
|
state?: string;
|
||||||
validFrom?: string;
|
validFrom?: string;
|
||||||
validUntil?: string;
|
validUntil?: string;
|
||||||
|
auditStartDate?: string;
|
||||||
|
auditEndDate?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
const query = `
|
const query = `
|
||||||
@@ -140,6 +156,8 @@ export async function execute(
|
|||||||
state
|
state
|
||||||
validFrom
|
validFrom
|
||||||
validUntil
|
validUntil
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
reportUrl
|
reportUrl
|
||||||
compliancePortalVisibility
|
compliancePortalVisibility
|
||||||
createdAt
|
createdAt
|
||||||
@@ -158,6 +176,8 @@ export async function execute(
|
|||||||
if (additionalFields.state) input.state = additionalFields.state;
|
if (additionalFields.state) input.state = additionalFields.state;
|
||||||
if (additionalFields.validFrom) input.validFrom = additionalFields.validFrom;
|
if (additionalFields.validFrom) input.validFrom = additionalFields.validFrom;
|
||||||
if (additionalFields.validUntil) input.validUntil = additionalFields.validUntil;
|
if (additionalFields.validUntil) input.validUntil = additionalFields.validUntil;
|
||||||
|
if (additionalFields.auditStartDate) input.auditStartDate = additionalFields.auditStartDate;
|
||||||
|
if (additionalFields.auditEndDate) input.auditEndDate = additionalFields.auditEndDate;
|
||||||
|
|
||||||
const responseData = await proboApiRequest.call(this, query, { input });
|
const responseData = await proboApiRequest.call(this, query, { input });
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ export async function execute(
|
|||||||
state
|
state
|
||||||
validFrom
|
validFrom
|
||||||
validUntil
|
validUntil
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
reportUrl
|
reportUrl
|
||||||
compliancePortalVisibility
|
compliancePortalVisibility
|
||||||
createdAt
|
createdAt
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ export async function execute(
|
|||||||
state
|
state
|
||||||
validFrom
|
validFrom
|
||||||
validUntil
|
validUntil
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
reportUrl
|
reportUrl
|
||||||
compliancePortalVisibility
|
compliancePortalVisibility
|
||||||
createdAt
|
createdAt
|
||||||
|
|||||||
@@ -88,6 +88,8 @@ export async function execute(
|
|||||||
state
|
state
|
||||||
validFrom
|
validFrom
|
||||||
validUntil
|
validUntil
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
reportUrl
|
reportUrl
|
||||||
compliancePortalVisibility
|
compliancePortalVisibility
|
||||||
createdAt
|
createdAt
|
||||||
|
|||||||
@@ -99,6 +99,20 @@ export const description: INodeProperties[] = [
|
|||||||
default: '',
|
default: '',
|
||||||
description: 'The end date of the audit validity period',
|
description: 'The end date of the audit validity period',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Audit Start Date',
|
||||||
|
name: 'auditStartDate',
|
||||||
|
type: 'dateTime',
|
||||||
|
default: '',
|
||||||
|
description: 'The start date of the audit engagement',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Audit End Date',
|
||||||
|
name: 'auditEndDate',
|
||||||
|
type: 'dateTime',
|
||||||
|
default: '',
|
||||||
|
description: 'The end date of the audit engagement',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
@@ -113,6 +127,8 @@ export async function execute(
|
|||||||
state?: string;
|
state?: string;
|
||||||
validFrom?: string;
|
validFrom?: string;
|
||||||
validUntil?: string;
|
validUntil?: string;
|
||||||
|
auditStartDate?: string;
|
||||||
|
auditEndDate?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
const query = `
|
const query = `
|
||||||
@@ -124,6 +140,8 @@ export async function execute(
|
|||||||
state
|
state
|
||||||
validFrom
|
validFrom
|
||||||
validUntil
|
validUntil
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
reportUrl
|
reportUrl
|
||||||
compliancePortalVisibility
|
compliancePortalVisibility
|
||||||
createdAt
|
createdAt
|
||||||
@@ -138,6 +156,8 @@ export async function execute(
|
|||||||
if (updateFields.state) input.state = updateFields.state;
|
if (updateFields.state) input.state = updateFields.state;
|
||||||
if (updateFields.validFrom) input.validFrom = updateFields.validFrom;
|
if (updateFields.validFrom) input.validFrom = updateFields.validFrom;
|
||||||
if (updateFields.validUntil) input.validUntil = updateFields.validUntil;
|
if (updateFields.validUntil) input.validUntil = updateFields.validUntil;
|
||||||
|
if (updateFields.auditStartDate) input.auditStartDate = updateFields.auditStartDate;
|
||||||
|
if (updateFields.auditEndDate) input.auditEndDate = updateFields.auditEndDate;
|
||||||
|
|
||||||
const responseData = await proboApiRequest.call(this, query, { input });
|
const responseData = await proboApiRequest.call(this, query, { input });
|
||||||
|
|
||||||
|
|||||||
@@ -74,6 +74,8 @@ export async function execute(
|
|||||||
state
|
state
|
||||||
validFrom
|
validFrom
|
||||||
validUntil
|
validUntil
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
reportUrl
|
reportUrl
|
||||||
compliancePortalVisibility
|
compliancePortalVisibility
|
||||||
createdAt
|
createdAt
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ mutation($input: CreateAuditInput!) {
|
|||||||
state
|
state
|
||||||
validFrom
|
validFrom
|
||||||
validUntil
|
validUntil
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -55,6 +57,8 @@ type createResponse struct {
|
|||||||
State string `json:"state"`
|
State string `json:"state"`
|
||||||
ValidFrom *string `json:"validFrom"`
|
ValidFrom *string `json:"validFrom"`
|
||||||
ValidUntil *string `json:"validUntil"`
|
ValidUntil *string `json:"validUntil"`
|
||||||
|
AuditStartDate *string `json:"auditStartDate"`
|
||||||
|
AuditEndDate *string `json:"auditEndDate"`
|
||||||
} `json:"node"`
|
} `json:"node"`
|
||||||
} `json:"auditEdge"`
|
} `json:"auditEdge"`
|
||||||
} `json:"createAudit"`
|
} `json:"createAudit"`
|
||||||
@@ -68,6 +72,8 @@ func NewCmdCreate(f *cmdutil.Factory) *cobra.Command {
|
|||||||
flagState string
|
flagState string
|
||||||
flagValidFrom string
|
flagValidFrom string
|
||||||
flagValidUntil string
|
flagValidUntil string
|
||||||
|
flagAuditStartDate string
|
||||||
|
flagAuditEndDate string
|
||||||
flagCompliancePortalVisibility string
|
flagCompliancePortalVisibility string
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -160,6 +166,14 @@ func NewCmdCreate(f *cmdutil.Factory) *cobra.Command {
|
|||||||
input["validUntil"] = flagValidUntil
|
input["validUntil"] = flagValidUntil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if flagAuditStartDate != "" {
|
||||||
|
input["auditStartDate"] = flagAuditStartDate
|
||||||
|
}
|
||||||
|
|
||||||
|
if flagAuditEndDate != "" {
|
||||||
|
input["auditEndDate"] = flagAuditEndDate
|
||||||
|
}
|
||||||
|
|
||||||
if flagCompliancePortalVisibility != "" {
|
if flagCompliancePortalVisibility != "" {
|
||||||
input["compliancePortalVisibility"] = flagCompliancePortalVisibility
|
input["compliancePortalVisibility"] = flagCompliancePortalVisibility
|
||||||
}
|
}
|
||||||
@@ -195,6 +209,8 @@ func NewCmdCreate(f *cmdutil.Factory) *cobra.Command {
|
|||||||
cmd.Flags().StringVar(&flagState, "state", "", "Audit state: NOT_STARTED, IN_PROGRESS, COMPLETED, REJECTED, OUTDATED")
|
cmd.Flags().StringVar(&flagState, "state", "", "Audit state: NOT_STARTED, IN_PROGRESS, COMPLETED, REJECTED, OUTDATED")
|
||||||
cmd.Flags().StringVar(&flagValidFrom, "valid-from", "", "Valid from date (e.g. 2026-01-01)")
|
cmd.Flags().StringVar(&flagValidFrom, "valid-from", "", "Valid from date (e.g. 2026-01-01)")
|
||||||
cmd.Flags().StringVar(&flagValidUntil, "valid-until", "", "Valid until date (e.g. 2026-12-31)")
|
cmd.Flags().StringVar(&flagValidUntil, "valid-until", "", "Valid until date (e.g. 2026-12-31)")
|
||||||
|
cmd.Flags().StringVar(&flagAuditStartDate, "audit-start-date", "", "Audit start date (e.g. 2026-03-01)")
|
||||||
|
cmd.Flags().StringVar(&flagAuditEndDate, "audit-end-date", "", "Audit end date (e.g. 2026-03-15)")
|
||||||
cmd.Flags().StringVar(&flagCompliancePortalVisibility, "compliance-portal-visibility", "", "Compliance portal visibility: NONE, PRIVATE, PUBLIC")
|
cmd.Flags().StringVar(&flagCompliancePortalVisibility, "compliance-portal-visibility", "", "Compliance portal visibility: NONE, PRIVATE, PUBLIC")
|
||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ query($id: ID!, $first: Int, $after: CursorKey, $orderBy: AuditOrder) {
|
|||||||
state
|
state
|
||||||
validFrom
|
validFrom
|
||||||
validUntil
|
validUntil
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pageInfo {
|
pageInfo {
|
||||||
@@ -61,6 +63,8 @@ type audit struct {
|
|||||||
State string `json:"state"`
|
State string `json:"state"`
|
||||||
ValidFrom *string `json:"validFrom"`
|
ValidFrom *string `json:"validFrom"`
|
||||||
ValidUntil *string `json:"validUntil"`
|
ValidUntil *string `json:"validUntil"`
|
||||||
|
AuditStartDate *string `json:"auditStartDate"`
|
||||||
|
AuditEndDate *string `json:"auditEndDate"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCmdList(f *cmdutil.Factory) *cobra.Command {
|
func NewCmdList(f *cmdutil.Factory) *cobra.Command {
|
||||||
@@ -180,16 +184,28 @@ func NewCmdList(f *cmdutil.Factory) *cobra.Command {
|
|||||||
validUntil = *a.ValidUntil
|
validUntil = *a.ValidUntil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auditStartDate := ""
|
||||||
|
if a.AuditStartDate != nil {
|
||||||
|
auditStartDate = *a.AuditStartDate
|
||||||
|
}
|
||||||
|
|
||||||
|
auditEndDate := ""
|
||||||
|
if a.AuditEndDate != nil {
|
||||||
|
auditEndDate = *a.AuditEndDate
|
||||||
|
}
|
||||||
|
|
||||||
rows = append(rows, []string{
|
rows = append(rows, []string{
|
||||||
a.ID,
|
a.ID,
|
||||||
a.Name,
|
a.Name,
|
||||||
a.State,
|
a.State,
|
||||||
validFrom,
|
validFrom,
|
||||||
validUntil,
|
validUntil,
|
||||||
|
auditStartDate,
|
||||||
|
auditEndDate,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
t := cmdutil.NewTable("ID", "NAME", "STATE", "VALID FROM", "VALID UNTIL").Rows(rows...)
|
t := cmdutil.NewTable("ID", "NAME", "STATE", "VALID FROM", "VALID UNTIL", "AUDIT START", "AUDIT END").Rows(rows...)
|
||||||
|
|
||||||
_, _ = fmt.Fprintln(f.IOStreams.Out, t)
|
_, _ = fmt.Fprintln(f.IOStreams.Out, t)
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ mutation($input: UpdateAuditInput!) {
|
|||||||
state
|
state
|
||||||
validFrom
|
validFrom
|
||||||
validUntil
|
validUntil
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -51,6 +53,8 @@ type updateResponse struct {
|
|||||||
State string `json:"state"`
|
State string `json:"state"`
|
||||||
ValidFrom *string `json:"validFrom"`
|
ValidFrom *string `json:"validFrom"`
|
||||||
ValidUntil *string `json:"validUntil"`
|
ValidUntil *string `json:"validUntil"`
|
||||||
|
AuditStartDate *string `json:"auditStartDate"`
|
||||||
|
AuditEndDate *string `json:"auditEndDate"`
|
||||||
} `json:"audit"`
|
} `json:"audit"`
|
||||||
} `json:"updateAudit"`
|
} `json:"updateAudit"`
|
||||||
}
|
}
|
||||||
@@ -61,6 +65,8 @@ func NewCmdUpdate(f *cmdutil.Factory) *cobra.Command {
|
|||||||
flagState string
|
flagState string
|
||||||
flagValidFrom string
|
flagValidFrom string
|
||||||
flagValidUntil string
|
flagValidUntil string
|
||||||
|
flagAuditStartDate string
|
||||||
|
flagAuditEndDate string
|
||||||
flagCompliancePortalVisibility string
|
flagCompliancePortalVisibility string
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -107,6 +113,14 @@ func NewCmdUpdate(f *cmdutil.Factory) *cobra.Command {
|
|||||||
input["validUntil"] = flagValidUntil
|
input["validUntil"] = flagValidUntil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cmd.Flags().Changed("audit-start-date") {
|
||||||
|
input["auditStartDate"] = flagAuditStartDate
|
||||||
|
}
|
||||||
|
|
||||||
|
if cmd.Flags().Changed("audit-end-date") {
|
||||||
|
input["auditEndDate"] = flagAuditEndDate
|
||||||
|
}
|
||||||
|
|
||||||
if cmd.Flags().Changed("compliance-portal-visibility") {
|
if cmd.Flags().Changed("compliance-portal-visibility") {
|
||||||
input["compliancePortalVisibility"] = flagCompliancePortalVisibility
|
input["compliancePortalVisibility"] = flagCompliancePortalVisibility
|
||||||
}
|
}
|
||||||
@@ -144,6 +158,8 @@ func NewCmdUpdate(f *cmdutil.Factory) *cobra.Command {
|
|||||||
cmd.Flags().StringVar(&flagState, "state", "", "Audit state: NOT_STARTED, IN_PROGRESS, COMPLETED, REJECTED, OUTDATED")
|
cmd.Flags().StringVar(&flagState, "state", "", "Audit state: NOT_STARTED, IN_PROGRESS, COMPLETED, REJECTED, OUTDATED")
|
||||||
cmd.Flags().StringVar(&flagValidFrom, "valid-from", "", "Valid from date (e.g. 2026-01-01)")
|
cmd.Flags().StringVar(&flagValidFrom, "valid-from", "", "Valid from date (e.g. 2026-01-01)")
|
||||||
cmd.Flags().StringVar(&flagValidUntil, "valid-until", "", "Valid until date (e.g. 2026-12-31)")
|
cmd.Flags().StringVar(&flagValidUntil, "valid-until", "", "Valid until date (e.g. 2026-12-31)")
|
||||||
|
cmd.Flags().StringVar(&flagAuditStartDate, "audit-start-date", "", "Audit start date (e.g. 2026-03-01)")
|
||||||
|
cmd.Flags().StringVar(&flagAuditEndDate, "audit-end-date", "", "Audit end date (e.g. 2026-03-15)")
|
||||||
cmd.Flags().StringVar(&flagCompliancePortalVisibility, "compliance-portal-visibility", "", "Compliance portal visibility: NONE, PRIVATE, PUBLIC")
|
cmd.Flags().StringVar(&flagCompliancePortalVisibility, "compliance-portal-visibility", "", "Compliance portal visibility: NONE, PRIVATE, PUBLIC")
|
||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ query($id: ID!) {
|
|||||||
state
|
state
|
||||||
validFrom
|
validFrom
|
||||||
validUntil
|
validUntil
|
||||||
|
auditStartDate
|
||||||
|
auditEndDate
|
||||||
createdAt
|
createdAt
|
||||||
updatedAt
|
updatedAt
|
||||||
}
|
}
|
||||||
@@ -55,6 +57,8 @@ type viewResponse struct {
|
|||||||
State string `json:"state"`
|
State string `json:"state"`
|
||||||
ValidFrom *string `json:"validFrom"`
|
ValidFrom *string `json:"validFrom"`
|
||||||
ValidUntil *string `json:"validUntil"`
|
ValidUntil *string `json:"validUntil"`
|
||||||
|
AuditStartDate *string `json:"auditStartDate"`
|
||||||
|
AuditEndDate *string `json:"auditEndDate"`
|
||||||
CreatedAt string `json:"createdAt"`
|
CreatedAt string `json:"createdAt"`
|
||||||
UpdatedAt string `json:"updatedAt"`
|
UpdatedAt string `json:"updatedAt"`
|
||||||
} `json:"node"`
|
} `json:"node"`
|
||||||
@@ -134,6 +138,14 @@ func NewCmdView(f *cmdutil.Factory) *cobra.Command {
|
|||||||
_, _ = fmt.Fprintf(out, "%s%s\n", label.Render("Valid Until:"), *a.ValidUntil)
|
_, _ = fmt.Fprintf(out, "%s%s\n", label.Render("Valid Until:"), *a.ValidUntil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if a.AuditStartDate != nil && *a.AuditStartDate != "" {
|
||||||
|
_, _ = fmt.Fprintf(out, "%s%s\n", label.Render("Audit Start:"), *a.AuditStartDate)
|
||||||
|
}
|
||||||
|
|
||||||
|
if a.AuditEndDate != nil && *a.AuditEndDate != "" {
|
||||||
|
_, _ = fmt.Fprintf(out, "%s%s\n", label.Render("Audit End:"), *a.AuditEndDate)
|
||||||
|
}
|
||||||
|
|
||||||
_, _ = fmt.Fprintln(out)
|
_, _ = fmt.Fprintln(out)
|
||||||
_, _ = fmt.Fprintf(out, "%s%s\n", label.Render("Created:"), cmdutil.FormatTime(a.CreatedAt))
|
_, _ = fmt.Fprintf(out, "%s%s\n", label.Render("Created:"), cmdutil.FormatTime(a.CreatedAt))
|
||||||
_, _ = fmt.Fprintf(out, "%s%s\n", label.Render("Updated:"), cmdutil.FormatTime(a.UpdatedAt))
|
_, _ = fmt.Fprintf(out, "%s%s\n", label.Render("Updated:"), cmdutil.FormatTime(a.UpdatedAt))
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ type (
|
|||||||
ReportFileID *gid.GID `db:"report_file_id"`
|
ReportFileID *gid.GID `db:"report_file_id"`
|
||||||
ValidFrom *time.Time `db:"valid_from"`
|
ValidFrom *time.Time `db:"valid_from"`
|
||||||
ValidUntil *time.Time `db:"valid_until"`
|
ValidUntil *time.Time `db:"valid_until"`
|
||||||
|
AuditStartDate *time.Time `db:"audit_start_date"`
|
||||||
|
AuditEndDate *time.Time `db:"audit_end_date"`
|
||||||
State AuditState `db:"state"`
|
State AuditState `db:"state"`
|
||||||
CompliancePortalVisibility CompliancePortalVisibility `db:"trust_center_visibility"`
|
CompliancePortalVisibility CompliancePortalVisibility `db:"trust_center_visibility"`
|
||||||
CreatedAt time.Time `db:"created_at"`
|
CreatedAt time.Time `db:"created_at"`
|
||||||
@@ -122,6 +124,8 @@ SELECT
|
|||||||
report_file_id,
|
report_file_id,
|
||||||
valid_from,
|
valid_from,
|
||||||
valid_until,
|
valid_until,
|
||||||
|
audit_start_date,
|
||||||
|
audit_end_date,
|
||||||
state,
|
state,
|
||||||
trust_center_visibility,
|
trust_center_visibility,
|
||||||
created_at,
|
created_at,
|
||||||
@@ -208,6 +212,8 @@ SELECT
|
|||||||
report_file_id,
|
report_file_id,
|
||||||
valid_from,
|
valid_from,
|
||||||
valid_until,
|
valid_until,
|
||||||
|
audit_start_date,
|
||||||
|
audit_end_date,
|
||||||
state,
|
state,
|
||||||
trust_center_visibility,
|
trust_center_visibility,
|
||||||
created_at,
|
created_at,
|
||||||
@@ -258,6 +264,8 @@ INSERT INTO audits (
|
|||||||
report_file_id,
|
report_file_id,
|
||||||
valid_from,
|
valid_from,
|
||||||
valid_until,
|
valid_until,
|
||||||
|
audit_start_date,
|
||||||
|
audit_end_date,
|
||||||
state,
|
state,
|
||||||
trust_center_visibility,
|
trust_center_visibility,
|
||||||
created_at,
|
created_at,
|
||||||
@@ -271,6 +279,8 @@ INSERT INTO audits (
|
|||||||
@report_file_id,
|
@report_file_id,
|
||||||
@valid_from,
|
@valid_from,
|
||||||
@valid_until,
|
@valid_until,
|
||||||
|
@audit_start_date,
|
||||||
|
@audit_end_date,
|
||||||
@state,
|
@state,
|
||||||
@trust_center_visibility,
|
@trust_center_visibility,
|
||||||
@created_at,
|
@created_at,
|
||||||
@@ -287,6 +297,8 @@ INSERT INTO audits (
|
|||||||
"report_file_id": a.ReportFileID,
|
"report_file_id": a.ReportFileID,
|
||||||
"valid_from": a.ValidFrom,
|
"valid_from": a.ValidFrom,
|
||||||
"valid_until": a.ValidUntil,
|
"valid_until": a.ValidUntil,
|
||||||
|
"audit_start_date": a.AuditStartDate,
|
||||||
|
"audit_end_date": a.AuditEndDate,
|
||||||
"state": a.State,
|
"state": a.State,
|
||||||
"trust_center_visibility": a.CompliancePortalVisibility,
|
"trust_center_visibility": a.CompliancePortalVisibility,
|
||||||
"created_at": a.CreatedAt,
|
"created_at": a.CreatedAt,
|
||||||
@@ -313,6 +325,8 @@ SET
|
|||||||
report_file_id = @report_file_id,
|
report_file_id = @report_file_id,
|
||||||
valid_from = @valid_from,
|
valid_from = @valid_from,
|
||||||
valid_until = @valid_until,
|
valid_until = @valid_until,
|
||||||
|
audit_start_date = @audit_start_date,
|
||||||
|
audit_end_date = @audit_end_date,
|
||||||
state = @state,
|
state = @state,
|
||||||
trust_center_visibility = @trust_center_visibility,
|
trust_center_visibility = @trust_center_visibility,
|
||||||
updated_at = @updated_at
|
updated_at = @updated_at
|
||||||
@@ -329,6 +343,8 @@ WHERE
|
|||||||
"report_file_id": a.ReportFileID,
|
"report_file_id": a.ReportFileID,
|
||||||
"valid_from": a.ValidFrom,
|
"valid_from": a.ValidFrom,
|
||||||
"valid_until": a.ValidUntil,
|
"valid_until": a.ValidUntil,
|
||||||
|
"audit_start_date": a.AuditStartDate,
|
||||||
|
"audit_end_date": a.AuditEndDate,
|
||||||
"state": a.State,
|
"state": a.State,
|
||||||
"trust_center_visibility": a.CompliancePortalVisibility,
|
"trust_center_visibility": a.CompliancePortalVisibility,
|
||||||
"updated_at": a.UpdatedAt,
|
"updated_at": a.UpdatedAt,
|
||||||
@@ -386,6 +402,8 @@ WITH audits_by_control AS (
|
|||||||
a.report_file_id,
|
a.report_file_id,
|
||||||
a.valid_from,
|
a.valid_from,
|
||||||
a.valid_until,
|
a.valid_until,
|
||||||
|
a.audit_start_date,
|
||||||
|
a.audit_end_date,
|
||||||
a.state,
|
a.state,
|
||||||
a.trust_center_visibility,
|
a.trust_center_visibility,
|
||||||
a.created_at,
|
a.created_at,
|
||||||
@@ -405,6 +423,8 @@ SELECT
|
|||||||
report_file_id,
|
report_file_id,
|
||||||
valid_from,
|
valid_from,
|
||||||
valid_until,
|
valid_until,
|
||||||
|
audit_start_date,
|
||||||
|
audit_end_date,
|
||||||
state,
|
state,
|
||||||
trust_center_visibility,
|
trust_center_visibility,
|
||||||
created_at,
|
created_at,
|
||||||
@@ -453,6 +473,8 @@ WITH audits_by_finding AS (
|
|||||||
a.report_file_id,
|
a.report_file_id,
|
||||||
a.valid_from,
|
a.valid_from,
|
||||||
a.valid_until,
|
a.valid_until,
|
||||||
|
a.audit_start_date,
|
||||||
|
a.audit_end_date,
|
||||||
a.state,
|
a.state,
|
||||||
a.trust_center_visibility,
|
a.trust_center_visibility,
|
||||||
a.created_at,
|
a.created_at,
|
||||||
@@ -472,6 +494,8 @@ SELECT
|
|||||||
report_file_id,
|
report_file_id,
|
||||||
valid_from,
|
valid_from,
|
||||||
valid_until,
|
valid_until,
|
||||||
|
audit_start_date,
|
||||||
|
audit_end_date,
|
||||||
state,
|
state,
|
||||||
trust_center_visibility,
|
trust_center_visibility,
|
||||||
created_at,
|
created_at,
|
||||||
@@ -603,6 +627,8 @@ SELECT
|
|||||||
report_file_id,
|
report_file_id,
|
||||||
valid_from,
|
valid_from,
|
||||||
valid_until,
|
valid_until,
|
||||||
|
audit_start_date,
|
||||||
|
audit_end_date,
|
||||||
state,
|
state,
|
||||||
trust_center_visibility,
|
trust_center_visibility,
|
||||||
created_at,
|
created_at,
|
||||||
@@ -652,6 +678,8 @@ SELECT
|
|||||||
report_file_id,
|
report_file_id,
|
||||||
valid_from,
|
valid_from,
|
||||||
valid_until,
|
valid_until,
|
||||||
|
audit_start_date,
|
||||||
|
audit_end_date,
|
||||||
state,
|
state,
|
||||||
trust_center_visibility,
|
trust_center_visibility,
|
||||||
created_at,
|
created_at,
|
||||||
@@ -698,6 +726,8 @@ SELECT
|
|||||||
report_id,
|
report_id,
|
||||||
valid_from,
|
valid_from,
|
||||||
valid_until,
|
valid_until,
|
||||||
|
audit_start_date,
|
||||||
|
audit_end_date,
|
||||||
state,
|
state,
|
||||||
trust_center_visibility,
|
trust_center_visibility,
|
||||||
created_at,
|
created_at,
|
||||||
|
|||||||
22
pkg/coredata/migrations/20260728T142906Z.sql
Normal file
22
pkg/coredata/migrations/20260728T142906Z.sql
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
-- Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
|
||||||
|
--
|
||||||
|
-- Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
-- of this software and associated documentation files (the "Software"), to deal
|
||||||
|
-- in the Software without restriction, including without limitation the rights
|
||||||
|
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
-- copies of the Software, and to permit persons to whom the Software is
|
||||||
|
-- furnished to do so, subject to the following conditions:
|
||||||
|
--
|
||||||
|
-- The above copyright notice and this permission notice shall be included in
|
||||||
|
-- all copies or substantial portions of the Software.
|
||||||
|
--
|
||||||
|
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
-- SOFTWARE.
|
||||||
|
|
||||||
|
ALTER TABLE audits ADD COLUMN audit_start_date DATE;
|
||||||
|
ALTER TABLE audits ADD COLUMN audit_end_date DATE;
|
||||||
@@ -44,6 +44,8 @@ type (
|
|||||||
Name *string
|
Name *string
|
||||||
ValidFrom *time.Time
|
ValidFrom *time.Time
|
||||||
ValidUntil *time.Time
|
ValidUntil *time.Time
|
||||||
|
AuditStartDate *time.Time
|
||||||
|
AuditEndDate *time.Time
|
||||||
State *coredata.AuditState
|
State *coredata.AuditState
|
||||||
CompliancePortalVisibility *coredata.CompliancePortalVisibility
|
CompliancePortalVisibility *coredata.CompliancePortalVisibility
|
||||||
}
|
}
|
||||||
@@ -53,6 +55,8 @@ type (
|
|||||||
Name **string
|
Name **string
|
||||||
ValidFrom *time.Time
|
ValidFrom *time.Time
|
||||||
ValidUntil *time.Time
|
ValidUntil *time.Time
|
||||||
|
AuditStartDate *time.Time
|
||||||
|
AuditEndDate *time.Time
|
||||||
State *coredata.AuditState
|
State *coredata.AuditState
|
||||||
CompliancePortalVisibility *coredata.CompliancePortalVisibility
|
CompliancePortalVisibility *coredata.CompliancePortalVisibility
|
||||||
}
|
}
|
||||||
@@ -70,6 +74,7 @@ func (car *CreateAuditRequest) Validate() error {
|
|||||||
v.Check(car.FrameworkID, "framework_id", validator.Required(), validator.GID(coredata.FrameworkEntityType))
|
v.Check(car.FrameworkID, "framework_id", validator.Required(), validator.GID(coredata.FrameworkEntityType))
|
||||||
v.Check(car.Name, "name", validator.SafeTextNoNewLine(TitleMaxLength))
|
v.Check(car.Name, "name", validator.SafeTextNoNewLine(TitleMaxLength))
|
||||||
v.Check(car.ValidUntil, "valid_until", validator.After(car.ValidFrom))
|
v.Check(car.ValidUntil, "valid_until", validator.After(car.ValidFrom))
|
||||||
|
v.Check(car.AuditEndDate, "audit_end_date", validator.After(car.AuditStartDate))
|
||||||
v.Check(car.State, "state", validator.OneOfSlice(coredata.AuditStates()))
|
v.Check(car.State, "state", validator.OneOfSlice(coredata.AuditStates()))
|
||||||
v.Check(car.CompliancePortalVisibility, "trust_center_visibility", validator.OneOfSlice(coredata.CompliancePortalVisibilities()))
|
v.Check(car.CompliancePortalVisibility, "trust_center_visibility", validator.OneOfSlice(coredata.CompliancePortalVisibilities()))
|
||||||
|
|
||||||
@@ -82,6 +87,7 @@ func (uar *UpdateAuditRequest) Validate() error {
|
|||||||
v.Check(uar.ID, "id", validator.Required(), validator.GID(coredata.AuditEntityType))
|
v.Check(uar.ID, "id", validator.Required(), validator.GID(coredata.AuditEntityType))
|
||||||
v.Check(uar.Name, "name", validator.SafeTextNoNewLine(TitleMaxLength))
|
v.Check(uar.Name, "name", validator.SafeTextNoNewLine(TitleMaxLength))
|
||||||
v.Check(uar.ValidUntil, "valid_until", validator.After(uar.ValidFrom))
|
v.Check(uar.ValidUntil, "valid_until", validator.After(uar.ValidFrom))
|
||||||
|
v.Check(uar.AuditEndDate, "audit_end_date", validator.After(uar.AuditStartDate))
|
||||||
v.Check(uar.State, "state", validator.OneOfSlice(coredata.AuditStates()))
|
v.Check(uar.State, "state", validator.OneOfSlice(coredata.AuditStates()))
|
||||||
v.Check(uar.CompliancePortalVisibility, "trust_center_visibility", validator.OneOfSlice(coredata.CompliancePortalVisibilities()))
|
v.Check(uar.CompliancePortalVisibility, "trust_center_visibility", validator.OneOfSlice(coredata.CompliancePortalVisibilities()))
|
||||||
|
|
||||||
@@ -170,6 +176,8 @@ func (s *AuditService) Create(
|
|||||||
FrameworkID: req.FrameworkID,
|
FrameworkID: req.FrameworkID,
|
||||||
ValidFrom: req.ValidFrom,
|
ValidFrom: req.ValidFrom,
|
||||||
ValidUntil: req.ValidUntil,
|
ValidUntil: req.ValidUntil,
|
||||||
|
AuditStartDate: req.AuditStartDate,
|
||||||
|
AuditEndDate: req.AuditEndDate,
|
||||||
State: coredata.AuditStateNotStarted,
|
State: coredata.AuditStateNotStarted,
|
||||||
CompliancePortalVisibility: coredata.CompliancePortalVisibilityNone,
|
CompliancePortalVisibility: coredata.CompliancePortalVisibilityNone,
|
||||||
CreatedAt: now,
|
CreatedAt: now,
|
||||||
@@ -240,6 +248,14 @@ func (s *AuditService) Update(
|
|||||||
audit.ValidUntil = req.ValidUntil
|
audit.ValidUntil = req.ValidUntil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if req.AuditStartDate != nil {
|
||||||
|
audit.AuditStartDate = req.AuditStartDate
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.AuditEndDate != nil {
|
||||||
|
audit.AuditEndDate = req.AuditEndDate
|
||||||
|
}
|
||||||
|
|
||||||
if req.State != nil {
|
if req.State != nil {
|
||||||
audit.State = *req.State
|
audit.State = *req.State
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,8 @@ func (r *mutationResolver) CreateAudit(ctx context.Context, input types.CreateAu
|
|||||||
Name: input.Name,
|
Name: input.Name,
|
||||||
ValidFrom: input.ValidFrom,
|
ValidFrom: input.ValidFrom,
|
||||||
ValidUntil: input.ValidUntil,
|
ValidUntil: input.ValidUntil,
|
||||||
|
AuditStartDate: input.AuditStartDate,
|
||||||
|
AuditEndDate: input.AuditEndDate,
|
||||||
State: input.State,
|
State: input.State,
|
||||||
CompliancePortalVisibility: input.CompliancePortalVisibility,
|
CompliancePortalVisibility: input.CompliancePortalVisibility,
|
||||||
}
|
}
|
||||||
@@ -439,6 +441,8 @@ func (r *mutationResolver) UpdateAudit(ctx context.Context, input types.UpdateAu
|
|||||||
Name: gqlutils.UnwrapOmittable(input.Name),
|
Name: gqlutils.UnwrapOmittable(input.Name),
|
||||||
ValidFrom: input.ValidFrom,
|
ValidFrom: input.ValidFrom,
|
||||||
ValidUntil: input.ValidUntil,
|
ValidUntil: input.ValidUntil,
|
||||||
|
AuditStartDate: input.AuditStartDate,
|
||||||
|
AuditEndDate: input.AuditEndDate,
|
||||||
State: input.State,
|
State: input.State,
|
||||||
CompliancePortalVisibility: input.CompliancePortalVisibility,
|
CompliancePortalVisibility: input.CompliancePortalVisibility,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,6 +151,8 @@ type Audit implements Node {
|
|||||||
framework: Framework @goField(forceResolver: true)
|
framework: Framework @goField(forceResolver: true)
|
||||||
validFrom: Datetime
|
validFrom: Datetime
|
||||||
validUntil: Datetime
|
validUntil: Datetime
|
||||||
|
auditStartDate: Datetime
|
||||||
|
auditEndDate: Datetime
|
||||||
reportFile: File @goField(forceResolver: true)
|
reportFile: File @goField(forceResolver: true)
|
||||||
state: AuditState!
|
state: AuditState!
|
||||||
|
|
||||||
@@ -275,6 +277,8 @@ input CreateAuditInput {
|
|||||||
name: String
|
name: String
|
||||||
validFrom: Datetime
|
validFrom: Datetime
|
||||||
validUntil: Datetime
|
validUntil: Datetime
|
||||||
|
auditStartDate: Datetime
|
||||||
|
auditEndDate: Datetime
|
||||||
state: AuditState
|
state: AuditState
|
||||||
compliancePortalVisibility: CompliancePortalVisibility
|
compliancePortalVisibility: CompliancePortalVisibility
|
||||||
file: Upload
|
file: Upload
|
||||||
@@ -285,6 +289,8 @@ input UpdateAuditInput {
|
|||||||
name: String @goField(omittable: true)
|
name: String @goField(omittable: true)
|
||||||
validFrom: Datetime
|
validFrom: Datetime
|
||||||
validUntil: Datetime
|
validUntil: Datetime
|
||||||
|
auditStartDate: Datetime
|
||||||
|
auditEndDate: Datetime
|
||||||
state: AuditState
|
state: AuditState
|
||||||
compliancePortalVisibility: CompliancePortalVisibility
|
compliancePortalVisibility: CompliancePortalVisibility
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,6 +76,8 @@ func NewAudit(a *coredata.Audit) *Audit {
|
|||||||
},
|
},
|
||||||
ValidFrom: a.ValidFrom,
|
ValidFrom: a.ValidFrom,
|
||||||
ValidUntil: a.ValidUntil,
|
ValidUntil: a.ValidUntil,
|
||||||
|
AuditStartDate: a.AuditStartDate,
|
||||||
|
AuditEndDate: a.AuditEndDate,
|
||||||
State: a.State,
|
State: a.State,
|
||||||
Name: a.Name,
|
Name: a.Name,
|
||||||
CompliancePortalVisibility: a.CompliancePortalVisibility,
|
CompliancePortalVisibility: a.CompliancePortalVisibility,
|
||||||
|
|||||||
@@ -1499,6 +1499,8 @@ func (r *Resolver) AddAuditTool(ctx context.Context, req *mcp.CallToolRequest, i
|
|||||||
Name: input.Name,
|
Name: input.Name,
|
||||||
ValidFrom: input.ValidFrom,
|
ValidFrom: input.ValidFrom,
|
||||||
ValidUntil: input.ValidUntil,
|
ValidUntil: input.ValidUntil,
|
||||||
|
AuditStartDate: input.AuditStartDate,
|
||||||
|
AuditEndDate: input.AuditEndDate,
|
||||||
State: input.State,
|
State: input.State,
|
||||||
FrameworkID: input.FrameworkID,
|
FrameworkID: input.FrameworkID,
|
||||||
},
|
},
|
||||||
@@ -1527,6 +1529,8 @@ func (r *Resolver) UpdateAuditTool(ctx context.Context, req *mcp.CallToolRequest
|
|||||||
Name: UnwrapOmittable(input.Name),
|
Name: UnwrapOmittable(input.Name),
|
||||||
ValidFrom: input.ValidFrom,
|
ValidFrom: input.ValidFrom,
|
||||||
ValidUntil: input.ValidUntil,
|
ValidUntil: input.ValidUntil,
|
||||||
|
AuditStartDate: input.AuditStartDate,
|
||||||
|
AuditEndDate: input.AuditEndDate,
|
||||||
State: input.State,
|
State: input.State,
|
||||||
CompliancePortalVisibility: input.CompliancePortalVisibility,
|
CompliancePortalVisibility: input.CompliancePortalVisibility,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -4674,6 +4674,18 @@ components:
|
|||||||
- "null"
|
- "null"
|
||||||
format: date-time
|
format: date-time
|
||||||
description: Valid until date
|
description: Valid until date
|
||||||
|
audit_start_date:
|
||||||
|
type:
|
||||||
|
- string
|
||||||
|
- "null"
|
||||||
|
format: date-time
|
||||||
|
description: Audit start date
|
||||||
|
audit_end_date:
|
||||||
|
type:
|
||||||
|
- string
|
||||||
|
- "null"
|
||||||
|
format: date-time
|
||||||
|
description: Audit end date
|
||||||
state:
|
state:
|
||||||
$ref: "#/components/schemas/AuditState"
|
$ref: "#/components/schemas/AuditState"
|
||||||
description: Audit state
|
description: Audit state
|
||||||
@@ -4791,6 +4803,14 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
format: date-time
|
format: date-time
|
||||||
description: Valid until date
|
description: Valid until date
|
||||||
|
audit_start_date:
|
||||||
|
type: string
|
||||||
|
format: date-time
|
||||||
|
description: Audit start date
|
||||||
|
audit_end_date:
|
||||||
|
type: string
|
||||||
|
format: date-time
|
||||||
|
description: Audit end date
|
||||||
state:
|
state:
|
||||||
$ref: "#/components/schemas/AuditState"
|
$ref: "#/components/schemas/AuditState"
|
||||||
description: Audit state
|
description: Audit state
|
||||||
@@ -4827,6 +4847,18 @@ components:
|
|||||||
- "null"
|
- "null"
|
||||||
format: date-time
|
format: date-time
|
||||||
description: Valid until date
|
description: Valid until date
|
||||||
|
audit_start_date:
|
||||||
|
type:
|
||||||
|
- string
|
||||||
|
- "null"
|
||||||
|
format: date-time
|
||||||
|
description: Audit start date
|
||||||
|
audit_end_date:
|
||||||
|
type:
|
||||||
|
- string
|
||||||
|
- "null"
|
||||||
|
format: date-time
|
||||||
|
description: Audit end date
|
||||||
state:
|
state:
|
||||||
anyOf:
|
anyOf:
|
||||||
- $ref: "#/components/schemas/AuditState"
|
- $ref: "#/components/schemas/AuditState"
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ func NewAudit(a *coredata.Audit, file *coredata.File) *Audit {
|
|||||||
HasReport: a.ReportFileID != nil,
|
HasReport: a.ReportFileID != nil,
|
||||||
ValidFrom: a.ValidFrom,
|
ValidFrom: a.ValidFrom,
|
||||||
ValidUntil: a.ValidUntil,
|
ValidUntil: a.ValidUntil,
|
||||||
|
AuditStartDate: a.AuditStartDate,
|
||||||
|
AuditEndDate: a.AuditEndDate,
|
||||||
CreatedAt: a.CreatedAt,
|
CreatedAt: a.CreatedAt,
|
||||||
UpdatedAt: a.UpdatedAt,
|
UpdatedAt: a.UpdatedAt,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user