Adding more microservices for tenantA and tenantB
This commit is contained in:
parent
fda92f6928
commit
7e246bd7c3
@ -1,49 +0,0 @@
|
||||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions;
|
||||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Events;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using Ordering.API.Application.IntegrationEvents.Events;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using TenantACustomisations.Services;
|
||||
|
||||
namespace TenantACustomisations.IntegrationEvents.EventHandling
|
||||
{
|
||||
public class CustomisationEventHandler : IIntegrationEventHandler<CustomisationEvent>
|
||||
{
|
||||
|
||||
private readonly ILogger<CustomisationEventHandler> _logger;
|
||||
private readonly IEventBus _eventBus;
|
||||
private readonly IValidationService validationService;
|
||||
|
||||
public CustomisationEventHandler(ILogger<CustomisationEventHandler> logger, IEventBus eventBus)
|
||||
{
|
||||
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||
_eventBus = eventBus ?? throw new ArgumentNullException(nameof(eventBus));
|
||||
validationService = new ValidationService();
|
||||
}
|
||||
|
||||
public async Task Handle(CustomisationEvent @event)
|
||||
{
|
||||
_logger.LogInformation("----- Handling integration event: {IntegrationEventId} - ({@IntegrationEvent})", @event.Id, @event);
|
||||
IntegrationEvent integrationEvent = @event.@event;
|
||||
|
||||
switch (integrationEvent.GetType().Name)
|
||||
{
|
||||
case "UserCheckoutAcceptedIntegrationEvent":
|
||||
if (validationService.Validate((UserCheckoutAcceptedIntegrationEvent)integrationEvent))
|
||||
{
|
||||
integrationEvent.CheckForCustomisation = false;
|
||||
_eventBus.Publish(integrationEvent);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
integrationEvent.CheckForCustomisation = false;
|
||||
_eventBus.Publish(integrationEvent);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,60 +0,0 @@
|
||||
using MediatR;
|
||||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions;
|
||||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Extensions;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Ordering.API.Application.Behaviors;
|
||||
using Serilog.Context;
|
||||
using System.Threading.Tasks;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using TenantACustomisations.IntegrationEvents.Events;
|
||||
using TenantACustomisations.ExternalServices;
|
||||
using TenantACustomisations.Database;
|
||||
|
||||
namespace TenantACustomisations.IntegrationEvents.EventHandling
|
||||
{
|
||||
public class TenantAUserCheckoutAcceptedIntegrationEventHandler :
|
||||
IIntegrationEventHandler<UserCheckoutAcceptedIntegrationEvent>
|
||||
{
|
||||
private readonly IMediator _mediator;
|
||||
private readonly IEventBus _eventBus;
|
||||
private readonly ILogger<TenantAUserCheckoutAcceptedIntegrationEventHandler> _logger;
|
||||
//private readonly TenantAContext _context;
|
||||
//private readonly IShippingService _shippingService;
|
||||
|
||||
public TenantAUserCheckoutAcceptedIntegrationEventHandler(
|
||||
IMediator mediator,
|
||||
ILogger<TenantAUserCheckoutAcceptedIntegrationEventHandler> logger,
|
||||
IEventBus eventBus
|
||||
)
|
||||
{
|
||||
_mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
|
||||
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||
_eventBus = eventBus ?? throw new ArgumentNullException(nameof(eventBus));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Integration event handler which starts the create order process
|
||||
/// </summary>
|
||||
/// <param name="@event">
|
||||
/// Integration event message which is sent by the
|
||||
/// basket.api once it has successfully process the
|
||||
/// order items.
|
||||
/// </param>
|
||||
/// <returns></returns>
|
||||
public async Task Handle(UserCheckoutAcceptedIntegrationEvent @event)
|
||||
{
|
||||
using (LogContext.PushProperty("IntegrationEventContext", $"{@event.Id}- TenantA"))
|
||||
{
|
||||
_logger.LogInformation("----- Handling integration event: {IntegrationEventId} at TenantA- ({@IntegrationEvent})", @event.Id, @event);
|
||||
_logger.LogInformation("Hello");
|
||||
|
||||
//TODO
|
||||
Debug.WriteLine(@event);
|
||||
//Save shipping info
|
||||
//Hard code view comp
|
||||
//Retrieve shipping info and show
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,62 +0,0 @@
|
||||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Events;
|
||||
using Ordering.API.Application.Models;
|
||||
using System;
|
||||
|
||||
namespace TenantACustomisations.IntegrationEvents.Events
|
||||
{
|
||||
public class UserCheckoutAcceptedIntegrationEvent : IntegrationEvent
|
||||
{
|
||||
public string UserId { get; }
|
||||
|
||||
public string UserName { get; }
|
||||
|
||||
public string City { get; set; }
|
||||
|
||||
public string Street { get; set; }
|
||||
|
||||
public string State { get; set; }
|
||||
|
||||
public string Country { get; set; }
|
||||
|
||||
public string ZipCode { get; set; }
|
||||
|
||||
public string CardNumber { get; set; }
|
||||
|
||||
public string CardHolderName { get; set; }
|
||||
|
||||
public DateTime CardExpiration { get; set; }
|
||||
|
||||
public string CardSecurityNumber { get; set; }
|
||||
|
||||
public int CardTypeId { get; set; }
|
||||
|
||||
public string Buyer { get; set; }
|
||||
|
||||
public Guid RequestId { get; set; }
|
||||
|
||||
public CustomerBasket Basket { get; }
|
||||
|
||||
public UserCheckoutAcceptedIntegrationEvent(string userId, string userName, string city, string street,
|
||||
string state, string country, string zipCode, string cardNumber, string cardHolderName,
|
||||
DateTime cardExpiration, string cardSecurityNumber, int cardTypeId, string buyer, Guid requestId,
|
||||
CustomerBasket basket)
|
||||
{
|
||||
UserId = userId;
|
||||
City = city;
|
||||
Street = street;
|
||||
State = state;
|
||||
Country = country;
|
||||
ZipCode = zipCode;
|
||||
CardNumber = cardNumber;
|
||||
CardHolderName = cardHolderName;
|
||||
CardExpiration = cardExpiration;
|
||||
CardSecurityNumber = cardSecurityNumber;
|
||||
CardTypeId = cardTypeId;
|
||||
Buyer = buyer;
|
||||
Basket = basket;
|
||||
RequestId = requestId;
|
||||
UserName = userName;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using TenantACustomisations.ExternalServices;
|
||||
|
||||
namespace TenantACustomisations.Database
|
||||
{
|
||||
public class DbInitializer
|
||||
{
|
||||
public void Initialize(TenantAContext context)
|
||||
{
|
||||
context.Database.EnsureCreated();
|
||||
|
||||
if (context.ShippingInformation.Any())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ShippingInformation shippingInformation = new ShippingInformation();
|
||||
shippingInformation.ShippingTime = DateTime.Today;
|
||||
shippingInformation.ArrivalTime = DateTime.Today.AddDays(2);
|
||||
shippingInformation.FragilityLevel = Fragility.Medium;
|
||||
shippingInformation.PriorityLevel = Priority.High;
|
||||
shippingInformation.ShippingInformationId = 1;
|
||||
shippingInformation.OrderNumber = "1";
|
||||
context.ShippingInformation.Add(shippingInformation);
|
||||
|
||||
context.SaveChanges();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Design;
|
||||
using TenantACustomisations.ExternalServices;
|
||||
using TenantACustomisations.IntegrationEvents.Events;
|
||||
|
||||
namespace TenantACustomisations.Database
|
||||
{
|
||||
public class TenantAContext : DbContext
|
||||
{
|
||||
public TenantAContext(DbContextOptions<TenantAContext> options)
|
||||
: base(options)
|
||||
{
|
||||
}
|
||||
|
||||
public DbSet<ShippingInformation> ShippingInformation { get; set; }
|
||||
|
||||
public DbSet<SavedEvent> SavedEvent
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
|
||||
}
|
||||
public class TenantAContextDesignFactory : IDesignTimeDbContextFactory<TenantAContext>
|
||||
{
|
||||
public TenantAContext CreateDbContext(string[] args)
|
||||
{
|
||||
var optionsBuilder = new DbContextOptionsBuilder<TenantAContext>()
|
||||
.UseSqlServer("Server=.;Initial Catalog=Microsoft.eShopOnContainers.Services.TenantADb;Integrated Security=true");
|
||||
|
||||
return new TenantAContext(optionsBuilder.Options);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
using Microsoft.AspNetCore.SignalR;
|
||||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Serilog.Context;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using TenantAShippingInformation.IntegrationEvents.Events;
|
||||
|
||||
namespace TenantAShippingInformation.IntegrationEvents.EventHandling
|
||||
{
|
||||
public class OrderStatusChangedToAwaitingValidationIntegrationEventHandler :
|
||||
IIntegrationEventHandler<OrderStatusChangedToAwaitingValidationIntegrationEvent>
|
||||
{
|
||||
private readonly ILogger<OrderStatusChangedToAwaitingValidationIntegrationEventHandler> _logger;
|
||||
|
||||
public OrderStatusChangedToAwaitingValidationIntegrationEventHandler(ILogger<OrderStatusChangedToAwaitingValidationIntegrationEventHandler> logger)
|
||||
{
|
||||
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||
}
|
||||
|
||||
public async Task Handle(OrderStatusChangedToAwaitingValidationIntegrationEvent @event)
|
||||
{
|
||||
using (LogContext.PushProperty("IntegrationEventContext", $"{@event.Id}- TenantA"))
|
||||
{
|
||||
//TODO
|
||||
Debug.WriteLine(@event);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -7,11 +7,12 @@ using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using TenantACustomisations.Database;
|
||||
using TenantACustomisations.ExternalServices;
|
||||
using TenantACustomisations.IntegrationEvents.Events;
|
||||
using TenantAShippingInformation.Database;
|
||||
using TenantAShippingInformation.ExternalServices;
|
||||
using TenantAShippingInformation.IntegrationEvents.Events;
|
||||
using TenantAShippingInformation.Models;
|
||||
|
||||
namespace TenantACustomisations.IntegrationEvents.EventHandling
|
||||
namespace TenantAShippingInformation.IntegrationEvents.EventHandling
|
||||
{
|
||||
public class OrderStatusChangedToSubmittedIntegrationEventHandler :
|
||||
IIntegrationEventHandler<OrderStatusChangedToSubmittedIntegrationEvent>
|
||||
@ -31,14 +32,14 @@ namespace TenantACustomisations.IntegrationEvents.EventHandling
|
||||
{
|
||||
using (LogContext.PushProperty("IntegrationEventContext", $"{@event.Id}- TenantA"))
|
||||
{
|
||||
_logger.LogInformation("----- Handling integration event: {IntegrationEventId} at TenantA - ({@IntegrationEvent})", @event.Id, @event);
|
||||
_logger.LogInformation("Hello");
|
||||
//TODO
|
||||
Debug.WriteLine(@event);
|
||||
ShippingInformation shippingInformation = _shippingService.CalculateShippingInformation(@event.OrderId);
|
||||
_context.ShippingInformation.Add(shippingInformation);
|
||||
_logger.LogInformation("----- Saving shipping information: {IntegrationEventId} at TenantA - ({@IntegrationEvent}) - {@ShippingInformation}", @event.Id, @event, shippingInformation);
|
||||
_context.SaveChanges();
|
||||
using (LogContext.PushProperty("IntegrationEventContext", $"{@event.Id}- TenantA"))
|
||||
{
|
||||
_logger.LogInformation("----- Handling integration event: {IntegrationEventId} at TenantA - ({@IntegrationEvent})", @event.Id, @event);
|
||||
ShippingInformation shippingInformation = _shippingService.CalculateShippingInformation(@event.OrderId);
|
||||
_context.ShippingInformation.Add(shippingInformation);
|
||||
_logger.LogInformation("----- Saving shipping information: {IntegrationEventId} at TenantA - ({@IntegrationEvent}) - {@ShippingInformation}", @event.Id, @event, shippingInformation);
|
||||
_context.SaveChanges();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Events;
|
||||
|
||||
namespace TenantAShippingInformation.IntegrationEvents.Events
|
||||
{
|
||||
public class OrderStatusChangedToAwaitingValidationIntegrationEvent : IntegrationEvent
|
||||
{
|
||||
public int OrderId { get; }
|
||||
public IEnumerable<OrderStockItem> OrderStockItems { get; }
|
||||
|
||||
public OrderStatusChangedToAwaitingValidationIntegrationEvent(int orderId,
|
||||
IEnumerable<OrderStockItem> orderStockItems)
|
||||
{
|
||||
OrderId = orderId;
|
||||
OrderStockItems = orderStockItems;
|
||||
}
|
||||
}
|
||||
|
||||
public class OrderStockItem
|
||||
{
|
||||
public int ProductId { get; }
|
||||
public int Units { get; }
|
||||
|
||||
public OrderStockItem(int productId, int units)
|
||||
{
|
||||
ProductId = productId;
|
||||
Units = units;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace TenantACustomisations.ExternalServices
|
||||
{
|
||||
public enum Fragility
|
||||
{
|
||||
Low, Medium, High
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace TenantACustomisations.ExternalServices
|
||||
{
|
||||
public enum Priority
|
||||
{
|
||||
Low, Medium, High
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace TenantACustomisations.ExternalServices
|
||||
{
|
||||
public class ShippingInformation
|
||||
{
|
||||
public int ShippingInformationId { get; set; }
|
||||
public DateTime ArrivalTime { get; set; }
|
||||
public DateTime ShippingTime { get; set; }
|
||||
public Priority PriorityLevel {get;set;}
|
||||
public Fragility FragilityLevel { get; set; }
|
||||
public String OrderNumber { get; set; }
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using TenantAShippingInformation.Models;
|
||||
|
||||
namespace TenantAShippingInformation.Database
|
||||
{
|
||||
public class DbInitializer
|
||||
{
|
||||
public void Initialize(TenantAContext context)
|
||||
{
|
||||
context.Database.EnsureCreated();
|
||||
|
||||
if (context.ShippingInformation.Any())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ShippingInformation shippingInformation = new ShippingInformation();
|
||||
shippingInformation.ShippingTime = DateTime.Today;
|
||||
shippingInformation.ArrivalTime = DateTime.Today.AddDays(2);
|
||||
shippingInformation.FragilityLevel = Fragility.Medium;
|
||||
shippingInformation.PriorityLevel = Priority.High;
|
||||
shippingInformation.ShippingInformationId = 1;
|
||||
shippingInformation.OrderNumber = "1";
|
||||
context.ShippingInformation.Add(shippingInformation);
|
||||
|
||||
context.SaveChanges();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Design;
|
||||
using TenantAShippingInformation.Models;
|
||||
|
||||
namespace TenantAShippingInformation.Database
|
||||
{
|
||||
public class TenantAContext : DbContext
|
||||
{
|
||||
public TenantAContext(DbContextOptions<TenantAContext> options)
|
||||
: base(options)
|
||||
{
|
||||
}
|
||||
|
||||
public DbSet<ShippingInformation> ShippingInformation { get; set; }
|
||||
|
||||
|
||||
}
|
||||
public class TenantAContextDesignFactory : IDesignTimeDbContextFactory<TenantAContext>
|
||||
{
|
||||
public TenantAContext CreateDbContext(string[] args)
|
||||
{
|
||||
var optionsBuilder = new DbContextOptionsBuilder<TenantAContext>()
|
||||
.UseSqlServer("Server=.;Initial Catalog=Microsoft.eShopOnContainers.Services.TenantAShippingInformationDb;Integrated Security=true");
|
||||
|
||||
return new TenantAContext(optionsBuilder.Options);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
|
||||
WORKDIR /app
|
||||
EXPOSE 80
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
|
||||
WORKDIR /src
|
||||
|
||||
# Keep the project list and command dotnet restore identical in all Dockfiles to maximize image cache utilization
|
||||
COPY eShopOnContainers-ServicesAndWebApps.sln .
|
||||
COPY docker-compose.dcproj /src/
|
||||
COPY src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj src/ApiGateways/ApiGw-Base/
|
||||
COPY src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj src/ApiGateways/Mobile.Bff.Shopping/aggregator/
|
||||
COPY src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj src/ApiGateways/Web.Bff.Shopping/aggregator/
|
||||
COPY src/BuildingBlocks/Devspaces.Support/Devspaces.Support.csproj src/BuildingBlocks/Devspaces.Support/
|
||||
COPY src/BuildingBlocks/EventBus/EventBus/EventBus.csproj src/BuildingBlocks/EventBus/EventBus/
|
||||
COPY src/BuildingBlocks/EventBus/EventBus.Tests/EventBus.Tests.csproj src/BuildingBlocks/EventBus/EventBus.Tests/
|
||||
COPY src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj src/BuildingBlocks/EventBus/EventBusRabbitMQ/
|
||||
COPY src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj src/BuildingBlocks/EventBus/EventBusServiceBus/
|
||||
COPY src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj src/BuildingBlocks/EventBus/IntegrationEventLogEF/
|
||||
COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj src/BuildingBlocks/WebHostCustomization/WebHost.Customization/
|
||||
COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/
|
||||
COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/
|
||||
COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/
|
||||
COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/
|
||||
COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/
|
||||
COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/
|
||||
COPY src/Services/Identity/Identity.API/Identity.API.csproj src/Services/Identity/Identity.API/
|
||||
COPY src/Services/Location/Locations.API/Locations.API.csproj src/Services/Location/Locations.API/
|
||||
COPY src/Services/Location/Locations.FunctionalTests/Locations.FunctionalTests.csproj src/Services/Location/Locations.FunctionalTests/
|
||||
COPY src/Services/Marketing/Marketing.API/Marketing.API.csproj src/Services/Marketing/Marketing.API/
|
||||
COPY src/Services/Marketing/Marketing.FunctionalTests/Marketing.FunctionalTests.csproj src/Services/Marketing/Marketing.FunctionalTests/
|
||||
COPY src/Services/Ordering/Ordering.API/Ordering.API.csproj src/Services/Ordering/Ordering.API/
|
||||
COPY src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj src/Services/Ordering/Ordering.BackgroundTasks/
|
||||
COPY src/Services/Ordering/Ordering.Domain/Ordering.Domain.csproj src/Services/Ordering/Ordering.Domain/
|
||||
COPY src/Services/Ordering/Ordering.FunctionalTests/Ordering.FunctionalTests.csproj src/Services/Ordering/Ordering.FunctionalTests/
|
||||
COPY src/Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj src/Services/Ordering/Ordering.Infrastructure/
|
||||
COPY src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj src/Services/Ordering/Ordering.SignalrHub/
|
||||
COPY src/Services/Ordering/Ordering.UnitTests/Ordering.UnitTests.csproj src/Services/Ordering/Ordering.UnitTests/
|
||||
COPY src/Services/Payment/Payment.API/Payment.API.csproj src/Services/Payment/Payment.API/
|
||||
COPY src/Services/Webhooks/Webhooks.API/Webhooks.API.csproj src/Services/Webhooks/Webhooks.API/
|
||||
COPY src/Web/WebhookClient/WebhookClient.csproj src/Web/WebhookClient/
|
||||
COPY src/Web/WebMVC/WebMVC.csproj src/Web/WebMVC/
|
||||
COPY src/Web/WebSPA/WebSPA.csproj src/Web/WebSPA/
|
||||
COPY src/Web/WebStatus/WebStatus.csproj src/Web/WebStatus/
|
||||
COPY test/ServicesTests/Application.FunctionalTests/Application.FunctionalTests.csproj test/ServicesTests/Application.FunctionalTests/
|
||||
COPY test/ServicesTests/LoadTest/LoadTest.csproj test/ServicesTests/LoadTest/
|
||||
|
||||
RUN dotnet restore eShopOnContainers-ServicesAndWebApps.sln
|
||||
|
||||
COPY . .
|
||||
WORKDIR /src/src/Services/TenantCustomisations/TenantAShippingInformation
|
||||
RUN dotnet publish --no-restore -c Release -o /app
|
||||
|
||||
FROM build AS publish
|
||||
|
||||
FROM base AS final
|
||||
WORKDIR /app
|
||||
COPY --from=publish /app .
|
||||
ENTRYPOINT ["dotnet", "TenantAShippingInformation.dll"]
|
@ -0,0 +1,9 @@
|
||||
using TenantAShippingInformation.Models;
|
||||
|
||||
namespace TenantAShippingInformation.ExternalServices
|
||||
{
|
||||
public interface IShippingService
|
||||
{
|
||||
ShippingInformation CalculateShippingInformation(int orderId);
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
using System;
|
||||
using TenantAShippingInformation.Models;
|
||||
|
||||
namespace TenantAShippingInformation.ExternalServices
|
||||
{
|
||||
public class MockedShippingService : IShippingService
|
||||
{
|
||||
public ShippingInformation CalculateShippingInformation(int orderId)
|
||||
{
|
||||
ShippingInformation shippingInformation = new ShippingInformation();
|
||||
shippingInformation.ShippingTime = DateTime.Today;
|
||||
shippingInformation.ArrivalTime = DateTime.Today.AddDays(2);
|
||||
shippingInformation.FragilityLevel = Fragility.Medium;
|
||||
shippingInformation.PriorityLevel = Priority.High;
|
||||
shippingInformation.OrderNumber = orderId.ToString();
|
||||
|
||||
return shippingInformation;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
using Autofac;
|
||||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions;
|
||||
using System.Reflection;
|
||||
using TenantAShippingInformation.IntegrationEvents.EventHandling;
|
||||
|
||||
namespace TenantAShippingInformation.Infrastructure.AutofacModules
|
||||
{
|
||||
|
||||
public class ApplicationModule
|
||||
:Autofac.Module
|
||||
{
|
||||
|
||||
public string QueriesConnectionString { get; }
|
||||
|
||||
public ApplicationModule(string qconstr)
|
||||
{
|
||||
QueriesConnectionString = qconstr;
|
||||
|
||||
}
|
||||
|
||||
protected override void Load(ContainerBuilder builder)
|
||||
{
|
||||
builder.RegisterAssemblyTypes(typeof(OrderStatusChangedToAwaitingValidationIntegrationEventHandler).GetTypeInfo().Assembly)
|
||||
.AsClosedTypesOf(typeof(IIntegrationEventHandler<>));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
using Autofac;
|
||||
|
||||
namespace TenantAShippingInformation.Infrastructure.AutofacModules
|
||||
{
|
||||
public class MediatorModule : Autofac.Module
|
||||
{
|
||||
protected override void Load(ContainerBuilder builder)
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Swashbuckle.AspNetCore.Swagger;
|
||||
using Swashbuckle.AspNetCore.SwaggerGen;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace TenantAShippingInformation.Infrastructure.Filters
|
||||
{
|
||||
public class AuthorizeCheckOperationFilter : IOperationFilter
|
||||
{
|
||||
public void Apply(Operation operation, OperationFilterContext context)
|
||||
{
|
||||
// Check for authorize attribute
|
||||
var hasAuthorize = context.MethodInfo.DeclaringType.GetCustomAttributes(true).OfType<AuthorizeAttribute>().Any() ||
|
||||
context.MethodInfo.GetCustomAttributes(true).OfType<AuthorizeAttribute>().Any();
|
||||
|
||||
if (!hasAuthorize) return;
|
||||
|
||||
operation.Responses.TryAdd("401", new Response { Description = "Unauthorized" });
|
||||
operation.Responses.TryAdd("403", new Response { Description = "Forbidden" });
|
||||
|
||||
operation.Security = new List<IDictionary<string, IEnumerable<string>>>
|
||||
{
|
||||
new Dictionary<string, IEnumerable<string>>
|
||||
{
|
||||
{ "oauth2", new [] { "orderingapi" } }
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
namespace TenantAShippingInformation.Infrastructure.Filters
|
||||
{
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System.Net;
|
||||
|
||||
public class HttpGlobalExceptionFilter : IExceptionFilter
|
||||
{
|
||||
private readonly IHostingEnvironment env;
|
||||
private readonly ILogger<HttpGlobalExceptionFilter> logger;
|
||||
|
||||
public HttpGlobalExceptionFilter(IHostingEnvironment env, ILogger<HttpGlobalExceptionFilter> logger)
|
||||
{
|
||||
this.env = env;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
public void OnException(ExceptionContext context)
|
||||
{
|
||||
logger.LogError(new EventId(context.Exception.HResult),
|
||||
context.Exception,
|
||||
context.Exception.Message);
|
||||
|
||||
if (1==2)//TODO
|
||||
{
|
||||
var problemDetails = new ValidationProblemDetails()
|
||||
{
|
||||
Instance = context.HttpContext.Request.Path,
|
||||
Status = StatusCodes.Status400BadRequest,
|
||||
Detail = "Please refer to the errors property for additional details."
|
||||
};
|
||||
|
||||
problemDetails.Errors.Add("DomainValidations", new string[] { context.Exception.Message.ToString() });
|
||||
|
||||
context.Result = new BadRequestObjectResult(problemDetails);
|
||||
context.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
|
||||
}
|
||||
else
|
||||
{
|
||||
var json = new JsonErrorResponse
|
||||
{
|
||||
Messages = new[] { "An error occur.Try it again." }
|
||||
};
|
||||
|
||||
if (env.IsDevelopment())
|
||||
{
|
||||
json.DeveloperMessage = context.Exception;
|
||||
}
|
||||
|
||||
// Result asigned to a result object but in destiny the response is empty. This is a known bug of .net core 1.1
|
||||
// It will be fixed in .net core 1.1.2. See https://github.com/aspnet/Mvc/issues/5594 for more information
|
||||
//TODO
|
||||
//context.Result = new InternalServerErrorObjectResult(json);
|
||||
context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
|
||||
}
|
||||
context.ExceptionHandled = true;
|
||||
}
|
||||
|
||||
private class JsonErrorResponse
|
||||
{
|
||||
public string[] Messages { get; set; }
|
||||
|
||||
public object DeveloperMessage { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
using Microsoft.AspNetCore.SignalR;
|
||||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Serilog.Context;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using TenantBShippingInformation.IntegrationEvents.Events;
|
||||
|
||||
namespace TenantBShippingInformation.IntegrationEvents.EventHandling
|
||||
{
|
||||
public class OrderStatusChangedToSubmittedIntegrationEventHandler :
|
||||
IIntegrationEventHandler<OrderStatusChangedToSubmittedIntegrationEvent>
|
||||
{
|
||||
private readonly ILogger<OrderStatusChangedToSubmittedIntegrationEventHandler> _logger;
|
||||
|
||||
public OrderStatusChangedToSubmittedIntegrationEventHandler(ILogger<OrderStatusChangedToSubmittedIntegrationEventHandler> logger)
|
||||
{
|
||||
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||
}
|
||||
|
||||
public async Task Handle(OrderStatusChangedToSubmittedIntegrationEvent @event)
|
||||
{
|
||||
using (LogContext.PushProperty("IntegrationEventContext", $"{@event.Id}- TenantA"))
|
||||
{
|
||||
//TODO
|
||||
Debug.WriteLine(@event);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Events;
|
||||
|
||||
namespace TenantBShippingInformation.IntegrationEvents.Events
|
||||
{
|
||||
public class OrderStatusChangedToSubmittedIntegrationEvent : IntegrationEvent
|
||||
{
|
||||
public int OrderId { get; }
|
||||
public string OrderStatus { get; }
|
||||
public string BuyerName { get; }
|
||||
|
||||
public OrderStatusChangedToSubmittedIntegrationEvent(int orderId, string orderStatus, string buyerName)
|
||||
{
|
||||
OrderId = orderId;
|
||||
OrderStatus = orderStatus;
|
||||
BuyerName = buyerName;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
namespace TenantAShippingInformation.Models
|
||||
{
|
||||
public enum Fragility
|
||||
{
|
||||
Low, Medium, High
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
namespace TenantAShippingInformation.Models
|
||||
{
|
||||
public enum Priority
|
||||
{
|
||||
Low, Medium, High
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
|
||||
namespace TenantAShippingInformation.Models
|
||||
{
|
||||
public class ShippingInformation
|
||||
{
|
||||
public int ShippingInformationId { get; set; }
|
||||
public DateTime ArrivalTime { get; set; }
|
||||
public DateTime ShippingTime { get; set; }
|
||||
public Priority PriorityLevel {get;set;}
|
||||
public Fragility FragilityLevel { get; set; }
|
||||
public String OrderNumber { get; set; }
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user