diff --git a/src/router/Function.cs b/src/router/Function.cs index b061318..159aed3 100644 --- a/src/router/Function.cs +++ b/src/router/Function.cs @@ -8,6 +8,8 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Amazon.DynamoDBv2.DocumentModel; +using ServerlessPizzaAPI.Models; // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))] @@ -31,30 +33,52 @@ private Task SendSQSMessage(string functionName, string pay public void FunctionHandler(DynamoDBEvent dynamoEvent, ILambdaContext context) { + Console.WriteLine($"Incoming Event: {JsonConvert.SerializeObject(dynamoEvent)}"); + foreach (DynamoDBEvent.DynamodbStreamRecord record in dynamoEvent.Records) { - string json = JsonConvert.SerializeObject(record); + string json = Document.FromAttributeMap(record.Dynamodb.NewImage).ToJson(); + Console.WriteLine($"Record: {json}"); - List events = record.Dynamodb.NewImage["events"].L; + var order = JsonConvert.DeserializeObject(json); - if (events.Count == 0) + if (order.Events == null || !order.Events.Any()) { + Console.WriteLine($"Sending message to Prep queue"); SendSQSMessage("serverless-pizza-prep", json).Wait(); } else { - switch (events.Last().M["type"].S) + var orderedEvents = order.Events.OrderBy(e => (int)e.Type); + + Console.WriteLine($"Events: {string.Join(", ", orderedEvents.Select(e => e.Type))}"); + + var lastEvent = orderedEvents.Last(); + + Console.WriteLine($"Last event: {JsonConvert.SerializeObject(lastEvent)}"); + + if (lastEvent.End == null) + { + Console.WriteLine($"Last event end is null, nothing to route."); + return; + } + + switch (lastEvent.Type) { - case "prep": + case EventType.Prep: + Console.WriteLine($"Sending message to Cook queue"); SendSQSMessage("serverless-pizza-cook", json).Wait(); break; - case "cook": + case EventType.Cook: + Console.WriteLine($"Sending message to Finish queue"); SendSQSMessage("serverless-pizza-finish", json).Wait(); break; - case "finish": + case EventType.Finish: + Console.WriteLine($"Sending message to Deliver queue"); SendSQSMessage("serverless-pizza-deliver", json).Wait(); break; - case "deliver": + case EventType.Delivery: + Console.WriteLine($"Order delivered, nothing more to do."); break; } } diff --git a/src/router/Models/Details.cs b/src/router/Models/Details.cs new file mode 100644 index 0000000..ad5e4b9 --- /dev/null +++ b/src/router/Models/Details.cs @@ -0,0 +1,20 @@ +namespace ServerlessPizzaAPI.Models +{ + using System.Collections.Generic; + + public class Details + { + public Details(string size, string type, int cookTime, IEnumerable toppings) + { + Size = size; + Type = type; + CookTime = cookTime; + Toppings = toppings; + } + + public string Size { get; } + public string Type { get; } + public int CookTime { get; } + public IEnumerable Toppings { get; } + } +} diff --git a/src/router/Models/Event.cs b/src/router/Models/Event.cs new file mode 100644 index 0000000..789b5b6 --- /dev/null +++ b/src/router/Models/Event.cs @@ -0,0 +1,18 @@ +namespace ServerlessPizzaAPI.Models +{ + using System; + + public class Event + { + public Event(EventType type, DateTime start, DateTime? end) + { + Type = type; + Start = start; + End = end; + } + + public EventType Type { get; } + public DateTime Start { get; } + public DateTime? End { get; } + } +} diff --git a/src/router/Models/EventType.cs b/src/router/Models/EventType.cs new file mode 100644 index 0000000..12250b0 --- /dev/null +++ b/src/router/Models/EventType.cs @@ -0,0 +1,11 @@ +namespace ServerlessPizzaAPI.Models +{ + public enum EventType + { + Unknown = 0, + Prep = 1, + Cook = 2, + Finish = 3, + Delivery = 4, + } +} diff --git a/src/router/Models/Order.cs b/src/router/Models/Order.cs new file mode 100644 index 0000000..7164c16 --- /dev/null +++ b/src/router/Models/Order.cs @@ -0,0 +1,23 @@ +namespace ServerlessPizzaAPI.Models +{ + using System; + using System.Collections.Generic; + + public class Order + { + public Order(string id, string name, DateTime placed, IEnumerable events, Details details) + { + Id = id; + Name = name; + Placed = placed; + Events = events; + Details = details; + } + + public string Id { get; } + public string Name { get; } + public DateTime Placed { get; } + public IEnumerable Events { get; } + public Details Details { get; } + } +}