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
1 change: 1 addition & 0 deletions src/Catalog.API/Extensions/Extensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public static void AddApplicationServices(this IHostApplicationBuilder builder)
builder.Services.AddTransient<IIntegrationEventLogService, IntegrationEventLogService<CatalogContext>>();

builder.Services.AddTransient<ICatalogIntegrationEventService, CatalogIntegrationEventService>();
builder.Services.AddTransient<ICatalogStockValidationService, CatalogStockValidationService>();

builder.AddRabbitMqEventBus("eventbus")
.AddSubscription<OrderStatusChangedToAwaitingValidationIntegrationEvent, OrderStatusChangedToAwaitingValidationIntegrationEventHandler>()
Expand Down
25 changes: 25 additions & 0 deletions src/Catalog.API/IntegrationEvents/CatalogStockValidationService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
namespace eShop.Catalog.API.IntegrationEvents;

public sealed class CatalogStockValidationService(CatalogContext catalogContext) : ICatalogStockValidationService
{
public async Task<IntegrationEvent> ValidateStockAsync(int orderId, IEnumerable<OrderStockItem> orderStockItems)
{
var confirmedOrderStockItems = new List<ConfirmedOrderStockItem>();

foreach (var orderStockItem in orderStockItems)
{
var catalogItem = await catalogContext.CatalogItems.FindAsync(orderStockItem.ProductId);
if (catalogItem is not null)
{
var hasStock = catalogItem.AvailableStock >= orderStockItem.Units;
var confirmedOrderStockItem = new ConfirmedOrderStockItem(catalogItem.Id, hasStock);

confirmedOrderStockItems.Add(confirmedOrderStockItem);
}
}

return confirmedOrderStockItems.Any(c => !c.HasStock)
? new OrderStockRejectedIntegrationEvent(orderId, confirmedOrderStockItems)
: new OrderStockConfirmedIntegrationEvent(orderId);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
namespace eShop.Catalog.API.IntegrationEvents.EventHandling;

public class OrderStatusChangedToAwaitingValidationIntegrationEventHandler(
CatalogContext catalogContext,
ICatalogStockValidationService stockValidationService,
ICatalogIntegrationEventService catalogIntegrationEventService,
ILogger<OrderStatusChangedToAwaitingValidationIntegrationEventHandler> logger) :
IIntegrationEventHandler<OrderStatusChangedToAwaitingValidationIntegrationEvent>
Expand All @@ -10,23 +10,7 @@ public async Task Handle(OrderStatusChangedToAwaitingValidationIntegrationEvent
{
logger.LogInformation("Handling integration event: {IntegrationEventId} - ({@IntegrationEvent})", @event.Id, @event);

var confirmedOrderStockItems = new List<ConfirmedOrderStockItem>();

foreach (var orderStockItem in @event.OrderStockItems)
{
var catalogItem = catalogContext.CatalogItems.Find(orderStockItem.ProductId);
if (catalogItem is not null)
{
var hasStock = catalogItem.AvailableStock >= orderStockItem.Units;
var confirmedOrderStockItem = new ConfirmedOrderStockItem(catalogItem.Id, hasStock);

confirmedOrderStockItems.Add(confirmedOrderStockItem);
}
}

var confirmedIntegrationEvent = confirmedOrderStockItems.Any(c => !c.HasStock)
? (IntegrationEvent)new OrderStockRejectedIntegrationEvent(@event.OrderId, confirmedOrderStockItems)
: new OrderStockConfirmedIntegrationEvent(@event.OrderId);
var confirmedIntegrationEvent = await stockValidationService.ValidateStockAsync(@event.OrderId, @event.OrderStockItems);

await catalogIntegrationEventService.SaveEventAndCatalogContextChangesAsync(confirmedIntegrationEvent);
await catalogIntegrationEventService.PublishThroughEventBusAsync(confirmedIntegrationEvent);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace eShop.Catalog.API.IntegrationEvents;

public interface ICatalogStockValidationService
{
Task<IntegrationEvent> ValidateStockAsync(int orderId, IEnumerable<OrderStockItem> orderStockItems);
}
Loading