some change in test base

This commit is contained in:
meysamhadeli 2022-05-09 23:59:40 +04:30
parent 31dc05f580
commit 5007aaaead
30 changed files with 523 additions and 371 deletions

View File

@ -1,6 +1,6 @@
<Project>
<ItemGroup>
<PackageReference Include="Meziantou.Analyzer" Version="1.0.688" Condition="$(MSBuildProjectExtension) == '.csproj'" PrivateAssets="all">
<PackageReference Include="Meziantou.Analyzer" Version="1.0.688" Condition="$(MSBuildProjectExtension) == '.csproj'" PrivateAssets="all">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
@ -10,38 +10,38 @@
PrivateAssets="all"
Condition="$(MSBuildProjectExtension) == '.csproj'"
/>
<PackageReference
<PackageReference
Include="SonarAnalyzer.CSharp"
Version="8.29.0.36737"
PrivateAssets="all"
Condition="$(MSBuildProjectExtension) == '.csproj'"
/>
<PackageReference
<PackageReference
Include="Roslynator.Analyzers"
Version="3.3.0"
PrivateAssets="all"
Condition="$(MSBuildProjectExtension) == '.csproj'"
/>
<PackageReference
<PackageReference
Include="Roslynator.CodeAnalysis.Analyzers"
Version="3.3.0"
PrivateAssets="all"
Condition="$(MSBuildProjectExtension) == '.csproj'"
/>
<PackageReference
<PackageReference
Include="Roslynator.Formatting.Analyzers"
Version="3.3.0"
PrivateAssets="all"
Condition="$(MSBuildProjectExtension) == '.csproj'"
/>
<PackageReference
<PackageReference
Include="Microsoft.VisualStudio.Threading.Analyzers"
Version="17.0.64"
PrivateAssets="all"
Condition="$(MSBuildProjectExtension) == '.csproj'"
/>
<PackageReference
<PackageReference
Include="AsyncFixer"
Version="1.5.1"
PrivateAssets="all"
@ -51,7 +51,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.1">
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

View File

@ -6,13 +6,13 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageReference Include="Yarp.ReverseProxy" Version="1.0.0" />
<PackageReference Include="Microsoft.Identity.Web" Version="1.22.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3"/>
<PackageReference Include="Yarp.ReverseProxy" Version="1.0.0"/>
<PackageReference Include="Microsoft.Identity.Web" Version="1.22.3"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\BuildingBlocks\BuildingBlocks.csproj" />
<ProjectReference Include="..\..\BuildingBlocks\BuildingBlocks.csproj"/>
</ItemGroup>
</Project>

View File

@ -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"
}
}
}

View File

@ -7,114 +7,114 @@
<ItemGroup>
<PackageReference Include="Ardalis.GuardClauses" Version="3.3.0" />
<PackageReference Include="AspNetCore.HealthChecks.UI.SQLite.Storage" Version="5.0.1" />
<PackageReference Include="Ben.BlockingDetector" Version="0.0.4" />
<PackageReference Include="EasyCaching.Core" Version="1.4.1" />
<PackageReference Include="EasyCaching.InMemory" Version="1.4.1" />
<PackageReference Include="EFCore.NamingConventions" Version="6.0.0" />
<PackageReference Include="EntityFrameworkCore.Triggered" Version="3.0.0" />
<PackageReference Include="Figgle" Version="0.4.0" />
<PackageReference Include="FluentValidation" Version="10.3.6" />
<PackageReference Include="FluentValidation.AspNetCore" Version="10.3.6" />
<PackageReference Include="Grpc.Net.Client" Version="2.44.0" />
<PackageReference Include="MagicOnion" Version="4.4.0" />
<PackageReference Include="MagicOnion.Abstractions" Version="4.4.0" />
<PackageReference Include="MagicOnion.Client" Version="4.4.0" />
<PackageReference Include="MagicOnion.Server" Version="4.4.0" />
<PackageReference Include="MagicOnion.Server" Version="4.4.0" />
<PackageReference Include="Polly" Version="7.2.3" />
<PackageReference Include="Ardalis.GuardClauses" Version="3.3.0"/>
<PackageReference Include="AspNetCore.HealthChecks.UI.SQLite.Storage" Version="5.0.1"/>
<PackageReference Include="Ben.BlockingDetector" Version="0.0.4"/>
<PackageReference Include="EasyCaching.Core" Version="1.4.1"/>
<PackageReference Include="EasyCaching.InMemory" Version="1.4.1"/>
<PackageReference Include="EFCore.NamingConventions" Version="6.0.0"/>
<PackageReference Include="EntityFrameworkCore.Triggered" Version="3.0.0"/>
<PackageReference Include="Figgle" Version="0.4.0"/>
<PackageReference Include="FluentValidation" Version="10.3.6"/>
<PackageReference Include="FluentValidation.AspNetCore" Version="10.3.6"/>
<PackageReference Include="Grpc.Net.Client" Version="2.44.0"/>
<PackageReference Include="MagicOnion" Version="4.4.0"/>
<PackageReference Include="MagicOnion.Abstractions" Version="4.4.0"/>
<PackageReference Include="MagicOnion.Client" Version="4.4.0"/>
<PackageReference Include="MagicOnion.Server" Version="4.4.0"/>
<PackageReference Include="MagicOnion.Server" Version="4.4.0"/>
<PackageReference Include="Polly" Version="7.2.3"/>
<PackageReference Include="protobuf-net.BuildTools" Version="3.0.115">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="protobuf-net.Grpc" Version="1.0.152" />
<PackageReference Include="Hellang.Middleware.ProblemDetails" Version="6.3.0" />
<PackageReference Include="Humanizer.Core" Version="2.14.1" />
<PackageReference Include="IdGen" Version="3.0.0" />
<PackageReference Include="Mapster" Version="7.3.0" />
<PackageReference Include="Mapster.DependencyInjection" Version="1.0.0" />
<PackageReference Include="MediatR" Version="9.0.0" />
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="9.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="5.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="6.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />
<PackageReference Include="MongoDB.Driver" Version="2.14.1" />
<PackageReference Include="Moq" Version="4.16.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="OpenTelemetry.Contrib.Instrumentation.MassTransit" Version="1.0.0-beta2" />
<PackageReference Include="protobuf-net.Grpc.AspNetCore" Version="1.0.152" />
<PackageReference Include="Scrutor" Version="3.3.0" />
<PackageReference Include="Scrutor.AspNetCore" Version="3.3.0" />
<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
<PackageReference Include="Serilog.Enrichers.Span" Version="2.2.0" />
<PackageReference Include="Serilog.Formatting.Elasticsearch" Version="8.4.1" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.0.1" />
<PackageReference Include="Serilog.Sinks.Elasticsearch" Version="8.4.1" />
<PackageReference Include="Serilog.Sinks.Seq" Version="5.1.0" />
<PackageReference Include="Serilog.Sinks.SpectreConsole" Version="0.1.1" />
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="6.2.3" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.2.3" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="6.2.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageReference Include="AspNetCore.HealthChecks.UI" Version="5.0.1" />
<PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="5.0.1" />
<PackageReference Include="AspNetCore.HealthChecks.UI.InMemory.Storage" Version="5.0.1" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="6.0.1" />
<PackageReference Include="AspNetCore.HealthChecks.MongoDb" Version="6.0.1" />
<PackageReference Include="System.Interactive.Async" Version="5.1.0" />
<PackageReference Include="MassTransit" Version="8.0.0" />
<PackageReference Include="MassTransit.RabbitMQ" Version="8.0.0" />
<PackageReference Include="DotNetCore.CAP" Version="6.0.0" />
<PackageReference Include="DotNetCore.CAP.Dashboard" Version="6.0.0" />
<PackageReference Include="DotNetCore.CAP.MongoDB" Version="6.0.0" />
<PackageReference Include="DotNetCore.CAP.OpenTelemetry" Version="6.0.0" />
<PackageReference Include="DotNetCore.CAP.RabbitMQ" Version="6.0.0" />
<PackageReference Include="DotNetCore.CAP.SqlServer" Version="6.0.0" />
<PackageReference Include="Duende.IdentityServer" Version="6.0.0" />
<PackageReference Include="Duende.IdentityServer.AspNetIdentity" Version="6.0.0" />
<PackageReference Include="Duende.IdentityServer.EntityFramework" Version="6.0.0" />
<PackageReference Include="Duende.IdentityServer.EntityFramework.Storage" Version="6.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.0" />
<PackageReference Include="protobuf-net.Grpc" Version="1.0.152"/>
<PackageReference Include="Hellang.Middleware.ProblemDetails" Version="6.3.0"/>
<PackageReference Include="Humanizer.Core" Version="2.14.1"/>
<PackageReference Include="IdGen" Version="3.0.0"/>
<PackageReference Include="Mapster" Version="7.3.0"/>
<PackageReference Include="Mapster.DependencyInjection" Version="1.0.0"/>
<PackageReference Include="MediatR" Version="9.0.0"/>
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="9.0.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.0"/>
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="5.0.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.1"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="6.0.1"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.1"/>
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0"/>
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0"/>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0"/>
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0"/>
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="6.0.1"/>
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.0"/>
<PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0"/>
<PackageReference Include="MongoDB.Driver" Version="2.14.1"/>
<PackageReference Include="Moq" Version="4.16.1"/>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1"/>
<PackageReference Include="OpenTelemetry.Contrib.Instrumentation.MassTransit" Version="1.0.0-beta2"/>
<PackageReference Include="protobuf-net.Grpc.AspNetCore" Version="1.0.152"/>
<PackageReference Include="Scrutor" Version="3.3.0"/>
<PackageReference Include="Scrutor.AspNetCore" Version="3.3.0"/>
<PackageReference Include="Serilog" Version="2.10.0"/>
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0"/>
<PackageReference Include="Serilog.Enrichers.Span" Version="2.2.0"/>
<PackageReference Include="Serilog.Formatting.Elasticsearch" Version="8.4.1"/>
<PackageReference Include="Serilog.Sinks.Console" Version="4.0.1"/>
<PackageReference Include="Serilog.Sinks.Elasticsearch" Version="8.4.1"/>
<PackageReference Include="Serilog.Sinks.Seq" Version="5.1.0"/>
<PackageReference Include="Serilog.Sinks.SpectreConsole" Version="0.1.1"/>
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="6.2.3"/>
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.2.3"/>
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="6.2.3"/>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3"/>
<PackageReference Include="AspNetCore.HealthChecks.UI" Version="5.0.1"/>
<PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="5.0.1"/>
<PackageReference Include="AspNetCore.HealthChecks.UI.InMemory.Storage" Version="5.0.1"/>
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="6.0.1"/>
<PackageReference Include="AspNetCore.HealthChecks.MongoDb" Version="6.0.1"/>
<PackageReference Include="System.Interactive.Async" Version="5.1.0"/>
<PackageReference Include="MassTransit" Version="8.0.0"/>
<PackageReference Include="MassTransit.RabbitMQ" Version="8.0.0"/>
<PackageReference Include="DotNetCore.CAP" Version="6.0.0"/>
<PackageReference Include="DotNetCore.CAP.Dashboard" Version="6.0.0"/>
<PackageReference Include="DotNetCore.CAP.MongoDB" Version="6.0.0"/>
<PackageReference Include="DotNetCore.CAP.OpenTelemetry" Version="6.0.0"/>
<PackageReference Include="DotNetCore.CAP.RabbitMQ" Version="6.0.0"/>
<PackageReference Include="DotNetCore.CAP.SqlServer" Version="6.0.0"/>
<PackageReference Include="Duende.IdentityServer" Version="6.0.0"/>
<PackageReference Include="Duende.IdentityServer.AspNetIdentity" Version="6.0.0"/>
<PackageReference Include="Duende.IdentityServer.EntityFramework" Version="6.0.0"/>
<PackageReference Include="Duende.IdentityServer.EntityFramework.Storage" Version="6.0.3"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.1"/>
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.0"/>
<PackageReference Include="Jaeger" Version="0.3.7" />
<PackageReference Include="OpenTracing" Version="0.12.1" />
<PackageReference Include="prometheus-net" Version="6.0.0" />
<PackageReference Include="prometheus-net.AspNetCore" Version="6.0.0" />
<PackageReference Include="Jaeger" Version="0.3.7"/>
<PackageReference Include="OpenTracing" Version="0.12.1"/>
<PackageReference Include="prometheus-net" Version="6.0.0"/>
<PackageReference Include="prometheus-net.AspNetCore" Version="6.0.0"/>
<PackageReference Include="OpenTelemetry" Version="1.2.0-rc3" />
<PackageReference Include="OpenTelemetry.Exporter.Jaeger" Version="1.2.0-rc3" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.0.0-rc9" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.0.0-rc9" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.0.0-rc9" />
<PackageReference Include="OpenTelemetry" Version="1.2.0-rc3"/>
<PackageReference Include="OpenTelemetry.Exporter.Jaeger" Version="1.2.0-rc3"/>
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.0.0-rc9"/>
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.0.0-rc9"/>
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.0.0-rc9"/>
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.0.64">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="EventStore.Client.Grpc.Streams" Version="22.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.3" />
<PackageReference Include="EventStore.Client.Grpc.Streams" Version="22.0.0"/>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1"/>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.3"/>
</ItemGroup>
<ItemGroup>
<Folder Include="Contracts" />
<Folder Include="EventStoreDB\BackgroundWorkers" />
<Folder Include="Contracts"/>
<Folder Include="EventStoreDB\BackgroundWorkers"/>
</ItemGroup>
</Project>

View File

@ -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<TDbContext>(this IServiceCollection services) where TDbContext : DbContext
public static IServiceCollection AddCustomCap<TDbContext>(this IServiceCollection services)
where TDbContext : DbContext
{
var rabbitMqOptions = services.GetOptions<RabbitMQOptions>("RabbitMq");

View File

@ -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<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : notnull, IRequest<TResponse>
where TResponse : notnull
{
public class CachingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : notnull, IRequest<TResponse>
where TResponse : notnull
private readonly ICacheRequest _cacheRequest;
private readonly IEasyCachingProvider _cachingProvider;
private readonly ILogger<CachingBehavior<TRequest, TResponse>> _logger;
private readonly int defaultCacheExpirationInHours = 1;
public CachingBehavior(IEasyCachingProviderFactory cachingFactory,
ILogger<CachingBehavior<TRequest, TResponse>> logger,
ICacheRequest cacheRequest)
{
private readonly ILogger<CachingBehavior<TRequest, TResponse>> _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<CachingBehavior<TRequest, TResponse>> logger,
ICacheRequest cacheRequest)
public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken,
RequestHandlerDelegate<TResponse> 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<TResponse>(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<TResponse> Handle(TRequest request, CancellationToken cancellationToken,
RequestHandlerDelegate<TResponse> 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<TResponse>(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;
}
}

View File

@ -1,5 +1,10 @@
namespace BuildingBlocks.Domain.Model;
public interface IEntity
{
long Id { get; }
}
public interface IEntity<out TId>
{
TId Id { get; }

View File

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

View File

@ -41,7 +41,7 @@ public class EfIdentityTxBehavior<TRequest, TResponse> : IPipelineBehavior<TRequ
nameof(EfTxBehavior<TRequest, TResponse>),
typeof(TRequest).FullName);
await _dbContextBase.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken);
await _dbContextBase.BeginTransactionAsync(cancellationToken);
try
{

View File

@ -45,7 +45,7 @@ public class EfTxBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TRe
nameof(EfTxBehavior<TRequest, TResponse>),
typeof(TRequest).FullName);
await _dbContextBase.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken);
await _dbContextBase.BeginTransactionAsync(cancellationToken);
try
{

View File

@ -9,7 +9,7 @@ public interface IDbContext
DbSet<TEntity> Set<TEntity>()
where TEntity : class;
IReadOnlyList<IDomainEvent> GetDomainEvents();
Task BeginTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken = default);
Task BeginTransactionAsync(CancellationToken cancellationToken = default);
Task CommitTransactionAsync(CancellationToken cancellationToken = default);
Task RollbackTransactionAsync(CancellationToken cancellationToken = default);
Task<int> SaveChangesAsync(CancellationToken cancellationToken = default);

View File

@ -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;
}
}
public static TModel GetOptions<TModel>(this WebApplication app, string section) where TModel : new()
{
var model = new TModel();
app.Configuration?.GetSection(section).Bind(model);
return model;
}
}

View File

@ -5,9 +5,9 @@
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Booking\Booking.csproj" />
<ProjectReference Include="..\Booking\Booking.csproj"/>
</ItemGroup>
</Project>

View File

@ -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",

View File

@ -13,11 +13,11 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Data\Migrations" />
<Folder Include="Data\Migrations"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\BuildingBlocks\BuildingBlocks.csproj" />
<ProjectReference Include="..\..\..\..\BuildingBlocks\BuildingBlocks.csproj"/>
</ItemGroup>
</Project>

View File

@ -7,11 +7,11 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Flight\Flight.csproj" />
<ProjectReference Include="..\Flight\Flight.csproj"/>
</ItemGroup>
<ItemGroup>
@ -19,5 +19,5 @@
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

View File

@ -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>("AppOptions");
Console.WriteLine(FiggleFonts.Standard.Render(appOptions.Name));
builder.Services.AddCustomDbContext<FlightDbContext>(configuration, typeof(FlightRoot).Assembly);
builder.Services.AddMongoDbContext<FlightReadDbContext>(configuration);
builder.Services.AddScoped<IDataSeeder, FlightDataSeeder>();
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<IEventMapper, EventMapper>();
builder.Services.AddCustomMassTransit(typeof(FlightRoot).Assembly);
builder.Services.AddCustomOpenTelemetry();
builder.Services.AddRouting(options => options.LowercaseUrls = true);
builder.Services.AddGrpc(options =>
{
options.Interceptors.Add<GrpcExceptionInterceptor>();
});
builder.Services.AddMagicOnion();
SnowFlakIdGenerator.Configure(1);
builder.Services.AddCachingRequest(new List<Assembly>
{
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<IApiVersionDescriptionProvider>();
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>("AppOptions");
Console.WriteLine(FiggleFonts.Standard.Render(appOptions.Name));
builder.AddCustomSerilog();
services.AddCustomDbContext<FlightDbContext>(configuration, typeof(FlightRoot).Assembly);
services.AddScoped<IDataSeeder, FlightDataSeeder>();
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<IEventMapper, EventMapper>();
services.AddCustomMassTransit(typeof(FlightRoot).Assembly);
services.AddCustomOpenTelemetry();
services.AddRouting(options => options.LowercaseUrls = true);
services.AddGrpc(options =>
{
options.Interceptors.Add<GrpcExceptionInterceptor>();
});
services.AddMagicOnion();
SnowFlakIdGenerator.Configure(1);
services.AddCachingRequest(new List<Assembly> {typeof(FlightRoot).Assembly});
services.AddEasyCaching(options => { options.UseInMemory(configuration, "mem"); });
}
static void ConfigureApplication(WebApplication app)
{
var appOptions = app.GetOptions<AppOptions>("AppOptions");
if (app.Environment.IsDevelopment())
{
var provider = app.Services.GetService<IApiVersionDescriptionProvider>();
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 { }

View File

@ -12,15 +12,16 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Aircrafts\Exceptions" />
<Folder Include="Airports\Exceptions" />
<Folder Include="Data\Migrations" />
<Folder Include="Flights\Features\UpdateFlight" />
<Folder Include="Seats\Features\CreateSeat" />
<Folder Include="Aircrafts\Exceptions"/>
<Folder Include="Airports\Exceptions"/>
<Folder Include="Data\Migrations"/>
<Folder Include="Enum"/>
<Folder Include="Flights\Features\UpdateFlight"/>
<Folder Include="Seats\Features\CreateSeat"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\BuildingBlocks\BuildingBlocks.csproj" />
<ProjectReference Include="..\..\..\..\BuildingBlocks\BuildingBlocks.csproj"/>
</ItemGroup>
</Project>

View File

@ -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<ActionResult> GetById([FromRoute] GetFlightByIdQuery query, CancellationToken cancellationToken)
{
throw new Exception();
var result = await Mediator.Send(query, cancellationToken);
return Ok(result);

View File

@ -1,36 +1,34 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<IsPackable>false</IsPackable>
</PropertyGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0"/>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="6.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Nito.AsyncEx" Version="5.1.2" />
<PackageReference Include="AutoBogus" Version="2.13.1" />
<PackageReference Include="Bogus" Version="34.0.1" />
<PackageReference Include="Docker.DotNet" Version="3.125.5" />
<PackageReference Include="Ductus.FluentDocker" Version="2.10.41" />
<PackageReference Include="FluentAssertions" Version="6.2.0" />
<PackageReference Include="MediatR" Version="9.0.0" />
<PackageReference Include="Moq" Version="4.16.1" />
<PackageReference Include="Respawn" Version="4.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\src\Flight\Flight.csproj" />
</ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="6.0.4"/>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0"/>
<PackageReference Include="xunit" Version="2.4.1"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Nito.AsyncEx" Version="5.1.2"/>
<PackageReference Include="AutoBogus" Version="2.13.1"/>
<PackageReference Include="Bogus" Version="34.0.1"/>
<PackageReference Include="Docker.DotNet" Version="3.125.5"/>
<PackageReference Include="Ductus.FluentDocker" Version="2.10.41"/>
<PackageReference Include="FluentAssertions" Version="6.2.0"/>
<PackageReference Include="MediatR" Version="9.0.0"/>
<PackageReference Include="Moq" Version="4.16.1"/>
<PackageReference Include="Respawn" Version="4.0.0"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\src\Flight.Api\Flight.Api.csproj"/>
</ItemGroup>
</Project>

View File

@ -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<TestFixture>
{
}
// 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<Program> _factory;
private static IServiceScopeFactory _scopeFactory = null!;
private readonly IServiceScopeFactory _scopeFactory;
public TestFixture()
{
_factory = new FlightTestApplicationFactory();
var factory = FlightTestApplicationFactory();
_configuration = _factory.Services.GetRequiredService<IConfiguration>();
_scopeFactory = _factory.Services.GetRequiredService<IServiceScopeFactory>();
_configuration = factory.Services.GetRequiredService<IConfiguration>();
_scopeFactory = factory.Services.GetRequiredService<IServiceScopeFactory>();
_checkpoint = new Checkpoint();
}
class FlightTestApplicationFactory : WebApplicationFactory<Program>
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
// builder.ConfigureAppConfiguration((_, configBuilder) =>
// {
// configBuilder.AddInMemoryCollection(new Dictionary<string, string>
// {
// {"ConnectionStrings:DefaultConnection", _connectionString}
// });
// });
builder.ConfigureServices(services =>
{
services.AddLogging();
var httpContextAccessorService = services.FirstOrDefault(d =>
d.ServiceType == typeof(IHttpContextAccessor));
services.Remove(httpContextAccessorService);
services.AddSingleton(_ => Mock.Of<IHttpContextAccessor>());
services.AddSingleton(Mock.Of<IWebHostEnvironment>(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<AddToBook>();
// // cfg.AddConsumerTestHarness<AddToBook>();
// });
EnsureDatabase();
});
}
}
private static void EnsureDatabase()
{
using var scope = _scopeFactory.CreateScope();
var context = scope.ServiceProvider.GetService<FlightDbContext>();
context?.Database.Migrate();
}
public static TScopedService GetService<TScopedService>()
{
var scope = _scopeFactory.CreateScope();
var service = scope.ServiceProvider.GetService<TScopedService>();
return service;
}
public static Task<TResponse> SendAsync<TResponse>(IRequest<TResponse> request)
{
using var scope = _scopeFactory.CreateScope();
var mediator = scope.ServiceProvider.GetService<ISender>();
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<Program> FlightTestApplicationFactory()
{
return new WebApplicationFactory<Program>()
.WithWebHostBuilder(builder =>
{
builder.ConfigureAppConfiguration((_, configBuilder) =>
{
configBuilder.AddInMemoryCollection(new Dictionary<string, string>
{
{
"ConnectionStrings:DefaultConnection",
"Server=db;Database=FlightDB;User ID=sa;Password=@Aa123456"
}
});
});
});
}
public async Task ExecuteScopeAsync(Func<IServiceProvider, Task> action)
{
using var scope = _scopeFactory.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<FlightDbContext>();
try
{
await dbContext.BeginTransactionAsync();
await action(scope.ServiceProvider);
await dbContext.CommitTransactionAsync();
}
catch (Exception)
{
await dbContext.RollbackTransactionAsync();
throw;
}
}
public async Task<T> ExecuteScopeAsync<T>(Func<IServiceProvider, Task<T>> action)
{
using var scope = _scopeFactory.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<FlightDbContext>();
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<FlightDbContext, Task> action)
{
return ExecuteScopeAsync(sp => action(sp.GetService<FlightDbContext>()));
}
public Task ExecuteDbContextAsync(Func<FlightDbContext, ValueTask> action)
{
return ExecuteScopeAsync(sp => action(sp.GetService<FlightDbContext>()).AsTask());
}
public Task ExecuteDbContextAsync(Func<FlightDbContext, IMediator, Task> action)
{
return ExecuteScopeAsync(sp => action(sp.GetService<FlightDbContext>(), sp.GetService<IMediator>()));
}
public Task<T> ExecuteDbContextAsync<T>(Func<FlightDbContext, Task<T>> action)
{
return ExecuteScopeAsync(sp => action(sp.GetService<FlightDbContext>()));
}
public Task<T> ExecuteDbContextAsync<T>(Func<FlightDbContext, ValueTask<T>> action)
{
return ExecuteScopeAsync(sp => action(sp.GetService<FlightDbContext>()).AsTask());
}
public Task<T> ExecuteDbContextAsync<T>(Func<FlightDbContext, IMediator, Task<T>> action)
{
return ExecuteScopeAsync(sp => action(sp.GetService<FlightDbContext>(), sp.GetService<IMediator>()));
}
public Task InsertAsync<T>(params T[] entities) where T : class
{
return ExecuteDbContextAsync(db =>
{
foreach (var entity in entities) db.Set<T>().Add(entity);
return db.SaveChangesAsync();
});
}
public Task InsertAsync<TEntity>(TEntity entity) where TEntity : class
{
return ExecuteDbContextAsync(db =>
{
db.Set<TEntity>().Add(entity);
return db.SaveChangesAsync();
});
}
public Task InsertAsync<TEntity, TEntity2>(TEntity entity, TEntity2 entity2)
where TEntity : class
where TEntity2 : class
{
return ExecuteDbContextAsync(db =>
{
db.Set<TEntity>().Add(entity);
db.Set<TEntity2>().Add(entity2);
return db.SaveChangesAsync();
});
}
public Task InsertAsync<TEntity, TEntity2, TEntity3>(TEntity entity, TEntity2 entity2, TEntity3 entity3)
where TEntity : class
where TEntity2 : class
where TEntity3 : class
{
return ExecuteDbContextAsync(db =>
{
db.Set<TEntity>().Add(entity);
db.Set<TEntity2>().Add(entity2);
db.Set<TEntity3>().Add(entity3);
return db.SaveChangesAsync();
});
}
public Task InsertAsync<TEntity, TEntity2, TEntity3, TEntity4>(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<TEntity>().Add(entity);
db.Set<TEntity2>().Add(entity2);
db.Set<TEntity3>().Add(entity3);
db.Set<TEntity4>().Add(entity4);
return db.SaveChangesAsync();
});
}
public Task<T> FindAsync<T>(int id)
where T : class, IEntity
{
return ExecuteDbContextAsync(db => db.Set<T>().FindAsync(id).AsTask());
}
public Task<TResponse> SendAsync<TResponse>(IRequest<TResponse> request)
{
return ExecuteScopeAsync(sp =>
{
var mediator = sp.GetRequiredService<IMediator>();
return mediator.Send(request);
});
}
public Task SendAsync(IRequest request)
{
return ExecuteScopeAsync(sp =>
{
var mediator = sp.GetRequiredService<IMediator>();
return mediator.Send(request);
});
}
}

View File

@ -7,11 +7,11 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Identity\Identity.csproj" />
<ProjectReference Include="..\Identity\Identity.csproj"/>
</ItemGroup>
<ItemGroup>
<_ContentIncludedByDefault Remove="keys\is-signing-key-C01EF7C986B61650360AFA59291E65BC.json" />
<_ContentIncludedByDefault Remove="keys\is-signing-key-C01EF7C986B61650360AFA59291E65BC.json"/>
</ItemGroup>
</Project>

View File

@ -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}
{
"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
}

View File

@ -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}
{
"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
}

View File

@ -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}
{
"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
}

View File

@ -33,9 +33,14 @@ public sealed class IdentityContext : IdentityDbContext<ApplicationUser, Identit
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)

View File

@ -12,7 +12,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\BuildingBlocks\BuildingBlocks.csproj" />
<ProjectReference Include="..\..\..\..\BuildingBlocks\BuildingBlocks.csproj"/>
</ItemGroup>
</Project>

View File

@ -4,9 +4,9 @@
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Passenger\Passenger.csproj" />
<ProjectReference Include="..\Passenger\Passenger.csproj"/>
</ItemGroup>
</Project>

View File

@ -13,12 +13,12 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Data\Migrations" />
<Folder Include="Extensions" />
<Folder Include="Data\Migrations"/>
<Folder Include="Extensions"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\BuildingBlocks\BuildingBlocks.csproj" />
<ProjectReference Include="..\..\..\..\BuildingBlocks\BuildingBlocks.csproj"/>
</ItemGroup>
</Project>