Skip to content

Instantly share code, notes, and snippets.

@dcomartin
Created March 22, 2023 19:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dcomartin/235211075d417848602a434036c24aa0 to your computer and use it in GitHub Desktop.
Save dcomartin/235211075d417848602a434036c24aa0 to your computer and use it in GitHub Desktop.
public async Task CreateOrderAsync(int basketId, Address shippingAddress)
{
var basketSpec = new BasketWithItemsSpecification(basketId);
var basket = await _basketRepository.GetBySpecAsync(basketSpec);
Guard.Against.NullBasket(basketId, basket);
Guard.Against.EmptyBasketOnCheckout(basket.Items);
var catalogItemsSpecification = new CatalogItemsSpecification(basket.Items.Select(item => item.CatalogItemId).ToArray());
var catalogItems = await _itemRepository.ListAsync(catalogItemsSpecification);
var items = basket.Items.Select(basketItem =>
{
var catalogItem = catalogItems.First(c => c.Id == basketItem.CatalogItemId);
var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, _uriComposer.ComposePicUri(catalogItem.PictureUri));
var orderItem = new OrderItem(itemOrdered, basketItem.UnitPrice, basketItem.Quantity);
return orderItem;
}).ToList();
var order = new Order(basket.BuyerId, shippingAddress, items);
await _db.AddAsync(order);
await _db.SaveChangesAsync();
var orderPlacedEvent = new OrderPlacedEvent(order.Id);
var retry = Policy.Handle<Exception>()
.WaitAndRetryAsync(new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3) });
var fallback = Policy.Handle<Exception>().FallbackAsync(async _ =>
{
var s3Client = new AmazonS3Client();
await s3Client.PutObjectAsync(new PutObjectRequest
{
Key = Guid.NewGuid().ToString(),
ContentBody = JsonConvert.SerializeObject(orderPlacedEvent)
});
});
await fallback.WrapAsync(retry).ExecuteAsync(async () =>
{
await _broker.Publish(orderPlacedEvent);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment