Advertisement
Guest User

Event Out of Order Controller

a guest
Nov 20th, 2019
350
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.67 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Microsoft.AspNetCore.Mvc;
  6. using Microsoft.Azure.EventGrid;
  7. using Microsoft.Azure.EventGrid.Models;
  8. using Microsoft.Extensions.Logging;
  9.  
  10. using System.Text.Json;
  11.  
  12. namespace order_eg.Controllers
  13. {
  14.     public class Item
  15.     {
  16.         public string Name { get; set; }
  17.  
  18.         public int Version { get; set; }
  19.  
  20.     }
  21.     [ApiController]
  22.     [Route("[controller]")]
  23.     public class OrderController : ControllerBase
  24.     {
  25.         static private Item CurrentItem = new Item { Name = "Initial", Version = 0 };
  26.  
  27.         private readonly ILogger<OrderController> _logger;
  28.  
  29.         public OrderController(ILogger<OrderController> logger)
  30.         {
  31.             _logger = logger;
  32.         }
  33.  
  34.         [HttpGet]
  35.         public async Task<ActionResult<Item>> GetItem()
  36.         {
  37.             //var topicEndpoint = "https://my-entity-topic.westeurope-1.eventgrid.azure.net/api/events";
  38.             var topicKey = "";
  39.             var eventGridClient = new EventGridClient(new TopicCredentials(topicKey));
  40.             var eventsList1 = CreateEvent(1);
  41.             var eventsList2 = CreateEvent(2);
  42.  
  43.             await eventGridClient.PublishEventsAsync("my-entity-topic.westeurope-1.eventgrid.azure.net", eventsList2);
  44.             await Task.Delay(1000);
  45.             await eventGridClient.PublishEventsAsync("my-entity-topic.westeurope-1.eventgrid.azure.net", eventsList1);
  46.  
  47.             return Ok(CurrentItem);
  48.         }
  49.  
  50.         private static List<EventGridEvent> CreateEvent(int inc)
  51.         {
  52.             var eventsList = new List<EventGridEvent>();
  53.             eventsList.Add(new EventGridEvent()
  54.             {
  55.                 Id = Guid.NewGuid().ToString(),
  56.                 Data = new Item()
  57.                 {
  58.                     Name = "Test",
  59.                     Version = CurrentItem.Version + inc
  60.                 },
  61.                 EventTime = DateTime.Now,
  62.                 EventType = "Custom",
  63.                 Subject = "MyTopic",
  64.                 DataVersion = "1.0"
  65.             });
  66.             return eventsList;
  67.         }
  68.  
  69.         [HttpPost]
  70.         public ActionResult Update(Item item)
  71.         {
  72.             if (item.Version == CurrentItem.Version + 1)
  73.             {
  74.                 CurrentItem = item;
  75.                 return Ok();
  76.             }
  77.             throw new Exception("Out of order message"); // https://docs.microsoft.com/en-us/azure/event-grid/delivery-and-retry#failure-codes
  78.  
  79.         }
  80.  
  81.         [HttpPost("webhook")]
  82.         public ActionResult WebHook([FromBody]EventGridEvent[] eventGridEvents)
  83.         {
  84.             _logger.LogInformation("Recieved {0} {1}", eventGridEvents.Length, eventGridEvents.FirstOrDefault()?.Data);
  85.  
  86.             var eventGridEvent = eventGridEvents.FirstOrDefault(); // TODO:
  87.  
  88.             if (eventGridEvent == null) return BadRequest();
  89.  
  90.             if (eventGridEvent.EventType == EventTypes.EventGridSubscriptionValidationEvent)
  91.             {
  92.                 var element = (JsonElement)eventGridEvent.Data;
  93.                 var json = element.GetRawText();
  94.                 var data = JsonSerializer.Deserialize<SubscriptionValidationEventData>(json);
  95.                 var response = new SubscriptionValidationResponse(data.ValidationCode);
  96.                 return Ok(response);
  97.                
  98.             }
  99.             else // TODO: event type
  100.             {
  101.                 var element = (JsonElement)eventGridEvent.Data;
  102.                 var json = element.GetRawText();
  103.                 var data = JsonSerializer.Deserialize<Item>(json);
  104.                 return Update(data);
  105.             }
  106.         }
  107.     }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement