Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 32 additions & 8 deletions src/router/Function.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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))]
Expand All @@ -31,30 +33,52 @@ private Task<SendMessageResponse> 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<AttributeValue> events = record.Dynamodb.NewImage["events"].L;
var order = JsonConvert.DeserializeObject<Order>(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;
}
}
Expand Down
20 changes: 20 additions & 0 deletions src/router/Models/Details.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace ServerlessPizzaAPI.Models
{
using System.Collections.Generic;

public class Details
{
public Details(string size, string type, int cookTime, IEnumerable<string> toppings)
{
Size = size;
Type = type;
CookTime = cookTime;
Toppings = toppings;
}

public string Size { get; }
public string Type { get; }
public int CookTime { get; }
public IEnumerable<string> Toppings { get; }
}
}
18 changes: 18 additions & 0 deletions src/router/Models/Event.cs
Original file line number Diff line number Diff line change
@@ -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; }
}
}
11 changes: 11 additions & 0 deletions src/router/Models/EventType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace ServerlessPizzaAPI.Models
{
public enum EventType
{
Unknown = 0,
Prep = 1,
Cook = 2,
Finish = 3,
Delivery = 4,
}
}
23 changes: 23 additions & 0 deletions src/router/Models/Order.cs
Original file line number Diff line number Diff line change
@@ -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<Event> 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<Event> Events { get; }
public Details Details { get; }
}
}