From ad18adf471201f66cfdff3bddf3b7848f7053a7c Mon Sep 17 00:00:00 2001
From: Daniel James Smith <djsmith85@users.noreply.github.com>
Date: Tue, 30 Nov 2021 19:47:56 +0100
Subject: [PATCH] Migrate deprecated Microsoft.Azure.EventGrid to
 Azure.Messaging.EventGrid (#1731)

* Migrate from deprecated Microsoft.Azure.EventGrid to Azure.Messaging.EventGrid

* Fixed retrieval/parsing of EventGridEvents

* Fixed an issue where the events where not handled by the registered event handlers
---
 src/Api/Api.csproj                       |  2 +-
 src/Api/Controllers/CiphersController.cs |  2 +-
 src/Api/Controllers/SendsController.cs   |  2 +-
 src/Api/Utilities/ApiHelpers.cs          | 34 +++++++++++-------------
 4 files changed, 18 insertions(+), 22 deletions(-)

diff --git a/src/Api/Api.csproj b/src/Api/Api.csproj
index a587328913..f02d00718b 100644
--- a/src/Api/Api.csproj
+++ b/src/Api/Api.csproj
@@ -28,10 +28,10 @@
   </Choose>
 
   <ItemGroup>
+    <PackageReference Include="Azure.Messaging.EventGrid" Version="4.7.0" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.9" />
     <PackageReference Include="NewRelic.Agent" Version="8.41.0" />
     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
-    <PackageReference Include="Microsoft.Azure.EventGrid" Version="3.2.0" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/Api/Controllers/CiphersController.cs b/src/Api/Controllers/CiphersController.cs
index b19f4f453d..5a982418c6 100644
--- a/src/Api/Controllers/CiphersController.cs
+++ b/src/Api/Controllers/CiphersController.cs
@@ -14,7 +14,7 @@ using System.Collections.Generic;
 using Bit.Core.Models.Table;
 using Bit.Core.Settings;
 using Core.Models.Data;
-using Microsoft.Azure.EventGrid.Models;
+using Azure.Messaging.EventGrid;
 using Bit.Core.Models.Data;
 using Microsoft.Extensions.Logging;
 using Newtonsoft.Json;
diff --git a/src/Api/Controllers/SendsController.cs b/src/Api/Controllers/SendsController.cs
index f8f1689215..16d6c2d86b 100644
--- a/src/Api/Controllers/SendsController.cs
+++ b/src/Api/Controllers/SendsController.cs
@@ -12,7 +12,7 @@ using Bit.Core.Settings;
 using Bit.Core.Models.Api.Response;
 using Bit.Core.Enums;
 using Bit.Core.Context;
-using Microsoft.Azure.EventGrid.Models;
+using Azure.Messaging.EventGrid;
 using Bit.Api.Utilities;
 using System.Collections.Generic;
 using Bit.Core.Models.Table;
diff --git a/src/Api/Utilities/ApiHelpers.cs b/src/Api/Utilities/ApiHelpers.cs
index 83677bf8e0..4076b8e784 100644
--- a/src/Api/Utilities/ApiHelpers.cs
+++ b/src/Api/Utilities/ApiHelpers.cs
@@ -1,8 +1,8 @@
 using Bit.Core.Utilities;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
-using Microsoft.Azure.EventGrid;
-using Microsoft.Azure.EventGrid.Models;
+using Azure.Messaging.EventGrid;
+using Azure.Messaging.EventGrid.SystemEvents;
 using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
@@ -55,29 +55,25 @@ namespace Bit.Api.Utilities
             }
 
             var response = string.Empty;
-            var requestContent = await new StreamReader(request.Body).ReadToEndAsync();
-            if (string.IsNullOrWhiteSpace(requestContent))
-            {
-                return new OkObjectResult(response);
-            }
-
-            var eventGridSubscriber = new EventGridSubscriber();
-            var eventGridEvents = eventGridSubscriber.DeserializeEventGridEvents(requestContent);
-
+            var requestData = await BinaryData.FromStreamAsync(request.Body);
+            var eventGridEvents = EventGridEvent.ParseMany(requestData);
             foreach (var eventGridEvent in eventGridEvents)
             {
-                if (eventGridEvent.Data is SubscriptionValidationEventData eventData)
+                if (eventGridEvent.TryGetSystemEventData(out object systemEvent))
                 {
-                    // Might want to enable additional validation: subject, topic etc.
-
-                    var responseData = new SubscriptionValidationResponse()
+                    if (systemEvent is SubscriptionValidationEventData eventData)
                     {
-                        ValidationResponse = eventData.ValidationCode
-                    };
+                        // Might want to enable additional validation: subject, topic etc.
+                        var responseData = new SubscriptionValidationResponse()
+                        {
+                            ValidationResponse = eventData.ValidationCode
+                        };
 
-                    return new OkObjectResult(responseData);
+                        return new OkObjectResult(responseData);
+                    }
                 }
-                else if (eventTypeHandlers.ContainsKey(eventGridEvent.EventType))
+
+                if (eventTypeHandlers.ContainsKey(eventGridEvent.EventType))
                 {
                     await eventTypeHandlers[eventGridEvent.EventType](eventGridEvent);
                 }