Skip to content
Merged
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
3 changes: 2 additions & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@
</PackageVersion>
<PackageVersion Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.0" />
<PackageVersion Include="Microsoft.Win32.Primitives" Version="4.3.0" />
<PackageVersion Include="MinimalApi.Endpoint" Version="1.3.0" />
<PackageVersion Include="Minimalpi.Endpoint" Version="1.3.0" />
<PackageVersion Include="NimblePros.SharedKernel" Version="2.1.1" />
<PackageVersion Include="NimblePros.Metronome" Version="0.4.1" />
<PackageVersion Include="NSubstitute" Version="5.3.0" />
<PackageVersion Include="NSubstitute.Analyzers.CSharp" Version="1.0.17" />
Expand Down
5 changes: 3 additions & 2 deletions src/ApplicationCore/ApplicationCore.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
<ItemGroup>
<PackageReference Include="Ardalis.GuardClauses" />
<PackageReference Include="Ardalis.Result" />
<PackageReference Include="Ardalis.Specification" />
<PackageReference Include="System.Security.Claims" />
<PackageReference Include="Ardalis.Specification" />
<PackageReference Include="NimblePros.SharedKernel" />
<PackageReference Include="System.Security.Claims" />
<PackageReference Include="System.Text.Json" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
using Ardalis.SharedKernel;

namespace Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate.Events;
public class OrderCreatedEvent(Order order) : DomainEventBase
{
public Order Order { get; init; } = order;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System.Threading;
using System.Threading.Tasks;
using MediatR;
using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate.Events;
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
using Microsoft.Extensions.Logging;

namespace Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate.Handlers;

public class OrderCreatedHandler(ILogger<OrderCreatedHandler> logger, IEmailSender emailSender) : INotificationHandler<OrderCreatedEvent>
{
public async Task Handle(OrderCreatedEvent domainEvent, CancellationToken cancellationToken)
{
logger.LogInformation("Order #{orderId} placed: ", domainEvent.Order.Id);

await emailSender.SendEmailAsync("[email protected]",
"Order Created",
$"Order with id {domainEvent.Order.Id} was created.");
}
}
8 changes: 7 additions & 1 deletion src/ApplicationCore/Services/OrderService.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
using System.Linq;
using System.Threading.Tasks;
using Ardalis.GuardClauses;
using MediatR;
using Microsoft.eShopWeb.ApplicationCore.Entities;
using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;
using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate;
using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate.Events;
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
using Microsoft.eShopWeb.ApplicationCore.Specifications;

Expand All @@ -15,16 +17,18 @@ public class OrderService : IOrderService
private readonly IUriComposer _uriComposer;
private readonly IRepository<Basket> _basketRepository;
private readonly IRepository<CatalogItem> _itemRepository;
private readonly IMediator _mediator;

public OrderService(IRepository<Basket> basketRepository,
IRepository<CatalogItem> itemRepository,
IRepository<Order> orderRepository,
IUriComposer uriComposer)
IUriComposer uriComposer, IMediator mediator)
{
_orderRepository = orderRepository;
_uriComposer = uriComposer;
_basketRepository = basketRepository;
_itemRepository = itemRepository;
_mediator = mediator;
}

public async Task CreateOrderAsync(int basketId, Address shippingAddress)
Expand All @@ -49,5 +53,7 @@ public async Task CreateOrderAsync(int basketId, Address shippingAddress)
var order = new Order(basket.BuyerId, shippingAddress, items);

await _orderRepository.AddAsync(order);
OrderCreatedEvent orderCreatedEvent = new OrderCreatedEvent(order);
await _mediator.Publish(orderCreatedEvent);
}
}
15 changes: 0 additions & 15 deletions src/Infrastructure/Services/EmailSender.cs

This file was deleted.

13 changes: 13 additions & 0 deletions src/Infrastructure/Services/LoggerEmailSender.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System.Threading.Tasks;
using Microsoft.eShopWeb.ApplicationCore.Interfaces;

namespace Microsoft.eShopWeb.Infrastructure.Services;

public class LoggerEmailSender(IAppLogger<LoggerEmailSender> logger): IEmailSender
{
public Task SendEmailAsync(string email, string subject, string message)
{
logger.LogInformation("to: {email}, subject: {emailSubject}, message: {emailMessage}", email, subject, message);
return Task.CompletedTask;
}
}
2 changes: 1 addition & 1 deletion src/Web/Configuration/ConfigureCoreServices.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public static IServiceCollection AddCoreServices(this IServiceCollection service
services.AddSingleton<IUriComposer>(new UriComposer(catalogSettings));

services.AddScoped(typeof(IAppLogger<>), typeof(LoggerAdapter<>));
services.AddTransient<IEmailSender, EmailSender>();
services.AddTransient<IEmailSender, LoggerEmailSender>();

return services;
}
Expand Down
12 changes: 9 additions & 3 deletions src/Web/Configuration/ConfigureWebServices.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Microsoft.eShopWeb.Web.Interfaces;
using Microsoft.eShopWeb.ApplicationCore.Services;
using Microsoft.eShopWeb.Web.Interfaces;
using Microsoft.eShopWeb.Web.Services;

namespace Microsoft.eShopWeb.Web.Configuration;
Expand All @@ -7,8 +8,13 @@ public static class ConfigureWebServices
{
public static IServiceCollection AddWebServices(this IServiceCollection services, IConfiguration configuration)
{
services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(BasketViewModelService).Assembly));
// Add MediatR support for the services
services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(typeof(BasketViewModelService).Assembly);
cfg.RegisterServicesFromAssembly(typeof(OrderService).Assembly);
}
);
services.AddScoped<IBasketViewModelService, BasketViewModelService>();
services.AddScoped<CatalogViewModelService>();
services.AddScoped<ICatalogItemViewModelService, CatalogItemViewModelService>();
Expand Down