@ -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); | |||||
} | |||||
} | |||||
} | |||||
} |
@ -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; } | |||||
} | |||||
} |