From 96d33bc0df2ddfba96bd1680060f6f8d91a39ad9 Mon Sep 17 00:00:00 2001
From: Muhammad Atif Ali <me@matifali.dev>
Date: Fri, 22 Nov 2024 12:10:25 +0500
Subject: [PATCH] Improve incident management in Instatus check script

- Change incident naming for better clarity.
- Ensure new incidents are not created if unresolved ones exist.
---
 .github/scripts/check.sh | 34 ++++++++++++++++++++++++----------
 1 file changed, 24 insertions(+), 10 deletions(-)

diff --git a/.github/scripts/check.sh b/.github/scripts/check.sh
index abb47907..37157e78 100755
--- a/.github/scripts/check.sh
+++ b/.github/scripts/check.sh
@@ -42,7 +42,7 @@ update_component_status() {
 
 # Function to create an incident
 create_incident() {
-    local incident_name="Testing Instatus"
+    local incident_name="Degraded Service"
     local message="The following modules are experiencing issues:\n"
     for i in "${!failures[@]}"; do
         message+="$(($i + 1)). ${failures[$i]}\n"
@@ -53,7 +53,7 @@ create_incident() {
         component_status="MAJOROUTAGE"
     fi
     # see https://instatus.com/help/api/incidents
-    response=$(curl -s -X POST "https://api.instatus.com/v1/$INSTATUS_PAGE_ID/incidents" \
+    incident_id=$(curl -s -X POST "https://api.instatus.com/v1/$INSTATUS_PAGE_ID/incidents" \
         -H "Authorization: Bearer $INSTATUS_API_KEY" \
         -H "Content-Type: application/json" \
         -d "{
@@ -68,10 +68,25 @@ create_incident() {
                     \"status\": \"PARTIALOUTAGE\"
                 }
             ]
-        }")
+        }" | jq -r '.id')
 
-    incident_id=$(echo "$response" | jq -r '.id')
-    echo "$incident_id"
+    echo "Created incident with ID: $incident_id"
+}
+
+# Function to check for existing unresolved incidents
+check_existing_incident() {
+    # Fetch the latest incidents with status not equal to "RESOLVED"
+    local unresolved_incidents=$(curl -s -X GET "https://api.instatus.com/v1/$INSTATUS_PAGE_ID/incidents" \
+        -H "Authorization: Bearer $INSTATUS_API_KEY" \
+        -H "Content-Type: application/json" | jq -r '.incidents[] | select(.status != "RESOLVED") | .id')
+
+    if [[ -n "$unresolved_incidents" ]]; then
+        echo "Unresolved incidents found: $unresolved_incidents"
+        return 0  # Indicate that there are unresolved incidents
+    else
+        echo "No unresolved incidents found."
+        return 1  # Indicate that no unresolved incidents exist
+    fi
 }
 
 # Check each module's accessibility
@@ -94,20 +109,19 @@ done
 # Determine overall status and update Instatus component
 if (( status == 0 )); then
     echo "All modules are operational."
-    # set to 
     update_component_status "OPERATIONAL"
 else
     echo "The following modules have issues: ${failures[*]}"
-    # check if all modules are down 
     if (( ${#failures[@]} == ${#modules[@]} )); then
         update_component_status "MAJOROUTAGE"
     else
         update_component_status "PARTIALOUTAGE"
     fi
 
-    # Create a new incident
-    incident_id=$(create_incident)
-    echo "Created incident with ID: $incident_id"
+    # Check if there is an existing incident before creating a new one
+    if ! check_existing_incident; then
+        create_incident
+    fi
 fi
 
 exit "${status}"