added coupon service and enabled health check
This commit is contained in:
		
							parent
							
								
									40d4a311f2
								
							
						
					
					
						commit
						49595b5d58
					
				@ -24,6 +24,7 @@ COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
 | 
			
		||||
@ -15,6 +15,7 @@ public class Startup
 | 
			
		||||
        services.AddHealthChecks()
 | 
			
		||||
            .AddCheck("self", () => HealthCheckResult.Healthy())
 | 
			
		||||
            .AddUrlGroup(new Uri(Configuration["CatalogUrlHC"]), name: "catalogapi-check", tags: new string[] { "catalogapi" })
 | 
			
		||||
            .AddUrlGroup(new Uri(Configuration["CouponUrlHC"]), name: "couponapi-check", tags: new string[] { "couponapi" })
 | 
			
		||||
            .AddUrlGroup(new Uri(Configuration["OrderingUrlHC"]), name: "orderingapi-check", tags: new string[] { "orderingapi" })
 | 
			
		||||
            .AddUrlGroup(new Uri(Configuration["BasketUrlHC"]), name: "basketapi-check", tags: new string[] { "basketapi" })
 | 
			
		||||
            .AddUrlGroup(new Uri(Configuration["IdentityUrlHC"]), name: "identityapi-check", tags: new string[] { "identityapi" })
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
 | 
			
		||||
@ -15,6 +15,7 @@ public class Startup
 | 
			
		||||
        services.AddHealthChecks()
 | 
			
		||||
            .AddCheck("self", () => HealthCheckResult.Healthy())
 | 
			
		||||
            .AddUrlGroup(new Uri(Configuration["CatalogUrlHC"]), name: "catalogapi-check", tags: new string[] { "catalogapi" })
 | 
			
		||||
            .AddUrlGroup(new Uri(Configuration["CouponUrlHC"]), name: "couponapi-check", tags: new string[] { "couponapi" })
 | 
			
		||||
            .AddUrlGroup(new Uri(Configuration["OrderingUrlHC"]), name: "orderingapi-check", tags: new string[] { "orderingapi" })
 | 
			
		||||
            .AddUrlGroup(new Uri(Configuration["BasketUrlHC"]), name: "basketapi-check", tags: new string[] { "basketapi" })
 | 
			
		||||
            .AddUrlGroup(new Uri(Configuration["IdentityUrlHC"]), name: "identityapi-check", tags: new string[] { "identityapi" })
 | 
			
		||||
 | 
			
		||||
@ -1,32 +0,0 @@
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
 | 
			
		||||
namespace Coupon.API.Controllers;
 | 
			
		||||
 | 
			
		||||
[ApiController]
 | 
			
		||||
[Route("[controller]")]
 | 
			
		||||
public class WeatherForecastController : ControllerBase
 | 
			
		||||
{
 | 
			
		||||
    private static readonly string[] Summaries = new[]
 | 
			
		||||
    {
 | 
			
		||||
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    private readonly ILogger<WeatherForecastController> _logger;
 | 
			
		||||
 | 
			
		||||
    public WeatherForecastController(ILogger<WeatherForecastController> logger)
 | 
			
		||||
    {
 | 
			
		||||
        _logger = logger;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [HttpGet(Name = "GetWeatherForecast")]
 | 
			
		||||
    public IEnumerable<WeatherForecast> Get()
 | 
			
		||||
    {
 | 
			
		||||
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
 | 
			
		||||
            {
 | 
			
		||||
                Date = DateTime.Now.AddDays(index),
 | 
			
		||||
                TemperatureC = Random.Shared.Next(-20, 55),
 | 
			
		||||
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
 | 
			
		||||
            })
 | 
			
		||||
            .ToArray();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,13 +0,0 @@
 | 
			
		||||
<Project Sdk="Microsoft.NET.Sdk.Web">
 | 
			
		||||
 | 
			
		||||
    <PropertyGroup>
 | 
			
		||||
        <TargetFramework>net6.0</TargetFramework>
 | 
			
		||||
        <Nullable>enable</Nullable>
 | 
			
		||||
        <ImplicitUsings>enable</ImplicitUsings>
 | 
			
		||||
    </PropertyGroup>
 | 
			
		||||
 | 
			
		||||
    <ItemGroup>
 | 
			
		||||
        <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3"/>
 | 
			
		||||
    </ItemGroup>
 | 
			
		||||
 | 
			
		||||
</Project>
 | 
			
		||||
@ -1,25 +0,0 @@
 | 
			
		||||
var builder = WebApplication.CreateBuilder(args);
 | 
			
		||||
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
 | 
			
		||||
builder.Services.AddEndpointsApiExplorer();
 | 
			
		||||
builder.Services.AddSwaggerGen();
 | 
			
		||||
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
 | 
			
		||||
// Configure the HTTP request pipeline.
 | 
			
		||||
if (app.Environment.IsDevelopment())
 | 
			
		||||
{
 | 
			
		||||
    app.UseSwagger();
 | 
			
		||||
    app.UseSwaggerUI();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.UseHttpsRedirection();
 | 
			
		||||
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
app.MapControllers();
 | 
			
		||||
 | 
			
		||||
app.Run();
 | 
			
		||||
@ -1,12 +0,0 @@
 | 
			
		||||
namespace Coupon.API;
 | 
			
		||||
 | 
			
		||||
public class WeatherForecast
 | 
			
		||||
{
 | 
			
		||||
    public DateTime Date { get; set; }
 | 
			
		||||
 | 
			
		||||
    public int TemperatureC { get; set; }
 | 
			
		||||
 | 
			
		||||
    public int TemperatureF => 32 + (int) (TemperatureC / 0.5556);
 | 
			
		||||
 | 
			
		||||
    public string? Summary { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@ -1,8 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "Logging": {
 | 
			
		||||
    "LogLevel": {
 | 
			
		||||
      "Default": "Information",
 | 
			
		||||
      "Microsoft.AspNetCore": "Warning"
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -1,9 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "Logging": {
 | 
			
		||||
    "LogLevel": {
 | 
			
		||||
      "Default": "Information",
 | 
			
		||||
      "Microsoft.AspNetCore": "Warning"
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "AllowedHosts": "*"
 | 
			
		||||
}
 | 
			
		||||
@ -24,6 +24,7 @@ COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
 | 
			
		||||
@ -68,10 +68,10 @@
 | 
			
		||||
    <PackageReference Include="Serilog.Sinks.Seq" Version="4.1.0-dev-00166" />
 | 
			
		||||
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.1" />
 | 
			
		||||
    <PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="6.2.1" />
 | 
			
		||||
    <PackageReference Include="System.Data.SqlClient" version="4.8.2"/>
 | 
			
		||||
    <PackageReference Include="System.Data.SqlClient" version="4.8.2" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="6.0.0" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.0" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.0"/>
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.0" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
 | 
			
		||||
@ -25,6 +25,7 @@ COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,20 @@
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
 | 
			
		||||
namespace Coupon.API.Controllers;
 | 
			
		||||
 | 
			
		||||
[ApiController]
 | 
			
		||||
[ApiVersion("1.0")]
 | 
			
		||||
[Route("v{version:apiVersion}/[controller]")]
 | 
			
		||||
public class CouponController : ControllerBase
 | 
			
		||||
{
 | 
			
		||||
    [HttpGet("{code}")]
 | 
			
		||||
    [ProducesResponseType(StatusCodes.Status200OK)]
 | 
			
		||||
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
 | 
			
		||||
    [ProducesResponseType(StatusCodes.Status404NotFound)]
 | 
			
		||||
    public async Task<ActionResult> GetCouponByCodeAsync(string code)
 | 
			
		||||
    {
 | 
			
		||||
        await Task.Delay(500);
 | 
			
		||||
        
 | 
			
		||||
        return Ok(code);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										43
									
								
								src/Services/Coupon/Coupon.API/Coupon.API.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/Services/Coupon/Coupon.API/Coupon.API.csproj
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,43 @@
 | 
			
		||||
<Project Sdk="Microsoft.NET.Sdk.Web">
 | 
			
		||||
 | 
			
		||||
    <PropertyGroup>
 | 
			
		||||
        <TargetFramework>net6.0</TargetFramework>
 | 
			
		||||
        <Nullable>enable</Nullable>
 | 
			
		||||
        <ImplicitUsings>enable</ImplicitUsings>
 | 
			
		||||
        <DebugType>portable</DebugType>
 | 
			
		||||
        <PreserveCompilationContext>true</PreserveCompilationContext>
 | 
			
		||||
        <AssemblyName>Coupon.API</AssemblyName>
 | 
			
		||||
        <PackageId>Coupon.API</PackageId>
 | 
			
		||||
        <UserSecretsId>aspnet-Coupon.API-20161122013618</UserSecretsId>
 | 
			
		||||
        <DockerComposeProjectPath>..\..\..\..\docker-compose.dcproj</DockerComposeProjectPath>
 | 
			
		||||
        <GenerateErrorForMissingTargetingPacks>false</GenerateErrorForMissingTargetingPacks>
 | 
			
		||||
        <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
 | 
			
		||||
    </PropertyGroup>
 | 
			
		||||
 | 
			
		||||
    <ItemGroup>
 | 
			
		||||
        <PackageReference Include="AspNetCore.HealthChecks.AzureServiceBus" Version="6.0.3" />
 | 
			
		||||
        <PackageReference Include="AspNetCore.HealthChecks.MongoDb" Version="6.0.1" />
 | 
			
		||||
        <PackageReference Include="AspNetCore.HealthChecks.Rabbitmq" Version="6.0.2" />
 | 
			
		||||
        <PackageReference Include="AspNetCore.HealthChecks.SqlServer" Version="6.0.2" />
 | 
			
		||||
        <PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="6.0.4" />
 | 
			
		||||
 | 
			
		||||
        <PackageReference Include="Microsoft.AspNetCore.HealthChecks" Version="1.0.0" />
 | 
			
		||||
        <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="5.0.0" />
 | 
			
		||||
        <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.20.0" />
 | 
			
		||||
        <PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="2.0.2" />
 | 
			
		||||
        <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.3" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.23" />
 | 
			
		||||
        <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.15.0" />
 | 
			
		||||
        <PackageReference Include="MongoDB.Driver.Core" Version="2.13.3" />
 | 
			
		||||
        <PackageReference Include="Polly" Version="7.2.3" />
 | 
			
		||||
        
 | 
			
		||||
        <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
 | 
			
		||||
    </ItemGroup>
 | 
			
		||||
 | 
			
		||||
    <ItemGroup>
 | 
			
		||||
      <ProjectReference Include="..\..\..\BuildingBlocks\EventBus\EventBusRabbitMQ\EventBusRabbitMQ.csproj" />
 | 
			
		||||
      <ProjectReference Include="..\..\..\BuildingBlocks\EventBus\EventBusServiceBus\EventBusServiceBus.csproj" />
 | 
			
		||||
      <ProjectReference Include="..\..\..\BuildingBlocks\EventBus\IntegrationEventLogEF\IntegrationEventLogEF.csproj" />
 | 
			
		||||
    </ItemGroup>
 | 
			
		||||
 | 
			
		||||
</Project>
 | 
			
		||||
							
								
								
									
										14
									
								
								src/Services/Coupon/Coupon.API/CouponSettings.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/Services/Coupon/Coupon.API/CouponSettings.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
			
		||||
namespace Coupon.API;
 | 
			
		||||
 | 
			
		||||
public class CouponSettings
 | 
			
		||||
{
 | 
			
		||||
    public string ConnectionString { get; set; }
 | 
			
		||||
 | 
			
		||||
    public string CouponMongoDatabase { get; set; }
 | 
			
		||||
 | 
			
		||||
    public string EventBusConnection { get; set; }
 | 
			
		||||
 | 
			
		||||
    public bool UseCustomizationData { get; set; }
 | 
			
		||||
 | 
			
		||||
    public bool AzureStorageEnabled { get; set; }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										68
									
								
								src/Services/Coupon/Coupon.API/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								src/Services/Coupon/Coupon.API/Dockerfile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,68 @@
 | 
			
		||||
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
 | 
			
		||||
WORKDIR /app
 | 
			
		||||
EXPOSE 80
 | 
			
		||||
EXPOSE 443
 | 
			
		||||
 | 
			
		||||
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
 | 
			
		||||
WORKDIR /src
 | 
			
		||||
 | 
			
		||||
# It's important to keep lines from here down to "COPY . ." identical in all Dockerfiles
 | 
			
		||||
# to take advantage of Docker's build cache, to speed up local container builds
 | 
			
		||||
COPY "eShopOnContainers-ServicesAndWebApps.sln" "eShopOnContainers-ServicesAndWebApps.sln"
 | 
			
		||||
 | 
			
		||||
COPY "ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj" "ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj"
 | 
			
		||||
COPY "ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj" "ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj"
 | 
			
		||||
COPY "BuildingBlocks/Devspaces.Support/Devspaces.Support.csproj" "BuildingBlocks/Devspaces.Support/Devspaces.Support.csproj"
 | 
			
		||||
COPY "BuildingBlocks/EventBus/EventBus/EventBus.csproj" "BuildingBlocks/EventBus/EventBus/EventBus.csproj"
 | 
			
		||||
COPY "BuildingBlocks/EventBus/EventBus.Tests/EventBus.Tests.csproj" "BuildingBlocks/EventBus/EventBus.Tests/EventBus.Tests.csproj"
 | 
			
		||||
COPY "BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj" "BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj"
 | 
			
		||||
COPY "BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj" "BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj"
 | 
			
		||||
COPY "BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj" "BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj"
 | 
			
		||||
COPY "BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj" "BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj"
 | 
			
		||||
COPY "Services/Basket/Basket.API/Basket.API.csproj" "Services/Basket/Basket.API/Basket.API.csproj"
 | 
			
		||||
COPY "Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj" "Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.Domain/Ordering.Domain.csproj" "Services/Ordering/Ordering.Domain/Ordering.Domain.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.FunctionalTests/Ordering.FunctionalTests.csproj" "Services/Ordering/Ordering.FunctionalTests/Ordering.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj" "Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj" "Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.UnitTests/Ordering.UnitTests.csproj" "Services/Ordering/Ordering.UnitTests/Ordering.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Payment/Payment.API/Payment.API.csproj" "Services/Payment/Payment.API/Payment.API.csproj"
 | 
			
		||||
COPY "Services/Webhooks/Webhooks.API/Webhooks.API.csproj" "Services/Webhooks/Webhooks.API/Webhooks.API.csproj"
 | 
			
		||||
COPY "Tests/Services/Application.FunctionalTests/Application.FunctionalTests.csproj" "Tests/Services/Application.FunctionalTests/Application.FunctionalTests.csproj"
 | 
			
		||||
COPY "Web/WebhookClient/WebhookClient.csproj" "Web/WebhookClient/WebhookClient.csproj"
 | 
			
		||||
COPY "Web/WebMVC/WebMVC.csproj" "Web/WebMVC/WebMVC.csproj"
 | 
			
		||||
COPY "Web/WebSPA/WebSPA.csproj" "Web/WebSPA/WebSPA.csproj"
 | 
			
		||||
COPY "Web/WebStatus/WebStatus.csproj" "Web/WebStatus/WebStatus.csproj"
 | 
			
		||||
 | 
			
		||||
COPY "docker-compose.dcproj" "docker-compose.dcproj"
 | 
			
		||||
 | 
			
		||||
COPY "NuGet.config" "NuGet.config"
 | 
			
		||||
 | 
			
		||||
RUN dotnet restore "eShopOnContainers-ServicesAndWebApps.sln"
 | 
			
		||||
 | 
			
		||||
COPY . .
 | 
			
		||||
WORKDIR /src/Services/Coupon/Coupon.API
 | 
			
		||||
RUN dotnet publish --no-restore -c Release -o /app
 | 
			
		||||
 | 
			
		||||
#FROM build as unittest
 | 
			
		||||
#WORKDIR /src/Services/Catalog/Catalog.UnitTests
 | 
			
		||||
#
 | 
			
		||||
#FROM build as functionaltest
 | 
			
		||||
#WORKDIR /src/Services/Catalog/Catalog.FunctionalTests
 | 
			
		||||
 | 
			
		||||
FROM build AS publish
 | 
			
		||||
 | 
			
		||||
FROM base AS final
 | 
			
		||||
WORKDIR /app
 | 
			
		||||
COPY --from=publish /app .
 | 
			
		||||
#COPY --from=build /src/Services/Catalog/Catalog.API/Proto /app/Proto
 | 
			
		||||
COPY --from=build /src/Services/Coupon/Coupon.API/eshop.pfx .
 | 
			
		||||
ENTRYPOINT ["dotnet", "Coupon.API.dll"]
 | 
			
		||||
							
								
								
									
										22
									
								
								src/Services/Coupon/Coupon.API/Dockerfile.develop
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/Services/Coupon/Coupon.API/Dockerfile.develop
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
FROM mcr.microsoft.com/dotnet/sdk:6.0
 | 
			
		||||
ARG BUILD_CONFIGURATION=Debug
 | 
			
		||||
ENV ASPNETCORE_ENVIRONMENT=Development
 | 
			
		||||
ENV DOTNET_USE_POLLING_FILE_WATCHER=true
 | 
			
		||||
EXPOSE 80
 | 
			
		||||
 | 
			
		||||
WORKDIR /src
 | 
			
		||||
 | 
			
		||||
COPY ["BuildingBlocks/EventBus/EventBus/EventBus.csproj", "BuildingBlocks/EventBus/EventBus/"]
 | 
			
		||||
COPY ["BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj", "BuildingBlocks/EventBus/EventBusRabbitMQ/"]
 | 
			
		||||
COPY ["BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj", "BuildingBlocks/EventBus/EventBusServiceBus/"]
 | 
			
		||||
COPY ["BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj", "BuildingBlocks/EventBus/IntegrationEventLogEF/"]
 | 
			
		||||
COPY ["BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj", "BuildingBlocks/WebHostCustomization/WebHost.Customization/"]
 | 
			
		||||
COPY ["Services/Catalog/Catalog.API/Catalog.API.csproj", "Services/Catalog/Catalog.API/"]
 | 
			
		||||
COPY ["NuGet.config", "NuGet.config"]
 | 
			
		||||
 | 
			
		||||
RUN dotnet restore Services/Catalog/Catalog.API/Catalog.API.csproj -nowarn:msb3202,nu1503
 | 
			
		||||
COPY . .
 | 
			
		||||
WORKDIR "/src/Services/Catalog/Catalog.API"
 | 
			
		||||
RUN dotnet build -c $BUILD_CONFIGURATION
 | 
			
		||||
 | 
			
		||||
ENTRYPOINT ["dotnet", "run", "--no-build", "--no-launch-profile", "-c", "$BUILD_CONFIGURATION", "--"]
 | 
			
		||||
@ -0,0 +1,164 @@
 | 
			
		||||
using System.Data.Common;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using Autofac;
 | 
			
		||||
using Coupon.API.Infrastructure.Filters;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus;
 | 
			
		||||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions;
 | 
			
		||||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ;
 | 
			
		||||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBusServiceBus;
 | 
			
		||||
using Microsoft.eShopOnContainers.BuildingBlocks.IntegrationEventLogEF.Services;
 | 
			
		||||
using Microsoft.Extensions.Diagnostics.HealthChecks;
 | 
			
		||||
using Microsoft.Extensions.Options;
 | 
			
		||||
using Microsoft.OpenApi.Models;
 | 
			
		||||
using RabbitMQ.Client;
 | 
			
		||||
 | 
			
		||||
namespace Coupon.API.Extensions;
 | 
			
		||||
 | 
			
		||||
public static class CustomExtensionMethods
 | 
			
		||||
{
 | 
			
		||||
    public static IServiceCollection AddAppInsight(this IServiceCollection services, IConfiguration configuration)
 | 
			
		||||
    {
 | 
			
		||||
        services.AddApplicationInsightsTelemetry(configuration);
 | 
			
		||||
        services.AddApplicationInsightsKubernetesEnricher();
 | 
			
		||||
    
 | 
			
		||||
        return services;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static IServiceCollection AddCustomMVC(this IServiceCollection services)
 | 
			
		||||
    {
 | 
			
		||||
        services.AddControllers(options =>
 | 
			
		||||
        {
 | 
			
		||||
            options.Filters.Add(typeof(HttpGlobalExceptionFilter));
 | 
			
		||||
        })
 | 
			
		||||
        .AddJsonOptions(options => options.JsonSerializerOptions.WriteIndented = true);
 | 
			
		||||
    
 | 
			
		||||
        services.AddCors(options =>
 | 
			
		||||
        {
 | 
			
		||||
            options.AddPolicy("CorsPolicy",
 | 
			
		||||
                builder => builder
 | 
			
		||||
                .SetIsOriginAllowed((host) => true)
 | 
			
		||||
                .AllowAnyMethod()
 | 
			
		||||
                .AllowAnyHeader()
 | 
			
		||||
                .AllowCredentials());
 | 
			
		||||
        });
 | 
			
		||||
    
 | 
			
		||||
        return services;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static IServiceCollection AddCustomHealthCheck(this IServiceCollection services, IConfiguration configuration)
 | 
			
		||||
    {
 | 
			
		||||
        var accountName = configuration.GetValue<string>("AzureStorageAccountName");
 | 
			
		||||
        var accountKey = configuration.GetValue<string>("AzureStorageAccountKey");
 | 
			
		||||
    
 | 
			
		||||
        var hcBuilder = services.AddHealthChecks();
 | 
			
		||||
        
 | 
			
		||||
        hcBuilder.AddCheck("self", () => HealthCheckResult.Healthy())
 | 
			
		||||
            .AddMongoDb(
 | 
			
		||||
                configuration["ConnectionString"],
 | 
			
		||||
                name: "CouponCollection-check",
 | 
			
		||||
                tags: new string[] { "couponcollection" });
 | 
			
		||||
 | 
			
		||||
        if (configuration.GetValue<bool>("AzureServiceBusEnabled"))
 | 
			
		||||
        {
 | 
			
		||||
            hcBuilder
 | 
			
		||||
                .AddAzureServiceBusTopic(
 | 
			
		||||
                    configuration["EventBusConnection"],
 | 
			
		||||
                    topicName: "eshop_event_bus",
 | 
			
		||||
                    name: "coupon-servicebus-check",
 | 
			
		||||
                    tags: new string[] { "servicebus" });
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            hcBuilder
 | 
			
		||||
                .AddRabbitMQ(
 | 
			
		||||
                    $"amqp://{configuration["EventBusConnection"]}",
 | 
			
		||||
                    name: "coupon-rabbitmqbus-check",
 | 
			
		||||
                    tags: new string[] { "rabbitmqbus" });
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        return services;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static IServiceCollection AddCustomOptions(this IServiceCollection services, IConfiguration configuration)
 | 
			
		||||
    {
 | 
			
		||||
        services.Configure<CouponSettings>(configuration);
 | 
			
		||||
        services.Configure<ApiBehaviorOptions>(options =>
 | 
			
		||||
        {
 | 
			
		||||
            options.InvalidModelStateResponseFactory = context =>
 | 
			
		||||
            {
 | 
			
		||||
                var problemDetails = new ValidationProblemDetails(context.ModelState)
 | 
			
		||||
                {
 | 
			
		||||
                    Instance = context.HttpContext.Request.Path,
 | 
			
		||||
                    Status = StatusCodes.Status400BadRequest,
 | 
			
		||||
                    Detail = "Please refer to the errors property for additional details."
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                return new BadRequestObjectResult(problemDetails)
 | 
			
		||||
                {
 | 
			
		||||
                    ContentTypes = { "application/problem+json", "application/problem+xml" }
 | 
			
		||||
                };
 | 
			
		||||
            };
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return services;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static IServiceCollection AddSwagger(this IServiceCollection services)
 | 
			
		||||
    {
 | 
			
		||||
        services.AddSwaggerGen(options =>
 | 
			
		||||
        {            
 | 
			
		||||
            options.SwaggerDoc("v1", new OpenApiInfo
 | 
			
		||||
            {
 | 
			
		||||
                Title = "eShopOnContainers - Coupon HTTP API",
 | 
			
		||||
                Version = "v1",
 | 
			
		||||
                Description = "The Coupon Microservice HTTP API. This is a Data-Driven/CRUD microservice sample"
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return services;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static IServiceCollection AddEventBus(this IServiceCollection services, IConfiguration configuration)
 | 
			
		||||
    {
 | 
			
		||||
        if (configuration.GetValue<bool>("AzureServiceBusEnabled"))
 | 
			
		||||
        {
 | 
			
		||||
            services.AddSingleton<IEventBus, EventBusServiceBus>(sp =>
 | 
			
		||||
            {
 | 
			
		||||
                var serviceBusPersisterConnection = sp.GetRequiredService<IServiceBusPersisterConnection>();
 | 
			
		||||
                var iLifetimeScope = sp.GetRequiredService<ILifetimeScope>();
 | 
			
		||||
                var logger = sp.GetRequiredService<ILogger<EventBusServiceBus>>();
 | 
			
		||||
                var eventBusSubcriptionsManager = sp.GetRequiredService<IEventBusSubscriptionsManager>();
 | 
			
		||||
                string subscriptionName = configuration["SubscriptionClientName"];
 | 
			
		||||
    
 | 
			
		||||
                return new EventBusServiceBus(serviceBusPersisterConnection, logger,
 | 
			
		||||
                    eventBusSubcriptionsManager, iLifetimeScope, subscriptionName);
 | 
			
		||||
            });
 | 
			
		||||
    
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            services.AddSingleton<IEventBus, EventBusRabbitMQ>(sp =>
 | 
			
		||||
            {
 | 
			
		||||
                var subscriptionClientName = configuration["SubscriptionClientName"];
 | 
			
		||||
                var rabbitMQPersistentConnection = sp.GetRequiredService<IRabbitMQPersistentConnection>();
 | 
			
		||||
                var iLifetimeScope = sp.GetRequiredService<ILifetimeScope>();
 | 
			
		||||
                var logger = sp.GetRequiredService<ILogger<EventBusRabbitMQ>>();
 | 
			
		||||
                var eventBusSubcriptionsManager = sp.GetRequiredService<IEventBusSubscriptionsManager>();
 | 
			
		||||
    
 | 
			
		||||
                var retryCount = 5;
 | 
			
		||||
                if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"]))
 | 
			
		||||
                {
 | 
			
		||||
                    retryCount = int.Parse(configuration["EventBusRetryCount"]);
 | 
			
		||||
                }
 | 
			
		||||
    
 | 
			
		||||
                return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, subscriptionClientName, retryCount);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        services.AddSingleton<IEventBusSubscriptionsManager, InMemoryEventBusSubscriptionsManager>();
 | 
			
		||||
 | 
			
		||||
        return services;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,68 @@
 | 
			
		||||
namespace Coupon.API.Extensions;
 | 
			
		||||
 | 
			
		||||
public static class WebHostExtensions
 | 
			
		||||
{
 | 
			
		||||
    public static bool IsInKubernetes(this IWebHost host)
 | 
			
		||||
    {
 | 
			
		||||
        var cfg = host.Services.GetService<IConfiguration>();
 | 
			
		||||
        var orchestratorType = cfg.GetValue<string>("OrchestratorType");
 | 
			
		||||
        return orchestratorType?.ToUpper() == "K8S";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // public static IWebHost MigrateDbContext<TContext>(this IWebHost host, Action<TContext, IServiceProvider> seeder) where TContext : DbContext
 | 
			
		||||
    // {
 | 
			
		||||
    //     var underK8s = host.IsInKubernetes();
 | 
			
		||||
    //
 | 
			
		||||
    //     using var scope = host.Services.CreateScope();
 | 
			
		||||
    //     var services = scope.ServiceProvider;
 | 
			
		||||
    //
 | 
			
		||||
    //     var logger = services.GetRequiredService<ILogger<TContext>>();
 | 
			
		||||
    //
 | 
			
		||||
    //     var context = services.GetService<TContext>();
 | 
			
		||||
    //
 | 
			
		||||
    //     try
 | 
			
		||||
    //     {
 | 
			
		||||
    //         logger.LogInformation("Migrating database associated with context {DbContextName}", typeof(TContext).Name);
 | 
			
		||||
    //
 | 
			
		||||
    //         if (underK8s)
 | 
			
		||||
    //         {
 | 
			
		||||
    //             InvokeSeeder(seeder, context, services);
 | 
			
		||||
    //         }
 | 
			
		||||
    //         else
 | 
			
		||||
    //         {
 | 
			
		||||
    //             var retry = Policy.Handle<SqlException>()
 | 
			
		||||
    //                     .WaitAndRetry(new TimeSpan[]
 | 
			
		||||
    //                     {
 | 
			
		||||
    //                     TimeSpan.FromSeconds(3),
 | 
			
		||||
    //                     TimeSpan.FromSeconds(5),
 | 
			
		||||
    //                     TimeSpan.FromSeconds(8),
 | 
			
		||||
    //                     });
 | 
			
		||||
    //
 | 
			
		||||
    //             //if the sql server container is not created on run docker compose this
 | 
			
		||||
    //             //migration can't fail for network related exception. The retry options for DbContext only 
 | 
			
		||||
    //             //apply to transient exceptions
 | 
			
		||||
    //             // Note that this is NOT applied when running some orchestrators (let the orchestrator to recreate the failing service)
 | 
			
		||||
    //             retry.Execute(() => InvokeSeeder(seeder, context, services));
 | 
			
		||||
    //         }
 | 
			
		||||
    //
 | 
			
		||||
    //         logger.LogInformation("Migrated database associated with context {DbContextName}", typeof(TContext).Name);
 | 
			
		||||
    //     }
 | 
			
		||||
    //     catch (Exception ex)
 | 
			
		||||
    //     {
 | 
			
		||||
    //         logger.LogError(ex, "An error occurred while migrating the database used on context {DbContextName}", typeof(TContext).Name);
 | 
			
		||||
    //         if (underK8s)
 | 
			
		||||
    //         {
 | 
			
		||||
    //             throw;          // Rethrow under k8s because we rely on k8s to re-run the pod
 | 
			
		||||
    //         }
 | 
			
		||||
    //     }
 | 
			
		||||
    //
 | 
			
		||||
    //     return host;
 | 
			
		||||
    // }
 | 
			
		||||
    //
 | 
			
		||||
    // private static void InvokeSeeder<TContext>(Action<TContext, IServiceProvider> seeder, TContext context, IServiceProvider services)
 | 
			
		||||
    //     where TContext : DbContext
 | 
			
		||||
    // {
 | 
			
		||||
    //     context.Database.Migrate();
 | 
			
		||||
    //     seeder(context, services);
 | 
			
		||||
    // }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,11 @@
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
 | 
			
		||||
namespace Coupon.API.Infrastructure.ActionResults;
 | 
			
		||||
 | 
			
		||||
public class InternalServerErrorObjectResult : ObjectResult
 | 
			
		||||
{
 | 
			
		||||
    public InternalServerErrorObjectResult(object error) : base(error)
 | 
			
		||||
    {
 | 
			
		||||
        StatusCode = StatusCodes.Status500InternalServerError;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,64 @@
 | 
			
		||||
using System.Net;
 | 
			
		||||
using Coupon.API.Infrastructure.ActionResults;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc.Filters;
 | 
			
		||||
 | 
			
		||||
namespace Coupon.API.Infrastructure.Filters;
 | 
			
		||||
 | 
			
		||||
public class HttpGlobalExceptionFilter : IExceptionFilter
 | 
			
		||||
{
 | 
			
		||||
    private readonly IWebHostEnvironment env;
 | 
			
		||||
    private readonly ILogger<HttpGlobalExceptionFilter> logger;
 | 
			
		||||
 | 
			
		||||
    public HttpGlobalExceptionFilter(IWebHostEnvironment 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);
 | 
			
		||||
 | 
			
		||||
        // TODO: Create domain exception
 | 
			
		||||
        if (context.Exception.GetType() == typeof(Exception))
 | 
			
		||||
        {
 | 
			
		||||
            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 ocurred." }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            if (env.IsDevelopment())
 | 
			
		||||
            {
 | 
			
		||||
                json.DeveloperMessage = context.Exception;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            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; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										53
									
								
								src/Services/Coupon/Coupon.API/Program.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/Services/Coupon/Coupon.API/Program.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
			
		||||
using Coupon.API.Extensions;
 | 
			
		||||
using HealthChecks.UI.Client;
 | 
			
		||||
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
 | 
			
		||||
 | 
			
		||||
var builder = WebApplication.CreateBuilder(args);
 | 
			
		||||
var configuration = builder.Configuration;
 | 
			
		||||
 | 
			
		||||
builder.Services
 | 
			
		||||
    .AddEndpointsApiExplorer()
 | 
			
		||||
    .AddSwagger()
 | 
			
		||||
    .AddApiVersioning()
 | 
			
		||||
    .AddAppInsight(configuration)
 | 
			
		||||
    .AddCustomMVC()
 | 
			
		||||
    .AddCustomOptions(configuration)
 | 
			
		||||
    .AddEventBus(configuration)
 | 
			
		||||
    .AddCustomHealthCheck(configuration);
 | 
			
		||||
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
 | 
			
		||||
// Configure the HTTP request pipeline.
 | 
			
		||||
if (app.Environment.IsDevelopment())
 | 
			
		||||
{
 | 
			
		||||
    app.UseSwagger();
 | 
			
		||||
    app.UseSwaggerUI();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.UseHttpsRedirection();
 | 
			
		||||
 | 
			
		||||
app.UseRouting();
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
var pathBase = configuration["PATH_BASE"];
 | 
			
		||||
if (!string.IsNullOrEmpty(pathBase))
 | 
			
		||||
{
 | 
			
		||||
    app.UsePathBase(pathBase);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.UseEndpoints(endpoints =>
 | 
			
		||||
{
 | 
			
		||||
    endpoints.MapControllers();
 | 
			
		||||
    
 | 
			
		||||
    endpoints.MapHealthChecks("/hc", new HealthCheckOptions
 | 
			
		||||
    {
 | 
			
		||||
        Predicate = _ => true,
 | 
			
		||||
        ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
 | 
			
		||||
    });
 | 
			
		||||
    endpoints.MapHealthChecks("/liveness", new HealthCheckOptions
 | 
			
		||||
    {
 | 
			
		||||
        Predicate = r => r.Name.Contains("self")
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
app.Run();
 | 
			
		||||
							
								
								
									
										18
									
								
								src/Services/Coupon/Coupon.API/appsettings.Development.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/Services/Coupon/Coupon.API/appsettings.Development.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,18 @@
 | 
			
		||||
{
 | 
			
		||||
  "ConnectionString": "mongodb://localhost:27017",
 | 
			
		||||
  "CouponMongoDatabase": "CouponDb",
 | 
			
		||||
  "Serilog": {
 | 
			
		||||
    "MinimumLevel": {
 | 
			
		||||
      "Default": "Debug",
 | 
			
		||||
      "Override": {
 | 
			
		||||
        "Microsoft": "Warning",
 | 
			
		||||
        "Microsoft.eShopOnContainers": "Debug",
 | 
			
		||||
        "System": "Warning"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "IdentityUrlExternal": "http://localhost:5105",
 | 
			
		||||
  "IdentityUrl": "http://localhost:5105",
 | 
			
		||||
  "AzureServiceBusEnabled": false,
 | 
			
		||||
  "EventBusConnection": "localhost"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										28
									
								
								src/Services/Coupon/Coupon.API/appsettings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/Services/Coupon/Coupon.API/appsettings.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
{
 | 
			
		||||
  "ConnectionString": null,
 | 
			
		||||
  "CouponMongoDatabase": "CouponDb",
 | 
			
		||||
  "UseCustomizationData": false,
 | 
			
		||||
  "Serilog": {
 | 
			
		||||
    "SeqServerUrl": null,
 | 
			
		||||
    "LogstashUrl": null,
 | 
			
		||||
    "MinimumLevel": {
 | 
			
		||||
      "Default": "Information",
 | 
			
		||||
      "Override": {
 | 
			
		||||
        "Microsoft": "Warning",
 | 
			
		||||
        "Microsoft.eShopOnContainers": "Information",
 | 
			
		||||
        "System": "Warning"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "SubscriptionClientName": "Coupon",
 | 
			
		||||
  "ApplicationInsights": {
 | 
			
		||||
    "InstrumentationKey": ""
 | 
			
		||||
  },
 | 
			
		||||
  "EventBusRetryCount": 5,
 | 
			
		||||
  "UseVault": false,
 | 
			
		||||
  "Vault": {
 | 
			
		||||
    "Name": "eshop",
 | 
			
		||||
    "ClientId": "your-client-id",
 | 
			
		||||
    "ClientSecret": "your-client-secret"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								src/Services/Coupon/Coupon.API/eshop.pfx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/Services/Coupon/Coupon.API/eshop.pfx
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							@ -24,6 +24,7 @@ COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
 | 
			
		||||
@ -35,6 +35,7 @@ COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
 | 
			
		||||
@ -25,6 +25,7 @@ COPY "Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj" "Services/Basket
 | 
			
		||||
COPY "Services/Catalog/Catalog.API/Catalog.API.csproj" "Services/Catalog/Catalog.API/Catalog.API.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" "Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj"
 | 
			
		||||
COPY "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj" "Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj"
 | 
			
		||||
COPY "Services/Coupon/Coupon.API/Coupon.API.csproj" "Services/Coupon/Coupon.API/Coupon.API.csproj"
 | 
			
		||||
COPY "Services/Identity/Identity.API/Identity.API.csproj" "Services/Identity/Identity.API/Identity.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.API/Ordering.API.csproj" "Services/Ordering/Ordering.API/Ordering.API.csproj"
 | 
			
		||||
COPY "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj" "Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj"
 | 
			
		||||
 | 
			
		||||
@ -100,7 +100,28 @@ services:
 | 
			
		||||
    ports:
 | 
			
		||||
      - "5101:80"
 | 
			
		||||
      - "9101:81"
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  coupon-api:
 | 
			
		||||
    environment:
 | 
			
		||||
      - ASPNETCORE_ENVIRONMENT=Development
 | 
			
		||||
      - ConnectionString=mongodb://nosqldata
 | 
			
		||||
      - CouponMongoDatabase=CouponDb
 | 
			
		||||
      - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
 | 
			
		||||
      - EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
 | 
			
		||||
      - EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
 | 
			
		||||
      - AzureStorageAccountName=${ESHOP_AZURE_STORAGE_CATALOG_NAME}
 | 
			
		||||
      - AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_CATALOG_KEY}
 | 
			
		||||
      - UseCustomizationData=True
 | 
			
		||||
      - AzureServiceBusEnabled=False
 | 
			
		||||
      - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
 | 
			
		||||
      - OrchestratorType=${ORCHESTRATOR_TYPE}
 | 
			
		||||
      - GRPC_PORT=81
 | 
			
		||||
      - PORT=80
 | 
			
		||||
      - PATH_BASE=/coupon-api
 | 
			
		||||
    ports:
 | 
			
		||||
      - "5110:80"
 | 
			
		||||
      - "9110:81"
 | 
			
		||||
  
 | 
			
		||||
  ordering-api:
 | 
			
		||||
    environment:
 | 
			
		||||
      - ASPNETCORE_ENVIRONMENT=Development
 | 
			
		||||
@ -177,27 +198,29 @@ services:
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./ApiGateways/Envoy/config/mobileshopping:/etc/envoy
 | 
			
		||||
    ports:
 | 
			
		||||
    - "5200:80"
 | 
			
		||||
    - "15200:8001"
 | 
			
		||||
      - "5200:80"
 | 
			
		||||
      - "15200:8001"
 | 
			
		||||
 | 
			
		||||
  webshoppingapigw:
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./ApiGateways/Envoy/config/webshopping:/etc/envoy
 | 
			
		||||
    ports:
 | 
			
		||||
    - "5202:80"
 | 
			
		||||
    - "15202:8001"
 | 
			
		||||
      - "5202:80"
 | 
			
		||||
      - "15202:8001"
 | 
			
		||||
 | 
			
		||||
  mobileshoppingagg:
 | 
			
		||||
    environment:
 | 
			
		||||
      - ASPNETCORE_ENVIRONMENT=Development
 | 
			
		||||
      - urls__basket=http://basket-api
 | 
			
		||||
      - urls__catalog=http://catalog-api
 | 
			
		||||
      - urls__coupon=http://coupon-api
 | 
			
		||||
      - urls__orders=http://ordering-api
 | 
			
		||||
      - urls__identity=http://identity-api
 | 
			
		||||
      - urls__grpcBasket=http://basket-api:81
 | 
			
		||||
      - urls__grpcCatalog=http://catalog-api:81
 | 
			
		||||
      - urls__grpcOrdering=http://ordering-api:81
 | 
			
		||||
      - CatalogUrlHC=http://catalog-api/hc
 | 
			
		||||
      - CouponUrlHC=http://coupon-api/hc
 | 
			
		||||
      - OrderingUrlHC=http://ordering-api/hc
 | 
			
		||||
      - IdentityUrlHC=http://identity-api/hc
 | 
			
		||||
      - BasketUrlHC=http://basket-api/hc
 | 
			
		||||
@ -211,12 +234,14 @@ services:
 | 
			
		||||
      - ASPNETCORE_ENVIRONMENT=Development
 | 
			
		||||
      - urls__basket=http://basket-api
 | 
			
		||||
      - urls__catalog=http://catalog-api
 | 
			
		||||
      - urls__coupon=http://coupon-api
 | 
			
		||||
      - urls__orders=http://ordering-api
 | 
			
		||||
      - urls__identity=http://identity-api
 | 
			
		||||
      - urls__grpcBasket=http://basket-api:81
 | 
			
		||||
      - urls__grpcCatalog=http://catalog-api:81
 | 
			
		||||
      - urls__grpcOrdering=http://ordering-api:81
 | 
			
		||||
      - CatalogUrlHC=http://catalog-api/hc
 | 
			
		||||
      - CouponUrlHC=http://coupon-api/hc
 | 
			
		||||
      - OrderingUrlHC=http://ordering-api/hc
 | 
			
		||||
      - IdentityUrlHC=http://identity-api/hc
 | 
			
		||||
      - BasketUrlHC=http://basket-api/hc
 | 
			
		||||
@ -257,14 +282,16 @@ services:
 | 
			
		||||
      - HealthChecksUI__HealthChecks__5__Uri=http://basket-api/hc
 | 
			
		||||
      - HealthChecksUI__HealthChecks__6__Name=Catalog HTTP Check
 | 
			
		||||
      - HealthChecksUI__HealthChecks__6__Uri=http://catalog-api/hc
 | 
			
		||||
      - HealthChecksUI__HealthChecks__7__Name=Identity HTTP Check
 | 
			
		||||
      - HealthChecksUI__HealthChecks__7__Uri=http://identity-api/hc
 | 
			
		||||
      - HealthChecksUI__HealthChecks__8__Name=Payments HTTP Check
 | 
			
		||||
      - HealthChecksUI__HealthChecks__8__Uri=http://payment-api/hc
 | 
			
		||||
      - HealthChecksUI__HealthChecks__9__Name=Ordering SignalRHub HTTP Check
 | 
			
		||||
      - HealthChecksUI__HealthChecks__9__Uri=http://ordering-signalrhub/hc
 | 
			
		||||
      - HealthChecksUI__HealthChecks__10__Name=Ordering HTTP Background Check
 | 
			
		||||
      - HealthChecksUI__HealthChecks__10__Uri=http://ordering-backgroundtasks/hc
 | 
			
		||||
      - HealthChecksUI__HealthChecks__7__Name=Coupon HTTP Check
 | 
			
		||||
      - HealthChecksUI__HealthChecks__7__Uri=http://coupon-api/hc
 | 
			
		||||
      - HealthChecksUI__HealthChecks__8__Name=Identity HTTP Check
 | 
			
		||||
      - HealthChecksUI__HealthChecks__8__Uri=http://identity-api/hc
 | 
			
		||||
      - HealthChecksUI__HealthChecks__9__Name=Payments HTTP Check
 | 
			
		||||
      - HealthChecksUI__HealthChecks__9__Uri=http://payment-api/hc
 | 
			
		||||
      - HealthChecksUI__HealthChecks__10__Name=Ordering SignalRHub HTTP Check
 | 
			
		||||
      - HealthChecksUI__HealthChecks__10__Uri=http://ordering-signalrhub/hc
 | 
			
		||||
      - HealthChecksUI__HealthChecks__11__Name=Ordering HTTP Background Check
 | 
			
		||||
      - HealthChecksUI__HealthChecks__11__Uri=http://ordering-backgroundtasks/hc
 | 
			
		||||
      - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
 | 
			
		||||
      - OrchestratorType=${ORCHESTRATOR_TYPE}
 | 
			
		||||
    ports:
 | 
			
		||||
 | 
			
		||||
@ -114,6 +114,7 @@ services:
 | 
			
		||||
      - IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105              #Local: You need to open your local dev-machine firewall at range 5100-5105.  at range 5100-5105.
 | 
			
		||||
      - PurchaseUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5202
 | 
			
		||||
      - CatalogUrlHC=http://catalog-api/hc
 | 
			
		||||
      - CouponUrlHC=http://coupon-api/hc
 | 
			
		||||
      - OrderingUrlHC=http://ordering-api/hc
 | 
			
		||||
      - IdentityUrlHC=http://identity-api/hc     #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser.
 | 
			
		||||
      - BasketUrlHC=http://basket-api/hc
 | 
			
		||||
@ -131,6 +132,7 @@ services:
 | 
			
		||||
      - PurchaseUrl=http://webshoppingapigw
 | 
			
		||||
      - IdentityUrl=http://10.0.75.1:5105  # Local Mac: Use http://docker.for.mac.localhost:5105 || Local Windows:  Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. || #Remote access: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser.
 | 
			
		||||
      - CatalogUrlHC=http://catalog-api/hc
 | 
			
		||||
      - CouponUrlHC=http://coupon-api/hc
 | 
			
		||||
      - OrderingUrlHC=http://ordering-api/hc
 | 
			
		||||
      - IdentityUrlHC=http://identity-api/hc     #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser.
 | 
			
		||||
      - BasketUrlHC=http://basket-api/hc
 | 
			
		||||
 | 
			
		||||
@ -43,6 +43,16 @@ services:
 | 
			
		||||
    depends_on:
 | 
			
		||||
      - sqldata
 | 
			
		||||
      - rabbitmq
 | 
			
		||||
        
 | 
			
		||||
  coupon-api:
 | 
			
		||||
    image: ${REGISTRY:-eshop}/coupon.api:${PLATFORM:-linux}-${TAG:-latest}
 | 
			
		||||
    build:
 | 
			
		||||
      context: .
 | 
			
		||||
      dockerfile: Services/Coupon/Coupon.API/Dockerfile
 | 
			
		||||
    depends_on:
 | 
			
		||||
      - sqldata
 | 
			
		||||
      - nosqldata
 | 
			
		||||
      - rabbitmq      
 | 
			
		||||
 | 
			
		||||
  ordering-api:
 | 
			
		||||
    image: ${REGISTRY:-eshop}/ordering.api:${PLATFORM:-linux}-${TAG:-latest}
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Web Apps", "Web Apps", "{E2
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Catalog", "Catalog", "{326A7FB3-5295-468C-A4FE-67DCB823E1E5}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Coupon", "Coupon", "{112D21CD-E9A7-4815-81EF-ECB61E2D9CC2}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Basket", "Basket", "{BF3EF4F3-E4F5-41DA-9D2D-57223687D1A8}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Ordering", "Ordering", "{0BD0DB92-2D98-44D9-9AC0-C59186D59B0B}"
 | 
			
		||||
@ -33,6 +35,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Basket.API", "Services\Bask
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Catalog.API", "Services\Catalog\Catalog.API\Catalog.API.csproj", "{42681D9D-750A-4DF7-BD9F-9292CFD5C253}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Coupon.API", "Services\Coupon\Coupon.API\Coupon.API.csproj", "{181F8727-ECA0-4D10-B6E5-E73593D35DA6}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ordering.API", "Services\Ordering\Ordering.API\Ordering.API.csproj", "{231226CE-690B-4979-8870-9A79D80928E2}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ordering.Domain", "Services\Ordering\Ordering.Domain\Ordering.Domain.csproj", "{F5598DCB-6DDE-4661-AD9D-A55612DA7E76}"
 | 
			
		||||
@ -124,10 +128,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{373D8AA1
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventBus.Tests", "BuildingBlocks\EventBus\EventBus.Tests\EventBus.Tests.csproj", "{95D735BE-2899-4495-BE3F-2600E93B4E3C}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Coupon", "Coupon", "{EA8E5543-46DB-4646-B29B-847756FF0B37}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Coupon.API", "Coupon.API\Coupon.API.csproj", "{A50CFB1D-A31D-4399-9115-CF79A004E106}"
 | 
			
		||||
EndProject
 | 
			
		||||
Global
 | 
			
		||||
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 | 
			
		||||
		Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
 | 
			
		||||
@ -256,6 +256,32 @@ Global
 | 
			
		||||
		{42681D9D-750A-4DF7-BD9F-9292CFD5C253}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
 | 
			
		||||
		{42681D9D-750A-4DF7-BD9F-9292CFD5C253}.Release|x64.ActiveCfg = Release|Any CPU
 | 
			
		||||
		{42681D9D-750A-4DF7-BD9F-9292CFD5C253}.Release|x86.ActiveCfg = Release|Any CPU
 | 
			
		||||
		{181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.AppStore|ARM.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.AppStore|iPhone.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.AppStore|x64.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.AppStore|x86.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Debug|Any CPU.Build.0 = Debug|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Debug|ARM.ActiveCfg = Debug|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Debug|iPhone.ActiveCfg = Debug|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Debug|x64.ActiveCfg = Debug|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Debug|x86.ActiveCfg = Debug|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Release|Any CPU.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Release|Any CPU.Build.0 = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Release|ARM.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Release|iPhone.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Release|x64.ActiveCfg = Release|Any CPU
 | 
			
		||||
        {181F8727-ECA0-4D10-B6E5-E73593D35DA6}.Release|x86.ActiveCfg = Release|Any CPU
 | 
			
		||||
		{231226CE-690B-4979-8870-9A79D80928E2}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
 | 
			
		||||
		{231226CE-690B-4979-8870-9A79D80928E2}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
 | 
			
		||||
		{231226CE-690B-4979-8870-9A79D80928E2}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
 | 
			
		||||
@ -1534,54 +1560,6 @@ Global
 | 
			
		||||
		{95D735BE-2899-4495-BE3F-2600E93B4E3C}.Release|x64.Build.0 = Release|Any CPU
 | 
			
		||||
		{95D735BE-2899-4495-BE3F-2600E93B4E3C}.Release|x86.ActiveCfg = Release|Any CPU
 | 
			
		||||
		{95D735BE-2899-4495-BE3F-2600E93B4E3C}.Release|x86.Build.0 = Release|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.AppStore|Any CPU.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.AppStore|ARM.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.AppStore|ARM.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.AppStore|iPhone.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.AppStore|x64.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.AppStore|x64.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.AppStore|x86.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.AppStore|x86.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Debug|Any CPU.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Debug|ARM.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Debug|ARM.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Debug|iPhone.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Debug|iPhone.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Debug|x64.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Debug|x64.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Debug|x86.ActiveCfg = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Debug|x86.Build.0 = Debug|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Release|Any CPU.ActiveCfg = Release|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Release|Any CPU.Build.0 = Release|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Release|ARM.ActiveCfg = Release|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Release|ARM.Build.0 = Release|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Release|iPhone.ActiveCfg = Release|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Release|iPhone.Build.0 = Release|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Release|x64.ActiveCfg = Release|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Release|x64.Build.0 = Release|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Release|x86.ActiveCfg = Release|Any CPU
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106}.Release|x86.Build.0 = Release|Any CPU
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
	GlobalSection(SolutionProperties) = preSolution
 | 
			
		||||
		HideSolutionNode = FALSE
 | 
			
		||||
@ -1590,12 +1568,14 @@ Global
 | 
			
		||||
		{91CF7717-08AB-4E65-B10E-0B426F01E2E8} = {932D8224-11F6-4D07-B109-DA28AD288A63}
 | 
			
		||||
		{E279BF0F-7F66-4F3A-A3AB-2CDA66C1CD04} = {932D8224-11F6-4D07-B109-DA28AD288A63}
 | 
			
		||||
		{326A7FB3-5295-468C-A4FE-67DCB823E1E5} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8}
 | 
			
		||||
		{112D21CD-E9A7-4815-81EF-ECB61E2D9CC2} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8}
 | 
			
		||||
		{BF3EF4F3-E4F5-41DA-9D2D-57223687D1A8} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8}
 | 
			
		||||
		{0BD0DB92-2D98-44D9-9AC0-C59186D59B0B} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8}
 | 
			
		||||
		{EF0337F2-ED00-4643-89FD-EE10863F1870} = {A857AD10-40FF-4303-BEC2-FF1C58D5735E}
 | 
			
		||||
		{24CD3B53-141E-4A07-9B0D-796641E1CF78} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8}
 | 
			
		||||
		{2110CBB0-3B38-4EE4-A743-DF6968D80D90} = {BF3EF4F3-E4F5-41DA-9D2D-57223687D1A8}
 | 
			
		||||
		{42681D9D-750A-4DF7-BD9F-9292CFD5C253} = {326A7FB3-5295-468C-A4FE-67DCB823E1E5}
 | 
			
		||||
		{181F8727-ECA0-4D10-B6E5-E73593D35DA6} = {112D21CD-E9A7-4815-81EF-ECB61E2D9CC2}
 | 
			
		||||
		{231226CE-690B-4979-8870-9A79D80928E2} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B}
 | 
			
		||||
		{F5598DCB-6DDE-4661-AD9D-A55612DA7E76} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B}
 | 
			
		||||
		{F0333D8E-0B27-42B7-B2C6-78F3657624E2} = {E279BF0F-7F66-4F3A-A3AB-2CDA66C1CD04}
 | 
			
		||||
@ -1640,8 +1620,6 @@ Global
 | 
			
		||||
		{B62E859F-825E-4C8B-93EC-5966EACFD026} = {798BFC44-2CCD-45FA-B37A-5173B03C2B30}
 | 
			
		||||
		{373D8AA1-36BE-49EC-89F0-6CB736666285} = {807BB76E-B2BB-47A2-A57B-3D1B20FF5E7F}
 | 
			
		||||
		{95D735BE-2899-4495-BE3F-2600E93B4E3C} = {373D8AA1-36BE-49EC-89F0-6CB736666285}
 | 
			
		||||
		{EA8E5543-46DB-4646-B29B-847756FF0B37} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8}
 | 
			
		||||
		{A50CFB1D-A31D-4399-9115-CF79A004E106} = {EA8E5543-46DB-4646-B29B-847756FF0B37}
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
	GlobalSection(ExtensibilityGlobals) = postSolution
 | 
			
		||||
		SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user