{
  "name": "Izini events to Slack",
  "flow": [
    {
      "id": 1,
      "module": "gateway:CustomWebHook",
      "version": 1,
      "parameters": {
        "hook": null,
        "maxResults": 1
      },
      "mapper": {},
      "metadata": {
        "designer": {
          "name": "Izini webhook"
        }
      }
    },
    {
      "id": 2,
      "module": "util:SetVariables",
      "version": 1,
      "parameters": {},
      "metadata": {
        "designer": {
          "name": "Read the signature"
        }
      },
      "mapper": {
        "variables": [
          {
            "name": "timestamp",
            "value": "{{get(map(1.__IMTHEADERS__; \"value\"; \"name\"; \"x-izini-timestamp\"); 1)}}"
          },
          {
            "name": "signature",
            "value": "{{get(map(1.__IMTHEADERS__; \"value\"; \"name\"; \"x-izini-signature-v2\"); 1)}}"
          },
          {
            "name": "signed",
            "value": "{{get(map(1.__IMTHEADERS__; \"value\"; \"name\"; \"x-izini-timestamp\"); 1)}}.{{1.value}}"
          }
        ]
      }
    },
    {
      "id": 3,
      "module": "util:SetVariables",
      "version": 1,
      "parameters": {},
      "metadata": {
        "designer": {
          "name": "Sign with your webhook secret"
        }
      },
      "mapper": {
        "variables": [
          {
            "name": "expected",
            "value": "{{sha256(2.signed; \"hex\"; \"PASTE_YOUR_IZINI_WEBHOOK_SECRET\")}}"
          },
          {
            "name": "age",
            "value": "{{abs(parseNumber(formatDate(now; \"X\")) - parseNumber(2.timestamp))}}"
          }
        ]
      }
    },
    {
      "id": 4,
      "module": "builtin:BasicRouter",
      "version": 1,
      "mapper": null,
      "metadata": {
        "designer": {
          "name": "Signed by Izini?"
        }
      },
      "routes": [
        {
          "flow": [
            {
              "id": 5,
              "module": "gateway:WebhookRespond",
              "version": 1,
              "parameters": {},
              "mapper": {
                "status": 200,
                "body": ""
              },
              "metadata": {
                "designer": {
                  "name": "Answer 200"
                }
              },
              "filter": {
                "name": "Signed by Izini, sent in the last 5 minutes",
                "conditions": [
                  [
                    {
                      "a": "{{3.expected}}",
                      "o": "text:equal",
                      "b": "{{2.signature}}"
                    },
                    {
                      "a": "{{3.age}}",
                      "o": "number:less",
                      "b": "300"
                    }
                  ]
                ]
              }
            },
            {
              "id": 6,
              "module": "json:ParseJSON",
              "version": 1,
              "parameters": {},
              "mapper": {
                "json": "{{1.value}}"
              },
              "metadata": {
                "designer": {
                  "name": "Parse event"
                }
              }
            },
            {
              "id": 7,
              "module": "util:SetVariables",
              "version": 1,
              "parameters": {},
              "metadata": {
                "designer": {
                  "name": "Describe event"
                }
              },
              "mapper": {
                "variables": [
                  {
                    "name": "headline",
                    "value": "{{switch(6.event; \"consent.updated\"; \"Consent recorded\"; \"dsar.received\"; \"New data subject request\"; \"dsar.due_soon\"; \"Data subject request due within 7 days\"; \"dsar.overdue\"; \"Data subject request past its target\"; \"dsar.closed\"; \"Data subject request closed\"; \"incident.created\"; \"Incident logged\"; \"incident.breach_clock\"; \"72-hour NDPC clock\"; \"incident.ndpc_notified\"; \"Breach reported to the NDPC\"; \"dpia.completed\"; \"DPIA completed\"; \"policy.published\"; \"Privacy policy published\"; \"vendor.dpa_review_due\"; \"Vendor DPA due for review\"; \"training.overdue\"; \"Staff training overdue\"; \"car.due\"; \"Annual audit return due 31 March\"; 6.event)}}{{if(6.event = \"incident.breach_clock\"; \": \"; \"\")}}{{if(6.event = \"incident.breach_clock\"; switch(6.payload.milestone; \"started\"; \"clock started\"; \"48h\"; \"48 hours left\"; \"24h\"; \"24 hours left\"; \"6h\"; \"6 hours left\"; \"overdue\"; \"deadline passed\"; 6.payload.milestone); \"\")}}"
                  },
                  {
                    "name": "reference",
                    "value": "{{ifempty(6.payload.reference; ifempty(6.payload.agreement_name; \"\"))}}"
                  },
                  {
                    "name": "when",
                    "value": "{{ifempty(6.payload.due_at; ifempty(6.payload.notification_deadline; ifempty(6.payload.review_due_date; ifempty(6.payload.due_date; 6.timestamp))))}}"
                  },
                  {
                    "name": "link",
                    "value": "{{ifempty(6.payload.dashboard_url; \"https://app.izini.ng/dashboard\")}}"
                  }
                ]
              }
            },
            {
              "id": 8,
              "module": "slack:CreateMessage",
              "version": 4,
              "parameters": {},
              "metadata": {
                "designer": {
                  "name": "Post to Slack"
                }
              },
              "mapper": {
                "channelWType": "manualy",
                "channel": "#compliance",
                "text": "*{{7.headline}}*{{if(7.reference; \" · \"; \"\")}}{{7.reference}}\nDate: {{7.when}}\n<{{7.link}}|Open in Izini>"
              }
            }
          ]
        },
        {
          "flow": [
            {
              "id": 9,
              "module": "gateway:WebhookRespond",
              "version": 1,
              "parameters": {},
              "mapper": {
                "status": 401,
                "body": ""
              },
              "metadata": {
                "designer": {
                  "name": "Answer 401"
                }
              },
              "filter": {
                "name": "Not signed by Izini, or too old",
                "conditions": [
                  [
                    {
                      "a": "{{3.expected}}",
                      "o": "text:notequal",
                      "b": "{{2.signature}}"
                    }
                  ],
                  [
                    {
                      "a": "{{3.age}}",
                      "o": "number:greaterorequal",
                      "b": "300"
                    }
                  ]
                ]
              }
            }
          ]
        }
      ]
    }
  ],
  "metadata": {
    "version": 1,
    "scenario": {
      "roundtrips": 1,
      "maxErrors": 3,
      "autoCommit": true,
      "autoCommitTriggerLast": true,
      "sequential": false,
      "confidential": false,
      "dataloss": false,
      "dlq": false
    }
  }
}
