diff --git a/Directory.Build.props b/Directory.Build.props
index 456ef29..308f857 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -1,6 +1,6 @@
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
@@ -10,38 +10,38 @@
PrivateAssets="all"
Condition="$(MSBuildProjectExtension) == '.csproj'"
/>
-
-
-
-
-
-
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/src/ApiGateway/src/ApiGateway.csproj b/src/ApiGateway/src/ApiGateway.csproj
index f9270e5..35f3ce0 100644
--- a/src/ApiGateway/src/ApiGateway.csproj
+++ b/src/ApiGateway/src/ApiGateway.csproj
@@ -6,13 +6,13 @@
-
-
-
+
+
+
-
+
diff --git a/src/ApiGateway/src/appsettings.docker.json b/src/ApiGateway/src/appsettings.docker.json
index d1addbf..bda427a 100644
--- a/src/ApiGateway/src/appsettings.docker.json
+++ b/src/ApiGateway/src/appsettings.docker.json
@@ -4,28 +4,28 @@
"flight": {
"destinations": {
"destination1": {
- "address" : "http://flight"
+ "address": "http://flight"
}
}
},
"identity": {
"destinations": {
"destination1": {
- "address" : "http://identity"
+ "address": "http://identity"
}
}
},
"passenger": {
"destinations": {
"destination1": {
- "address" : "http://passenger"
+ "address": "http://passenger"
}
}
},
"booking": {
"destinations": {
"destination1": {
- "address" : "http://booking"
+ "address": "http://booking"
}
}
}
diff --git a/src/BuildingBlocks/BuildingBlocks.csproj b/src/BuildingBlocks/BuildingBlocks.csproj
index 97d850b..6d5cf38 100644
--- a/src/BuildingBlocks/BuildingBlocks.csproj
+++ b/src/BuildingBlocks/BuildingBlocks.csproj
@@ -7,114 +7,114 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
+
+
+
-
-
+
+
diff --git a/src/BuildingBlocks/CAP/Extensions.cs b/src/BuildingBlocks/CAP/Extensions.cs
index 85469fc..cf1c6fa 100644
--- a/src/BuildingBlocks/CAP/Extensions.cs
+++ b/src/BuildingBlocks/CAP/Extensions.cs
@@ -6,13 +6,13 @@ using DotNetCore.CAP.Messages;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
-using OpenTelemetry.Trace;
namespace BuildingBlocks.CAP;
public static class Extensions
{
- public static IServiceCollection AddCustomCap(this IServiceCollection services) where TDbContext : DbContext
+ public static IServiceCollection AddCustomCap(this IServiceCollection services)
+ where TDbContext : DbContext
{
var rabbitMqOptions = services.GetOptions("RabbitMq");
diff --git a/src/BuildingBlocks/Caching/CachingBehavior.cs b/src/BuildingBlocks/Caching/CachingBehavior.cs
index 3a93d0f..4bd3889 100644
--- a/src/BuildingBlocks/Caching/CachingBehavior.cs
+++ b/src/BuildingBlocks/Caching/CachingBehavior.cs
@@ -1,63 +1,54 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using EasyCaching.Core;
+using EasyCaching.Core;
using MediatR;
using Microsoft.Extensions.Logging;
-namespace BuildingBlocks.Caching
+namespace BuildingBlocks.Caching;
+
+public class CachingBehavior : IPipelineBehavior
+ where TRequest : notnull, IRequest
+ where TResponse : notnull
{
- public class CachingBehavior : IPipelineBehavior
- where TRequest : notnull, IRequest
- where TResponse : notnull
+ private readonly ICacheRequest _cacheRequest;
+ private readonly IEasyCachingProvider _cachingProvider;
+ private readonly ILogger> _logger;
+ private readonly int defaultCacheExpirationInHours = 1;
+
+ public CachingBehavior(IEasyCachingProviderFactory cachingFactory,
+ ILogger> logger,
+ ICacheRequest cacheRequest)
{
- private readonly ILogger> _logger;
- private readonly IEasyCachingProvider _cachingProvider;
- private readonly ICacheRequest _cacheRequest;
- private readonly int defaultCacheExpirationInHours = 1;
+ _logger = logger;
+ _cachingProvider = cachingFactory.GetCachingProvider("mem");
+ _cacheRequest = cacheRequest;
+ }
- public CachingBehavior(IEasyCachingProviderFactory cachingFactory,
- ILogger> logger,
- ICacheRequest cacheRequest)
+
+ public async Task Handle(TRequest request, CancellationToken cancellationToken,
+ RequestHandlerDelegate next)
+ {
+ if (request is not ICacheRequest || _cacheRequest == null)
+ // No cache request found, so just continue through the pipeline
+ return await next();
+
+ var cacheKey = _cacheRequest.CacheKey;
+ var cachedResponse = await _cachingProvider.GetAsync(cacheKey);
+ if (cachedResponse.Value != null)
{
- _logger = logger;
- _cachingProvider = cachingFactory.GetCachingProvider("mem");
- _cacheRequest = cacheRequest;
+ _logger.LogDebug("Response retrieved {TRequest} from cache. CacheKey: {CacheKey}",
+ typeof(TRequest).FullName, cacheKey);
+ return cachedResponse.Value;
}
+ var response = await next();
- public async Task Handle(TRequest request, CancellationToken cancellationToken,
- RequestHandlerDelegate next)
- {
+ var expirationTime = _cacheRequest.AbsoluteExpirationRelativeToNow ??
+ DateTime.Now.AddHours(defaultCacheExpirationInHours);
- if (request is not ICacheRequest || _cacheRequest == null)
- {
- // No cache request found, so just continue through the pipeline
- return await next();
- }
+ await _cachingProvider.SetAsync(cacheKey, response, expirationTime.TimeOfDay);
- var cacheKey = _cacheRequest.CacheKey;
- var cachedResponse = await _cachingProvider.GetAsync(cacheKey);
- if (cachedResponse.Value != null)
- {
- _logger.LogDebug("Response retrieved {TRequest} from cache. CacheKey: {CacheKey}",
- typeof(TRequest).FullName, cacheKey);
- return cachedResponse.Value;
- }
+ _logger.LogDebug("Caching response for {TRequest} with cache key: {CacheKey}", typeof(TRequest).FullName,
+ cacheKey);
- var response = await next();
-
- var expirationTime = _cacheRequest.AbsoluteExpirationRelativeToNow ??
- DateTime.Now.AddHours(defaultCacheExpirationInHours);
-
- await _cachingProvider.SetAsync(cacheKey, response, expirationTime.TimeOfDay);
-
- _logger.LogDebug("Caching response for {TRequest} with cache key: {CacheKey}", typeof(TRequest).FullName,
- cacheKey);
-
- return response;
- }
+ return response;
}
}
diff --git a/src/BuildingBlocks/Domain/Model/IEntity.cs b/src/BuildingBlocks/Domain/Model/IEntity.cs
index be3e512..c7b88a5 100644
--- a/src/BuildingBlocks/Domain/Model/IEntity.cs
+++ b/src/BuildingBlocks/Domain/Model/IEntity.cs
@@ -1,5 +1,10 @@
namespace BuildingBlocks.Domain.Model;
+public interface IEntity
+{
+ long Id { get; }
+}
+
public interface IEntity
{
TId Id { get; }
diff --git a/src/BuildingBlocks/EFCore/AppDbContextBase.cs b/src/BuildingBlocks/EFCore/AppDbContextBase.cs
index 2458209..b43409a 100644
--- a/src/BuildingBlocks/EFCore/AppDbContextBase.cs
+++ b/src/BuildingBlocks/EFCore/AppDbContextBase.cs
@@ -27,10 +27,14 @@ public abstract class AppDbContextBase : DbContext, IDbContext
base.OnModelCreating(builder);
}
- public async Task BeginTransactionAsync(IsolationLevel isolationLevel,
- CancellationToken cancellationToken = default)
+ public async Task BeginTransactionAsync(CancellationToken cancellationToken = default)
{
- _currentTransaction ??= await Database.BeginTransactionAsync(isolationLevel, cancellationToken);
+ if (_currentTransaction != null)
+ {
+ return;
+ }
+
+ _currentTransaction = await Database.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken);
}
public async Task CommitTransactionAsync(CancellationToken cancellationToken = default)
diff --git a/src/BuildingBlocks/EFCore/EfIdentityTxBehavior.cs b/src/BuildingBlocks/EFCore/EfIdentityTxBehavior.cs
index fba037e..e89b788 100644
--- a/src/BuildingBlocks/EFCore/EfIdentityTxBehavior.cs
+++ b/src/BuildingBlocks/EFCore/EfIdentityTxBehavior.cs
@@ -41,7 +41,7 @@ public class EfIdentityTxBehavior : IPipelineBehavior),
typeof(TRequest).FullName);
- await _dbContextBase.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken);
+ await _dbContextBase.BeginTransactionAsync(cancellationToken);
try
{
diff --git a/src/BuildingBlocks/EFCore/EfTxBehavior.cs b/src/BuildingBlocks/EFCore/EfTxBehavior.cs
index 6373ee9..1220846 100644
--- a/src/BuildingBlocks/EFCore/EfTxBehavior.cs
+++ b/src/BuildingBlocks/EFCore/EfTxBehavior.cs
@@ -45,7 +45,7 @@ public class EfTxBehavior : IPipelineBehavior),
typeof(TRequest).FullName);
- await _dbContextBase.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken);
+ await _dbContextBase.BeginTransactionAsync(cancellationToken);
try
{
diff --git a/src/BuildingBlocks/EFCore/IDbContext.cs b/src/BuildingBlocks/EFCore/IDbContext.cs
index 03d0e50..1f40e48 100644
--- a/src/BuildingBlocks/EFCore/IDbContext.cs
+++ b/src/BuildingBlocks/EFCore/IDbContext.cs
@@ -9,7 +9,7 @@ public interface IDbContext
DbSet Set()
where TEntity : class;
IReadOnlyList GetDomainEvents();
- Task BeginTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken = default);
+ Task BeginTransactionAsync(CancellationToken cancellationToken = default);
Task CommitTransactionAsync(CancellationToken cancellationToken = default);
Task RollbackTransactionAsync(CancellationToken cancellationToken = default);
Task SaveChangesAsync(CancellationToken cancellationToken = default);
diff --git a/src/BuildingBlocks/Utils/ConfigurationExtensions.cs b/src/BuildingBlocks/Utils/ConfigurationExtensions.cs
index 44f8686..ace0c7b 100644
--- a/src/BuildingBlocks/Utils/ConfigurationExtensions.cs
+++ b/src/BuildingBlocks/Utils/ConfigurationExtensions.cs
@@ -1,3 +1,4 @@
+using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
@@ -19,4 +20,11 @@ public static class ConfigurationExtensions
configuration?.GetSection(section).Bind(model);
return model;
}
-}
\ No newline at end of file
+
+ public static TModel GetOptions(this WebApplication app, string section) where TModel : new()
+ {
+ var model = new TModel();
+ app.Configuration?.GetSection(section).Bind(model);
+ return model;
+ }
+}
diff --git a/src/Services/Booking/src/Booking.Api/Booking.Api.csproj b/src/Services/Booking/src/Booking.Api/Booking.Api.csproj
index fe73e9a..b78bb73 100644
--- a/src/Services/Booking/src/Booking.Api/Booking.Api.csproj
+++ b/src/Services/Booking/src/Booking.Api/Booking.Api.csproj
@@ -5,9 +5,9 @@
enable
enable
-
+
-
+
diff --git a/src/Services/Booking/src/Booking.Api/appsettings.json b/src/Services/Booking/src/Booking.Api/appsettings.json
index 72103ab..423f603 100644
--- a/src/Services/Booking/src/Booking.Api/appsettings.json
+++ b/src/Services/Booking/src/Booking.Api/appsettings.json
@@ -15,9 +15,9 @@
"DefaultConnection": "Server=.\\sqlexpress;Database=BookingDB;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Jwt": {
- "Authority": "https://localhost:5005",
- "Audience": "booking-api"
-},
+ "Authority": "https://localhost:5005",
+ "Audience": "booking-api"
+ },
"RabbitMq": {
"HostName": "localhost",
"ExchangeName": "booking",
diff --git a/src/Services/Booking/src/Booking/Booking.csproj b/src/Services/Booking/src/Booking/Booking.csproj
index 1cd1e12..620f3da 100644
--- a/src/Services/Booking/src/Booking/Booking.csproj
+++ b/src/Services/Booking/src/Booking/Booking.csproj
@@ -13,11 +13,11 @@
-
+
-
+
diff --git a/src/Services/Flight/src/Flight.Api/Flight.Api.csproj b/src/Services/Flight/src/Flight.Api/Flight.Api.csproj
index 7db9fe4..e1016b5 100644
--- a/src/Services/Flight/src/Flight.Api/Flight.Api.csproj
+++ b/src/Services/Flight/src/Flight.Api/Flight.Api.csproj
@@ -7,11 +7,11 @@
-
+
-
+
@@ -19,5 +19,5 @@
Always
-
+
diff --git a/src/Services/Flight/src/Flight.Api/Program.cs b/src/Services/Flight/src/Flight.Api/Program.cs
index 25c5716..cd4d5e5 100644
--- a/src/Services/Flight/src/Flight.Api/Program.cs
+++ b/src/Services/Flight/src/Flight.Api/Program.cs
@@ -8,7 +8,6 @@ using BuildingBlocks.Jwt;
using BuildingBlocks.Logging;
using BuildingBlocks.Mapster;
using BuildingBlocks.MassTransit;
-using BuildingBlocks.Mongo;
using BuildingBlocks.OpenTelemetry;
using BuildingBlocks.Swagger;
using BuildingBlocks.Utils;
@@ -24,78 +23,84 @@ using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Prometheus;
using Serilog;
-
var builder = WebApplication.CreateBuilder(args);
-var configuration = builder.Configuration;
-var appOptions = builder.Services.GetOptions("AppOptions");
-Console.WriteLine(FiggleFonts.Standard.Render(appOptions.Name));
-
-builder.Services.AddCustomDbContext(configuration, typeof(FlightRoot).Assembly);
-builder.Services.AddMongoDbContext(configuration);
-
-builder.Services.AddScoped();
-builder.AddCustomSerilog();
-builder.Services.AddJwt();
-builder.Services.AddControllers();
-builder.Services.AddCustomSwagger(builder.Configuration, typeof(FlightRoot).Assembly);
-builder.Services.AddCustomVersioning();
-builder.Services.AddCustomMediatR();
-builder.Services.AddValidatorsFromAssembly(typeof(FlightRoot).Assembly);
-builder.Services.AddCustomProblemDetails();
-builder.Services.AddCustomMapster(typeof(FlightRoot).Assembly);
-builder.Services.AddHttpContextAccessor();
-builder.Services.AddTransient();
-builder.Services.AddCustomMassTransit(typeof(FlightRoot).Assembly);
-builder.Services.AddCustomOpenTelemetry();
-builder.Services.AddRouting(options => options.LowercaseUrls = true);
-
-builder.Services.AddGrpc(options =>
-{
- options.Interceptors.Add();
-});
-
-builder.Services.AddMagicOnion();
-
-SnowFlakIdGenerator.Configure(1);
-
-builder.Services.AddCachingRequest(new List
-{
- typeof(FlightRoot).Assembly
-});
-
-builder.Services.AddEasyCaching(options => { options.UseInMemory(configuration, "mem"); });
+RegisterServices(builder);
var app = builder.Build();
-if (app.Environment.IsDevelopment())
-{
- var provider = app.Services.GetService();
- app.UseCustomSwagger(provider);
-}
+ConfigureApplication(app);
-app.UseSerilogRequestLogging();
-app.UseCorrelationId();
-app.UseRouting();
-app.UseHttpMetrics();
-app.UseMigrations();
-app.UseProblemDetails();
-app.UseHttpsRedirection();
-app.UseAuthentication();
-app.UseAuthorization();
-
-
-
-app.UseEndpoints(endpoints =>
-{
- endpoints.MapControllers();
- endpoints.MapMetrics();
- endpoints.MapMagicOnionService();
-});
-
-app.MapGet("/", x => x.Response.WriteAsync(appOptions.Name));
app.Run();
-public partial class Program
+static void RegisterServices(WebApplicationBuilder builder)
{
+ var configuration = builder.Configuration;
+ var services = builder.Services;
+
+ var appOptions = services.GetOptions("AppOptions");
+ Console.WriteLine(FiggleFonts.Standard.Render(appOptions.Name));
+
+ builder.AddCustomSerilog();
+
+ services.AddCustomDbContext(configuration, typeof(FlightRoot).Assembly);
+ services.AddScoped();
+ services.AddJwt();
+ services.AddControllers();
+ services.AddCustomSwagger(builder.Configuration, typeof(FlightRoot).Assembly);
+ services.AddCustomVersioning();
+ services.AddCustomMediatR();
+ services.AddValidatorsFromAssembly(typeof(FlightRoot).Assembly);
+ services.AddCustomProblemDetails();
+ services.AddCustomMapster(typeof(FlightRoot).Assembly);
+ services.AddHttpContextAccessor();
+ services.AddTransient();
+ services.AddCustomMassTransit(typeof(FlightRoot).Assembly);
+ services.AddCustomOpenTelemetry();
+ services.AddRouting(options => options.LowercaseUrls = true);
+
+ services.AddGrpc(options =>
+ {
+ options.Interceptors.Add();
+ });
+
+ services.AddMagicOnion();
+
+ SnowFlakIdGenerator.Configure(1);
+
+ services.AddCachingRequest(new List {typeof(FlightRoot).Assembly});
+
+ services.AddEasyCaching(options => { options.UseInMemory(configuration, "mem"); });
}
+
+static void ConfigureApplication(WebApplication app)
+{
+ var appOptions = app.GetOptions("AppOptions");
+
+ if (app.Environment.IsDevelopment())
+ {
+ var provider = app.Services.GetService();
+ app.UseCustomSwagger(provider);
+ }
+
+ app.UseSerilogRequestLogging();
+ app.UseCorrelationId();
+ app.UseRouting();
+ app.UseHttpMetrics();
+ app.UseMigrations();
+ app.UseProblemDetails();
+ app.UseHttpsRedirection();
+ app.UseAuthentication();
+ app.UseAuthorization();
+
+ app.UseEndpoints(endpoints =>
+ {
+ endpoints.MapControllers();
+ endpoints.MapMetrics();
+ endpoints.MapMagicOnionService();
+ });
+
+ app.MapGet("/", x => x.Response.WriteAsync(appOptions.Name));
+}
+
+public partial class Program { }
diff --git a/src/Services/Flight/src/Flight/Flight.csproj b/src/Services/Flight/src/Flight/Flight.csproj
index 6bc9a74..ce19486 100644
--- a/src/Services/Flight/src/Flight/Flight.csproj
+++ b/src/Services/Flight/src/Flight/Flight.csproj
@@ -12,15 +12,16 @@
-
-
-
-
-
+
+
+
+
+
+
-
+
diff --git a/src/Services/Flight/src/Flight/Flights/Features/GetFlightById/GetFlightByIdEndpoint.cs b/src/Services/Flight/src/Flight/Flights/Features/GetFlightById/GetFlightByIdEndpoint.cs
index 4d93d06..d6678ad 100644
--- a/src/Services/Flight/src/Flight/Flights/Features/GetFlightById/GetFlightByIdEndpoint.cs
+++ b/src/Services/Flight/src/Flight/Flights/Features/GetFlightById/GetFlightByIdEndpoint.cs
@@ -1,3 +1,4 @@
+using System;
using System.Threading;
using System.Threading.Tasks;
using BuildingBlocks.Web;
@@ -11,13 +12,14 @@ namespace Flight.Flights.Features.GetFlightById;
[Route(BaseApiPath + "/flight")]
public class GetFlightByIdEndpoint: BaseController
{
- [Authorize]
+ // [Authorize]
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[SwaggerOperation(Summary = "Get flight by id", Description = "Get flight by id")]
public async Task GetById([FromRoute] GetFlightByIdQuery query, CancellationToken cancellationToken)
{
+ throw new Exception();
var result = await Mediator.Send(query, cancellationToken);
return Ok(result);
diff --git a/src/Services/Flight/tests/Integration.Test.csproj b/src/Services/Flight/tests/Integration.Test.csproj
index ab5e0e7..ce02b74 100644
--- a/src/Services/Flight/tests/Integration.Test.csproj
+++ b/src/Services/Flight/tests/Integration.Test.csproj
@@ -1,36 +1,34 @@
-
- net6.0
+
+ net6.0
+ false
+
+
- false
-
+
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Services/Flight/tests/TestFixture.cs b/src/Services/Flight/tests/TestFixture.cs
index 0d0735b..1fa5b94 100644
--- a/src/Services/Flight/tests/TestFixture.cs
+++ b/src/Services/Flight/tests/TestFixture.cs
@@ -1,19 +1,12 @@
using System;
using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Security.Claims;
using System.Threading.Tasks;
+using BuildingBlocks.Domain.Model;
using Flight.Data;
using MediatR;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Testing;
-using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.VisualStudio.TestPlatform.TestHost;
-using Moq;
using Respawn;
using Xunit;
@@ -24,97 +17,214 @@ public class SliceFixtureCollection : ICollectionFixture
{
}
+// ref: https://github.com/jbogard/ContosoUniversityDotNetCore-Pages/blob/master/ContosoUniversity.IntegrationTests/SliceFixture.cs
public class TestFixture : IAsyncLifetime
{
private readonly Checkpoint _checkpoint;
private readonly IConfiguration _configuration;
private readonly WebApplicationFactory _factory;
- private static IServiceScopeFactory _scopeFactory = null!;
+ private readonly IServiceScopeFactory _scopeFactory;
public TestFixture()
{
- _factory = new FlightTestApplicationFactory();
+ var factory = FlightTestApplicationFactory();
- _configuration = _factory.Services.GetRequiredService();
- _scopeFactory = _factory.Services.GetRequiredService();
+ _configuration = factory.Services.GetRequiredService();
+ _scopeFactory = factory.Services.GetRequiredService();
_checkpoint = new Checkpoint();
}
- class FlightTestApplicationFactory : WebApplicationFactory
- {
- protected override void ConfigureWebHost(IWebHostBuilder builder)
- {
- // builder.ConfigureAppConfiguration((_, configBuilder) =>
- // {
- // configBuilder.AddInMemoryCollection(new Dictionary
- // {
- // {"ConnectionStrings:DefaultConnection", _connectionString}
- // });
- // });
-
- builder.ConfigureServices(services =>
- {
- services.AddLogging();
- var httpContextAccessorService = services.FirstOrDefault(d =>
- d.ServiceType == typeof(IHttpContextAccessor));
- services.Remove(httpContextAccessorService);
- services.AddSingleton(_ => Mock.Of());
-
- services.AddSingleton(Mock.Of(w =>
- w.EnvironmentName == "Flight.IntegrationTest" &&
- w.ApplicationName == "Flight"));
-
- // services.AddMassTransitTestHarness();
- //
- // // MassTransit Harness Setup -- Do Not Delete Comment
- // services.AddMassTransitInMemoryTestHarness(cfg =>
- // {
- // // Consumer Registration -- Do Not Delete Comment
- // // cfg.AddConsumer();
- // // cfg.AddConsumerTestHarness();
- // });
-
- EnsureDatabase();
- });
- }
-
- }
-
-
- private static void EnsureDatabase()
- {
- using var scope = _scopeFactory.CreateScope();
-
- var context = scope.ServiceProvider.GetService();
-
- context?.Database.Migrate();
- }
-
- public static TScopedService GetService()
- {
- var scope = _scopeFactory.CreateScope();
- var service = scope.ServiceProvider.GetService();
- return service;
- }
-
-
- public static Task SendAsync(IRequest request)
- {
- using var scope = _scopeFactory.CreateScope();
-
- var mediator = scope.ServiceProvider.GetService();
-
- return mediator.Send(request);
- }
-
public Task InitializeAsync()
- => _checkpoint.Reset(_configuration.GetConnectionString("FlightConnection"));
+ {
+ return _checkpoint.Reset(_configuration.GetConnectionString("DefaultConnection"));
+ }
public Task DisposeAsync()
{
_factory?.Dispose();
return Task.CompletedTask;
}
+
+ public WebApplicationFactory FlightTestApplicationFactory()
+ {
+ return new WebApplicationFactory()
+ .WithWebHostBuilder(builder =>
+ {
+ builder.ConfigureAppConfiguration((_, configBuilder) =>
+ {
+ configBuilder.AddInMemoryCollection(new Dictionary
+ {
+ {
+ "ConnectionStrings:DefaultConnection",
+ "Server=db;Database=FlightDB;User ID=sa;Password=@Aa123456"
+ }
+ });
+ });
+ });
+ }
+
+ public async Task ExecuteScopeAsync(Func action)
+ {
+ using var scope = _scopeFactory.CreateScope();
+ var dbContext = scope.ServiceProvider.GetRequiredService();
+
+ try
+ {
+ await dbContext.BeginTransactionAsync();
+
+ await action(scope.ServiceProvider);
+
+ await dbContext.CommitTransactionAsync();
+ }
+ catch (Exception)
+ {
+ await dbContext.RollbackTransactionAsync();
+ throw;
+ }
+ }
+
+ public async Task ExecuteScopeAsync(Func> action)
+ {
+ using var scope = _scopeFactory.CreateScope();
+ var dbContext = scope.ServiceProvider.GetRequiredService();
+
+ try
+ {
+ await dbContext.BeginTransactionAsync();
+
+ var result = await action(scope.ServiceProvider);
+
+ await dbContext.CommitTransactionAsync();
+
+ return result;
+ }
+ catch (Exception)
+ {
+ await dbContext.RollbackTransactionAsync();
+ throw;
+ }
+ }
+
+ public Task ExecuteDbContextAsync(Func action)
+ {
+ return ExecuteScopeAsync(sp => action(sp.GetService()));
+ }
+
+ public Task ExecuteDbContextAsync(Func action)
+ {
+ return ExecuteScopeAsync(sp => action(sp.GetService()).AsTask());
+ }
+
+ public Task ExecuteDbContextAsync(Func action)
+ {
+ return ExecuteScopeAsync(sp => action(sp.GetService(), sp.GetService()));
+ }
+
+ public Task ExecuteDbContextAsync(Func> action)
+ {
+ return ExecuteScopeAsync(sp => action(sp.GetService()));
+ }
+
+ public Task ExecuteDbContextAsync(Func> action)
+ {
+ return ExecuteScopeAsync(sp => action(sp.GetService()).AsTask());
+ }
+
+ public Task ExecuteDbContextAsync(Func> action)
+ {
+ return ExecuteScopeAsync(sp => action(sp.GetService(), sp.GetService()));
+ }
+
+ public Task InsertAsync(params T[] entities) where T : class
+ {
+ return ExecuteDbContextAsync(db =>
+ {
+ foreach (var entity in entities) db.Set().Add(entity);
+ return db.SaveChangesAsync();
+ });
+ }
+
+ public Task InsertAsync(TEntity entity) where TEntity : class
+ {
+ return ExecuteDbContextAsync(db =>
+ {
+ db.Set().Add(entity);
+
+ return db.SaveChangesAsync();
+ });
+ }
+
+ public Task InsertAsync(TEntity entity, TEntity2 entity2)
+ where TEntity : class
+ where TEntity2 : class
+ {
+ return ExecuteDbContextAsync(db =>
+ {
+ db.Set().Add(entity);
+ db.Set().Add(entity2);
+
+ return db.SaveChangesAsync();
+ });
+ }
+
+ public Task InsertAsync(TEntity entity, TEntity2 entity2, TEntity3 entity3)
+ where TEntity : class
+ where TEntity2 : class
+ where TEntity3 : class
+ {
+ return ExecuteDbContextAsync(db =>
+ {
+ db.Set().Add(entity);
+ db.Set().Add(entity2);
+ db.Set().Add(entity3);
+
+ return db.SaveChangesAsync();
+ });
+ }
+
+ public Task InsertAsync(TEntity entity, TEntity2 entity2, TEntity3 entity3,
+ TEntity4 entity4)
+ where TEntity : class
+ where TEntity2 : class
+ where TEntity3 : class
+ where TEntity4 : class
+ {
+ return ExecuteDbContextAsync(db =>
+ {
+ db.Set().Add(entity);
+ db.Set().Add(entity2);
+ db.Set().Add(entity3);
+ db.Set().Add(entity4);
+
+ return db.SaveChangesAsync();
+ });
+ }
+
+ public Task FindAsync(int id)
+ where T : class, IEntity
+ {
+ return ExecuteDbContextAsync(db => db.Set().FindAsync(id).AsTask());
+ }
+
+ public Task SendAsync(IRequest request)
+ {
+ return ExecuteScopeAsync(sp =>
+ {
+ var mediator = sp.GetRequiredService();
+
+ return mediator.Send(request);
+ });
+ }
+
+ public Task SendAsync(IRequest request)
+ {
+ return ExecuteScopeAsync(sp =>
+ {
+ var mediator = sp.GetRequiredService();
+
+ return mediator.Send(request);
+ });
+ }
}
diff --git a/src/Services/Identity/src/Identity.Api/Identity.Api.csproj b/src/Services/Identity/src/Identity.Api/Identity.Api.csproj
index 2715513..1a10b24 100644
--- a/src/Services/Identity/src/Identity.Api/Identity.Api.csproj
+++ b/src/Services/Identity/src/Identity.Api/Identity.Api.csproj
@@ -7,11 +7,11 @@
-
+
- <_ContentIncludedByDefault Remove="keys\is-signing-key-C01EF7C986B61650360AFA59291E65BC.json" />
+ <_ContentIncludedByDefault Remove="keys\is-signing-key-C01EF7C986B61650360AFA59291E65BC.json"/>
diff --git a/src/Services/Identity/src/Identity.Api/keys/is-signing-key-31079AE9DF4ED1F2D492E52BA5A644F5.json b/src/Services/Identity/src/Identity.Api/keys/is-signing-key-31079AE9DF4ED1F2D492E52BA5A644F5.json
index 2349aa7..8465fff 100644
--- a/src/Services/Identity/src/Identity.Api/keys/is-signing-key-31079AE9DF4ED1F2D492E52BA5A644F5.json
+++ b/src/Services/Identity/src/Identity.Api/keys/is-signing-key-31079AE9DF4ED1F2D492E52BA5A644F5.json
@@ -1 +1,9 @@
-{"Version":1,"Id":"31079AE9DF4ED1F2D492E52BA5A644F5","Created":"2022-04-18T20:26:55.3256244Z","Algorithm":"RS256","IsX509Certificate":false,"Data":"CfDJ8P3RLEnEd5JHjUIOTYyyJAzVTUgXKNFkjwfEWELe3r9iozJI4zF_jAjqORPS_C37DAQiHHtMYbgB7_j1Wwqck7qb_wv8CuDfNW8Hx0_UdWaO6vD0Sf_hIbBmN4RrwFwdMia8IUcNCUpwL9XJl95TLzD9FjpuyuWElQ8_5ZnF3SuErstPenQa4q9MYsj9XmPhNSk-BQan-cimxIAPYm1BgZNm5DMylT98sus9ScYTgOowV2n13MW0uA7kk9JOZIIjG07UuaSnuEQei03AU9zkejYD8yLwBi98ON5s0_jW2V3ebY-01VBQXhztu5Iev_SCynNyqQW-uqEzL9SSlzX8dEa79KKmOJEo2o325AVeDOBvco2XDCCra5RkRhUIPV3ZHvQr4EZJNqvi1zelWs3-FJ9vXE02-6XZkZKd6TzhPfiMDc1Z88-eVlx-uwhPjvJyfUSU9cAgbNDREDETxUcmIAMqqbXVAUCnaPkpbxy0VZ6YGSNsD9w77L6nIKiz-0KkVtxDZKCXh5BbDwAiWza8KWKclnVUnMLGhnjANEgKzzvmb1UJr1wZ0xRZ9KXyxr9oy0kP1Be-ysFSUd-YUTSgDvuQZV_DPjH2XP99tXqmfWJ8PJN9hswaRGhp5Jxo003l93u7Ivy-XR1BEhxVoYpvV9fCh8lo-N9ayHYpYlEsdArk1qvkuGRSlkBWNeEr_ZsvODbwM8Jp5q7pLK7cUy0bRHnYwkyHReS_fh6_tTdnfcQZPWb7fLN967XwebcVNOEENn5FX9oszCiy5BG9HQDIPffIx8bkKrZCMV77e5Qria9wNwkhIi3-7SOjRD-v5azkwiV0hTToAQTYsAT8DRTJklI90PF4JbsiMvObeoJtbwPy3E-K1_4DOxAjNwQFHf_zqWEbo9vmxGF-IerSwaJNSVfUUxnnYT8JWFYHYzWGyMvqtdymk1pmBaOJ64dgTVVcao7S0PwfV4DNUzxKQX-jNzqMihaXu4y8lyGIPJycJezm7nfGJiHhhhV4EWSQ1Y2ypBGv_s1iZ5pvTCeGkthY2Q4pe-GYKrFGTnBSLWwHqsVA2gwb1McjYjUGNgu_mnzyB45ZpKrqXQDDiozbQ4Ju7DJb5Vi_EoPmeHQDj5h5sFwAWtq0NGI_lRAog2K_QnZvSV3SFDVlaKDq9PjgIORc6wi5bzbAusWbjDd_sb211QsrNfW-0SWWgYwz9qRg14OiuntGESXSq9Cmx8WgPaK5H0FQGZUlzq3Bk8ov6GUhPeZSKP4gUyfRloSyj2DBZSe_0JOXO3e4Q6BFZLqhpStyAxoUZftEW_J3pKNjCrvKCOm-Taz0EVBEH9zqLTJwwXEoR86YYNTrtpARTOHo2qco_oMSX_2O4cpAfDZz0ZMHuqxunNnannVdFv5SdAHXngHLguLwAVuUTGlrg_xnUeW4Msi9-CKXpmmEQv6BCIW8Q4S5rn0vp394QgMCCo4473jOEeOX1G4_CUOhJZydGOCEbC5cMrM_54SKBu7hz8P9MCkDLj1ZsPwPDB1YyDwLFJlxb9oEZoRC4whvTJAfX2xNP4wv73ojxwrOII2ivNrnqNX6EM41bxmqMrF9tltSut-OR2XHO-DdJduoRnJjmKJl_WaZQypbZqfVepURuDNGChqyby--xsGMA-yQBBrVigXSKliuYG7dxWBp3TJFrvD4Aym1gAQOgjlObIHknv1cA83g_rHx6vq7JfwqMFYu6H6IZ6eeTUde1IixstE7EzU_4u5LzkQb8HKSMt3j9m3dlH4OigcPvcSJy8aJoN-UCFInfnE7IX0ul_S5HAgvgLM_BEVa3KTa0u8nxAY7xaIXrwWJZ23fhiZrOkNYJI1XAiN11sjtVgVS8viZCkTabUtpEtX2nPe767IbwVzPdOG-C6W_-8uNN_j1WjYeQfsSjmAjab2jZqx3BCDOjTbHkP_vKSzdABFA6bu2Fqt3io2UVTYq-a_Jf2b4JGmuiHomXjhsH3KZp_MDw1nZ8zf1mejyuH_NHFScVzb-vO_ieZ-RDQZn32VPaaDlylSMGa4kE9-54tHZUkFR4Jy1vpyKjXBa3uIEQBE5RFn7XCKbVA4Ea9BCou5ku7E6Zod0SfjMmmknB6jzLTVSBgMP2AkFb98m943O1XXsDQstMmTZdqmNJTOirLoL2Vu1AXqsdS7O-DrVcDImR7ekSGPhUSg2LQkObRPT26sSeiygKlNDi3PktIA1duuJ066NoIHCJupl2mugbFDrZ90SBaQ9n72Ya7fjKdrSdp3izCxqlldeZPANZMMZ5KwjX9WZnl-lPNsn3iCNaEhBCqSWne7YN6xxRS6gKoMobVav-HsZ841qr5iaYzDFD2kA4R35A-Dm5zJyfSCV4NPdUEGzIIbjg1-kYv8PFR_kImuXIwGXT86BxpgEY6PRaD8-ZFZMzerGvEhS8R39NpQ-hiZ_P_ZY3wamWHlwttaTvX3fqpflHlhKV_9AI9HZ","DataProtected":true}
\ No newline at end of file
+{
+ "Version": 1,
+ "Id": "31079AE9DF4ED1F2D492E52BA5A644F5",
+ "Created": "2022-04-18T20:26:55.3256244Z",
+ "Algorithm": "RS256",
+ "IsX509Certificate": false,
+ "Data": "CfDJ8P3RLEnEd5JHjUIOTYyyJAzVTUgXKNFkjwfEWELe3r9iozJI4zF_jAjqORPS_C37DAQiHHtMYbgB7_j1Wwqck7qb_wv8CuDfNW8Hx0_UdWaO6vD0Sf_hIbBmN4RrwFwdMia8IUcNCUpwL9XJl95TLzD9FjpuyuWElQ8_5ZnF3SuErstPenQa4q9MYsj9XmPhNSk-BQan-cimxIAPYm1BgZNm5DMylT98sus9ScYTgOowV2n13MW0uA7kk9JOZIIjG07UuaSnuEQei03AU9zkejYD8yLwBi98ON5s0_jW2V3ebY-01VBQXhztu5Iev_SCynNyqQW-uqEzL9SSlzX8dEa79KKmOJEo2o325AVeDOBvco2XDCCra5RkRhUIPV3ZHvQr4EZJNqvi1zelWs3-FJ9vXE02-6XZkZKd6TzhPfiMDc1Z88-eVlx-uwhPjvJyfUSU9cAgbNDREDETxUcmIAMqqbXVAUCnaPkpbxy0VZ6YGSNsD9w77L6nIKiz-0KkVtxDZKCXh5BbDwAiWza8KWKclnVUnMLGhnjANEgKzzvmb1UJr1wZ0xRZ9KXyxr9oy0kP1Be-ysFSUd-YUTSgDvuQZV_DPjH2XP99tXqmfWJ8PJN9hswaRGhp5Jxo003l93u7Ivy-XR1BEhxVoYpvV9fCh8lo-N9ayHYpYlEsdArk1qvkuGRSlkBWNeEr_ZsvODbwM8Jp5q7pLK7cUy0bRHnYwkyHReS_fh6_tTdnfcQZPWb7fLN967XwebcVNOEENn5FX9oszCiy5BG9HQDIPffIx8bkKrZCMV77e5Qria9wNwkhIi3-7SOjRD-v5azkwiV0hTToAQTYsAT8DRTJklI90PF4JbsiMvObeoJtbwPy3E-K1_4DOxAjNwQFHf_zqWEbo9vmxGF-IerSwaJNSVfUUxnnYT8JWFYHYzWGyMvqtdymk1pmBaOJ64dgTVVcao7S0PwfV4DNUzxKQX-jNzqMihaXu4y8lyGIPJycJezm7nfGJiHhhhV4EWSQ1Y2ypBGv_s1iZ5pvTCeGkthY2Q4pe-GYKrFGTnBSLWwHqsVA2gwb1McjYjUGNgu_mnzyB45ZpKrqXQDDiozbQ4Ju7DJb5Vi_EoPmeHQDj5h5sFwAWtq0NGI_lRAog2K_QnZvSV3SFDVlaKDq9PjgIORc6wi5bzbAusWbjDd_sb211QsrNfW-0SWWgYwz9qRg14OiuntGESXSq9Cmx8WgPaK5H0FQGZUlzq3Bk8ov6GUhPeZSKP4gUyfRloSyj2DBZSe_0JOXO3e4Q6BFZLqhpStyAxoUZftEW_J3pKNjCrvKCOm-Taz0EVBEH9zqLTJwwXEoR86YYNTrtpARTOHo2qco_oMSX_2O4cpAfDZz0ZMHuqxunNnannVdFv5SdAHXngHLguLwAVuUTGlrg_xnUeW4Msi9-CKXpmmEQv6BCIW8Q4S5rn0vp394QgMCCo4473jOEeOX1G4_CUOhJZydGOCEbC5cMrM_54SKBu7hz8P9MCkDLj1ZsPwPDB1YyDwLFJlxb9oEZoRC4whvTJAfX2xNP4wv73ojxwrOII2ivNrnqNX6EM41bxmqMrF9tltSut-OR2XHO-DdJduoRnJjmKJl_WaZQypbZqfVepURuDNGChqyby--xsGMA-yQBBrVigXSKliuYG7dxWBp3TJFrvD4Aym1gAQOgjlObIHknv1cA83g_rHx6vq7JfwqMFYu6H6IZ6eeTUde1IixstE7EzU_4u5LzkQb8HKSMt3j9m3dlH4OigcPvcSJy8aJoN-UCFInfnE7IX0ul_S5HAgvgLM_BEVa3KTa0u8nxAY7xaIXrwWJZ23fhiZrOkNYJI1XAiN11sjtVgVS8viZCkTabUtpEtX2nPe767IbwVzPdOG-C6W_-8uNN_j1WjYeQfsSjmAjab2jZqx3BCDOjTbHkP_vKSzdABFA6bu2Fqt3io2UVTYq-a_Jf2b4JGmuiHomXjhsH3KZp_MDw1nZ8zf1mejyuH_NHFScVzb-vO_ieZ-RDQZn32VPaaDlylSMGa4kE9-54tHZUkFR4Jy1vpyKjXBa3uIEQBE5RFn7XCKbVA4Ea9BCou5ku7E6Zod0SfjMmmknB6jzLTVSBgMP2AkFb98m943O1XXsDQstMmTZdqmNJTOirLoL2Vu1AXqsdS7O-DrVcDImR7ekSGPhUSg2LQkObRPT26sSeiygKlNDi3PktIA1duuJ066NoIHCJupl2mugbFDrZ90SBaQ9n72Ya7fjKdrSdp3izCxqlldeZPANZMMZ5KwjX9WZnl-lPNsn3iCNaEhBCqSWne7YN6xxRS6gKoMobVav-HsZ841qr5iaYzDFD2kA4R35A-Dm5zJyfSCV4NPdUEGzIIbjg1-kYv8PFR_kImuXIwGXT86BxpgEY6PRaD8-ZFZMzerGvEhS8R39NpQ-hiZ_P_ZY3wamWHlwttaTvX3fqpflHlhKV_9AI9HZ",
+ "DataProtected": true
+}
diff --git a/src/Services/Identity/src/Identity.Api/keys/is-signing-key-74ABBD16A9EF6567607D1F748BB91597.json b/src/Services/Identity/src/Identity.Api/keys/is-signing-key-74ABBD16A9EF6567607D1F748BB91597.json
index d66299e..c2370f0 100644
--- a/src/Services/Identity/src/Identity.Api/keys/is-signing-key-74ABBD16A9EF6567607D1F748BB91597.json
+++ b/src/Services/Identity/src/Identity.Api/keys/is-signing-key-74ABBD16A9EF6567607D1F748BB91597.json
@@ -1 +1,9 @@
-{"Version":1,"Id":"74ABBD16A9EF6567607D1F748BB91597","Created":"2022-03-29T20:44:37.9948898Z","Algorithm":"RS256","IsX509Certificate":false,"Data":"CfDJ8P3RLEnEd5JHjUIOTYyyJAzeYir0LDVxp1O__t0rzDUFxCBt5XtK6FK6fLgopH3OcjrMTbORu_DJp3lf4bf015LKnOk0yjzfzZ5xRX3qwHwz1jvdXKqzt-Pf85kiRlrNv6qiTH7UXP5xGTY3Tn7TdkVJfPmvfHtQyw1FhIPJnx5KQ469H2DRnoxmpwpspHrGlrPA5cJn3Uc7xFnTNEe0laORnilL1rxTTsKFFhJCWCcoxMozgh_SQqEhy9B7Vb4rQHn-ULb8qO4IaKDvbuCJNuGD2nJxy5lBNkdFKJD724IlGIB1nV3w5LR3YVYcxxIc1bLrbK3byHbVHsl8i9uacpN4-JP2Z16Sku9jhsQ21d1tNssE7gmxe8u6qE4RQjL2URSci8_XdSsRa0DBYNaVOSLv60M4dtwg6pJeWB6GfvJ8_JFnTDFDs51rXc77RL4tANblHLzuQl2C3gMMbJPoviWSs8R0hg2mCp0-pQWwSzNvNmtWwsMNXPgHtfIrJTGDKTQEiYIkvkf34gsBaweyea3Q5H2prmt10qVHr47LpkjGqxpHvi9eboJQkG2y-1MBptNpdiYZ4gbViplu8Ru5M4YsCmb0zZF2Q1DZsKVM-T_PFZCgyy1LjLwSHczvcflQh__6YmSwhehI7Nka86m3lK80nwAr9u0qoUyqjavte-XjNiRbUd7MHaEy2bT_jj40oqdh6sGURIkmmJljxPQfu7Scqgcs6chQSY4JXEnfLBa0AK40mefPwpk76QOJBQRBJ3PvnSLc5RMhgs2c2Vc54j4VuQU0tjiHoDPcgerj5oRIQCDiA2_ylleNmxBEomENO0FRortejvV7FNb2qzTfey1r6bTwJvN81EFfMhGUCsj7X0KkBywJMESsQlU3pbs_JChQfX-6rMjofkMYEtnupYnCutUFVO-xZoXrJvw5AOxtJn4JoPHBYeEhC29zjHvtzfSnnnDzCQxiJkWO6pyuAFVIyJUK50Bx_yuaiDicscEjShfd-fQEN_l3eFsUzTGa5rX9gfsPckH8jkpkFkXJlUKFt-nt_9FDnqi5WM6Hf_d891jocGkgiSLM2YURz5Fkyq8S6o-hrBnVf4Pz4dtfsQBw-NnOAl4FPnaknsVdDLZ-qe9gaZdN3wbHQMwFq2eTmm36M6ky47A2xO8MksDSlh4ROcrqJZOBaCWE6fFowcot1sJXFAqNw5iuEKNmtFtJU6oPWxTGY5C0BdjExksQZzqmg2JkjbqZE0zRBFBs0oSJHZsQTnBZmTELIUzMjZVO5eXfVp0tBoOWoW0KgTdHEhlHhNXkvZDoNIdQKu7RVEmhF3AmWWUYzpAW1Y_oEPAsF1Jf-msAlCiMnchbg3yxDG7n6VKAPssQQs3RGPjPLCjOKtHtK4X_3ivVvHbX0xxZhUk44DBv8HDd72rQLEenrXKuIEr_L6VzZ93BpisnxMWxJV6pRcYe1LTtu4nQGZ20hiJs98zHRHomwWJFqxIlPZrSrqTrxUAN4jCl4WSLgf-c2zRfO3AHqvlVCt518s92IUx75372znyoM7-xB5h95T2yxg9x9dlY-_-wICdlyPiQ8arAQ824Cl_2QkSU_ba30gAvWlXGYRVFpg3PSmP0mIhq-ffA8HLB0ARZfYl1_vMspd9kbPyJVCRSaFObC_L-AwvKV8f7Oqqd6bwbUYvdA_6cw1gFUeiqH2wuggOjFI3WDp-5ttVdmZnDVDK--LR3y5b2cYHAf3EG2N-7qMBwZqpOb3ivnRFX_SUlB9V9BlvSe_sLU5zJphBoSWm2-_4j9rWQjCaswlBLbScRA3r1KC5BFxFgbFFv7p4hWk_xjdAx5q4RHM6wqFfGj1WkrjRtdnMC7z1ZM7Bdsno-5yt6PQBP-y4QIvpSpefXl8E4_gBJ6dzToQwLS_Tpk7CjzlIV3oUZ5XfMV0s14Flky6ErsvBdXMzNbHwvxwCAoxbYDrjZ9U-w9gibGOOVBYmKjhkeGLGs8ejqc8TxrzEEFL1li1ZfXxeNAcu4zyNwTHsWaaLVciWaw-UuPqA4uDFxMNmxI6kfXa49L0voFkQaeMo48J2lVjH00QV8f-nXnVaZFztiTU7fYYlpK-RxRSL1q0qQOFMEKOdltqqKxKbM7grNSoBQz-ZHqQq7ZR4v7NRl-yyTGmcGvOzTaDfLP9snbDfiU2QnqH-S2pgtobbYJ_UZvGfg8AZurvNBbl-KuBOrN3yarxe5STJY9mHY_8y2c8C_foQifRSNr_oDANvMbfsukrV8HJimtMk9WF15Qaz51BCiZ9NIxiCsgaJHZ48Oi8EUput8rtTInjNjAvb33N4whgDKQVLWXE59k13dlZX7xA1V-pFbY9TvFLFsWwWS6Jrj8okejPb5Fsb9zraapVTTCIEr3VYR9BB_V7tgkldqpNatO6_qqczD4owmZ-dL6IDyE4f2u_2FCgUV1FP30UMdkRmKHAbhZ9kGCK-ZI5XS33qh","DataProtected":true}
\ No newline at end of file
+{
+ "Version": 1,
+ "Id": "74ABBD16A9EF6567607D1F748BB91597",
+ "Created": "2022-03-29T20:44:37.9948898Z",
+ "Algorithm": "RS256",
+ "IsX509Certificate": false,
+ "Data": "CfDJ8P3RLEnEd5JHjUIOTYyyJAzeYir0LDVxp1O__t0rzDUFxCBt5XtK6FK6fLgopH3OcjrMTbORu_DJp3lf4bf015LKnOk0yjzfzZ5xRX3qwHwz1jvdXKqzt-Pf85kiRlrNv6qiTH7UXP5xGTY3Tn7TdkVJfPmvfHtQyw1FhIPJnx5KQ469H2DRnoxmpwpspHrGlrPA5cJn3Uc7xFnTNEe0laORnilL1rxTTsKFFhJCWCcoxMozgh_SQqEhy9B7Vb4rQHn-ULb8qO4IaKDvbuCJNuGD2nJxy5lBNkdFKJD724IlGIB1nV3w5LR3YVYcxxIc1bLrbK3byHbVHsl8i9uacpN4-JP2Z16Sku9jhsQ21d1tNssE7gmxe8u6qE4RQjL2URSci8_XdSsRa0DBYNaVOSLv60M4dtwg6pJeWB6GfvJ8_JFnTDFDs51rXc77RL4tANblHLzuQl2C3gMMbJPoviWSs8R0hg2mCp0-pQWwSzNvNmtWwsMNXPgHtfIrJTGDKTQEiYIkvkf34gsBaweyea3Q5H2prmt10qVHr47LpkjGqxpHvi9eboJQkG2y-1MBptNpdiYZ4gbViplu8Ru5M4YsCmb0zZF2Q1DZsKVM-T_PFZCgyy1LjLwSHczvcflQh__6YmSwhehI7Nka86m3lK80nwAr9u0qoUyqjavte-XjNiRbUd7MHaEy2bT_jj40oqdh6sGURIkmmJljxPQfu7Scqgcs6chQSY4JXEnfLBa0AK40mefPwpk76QOJBQRBJ3PvnSLc5RMhgs2c2Vc54j4VuQU0tjiHoDPcgerj5oRIQCDiA2_ylleNmxBEomENO0FRortejvV7FNb2qzTfey1r6bTwJvN81EFfMhGUCsj7X0KkBywJMESsQlU3pbs_JChQfX-6rMjofkMYEtnupYnCutUFVO-xZoXrJvw5AOxtJn4JoPHBYeEhC29zjHvtzfSnnnDzCQxiJkWO6pyuAFVIyJUK50Bx_yuaiDicscEjShfd-fQEN_l3eFsUzTGa5rX9gfsPckH8jkpkFkXJlUKFt-nt_9FDnqi5WM6Hf_d891jocGkgiSLM2YURz5Fkyq8S6o-hrBnVf4Pz4dtfsQBw-NnOAl4FPnaknsVdDLZ-qe9gaZdN3wbHQMwFq2eTmm36M6ky47A2xO8MksDSlh4ROcrqJZOBaCWE6fFowcot1sJXFAqNw5iuEKNmtFtJU6oPWxTGY5C0BdjExksQZzqmg2JkjbqZE0zRBFBs0oSJHZsQTnBZmTELIUzMjZVO5eXfVp0tBoOWoW0KgTdHEhlHhNXkvZDoNIdQKu7RVEmhF3AmWWUYzpAW1Y_oEPAsF1Jf-msAlCiMnchbg3yxDG7n6VKAPssQQs3RGPjPLCjOKtHtK4X_3ivVvHbX0xxZhUk44DBv8HDd72rQLEenrXKuIEr_L6VzZ93BpisnxMWxJV6pRcYe1LTtu4nQGZ20hiJs98zHRHomwWJFqxIlPZrSrqTrxUAN4jCl4WSLgf-c2zRfO3AHqvlVCt518s92IUx75372znyoM7-xB5h95T2yxg9x9dlY-_-wICdlyPiQ8arAQ824Cl_2QkSU_ba30gAvWlXGYRVFpg3PSmP0mIhq-ffA8HLB0ARZfYl1_vMspd9kbPyJVCRSaFObC_L-AwvKV8f7Oqqd6bwbUYvdA_6cw1gFUeiqH2wuggOjFI3WDp-5ttVdmZnDVDK--LR3y5b2cYHAf3EG2N-7qMBwZqpOb3ivnRFX_SUlB9V9BlvSe_sLU5zJphBoSWm2-_4j9rWQjCaswlBLbScRA3r1KC5BFxFgbFFv7p4hWk_xjdAx5q4RHM6wqFfGj1WkrjRtdnMC7z1ZM7Bdsno-5yt6PQBP-y4QIvpSpefXl8E4_gBJ6dzToQwLS_Tpk7CjzlIV3oUZ5XfMV0s14Flky6ErsvBdXMzNbHwvxwCAoxbYDrjZ9U-w9gibGOOVBYmKjhkeGLGs8ejqc8TxrzEEFL1li1ZfXxeNAcu4zyNwTHsWaaLVciWaw-UuPqA4uDFxMNmxI6kfXa49L0voFkQaeMo48J2lVjH00QV8f-nXnVaZFztiTU7fYYlpK-RxRSL1q0qQOFMEKOdltqqKxKbM7grNSoBQz-ZHqQq7ZR4v7NRl-yyTGmcGvOzTaDfLP9snbDfiU2QnqH-S2pgtobbYJ_UZvGfg8AZurvNBbl-KuBOrN3yarxe5STJY9mHY_8y2c8C_foQifRSNr_oDANvMbfsukrV8HJimtMk9WF15Qaz51BCiZ9NIxiCsgaJHZ48Oi8EUput8rtTInjNjAvb33N4whgDKQVLWXE59k13dlZX7xA1V-pFbY9TvFLFsWwWS6Jrj8okejPb5Fsb9zraapVTTCIEr3VYR9BB_V7tgkldqpNatO6_qqczD4owmZ-dL6IDyE4f2u_2FCgUV1FP30UMdkRmKHAbhZ9kGCK-ZI5XS33qh",
+ "DataProtected": true
+}
diff --git a/src/Services/Identity/src/Identity.Api/keys/is-signing-key-9258A527F8A78F2F47D30E7F145FD59F.json b/src/Services/Identity/src/Identity.Api/keys/is-signing-key-9258A527F8A78F2F47D30E7F145FD59F.json
index e18a41b..8bac5d8 100644
--- a/src/Services/Identity/src/Identity.Api/keys/is-signing-key-9258A527F8A78F2F47D30E7F145FD59F.json
+++ b/src/Services/Identity/src/Identity.Api/keys/is-signing-key-9258A527F8A78F2F47D30E7F145FD59F.json
@@ -1 +1,9 @@
-{"Version":1,"Id":"9258A527F8A78F2F47D30E7F145FD59F","Created":"2022-02-15T09:58:48.5269984Z","Algorithm":"RS256","IsX509Certificate":false,"Data":"CfDJ8HYLA_44KBlEtnKYw5Y6NgZcbR_xFrM2Jsvq7lBG7H9pe38jngLl4EUknvBtq5hxuuwWtTX5qnwK_90h5-sbgF98Tio47qnnv-wA50LawMrDvcEbWMjdBXeFD4hE4QCSCi43i3oRms09g1c6gHipjTOTGmZ0Tj6wGAJZHkdJz6uBuvnWkuypYjaZG1vap_baLugSmjP71PUzn7jgFR1dQDEOcZE91-dERlCPeU7RXdDOTrUJMjD4yvfXO3VdB53YiZErMIgCv7rx1qZhzBPmyg2Z3XK86kY877HD4I-DOerJKeqPYl9vfVmFQgRRLFdOhi5ZpmUwJaRKG0zjTDDfOuvFG16WNPCrr3-_AIU3ANaCvL4Lg44t2lamlRaKlEvT5aKxphO2cVZjSWsTPJMHgHXWYM01e09i3WDbL07g35vJWsnRrrhxhiMoVJJG68-WrZVtev47fT69of6Z5_lhFcc7donENuxlN3K2V8P90Nkxu4eYbHwp267IvadONcgCMO_wHdKwZZswFUs5HYVyYVOZKtmE2T4I7JJWrOeL2iM_VWSFwkwV0hCLQyKazQZwVIe8s2s3glYY8ektc36reTZoSg4ykhanq26OLX4VKw9UzvfyV_J-EozNh2WXlhtgGqoeomjVrNp6U612ywre3QLN-lvSDjd2MoQsZ-CG4S6kyTuXNT0KxsdXs-hXUlXRNbri8fshIjSkYjCVWUKvNFvn7IMJ5AxYakWekKdPL7r75Q7HNJMMYxt8jh7fv7N8QKWuOnWWy_kA8N6qXIsHsetBeBfGBHbq92mQkfcdArVKuysqTzSy2wm9t4mLNFbzO1QPAQ9VS6aYS3DcWh2NF_pc2xlRCRt9Mb1P9IYEUQk7P2iakeYUhKH1MMNh0GuMwkCIaed4XCTEVZfSB70YtPUCawgNFP9hn5ENUVNRWBf6717gT1ioybimXghodrCOHiYxxQDDpss3e8MIl_x-BaqW8C2zYFd6xE0pVFXV5-X7O6XP2sc3ClOd1EyVnLRT1-87Uof-1KYA2kzTyPfWrnC72maTbOJzeje2f6oT98BfsgkvakOAchAkEl_FJz_Dv_KdJ9ZwC9Xv0Wan4dvSS5aR35iifXptuZ0du0pc2t6_CoHGLZxOG6SvXm7AN24XYFcWnRPvGUS2M5NG4pHJn73vOPaon1SAIBUrLiDXSWeW_27G_5UG5P1lPXYecFMjVG2vdKPEDxygu3yj1e5CDyeVmvcnI3-Hl_4skomLB14as8U950O7fr-CuS_BAli6m0mplgAPCOrfeyq_o-xWdM9vNoaEHRGA5e2ZfEIknCinSY7CuoGCnMmR0O8eT2P3aQ34TKHRRspvCVs8GAyzCZaVT8_ZeOHCl4FU8Ac5NIe3OMRPuZs1uJaBfBIVlPP9MfhKgEA_S5t8vfa3RJhiU0jMy5h9OToqnBOQsiIkY0mjSMsn3VvsqeNutK5DKoTpATX822sSHCSYXAewk7F-agvqKnM_cPVhib9Z1r0UXLS2neLZwF5ob7uI1nYU8TNb6cawcWPGBz9FoMjtxXsMsAci5luEVg1ZfGTU9kShAa3sdfRYC5E4L37_Fy_4EZyNEKEMPxx8I20PCPfqEPR_JB0geDv0Up9ZfD2ZwgwovYDVbGv3qIbgbkEH2Z7zf2e4gH9sZClvei1XigDL9gjfJ0b9IdA3QpWw6b3uleR-WbNWag5S2Phz6kPB2irBgoN7oG_gUegXQTzCif0mgeQSwbea1vXOngXBLG1PiyRk_iPKPhZMmg1UoMeqXQlXqDL4VFRnMOsYdOKr-BWsgdCM9zE3CCyVueBX0zTuZU0kM0P8hUH9RsZYdqPOXS0d4Fy0YUmQZTHWwSMbCUG1XmJ4QN3y1FKUKBvRRHZmZboYHz5EKFMHhAbk9ZHZRCpLm4hIlH81IiSgRlYm3CacJqjlAiLp0Tc0zF6oFlZFipA-nM5znhgDJMSV-CSW1FSDvYFvHolOxR4U0hlw_XG6NeytrkiAR7-wvU3ufkslsWowtcyswCNHcT7eg-tpptSXyT0RJaQhWwAc9L9lYWZnCBwknUCak23u1V7jM8ZldOM5jiQrjRvEBv-sqMto4Qo6129AatIKri04PYD9VlHzLP76KY4F-UHUcu-9g3cJp9mnbnzhmD1LvNPQmH2giY0pc9hFWW6_Ablz7GmW2cngb9xwHAgi-WBSrZYoW6l2dAdkm72ECwWmMguwT6OZdaZZzjBYixHKM-mnb4uzVT6CU-pp4-G9dYtX5EPqhKcmsmwbV6qiziV61rGYypP37spT8H_SWTFmqD-sMPg6jJj1PncSFd2mlZFBkuFJDvF6Aorf35t9-rePPRc18k14Poa8J8j_mYVJo3lEIrtRDLF3d8EvZ9UEjmgBj25gSiYhOJBPriRop1qmlVVSUjoTBIJaXlTXefbcZTqc8vguzQ5Oy8rjzTaxeP1-OgsCDO0xw7ibWEeN","DataProtected":true}
\ No newline at end of file
+{
+ "Version": 1,
+ "Id": "9258A527F8A78F2F47D30E7F145FD59F",
+ "Created": "2022-02-15T09:58:48.5269984Z",
+ "Algorithm": "RS256",
+ "IsX509Certificate": false,
+ "Data": "CfDJ8HYLA_44KBlEtnKYw5Y6NgZcbR_xFrM2Jsvq7lBG7H9pe38jngLl4EUknvBtq5hxuuwWtTX5qnwK_90h5-sbgF98Tio47qnnv-wA50LawMrDvcEbWMjdBXeFD4hE4QCSCi43i3oRms09g1c6gHipjTOTGmZ0Tj6wGAJZHkdJz6uBuvnWkuypYjaZG1vap_baLugSmjP71PUzn7jgFR1dQDEOcZE91-dERlCPeU7RXdDOTrUJMjD4yvfXO3VdB53YiZErMIgCv7rx1qZhzBPmyg2Z3XK86kY877HD4I-DOerJKeqPYl9vfVmFQgRRLFdOhi5ZpmUwJaRKG0zjTDDfOuvFG16WNPCrr3-_AIU3ANaCvL4Lg44t2lamlRaKlEvT5aKxphO2cVZjSWsTPJMHgHXWYM01e09i3WDbL07g35vJWsnRrrhxhiMoVJJG68-WrZVtev47fT69of6Z5_lhFcc7donENuxlN3K2V8P90Nkxu4eYbHwp267IvadONcgCMO_wHdKwZZswFUs5HYVyYVOZKtmE2T4I7JJWrOeL2iM_VWSFwkwV0hCLQyKazQZwVIe8s2s3glYY8ektc36reTZoSg4ykhanq26OLX4VKw9UzvfyV_J-EozNh2WXlhtgGqoeomjVrNp6U612ywre3QLN-lvSDjd2MoQsZ-CG4S6kyTuXNT0KxsdXs-hXUlXRNbri8fshIjSkYjCVWUKvNFvn7IMJ5AxYakWekKdPL7r75Q7HNJMMYxt8jh7fv7N8QKWuOnWWy_kA8N6qXIsHsetBeBfGBHbq92mQkfcdArVKuysqTzSy2wm9t4mLNFbzO1QPAQ9VS6aYS3DcWh2NF_pc2xlRCRt9Mb1P9IYEUQk7P2iakeYUhKH1MMNh0GuMwkCIaed4XCTEVZfSB70YtPUCawgNFP9hn5ENUVNRWBf6717gT1ioybimXghodrCOHiYxxQDDpss3e8MIl_x-BaqW8C2zYFd6xE0pVFXV5-X7O6XP2sc3ClOd1EyVnLRT1-87Uof-1KYA2kzTyPfWrnC72maTbOJzeje2f6oT98BfsgkvakOAchAkEl_FJz_Dv_KdJ9ZwC9Xv0Wan4dvSS5aR35iifXptuZ0du0pc2t6_CoHGLZxOG6SvXm7AN24XYFcWnRPvGUS2M5NG4pHJn73vOPaon1SAIBUrLiDXSWeW_27G_5UG5P1lPXYecFMjVG2vdKPEDxygu3yj1e5CDyeVmvcnI3-Hl_4skomLB14as8U950O7fr-CuS_BAli6m0mplgAPCOrfeyq_o-xWdM9vNoaEHRGA5e2ZfEIknCinSY7CuoGCnMmR0O8eT2P3aQ34TKHRRspvCVs8GAyzCZaVT8_ZeOHCl4FU8Ac5NIe3OMRPuZs1uJaBfBIVlPP9MfhKgEA_S5t8vfa3RJhiU0jMy5h9OToqnBOQsiIkY0mjSMsn3VvsqeNutK5DKoTpATX822sSHCSYXAewk7F-agvqKnM_cPVhib9Z1r0UXLS2neLZwF5ob7uI1nYU8TNb6cawcWPGBz9FoMjtxXsMsAci5luEVg1ZfGTU9kShAa3sdfRYC5E4L37_Fy_4EZyNEKEMPxx8I20PCPfqEPR_JB0geDv0Up9ZfD2ZwgwovYDVbGv3qIbgbkEH2Z7zf2e4gH9sZClvei1XigDL9gjfJ0b9IdA3QpWw6b3uleR-WbNWag5S2Phz6kPB2irBgoN7oG_gUegXQTzCif0mgeQSwbea1vXOngXBLG1PiyRk_iPKPhZMmg1UoMeqXQlXqDL4VFRnMOsYdOKr-BWsgdCM9zE3CCyVueBX0zTuZU0kM0P8hUH9RsZYdqPOXS0d4Fy0YUmQZTHWwSMbCUG1XmJ4QN3y1FKUKBvRRHZmZboYHz5EKFMHhAbk9ZHZRCpLm4hIlH81IiSgRlYm3CacJqjlAiLp0Tc0zF6oFlZFipA-nM5znhgDJMSV-CSW1FSDvYFvHolOxR4U0hlw_XG6NeytrkiAR7-wvU3ufkslsWowtcyswCNHcT7eg-tpptSXyT0RJaQhWwAc9L9lYWZnCBwknUCak23u1V7jM8ZldOM5jiQrjRvEBv-sqMto4Qo6129AatIKri04PYD9VlHzLP76KY4F-UHUcu-9g3cJp9mnbnzhmD1LvNPQmH2giY0pc9hFWW6_Ablz7GmW2cngb9xwHAgi-WBSrZYoW6l2dAdkm72ECwWmMguwT6OZdaZZzjBYixHKM-mnb4uzVT6CU-pp4-G9dYtX5EPqhKcmsmwbV6qiziV61rGYypP37spT8H_SWTFmqD-sMPg6jJj1PncSFd2mlZFBkuFJDvF6Aorf35t9-rePPRc18k14Poa8J8j_mYVJo3lEIrtRDLF3d8EvZ9UEjmgBj25gSiYhOJBPriRop1qmlVVSUjoTBIJaXlTXefbcZTqc8vguzQ5Oy8rjzTaxeP1-OgsCDO0xw7ibWEeN",
+ "DataProtected": true
+}
diff --git a/src/Services/Identity/src/Identity/Data/IdentityContext.cs b/src/Services/Identity/src/Identity/Data/IdentityContext.cs
index c681b3e..396fd0d 100644
--- a/src/Services/Identity/src/Identity/Data/IdentityContext.cs
+++ b/src/Services/Identity/src/Identity/Data/IdentityContext.cs
@@ -33,9 +33,14 @@ public sealed class IdentityContext : IdentityDbContext
-
+
-
+
diff --git a/src/Services/Passenger/src/Passenger.Api/Passenger.Api.csproj b/src/Services/Passenger/src/Passenger.Api/Passenger.Api.csproj
index d30af3b..f39ceab 100644
--- a/src/Services/Passenger/src/Passenger.Api/Passenger.Api.csproj
+++ b/src/Services/Passenger/src/Passenger.Api/Passenger.Api.csproj
@@ -4,9 +4,9 @@
net6.0
enable
-
+
-
+
diff --git a/src/Services/Passenger/src/Passenger.Api/appsettings.Development.json b/src/Services/Passenger/src/Passenger.Api/appsettings.Development.json
index 0db3279..2c63c08 100644
--- a/src/Services/Passenger/src/Passenger.Api/appsettings.Development.json
+++ b/src/Services/Passenger/src/Passenger.Api/appsettings.Development.json
@@ -1,3 +1,2 @@
{
-
}
diff --git a/src/Services/Passenger/src/Passenger/Passenger.csproj b/src/Services/Passenger/src/Passenger/Passenger.csproj
index 487d10d..e7d7f7e 100644
--- a/src/Services/Passenger/src/Passenger/Passenger.csproj
+++ b/src/Services/Passenger/src/Passenger/Passenger.csproj
@@ -13,12 +13,12 @@
-
-
+
+
-
+