{
  "name": "Record vendor RSS updates for human review — keep inactive",
  "flow": [
    {
      "id": 1,
      "module": "util:SetVariables",
      "version": 1,
      "parameters": {},
      "mapper": {
        "variables": [
          {
            "name": "configured",
            "value": "no"
          },
          {
            "name": "feedUrl",
            "value": "https://vendor.example.invalid/feed.xml"
          },
          {
            "name": "approvedHost",
            "value": "vendor.example.invalid"
          },
          {
            "name": "vendor",
            "value": "Fictional Sample Vendor"
          },
          {
            "name": "sheetDocumentId",
            "value": "UNSET_DOCUMENT_ID"
          },
          {
            "name": "sheetName",
            "value": "Updates"
          }
        ],
        "scope": "roundtrip"
      },
      "metadata": {
        "designer": {
          "x": 0,
          "y": 0,
          "name": "Set your feed and private sheet"
        }
      }
    },
    {
      "id": 2,
      "module": "rss:ActionReadArticles",
      "version": 4,
      "parameters": {
        "include": []
      },
      "filter": {
        "name": "Setup reviewed; approved public feed only",
        "conditions": [
          [
            {
              "a": "{{1.configured}}",
              "o": "text:equal",
              "b": "yes"
            },
            {
              "a": "{{1.feedUrl}}",
              "o": "text:pattern",
              "b": "^https://[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:[.][a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*[.][a-z]{2,63}(?:/[A-Za-z0-9_~./-]*)?$(?![\\s\\S])"
            },
            {
              "a": "{{length(1.feedUrl)}}",
              "o": "number:lessorequal",
              "b": "1500"
            },
            {
              "a": "{{get(split(substring(1.feedUrl; 8; length(1.feedUrl)); \"/\"); 1)}}",
              "o": "text:equal",
              "b": "{{1.approvedHost}}"
            },
            {
              "a": "{{1.approvedHost}}",
              "o": "text:notpattern",
              "b": "(^|[.])(invalid|test|example|local|internal|localhost|lan|home|arpa|onion|nip[.]io|sslip[.]io)$"
            },
            {
              "a": "{{1.sheetDocumentId}}",
              "o": "text:pattern",
              "b": "^[a-zA-Z0-9_-]{20,150}$"
            },
            {
              "a": "{{1.sheetDocumentId}}",
              "o": "text:notcontain",
              "b": "UNSET"
            }
          ]
        ]
      },
      "mapper": {
        "url": "{{1.feedUrl}}",
        "gzip": false,
        "maxResults": 5,
        "filterDateFrom": "",
        "filterDateTo": ""
      },
      "metadata": {
        "designer": {
          "x": 300,
          "y": 0,
          "name": "Retrieve up to five feed items"
        }
      }
    },
    {
      "id": 3,
      "module": "google-sheets:filterRows",
      "version": 2,
      "parameters": {},
      "filter": {
        "name": "Same approved host and bounded title",
        "conditions": [
          [
            {
              "a": "{{2.url}}",
              "o": "text:pattern",
              "b": "^https://[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:[.][a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*[.][a-z]{2,63}(?:/[A-Za-z0-9_~./-]*)?$(?![\\s\\S])"
            },
            {
              "a": "{{get(split(substring(2.url; 8; length(2.url)); \"/\"); 1)}}",
              "o": "text:equal",
              "b": "{{1.approvedHost}}"
            },
            {
              "a": "{{length(2.url)}}",
              "o": "number:lessorequal",
              "b": "1500"
            },
            {
              "a": "{{length(trim(2.title))}}",
              "o": "number:greater",
              "b": "0"
            },
            {
              "a": "{{length(2.title)}}",
              "o": "number:lessorequal",
              "b": "1000"
            }
          ]
        ]
      },
      "mapper": {
        "from": "share",
        "spreadsheetId": "{{1.sheetDocumentId}}",
        "sheetId": "{{1.sheetName}}",
        "includesHeaders": true,
        "tableFirstRow": "A1:Z1",
        "filter": [
          [
            {
              "a": "A",
              "o": "text:equal",
              "b": "{{sha256(1.feedUrl; \"hex\")}}:{{sha256(2.url; \"hex\")}}"
            }
          ]
        ],
        "sortOrder": "asc",
        "limit": "1",
        "valueRenderOption": "UNFORMATTED_VALUE",
        "dateTimeRenderOption": "FORMATTED_STRING"
      },
      "metadata": {
        "designer": {
          "x": 600,
          "y": 0,
          "name": "Look for this feed and article link"
        }
      }
    },
    {
      "id": 4,
      "module": "builtin:BasicAggregator",
      "version": 1,
      "parameters": {
        "feeder": 3
      },
      "mapper": {
        "__ROW_NUMBER__": "{{3.__ROW_NUMBER__}}",
        "__IMTLENGTH__": "{{3.`__IMTLENGTH__`}}"
      },
      "flags": {
        "stopIfEmpty": false
      },
      "metadata": {
        "designer": {
          "x": 900,
          "y": 0,
          "name": "Keep an empty lookup result"
        }
      }
    },
    {
      "id": 5,
      "module": "google-sheets:addRow",
      "version": 2,
      "parameters": {},
      "filter": {
        "name": "Append only after a successful empty lookup",
        "conditions": [
          [
            {
              "a": "{{length(4.array)}}",
              "o": "number:equal",
              "b": "1"
            },
            {
              "a": "{{get(4.array; \"1.__IMTLENGTH__\")}}",
              "o": "exist"
            },
            {
              "a": "{{get(4.array; \"1.__IMTLENGTH__\")}}",
              "o": "text:equal",
              "b": "0"
            }
          ]
        ]
      },
      "mapper": {
        "mode": "map",
        "insertUnformatted": true,
        "spreadsheetId": "{{1.sheetDocumentId}}",
        "sheetId": "{{1.sheetName}}",
        "tableFirstRow": "A1:Z1",
        "valueInputOption": "RAW",
        "insertDataOption": "INSERT_ROWS",
        "values": {
          "0": "{{sha256(1.feedUrl; \"hex\")}}:{{sha256(2.url; \"hex\")}}",
          "1": "{{1.vendor}}",
          "2": "{{1.feedUrl}}",
          "3": "{{2.url}}",
          "4": "{{2.title}}",
          "5": "{{if(2.rssFields.pubdate; formatDate(2.dateCreated; \"YYYY-MM-DDTHH:mm:ss.SSS[Z]\"; \"UTC\"); emptystring)}}",
          "6": "{{formatDate(now; \"YYYY-MM-DDTHH:mm:ss.SSS[Z]\"; \"UTC\")}}",
          "7": "{{formatDate(now; \"YYYY-MM-DDTHH:mm:ss.SSS[Z]\"; \"UTC\")}}",
          "8": "review_needed",
          "9": "Feed item only; open the source and check its claim."
        }
      },
      "metadata": {
        "designer": {
          "x": 1200,
          "y": 0,
          "name": "Append review-needed source row"
        }
      }
    }
  ],
  "metadata": {
    "instant": false,
    "version": 1,
    "scenario": {
      "roundtrips": 1,
      "maxErrors": 1,
      "autoCommit": true,
      "autoCommitTriggerLast": true,
      "sequential": true,
      "slots": null,
      "confidential": false,
      "dataloss": false,
      "dlq": false,
      "freshVariables": false
    },
    "designer": {
      "orphans": []
    },
    "notes": []
  }
}
