diff --git a/src/ApiServer/fixtures/revisions.js b/src/ApiServer/fixtures/revisions.js index 048a9d2b..eafa7ba1 100644 --- a/src/ApiServer/fixtures/revisions.js +++ b/src/ApiServer/fixtures/revisions.js @@ -163,28 +163,27 @@ export default [ }, icon: "bot", upgradesAvailable: false, - triggers: { - manual: { - enable: true, - }, - scheduler: { - enable: false, - }, - webhook: { - enable: false, - }, - event: { - enable: false, - type: null, - subject: null, - }, - }, - tokens: [ - { - token: "7AFBE8B30B2958B2B1879AAAF59B68EC31BF7C581F6D1C0833F64F623A667102", - label: "default", - }, - ], + triggers: [{ + type: "manual", + enabled: true, + conditions: null, + },{ + type: "webhook", + enabled: false, + conditions: null, + },{ + type: "scheduler", + enabled: false, + conditions: null, + },{ + type: "event", + enabled: true, + conditions: [{operation: "matches", field: "type", value: "io.boomerang.test"}, {operation: "matches", field: "subject", value: "australia"}], + },{ + type: "github", + enabled: true, + conditions: [{operation: "in", field: "event", values: ["create", "delete"]}, {operation: "in", field: "repository", values: ["australia","img","test"]}], + }], config: [ { key: "token", diff --git a/src/ApiServer/fixtures/summaries.js b/src/ApiServer/fixtures/summaries.js index d7c46101..8d6ba09f 100644 --- a/src/ApiServer/fixtures/summaries.js +++ b/src/ApiServer/fixtures/summaries.js @@ -135,15 +135,27 @@ const summaries = [ name: "ML Train – Bot Efficiency", shortDescription: "Train and store ML model for Bot Efficiency.", status: "active", - triggers: { - scheduler: { enable: false }, - webhook: { enable: false }, - event: { - enable: false, - type: null, - subject: null, - }, - }, + triggers: [{ + type: "manual", + enabled: true, + conditions: null, + },{ + type: "webhook", + enabled: false, + conditions: null, + },{ + type: "scheduler", + enabled: false, + conditions: null, + },{ + type: "event", + enabled: true, + conditions: [{operation: "matches", field: "type", value: "io.boomerang.test"}, {operation: "matches", field: "subject", value: "australia"}], + },{ + type: "github", + enabled: true, + conditions: [{operation: "in", field: "event", values: ["create", "delete"]}, {operation: "in", field: "repository", values: ["australia","img","test"]}], + }], labels: [ { key: "testing", @@ -163,7 +175,6 @@ const summaries = [ }, ], scope: "team", - tokens: [], storage: { activity: { enabled: true, @@ -317,15 +328,27 @@ const summaries = [ name: "ML Train – Bot Efficiency", shortDescription: "Train and store ML model for Bot Efficiency.", status: "active", - triggers: { - scheduler: { enable: false }, - webhook: { enable: false}, - event: { - enable: false, - type: null, - subject: null, - }, - }, + triggers: [{ + type: "manual", + enabled: true, + conditions: null, + },{ + type: "webhook", + enabled: false, + conditions: null, + },{ + type: "scheduler", + enabled: false, + conditions: null, + },{ + type: "event", + enabled: true, + conditions: [{operation: "matches", field: "type", value: "io.boomerang.test"}, {operation: "matches", field: "subject", value: "australia"}], + },{ + type: "github", + enabled: true, + conditions: [{operation: "in", field: "event", values: ["create", "delete"]}, {operation: "in", field: "repository", values: ["australia","img","test"]}], + }], labels: [ { key: "purpose", @@ -333,7 +356,6 @@ const summaries = [ }, ], scope: "system", - tokens: [], storage: { activity: { enabled: true, @@ -379,23 +401,27 @@ const summaries = [ name: "Java - Deploy", shortDescription: "", status: "active", - triggers: { - manual: { - enable: true, - }, - scheduler: { - enable: false, - }, - webhook: { - enable: true, - }, - event: { - enable: false, - type: null, - subject: null, - }, - }, - tokens: [], + triggers: [{ + type: "manual", + enabled: true, + conditions: null, + },{ + type: "webhook", + enabled: false, + conditions: null, + },{ + type: "scheduler", + enabled: false, + conditions: null, + },{ + type: "event", + enabled: true, + conditions: [{operation: "matches", field: "type", value: "io.boomerang.test"}, {operation: "matches", field: "subject", value: "australia"}], + },{ + type: "github", + enabled: true, + conditions: [{operation: "in", field: "event", values: ["create", "delete"]}, {operation: "in", field: "repository", values: ["australia","img","test"]}], + }], storage: { activity: { enabled: true, @@ -441,23 +467,27 @@ const summaries = [ name: "Java - Build", shortDescription: "Java - Build", status: "active", - triggers: { - manual: { - enable: true, - }, - scheduler: { - enable: false, - }, - webhook: { - enable: true, - }, - event: { - enable: false, - type: null, - subject: null, - }, - }, - tokens: [], + triggers: [{ + type: "manual", + enabled: true, + conditions: null, + },{ + type: "webhook", + enabled: false, + conditions: null, + },{ + type: "scheduler", + enabled: false, + conditions: null, + },{ + type: "event", + enabled: true, + conditions: [{operation: "matches", field: "type", value: "io.boomerang.test"}, {operation: "matches", field: "subject", value: "australia"}], + },{ + type: "github", + enabled: true, + conditions: [{operation: "in", field: "event", values: ["create", "delete"]}, {operation: "in", field: "repository", values: ["australia","img","test"]}], + }], storage: { activity: { enabled: true, diff --git a/src/Features/Editor/Configure/Configure.tsx b/src/Features/Editor/Configure/Configure.tsx index e4ec6201..2c72abee 100644 --- a/src/Features/Editor/Configure/Configure.tsx +++ b/src/Features/Editor/Configure/Configure.tsx @@ -94,27 +94,7 @@ function ConfigureContainer({ quotas, workflow, settingsRef }: ConfigureContaine timeout: workflow.timeout ?? null, retries: workflow.retries ?? null, labels: workflow.labels ? Object.entries(workflow.labels).map(([key, value]) => ({ key, value })) : [], - triggers: { - manual: { - enable: workflow.triggers?.manual?.enable ?? true, - }, - event: { - enable: workflow.triggers?.event?.enable ?? false, - subject: workflow.triggers?.event?.subject ?? "", - type: workflow.triggers?.event?.type ?? "", - }, - scheduler: { - enable: workflow.triggers?.scheduler?.enable ?? false, - }, - webhook: { - enable: workflow.triggers?.webhook?.enable ?? false, - }, - github: { - enable: workflow.triggers?.github?.enable ?? false, - events: workflow.triggers?.github?.events ?? [], - repositories: workflow.triggers?.github?.repositories ?? [], - }, - }, + triggers: workflow.triggers ?? [], config: workflow.config ?? [], }} validationSchema={Yup.object().shape({ @@ -136,27 +116,20 @@ function ConfigureContainer({ quotas, workflow, settingsRef }: ConfigureContaine name: Yup.string().required("Name is required").max(64, "Name must not be greater than 64 characters"), retries: Yup.number(), timeout: Yup.number(), - triggers: Yup.object().shape({ - manual: Yup.object().shape({ - enable: Yup.boolean(), - }), - event: Yup.object().shape({ - enable: Yup.boolean(), + triggers: Yup.array().of( + Yup.object().shape({ type: Yup.string(), - subject: Yup.string(), - }), - scheduler: Yup.object().shape({ - enable: Yup.boolean(), - }), - webhook: Yup.object().shape({ - enable: Yup.boolean(), - }), - github: Yup.object().shape({ - enable: Yup.boolean(), - events: Yup.array().of(Yup.string()), - repositories: Yup.array().of(Yup.string()), - }), - }), + enabled: Yup.boolean(), + conditions: Yup.array().of( + Yup.object().shape({ + operation: Yup.string(), + field: Yup.string(), + value: Yup.string().optional(), + values: Yup.array().of(Yup.string()).optional(), + }) + ), + }) + ), })} > {(formikProps) => @@ -331,8 +304,8 @@ function Configure(props: ConfigureProps) { id="triggers.manual.enable" data-testid="triggers.manual.enable" label="Enable" - onToggle={(checked: boolean) => handleOnToggleChange(checked, "triggers.manual.enable")} - toggled={values.triggers.manual.enable} + onToggle={(checked: boolean) => handleOnToggleChange(checked, "triggers.manual.enabled")} + toggled={values.triggers.some((trigger) => trigger.type === "manual" && trigger.enabled)} /> </div> </Section> @@ -343,11 +316,11 @@ function Configure(props: ConfigureProps) { id="triggers.scheduler.enable" data-testid="triggers.scheduler.enable" label="Enable" - onToggle={(checked: boolean) => handleOnToggleChange(checked, "triggers.scheduler.enable")} - toggled={values.triggers.scheduler.enable} + onToggle={(checked: boolean) => handleOnToggleChange(checked, "triggers.scheduler.enabled")} + toggled={values.triggers.some((trigger) => trigger.type === "scheduler" && trigger.enabled)} /> </div> - {values.triggers.scheduler.enable ? ( + {values.triggers.some((trigger) => trigger.type === "scheduler" && trigger.enabled) ? ( <InlineNotification lowContrast kind="info" @@ -373,14 +346,14 @@ function Configure(props: ConfigureProps) { <Toggle id="triggers.webhook.enable" label="Enable" - toggled={values.triggers.webhook.enable} + toggled={values.triggers.some((trigger) => trigger.type === "webhook" && trigger.enabled)} onToggle={(checked: boolean) => handleOnToggleChange(checked, "triggers.webhook.enable")} tooltipContent="Enable workflow to be executed by a webhook" tooltipProps={{ direction: "top" }} reversed /> </div> - {values.triggers.webhook.enable && ( + {values.triggers.some((trigger) => trigger.type === "webhook" && trigger.enabled) && ( <ComposedModal modalHeaderProps={{ title: "Webhook Usage", @@ -423,14 +396,14 @@ function Configure(props: ConfigureProps) { <Toggle id="triggers.event.enable" label="Enable" - toggled={values.triggers.event.enable} - onToggle={(checked: boolean) => handleOnToggleChange(checked, "triggers.event.enable")} + toggled={values.triggers.some((trigger) => trigger.type === "event" && trigger.enabled)} + onToggle={(checked: boolean) => handleOnToggleChange(checked, "triggers.event.enabled")} tooltipContent="Enable workflow to be triggered by received events." tooltipProps={{ direction: "top" }} reversed /> </div> - {values.triggers.event.enable && ( + {values.triggers.some((trigger) => trigger.type === "event" && trigger.enabled) && ( <> <p className={styles.sectionDescription}> The following filters will be applied to any incoming event based on the{" "} diff --git a/src/Types/index.tsx b/src/Types/index.tsx index b0bf0e54..7ecf27f9 100644 --- a/src/Types/index.tsx +++ b/src/Types/index.tsx @@ -152,27 +152,7 @@ export interface Workflow { date: string; }; config: Array<DataDrivenInput>; - triggers: { - manual: { - enable: boolean; - }; - event: { - enable: boolean; - subject: string; - type: string; - }; - scheduler: { - enable: boolean; - }; - webhook: { - enable: boolean; - }; - github: { - enable: boolean; - events: Array<string>; - repositories: Array<string>; - }; - }; + triggers: Array<WorkflowTrigger>; templateUpgradesAvailable: boolean; workspaces: Array<{ name: string; @@ -192,6 +172,33 @@ export enum WorkflowStatus { Inactive = "inactive", } +export interface WorkflowTrigger { + enabled: boolean; + type: WorkflowTriggerType; + conditions: Array<WorkflowTriggerCondition>; +} + +export enum WorkflowTriggerType { + Manual = "manual", + Scheduler = "scheduler", + Event = "event", + Webhook = "webhook", + GitHub = "github", +} + +export interface WorkflowTriggerCondition { + operation: WorkflowTriggerConditionOperation; + field: string; + value: string; + values: Array<string>; +} + +export enum WorkflowTriggerConditionOperation { + Matches = "matches", + Equals = "equals", + In = "in", +} + export type WorkflowViewType = ObjectValuesToType<typeof WorkflowView>; export type EdgeExecutionConditionType = ObjectValuesToType<typeof EdgeExecutionCondition>; @@ -746,26 +753,6 @@ export interface ConfigureWorkflowFormValues { timeout: number; retries: number; labels: Array<{ key: string; value: string }>; - triggers: { - manual: { - enable: boolean; - }; - event: { - enable: boolean; - type: string; - subject: string; - }; - scheduler: { - enable: boolean; - }; - webhook: { - enable: boolean; - }; - github: { - enable: boolean; - events: Array<string>; - repositories: Array<string>; - }; - }; + triggers: Array<WorkflowTrigger>; config: Array<DataDrivenInput>; }