mirror of
https://github.com/meysamhadeli/booking-microservices.git
synced 2026-05-03 19:41:52 +08:00
commit
3c562e1ed9
@ -247,7 +247,7 @@ Content-Type: application/json
|
|||||||
authorization: bearer {{Authenticate.response.body.access_token}}
|
authorization: bearer {{Authenticate.response.body.access_token}}
|
||||||
|
|
||||||
{
|
{
|
||||||
"passengerId": 7225627535474688,
|
"passengerId": 8765596234940416,
|
||||||
"flightId": 1,
|
"flightId": 1,
|
||||||
"description": "I want to fly to iran"
|
"description": "I want to fly to iran"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,14 +2,18 @@
|
|||||||
|
|
||||||
namespace BuildingBlocks.Core.Model;
|
namespace BuildingBlocks.Core.Model;
|
||||||
|
|
||||||
public interface IAggregate : IAudit
|
public interface IAggregate : IAudit, IVersion
|
||||||
{
|
{
|
||||||
IReadOnlyList<IDomainEvent> DomainEvents { get; }
|
IReadOnlyList<IDomainEvent> DomainEvents { get; }
|
||||||
IEvent[] ClearDomainEvents();
|
IEvent[] ClearDomainEvents();
|
||||||
long Version { get; set; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IAggregate<out T> : IAggregate
|
public interface IAggregate<out T> : IAggregate
|
||||||
{
|
{
|
||||||
T Id { get; }
|
T Id { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface IVersion
|
||||||
|
{
|
||||||
|
long Version { get; set; }
|
||||||
|
}
|
||||||
|
|||||||
@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|||||||
namespace BuildingBlocks.PersistMessageProcessor.Data.Migrations
|
namespace BuildingBlocks.PersistMessageProcessor.Data.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(PersistMessageDbContext))]
|
[DbContext(typeof(PersistMessageDbContext))]
|
||||||
[Migration("20230122153121_initial")]
|
[Migration("20230122204943_initial")]
|
||||||
partial class initial
|
partial class initial
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@ -5,6 +5,7 @@ namespace BuildingBlocks.PersistMessageProcessor.Data;
|
|||||||
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using Configurations;
|
using Configurations;
|
||||||
|
using Core.Model;
|
||||||
using global::Polly;
|
using global::Polly;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
@ -57,7 +58,9 @@ public class PersistMessageDbContext : DbContext, IPersistMessageDbContext
|
|||||||
var databaseValues = await entry.GetDatabaseValuesAsync(cancellationToken);
|
var databaseValues = await entry.GetDatabaseValuesAsync(cancellationToken);
|
||||||
|
|
||||||
if (databaseValues != null)
|
if (databaseValues != null)
|
||||||
|
{
|
||||||
entry.OriginalValues.SetValues(databaseValues);
|
entry.OriginalValues.SetValues(databaseValues);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return await base.SaveChangesAsync(cancellationToken);
|
return await base.SaveChangesAsync(cancellationToken);
|
||||||
@ -68,7 +71,7 @@ public class PersistMessageDbContext : DbContext, IPersistMessageDbContext
|
|||||||
|
|
||||||
private void OnBeforeSaving()
|
private void OnBeforeSaving()
|
||||||
{
|
{
|
||||||
foreach (var entry in ChangeTracker.Entries<PersistMessage>())
|
foreach (var entry in ChangeTracker.Entries<IVersion>())
|
||||||
{
|
{
|
||||||
switch (entry.State)
|
switch (entry.State)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
namespace BuildingBlocks.PersistMessageProcessor;
|
namespace BuildingBlocks.PersistMessageProcessor;
|
||||||
|
|
||||||
public class PersistMessage
|
using Core.Model;
|
||||||
|
|
||||||
|
public class PersistMessage: IVersion
|
||||||
{
|
{
|
||||||
public PersistMessage(long id, string dataType, string data, MessageDeliveryType deliveryType)
|
public PersistMessage(long id, string dataType, string data, MessageDeliveryType deliveryType)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -54,7 +54,7 @@ public class PersistMessageProcessor : IPersistMessageProcessor
|
|||||||
public async Task<IReadOnlyList<PersistMessage>> GetByFilterAsync(Expression<Func<PersistMessage, bool>> predicate,
|
public async Task<IReadOnlyList<PersistMessage>> GetByFilterAsync(Expression<Func<PersistMessage, bool>> predicate,
|
||||||
CancellationToken cancellationToken = default)
|
CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
return (await _persistMessageDbContext.PersistMessages.AsNoTracking().Where(predicate).ToListAsync(cancellationToken))
|
return (await _persistMessageDbContext.PersistMessages.Where(predicate).ToListAsync(cancellationToken))
|
||||||
.AsReadOnly();
|
.AsReadOnly();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,7 +110,7 @@ public class PersistMessageProcessor : IPersistMessageProcessor
|
|||||||
|
|
||||||
public async Task ProcessAllAsync(CancellationToken cancellationToken = default)
|
public async Task ProcessAllAsync(CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
var messages = await _persistMessageDbContext.PersistMessages.AsNoTracking()
|
var messages = await _persistMessageDbContext.PersistMessages
|
||||||
.Where(x => x.MessageStatus != MessageStatus.Processed)
|
.Where(x => x.MessageStatus != MessageStatus.Processed)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
|
|||||||
@ -14,7 +14,7 @@ public static class GrpcCircuitBreaker
|
|||||||
//ref: https://anthonygiretti.com/2020/03/31/grpc-asp-net-core-3-1-resiliency-with-polly/
|
//ref: https://anthonygiretti.com/2020/03/31/grpc-asp-net-core-3-1-resiliency-with-polly/
|
||||||
public static IHttpClientBuilder AddGrpcCircuitBreakerPolicyHandler(this IHttpClientBuilder httpClientBuilder)
|
public static IHttpClientBuilder AddGrpcCircuitBreakerPolicyHandler(this IHttpClientBuilder httpClientBuilder)
|
||||||
{
|
{
|
||||||
return httpClientBuilder.AddPolicyHandler((sp, _) =>
|
return httpClientBuilder.AddPolicyHandler((sp, _) =>
|
||||||
{
|
{
|
||||||
var options = sp.GetRequiredService<IConfiguration>().GetOptions<PolicyOptions>(nameof(PolicyOptions));
|
var options = sp.GetRequiredService<IConfiguration>().GetOptions<PolicyOptions>(nameof(PolicyOptions));
|
||||||
|
|
||||||
@ -23,28 +23,7 @@ public static class GrpcCircuitBreaker
|
|||||||
var loggerFactory = sp.GetRequiredService<ILoggerFactory>();
|
var loggerFactory = sp.GetRequiredService<ILoggerFactory>();
|
||||||
var logger = loggerFactory.CreateLogger("PollyGrpcCircuitBreakerPoliciesLogger");
|
var logger = loggerFactory.CreateLogger("PollyGrpcCircuitBreakerPoliciesLogger");
|
||||||
|
|
||||||
// gRPC status
|
return Policy.HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
|
||||||
var gRpcErrors = new StatusCode[]
|
|
||||||
{
|
|
||||||
StatusCode.DeadlineExceeded, StatusCode.Internal, StatusCode.NotFound, StatusCode.Cancelled,
|
|
||||||
StatusCode.ResourceExhausted, StatusCode.Unavailable, StatusCode.Unknown
|
|
||||||
};
|
|
||||||
|
|
||||||
// Http errors
|
|
||||||
var serverErrors = new HttpStatusCode[]
|
|
||||||
{
|
|
||||||
HttpStatusCode.BadGateway, HttpStatusCode.GatewayTimeout, HttpStatusCode.ServiceUnavailable,
|
|
||||||
HttpStatusCode.InternalServerError, HttpStatusCode.TooManyRequests, HttpStatusCode.RequestTimeout
|
|
||||||
};
|
|
||||||
|
|
||||||
return Policy.HandleResult<HttpResponseMessage>(r =>
|
|
||||||
{
|
|
||||||
var grpcStatus = StatusManager.GetStatusCode(r);
|
|
||||||
var httpStatusCode = r.StatusCode;
|
|
||||||
|
|
||||||
return (grpcStatus == null && serverErrors.Contains(httpStatusCode)) || // if the server send an error before gRPC pipeline
|
|
||||||
(httpStatusCode == HttpStatusCode.OK && gRpcErrors.Contains(grpcStatus.Value)); // if gRPC pipeline handled the request (gRPC always answers OK)
|
|
||||||
})
|
|
||||||
.CircuitBreakerAsync(
|
.CircuitBreakerAsync(
|
||||||
handledEventsAllowedBeforeBreaking: options.CircuitBreaker.RetryCount,
|
handledEventsAllowedBeforeBreaking: options.CircuitBreaker.RetryCount,
|
||||||
durationOfBreak: TimeSpan.FromSeconds(options.CircuitBreaker.BreakDuration),
|
durationOfBreak: TimeSpan.FromSeconds(options.CircuitBreaker.BreakDuration),
|
||||||
@ -64,20 +43,4 @@ public static class GrpcCircuitBreaker
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class StatusManager
|
|
||||||
{
|
|
||||||
public static StatusCode? GetStatusCode(HttpResponseMessage response)
|
|
||||||
{
|
|
||||||
var headers = response.Headers;
|
|
||||||
|
|
||||||
if (!headers.Contains("grpc-status") && response.StatusCode == HttpStatusCode.OK)
|
|
||||||
return StatusCode.OK;
|
|
||||||
|
|
||||||
if (headers.Contains("grpc-status"))
|
|
||||||
return (StatusCode)int.Parse(headers.GetValues("grpc-status").First());
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,37 +20,17 @@ public static class GrpcRetry
|
|||||||
|
|
||||||
Guard.Against.Null(options, nameof(options));
|
Guard.Against.Null(options, nameof(options));
|
||||||
|
|
||||||
var loggerFactory = sp.GetRequiredService<ILoggerFactory>();
|
return Policy
|
||||||
var logger = loggerFactory.CreateLogger("PollyGrpcRetryPoliciesLogger");
|
.HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
|
||||||
|
.WaitAndRetryAsync(options.Retry.RetryCount,
|
||||||
// gRPC status
|
retryAttempt => TimeSpan.FromSeconds(options.Retry.SleepDuration),
|
||||||
var gRpcErrors = new StatusCode[]
|
|
||||||
{
|
|
||||||
StatusCode.DeadlineExceeded, StatusCode.Internal, StatusCode.NotFound, StatusCode.Cancelled,
|
|
||||||
StatusCode.ResourceExhausted, StatusCode.Unavailable, StatusCode.Unknown
|
|
||||||
};
|
|
||||||
|
|
||||||
// Http errors
|
|
||||||
var serverErrors = new HttpStatusCode[]
|
|
||||||
{
|
|
||||||
HttpStatusCode.BadGateway, HttpStatusCode.GatewayTimeout, HttpStatusCode.ServiceUnavailable,
|
|
||||||
HttpStatusCode.InternalServerError, HttpStatusCode.TooManyRequests, HttpStatusCode.RequestTimeout
|
|
||||||
};
|
|
||||||
|
|
||||||
return Policy.HandleResult<HttpResponseMessage>(r =>
|
|
||||||
{
|
|
||||||
var grpcStatus = StatusManager.GetStatusCode(r);
|
|
||||||
var httpStatusCode = r.StatusCode;
|
|
||||||
|
|
||||||
return (grpcStatus == null && serverErrors.Contains(httpStatusCode)) || // if the server send an error before gRPC pipeline
|
|
||||||
(httpStatusCode == HttpStatusCode.OK && gRpcErrors.Contains(grpcStatus.Value)); // if gRPC pipeline handled the request (gRPC always answers OK)
|
|
||||||
})
|
|
||||||
.WaitAndRetryAsync(retryCount: options.Retry.RetryCount,
|
|
||||||
sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(options.Retry.SleepDuration),
|
|
||||||
onRetry: (response, timeSpan, retryCount, context) =>
|
onRetry: (response, timeSpan, retryCount, context) =>
|
||||||
{
|
{
|
||||||
if (response?.Exception != null)
|
if (response?.Exception != null)
|
||||||
{
|
{
|
||||||
|
var loggerFactory = sp.GetRequiredService<ILoggerFactory>();
|
||||||
|
var logger = loggerFactory.CreateLogger("PollyGrpcRetryPoliciesLogger");
|
||||||
|
|
||||||
logger.LogError(response.Exception,
|
logger.LogError(response.Exception,
|
||||||
"Request failed with {StatusCode}. Waiting {TimeSpan} before next retry. Retry attempt {RetryCount}.",
|
"Request failed with {StatusCode}. Waiting {TimeSpan} before next retry. Retry attempt {RetryCount}.",
|
||||||
response.Result.StatusCode,
|
response.Result.StatusCode,
|
||||||
@ -60,20 +40,4 @@ public static class GrpcRetry
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class StatusManager
|
|
||||||
{
|
|
||||||
public static StatusCode? GetStatusCode(HttpResponseMessage response)
|
|
||||||
{
|
|
||||||
var headers = response.Headers;
|
|
||||||
|
|
||||||
if (!headers.Contains("grpc-status") && response.StatusCode == HttpStatusCode.OK)
|
|
||||||
return StatusCode.OK;
|
|
||||||
|
|
||||||
if (headers.Contains("grpc-status"))
|
|
||||||
return (StatusCode)int.Parse(headers.GetValues("grpc-status").First());
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@
|
|||||||
"FlightAddress": "https://localhost:5003",
|
"FlightAddress": "https://localhost:5003",
|
||||||
"PassengerAddress": "https://localhost:5012"
|
"PassengerAddress": "https://localhost:5012"
|
||||||
},
|
},
|
||||||
"RetryOptions": {
|
"PolicyOptions": {
|
||||||
"Retry": {
|
"Retry": {
|
||||||
"RetryCount": 3,
|
"RetryCount": 3,
|
||||||
"SleepDuration": 1
|
"SleepDuration": 1
|
||||||
|
|||||||
@ -62,7 +62,7 @@ public class CreateBookingCommandHandler : ICommandHandler<CreateBookingCommand,
|
|||||||
|
|
||||||
await _flightGrpcServiceClient.ReserveSeatAsync(new ReserveSeatRequest
|
await _flightGrpcServiceClient.ReserveSeatAsync(new ReserveSeatRequest
|
||||||
{
|
{
|
||||||
FlightId = flight.FlightId, SeatNumber = emptySeat?.SeatNumber
|
FlightId = flight.Id, SeatNumber = emptySeat?.SeatNumber
|
||||||
});
|
});
|
||||||
|
|
||||||
var result = await _eventStoreDbRepository.Add(
|
var result = await _eventStoreDbRepository.Add(
|
||||||
|
|||||||
@ -100,7 +100,6 @@ public static class InfrastructureExtensions
|
|||||||
});
|
});
|
||||||
app.UseCorrelationId();
|
app.UseCorrelationId();
|
||||||
app.UseHttpMetrics();
|
app.UseHttpMetrics();
|
||||||
// app.UseMigration<PersistMessageDbContext>(env);
|
|
||||||
app.UseCustomHealthCheck();
|
app.UseCustomHealthCheck();
|
||||||
app.MapMetrics();
|
app.MapMetrics();
|
||||||
app.MapGet("/", x => x.Response.WriteAsync(appOptions.Name));
|
app.MapGet("/", x => x.Response.WriteAsync(appOptions.Name));
|
||||||
|
|||||||
@ -0,0 +1,16 @@
|
|||||||
|
namespace Identity.Data.Configurations;
|
||||||
|
|
||||||
|
using Identity.Models;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||||
|
|
||||||
|
public class RoleClaimConfiguration : IEntityTypeConfiguration<RoleClaim>
|
||||||
|
{
|
||||||
|
public void Configure(EntityTypeBuilder<RoleClaim> builder)
|
||||||
|
{
|
||||||
|
builder.ToTable(nameof(RoleClaim));
|
||||||
|
|
||||||
|
// // ref: https://learn.microsoft.com/en-us/ef/core/saving/concurrency?tabs=fluent-api
|
||||||
|
builder.Property(r => r.Version).IsConcurrencyToken();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
namespace Identity.Data.Configurations;
|
||||||
|
|
||||||
|
using Identity.Models;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||||
|
|
||||||
|
public class RoleConfiguration : IEntityTypeConfiguration<Role>
|
||||||
|
{
|
||||||
|
public void Configure(EntityTypeBuilder<Role> builder)
|
||||||
|
{
|
||||||
|
builder.ToTable(nameof(Role));
|
||||||
|
|
||||||
|
// // ref: https://learn.microsoft.com/en-us/ef/core/saving/concurrency?tabs=fluent-api
|
||||||
|
builder.Property(r => r.Version).IsConcurrencyToken();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
namespace Identity.Data.Configurations;
|
||||||
|
|
||||||
|
using Identity.Models;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||||
|
|
||||||
|
public class UserClaimConfiguration : IEntityTypeConfiguration<UserClaim>
|
||||||
|
{
|
||||||
|
public void Configure(EntityTypeBuilder<UserClaim> builder)
|
||||||
|
{
|
||||||
|
builder.ToTable(nameof(UserClaim));
|
||||||
|
|
||||||
|
// // ref: https://learn.microsoft.com/en-us/ef/core/saving/concurrency?tabs=fluent-api
|
||||||
|
builder.Property(r => r.Version).IsConcurrencyToken();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
namespace Identity.Data.Configurations;
|
||||||
|
|
||||||
|
using Identity.Models;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||||
|
|
||||||
|
public class UserConfiguration : IEntityTypeConfiguration<User>
|
||||||
|
{
|
||||||
|
public void Configure(EntityTypeBuilder<User> builder)
|
||||||
|
{
|
||||||
|
builder.ToTable(nameof(User));
|
||||||
|
|
||||||
|
// // ref: https://learn.microsoft.com/en-us/ef/core/saving/concurrency?tabs=fluent-api
|
||||||
|
builder.Property(r => r.Version).IsConcurrencyToken();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
namespace Identity.Data.Configurations;
|
||||||
|
|
||||||
|
using Identity.Models;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||||
|
|
||||||
|
public class UserLoginConfiguration : IEntityTypeConfiguration<UserLogin>
|
||||||
|
{
|
||||||
|
public void Configure(EntityTypeBuilder<UserLogin> builder)
|
||||||
|
{
|
||||||
|
builder.ToTable(nameof(UserLogin));
|
||||||
|
|
||||||
|
// // ref: https://learn.microsoft.com/en-us/ef/core/saving/concurrency?tabs=fluent-api
|
||||||
|
builder.Property(r => r.Version).IsConcurrencyToken();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
namespace Identity.Data.Configurations;
|
||||||
|
|
||||||
|
using Identity.Models;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||||
|
|
||||||
|
public class UserRoleConfiguration : IEntityTypeConfiguration<UserRole>
|
||||||
|
{
|
||||||
|
public void Configure(EntityTypeBuilder<UserRole> builder)
|
||||||
|
{
|
||||||
|
builder.ToTable(nameof(UserRole));
|
||||||
|
|
||||||
|
// // ref: https://learn.microsoft.com/en-us/ef/core/saving/concurrency?tabs=fluent-api
|
||||||
|
builder.Property(r => r.Version).IsConcurrencyToken();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
namespace Identity.Data.Configurations;
|
||||||
|
|
||||||
|
using Identity.Models;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||||
|
|
||||||
|
public class UserTokenConfiguration : IEntityTypeConfiguration<UserToken>
|
||||||
|
{
|
||||||
|
public void Configure(EntityTypeBuilder<UserToken> builder)
|
||||||
|
{
|
||||||
|
builder.ToTable(nameof(UserToken));
|
||||||
|
|
||||||
|
// // ref: https://learn.microsoft.com/en-us/ef/core/saving/concurrency?tabs=fluent-api
|
||||||
|
builder.Property(r => r.Version).IsConcurrencyToken();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -8,20 +8,16 @@ using System.Threading.Tasks;
|
|||||||
using BuildingBlocks.Core.Event;
|
using BuildingBlocks.Core.Event;
|
||||||
using BuildingBlocks.Core.Model;
|
using BuildingBlocks.Core.Model;
|
||||||
using BuildingBlocks.EFCore;
|
using BuildingBlocks.EFCore;
|
||||||
using Humanizer;
|
|
||||||
using Identity.Identity.Models;
|
using Identity.Identity.Models;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Identity;
|
|
||||||
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
|
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Metadata;
|
|
||||||
using Microsoft.EntityFrameworkCore.Storage;
|
using Microsoft.EntityFrameworkCore.Storage;
|
||||||
|
|
||||||
namespace Identity.Data;
|
namespace Identity.Data;
|
||||||
|
|
||||||
public sealed class IdentityContext : IdentityDbContext<ApplicationUser, IdentityRole<long>, long,
|
public sealed class IdentityContext : IdentityDbContext<User, Role, long,
|
||||||
IdentityUserClaim<long>,
|
UserClaim, UserRole, UserLogin, RoleClaim, UserToken>, IDbContext
|
||||||
IdentityUserRole<long>, IdentityUserLogin<long>, IdentityRoleClaim<long>, IdentityUserToken<long>>, IDbContext
|
|
||||||
{
|
{
|
||||||
private IDbContextTransaction _currentTransaction;
|
private IDbContextTransaction _currentTransaction;
|
||||||
|
|
||||||
@ -38,6 +34,12 @@ public sealed class IdentityContext : IdentityDbContext<ApplicationUser, Identit
|
|||||||
builder.ToSnakeCaseTables();
|
builder.ToSnakeCaseTables();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
OnBeforeSaving();
|
||||||
|
return await base.SaveChangesAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
public async Task BeginTransactionAsync(CancellationToken cancellationToken = default)
|
public async Task BeginTransactionAsync(CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
if (_currentTransaction != null)
|
if (_currentTransaction != null)
|
||||||
@ -96,4 +98,21 @@ public sealed class IdentityContext : IdentityDbContext<ApplicationUser, Identit
|
|||||||
|
|
||||||
return domainEvents.ToImmutableList();
|
return domainEvents.ToImmutableList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnBeforeSaving()
|
||||||
|
{
|
||||||
|
foreach (var entry in ChangeTracker.Entries<IVersion>())
|
||||||
|
{
|
||||||
|
switch (entry.State)
|
||||||
|
{
|
||||||
|
case EntityState.Modified:
|
||||||
|
entry.Entity.Version++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EntityState.Deleted:
|
||||||
|
entry.Entity.Version++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|||||||
namespace Identity.Data.Migrations
|
namespace Identity.Data.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(IdentityContext))]
|
[DbContext(typeof(IdentityContext))]
|
||||||
[Migration("20230113183552_initial")]
|
[Migration("20230122204905_initial")]
|
||||||
partial class initial
|
partial class initial
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@ -25,7 +25,81 @@ namespace Identity.Data.Migrations
|
|||||||
|
|
||||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
|
|
||||||
modelBuilder.Entity("Identity.Identity.Models.ApplicationUser", b =>
|
modelBuilder.Entity("Identity.Identity.Models.Role", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("id");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("ConcurrencyStamp")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("text")
|
||||||
|
.HasColumnName("concurrency_stamp");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)")
|
||||||
|
.HasColumnName("name");
|
||||||
|
|
||||||
|
b.Property<string>("NormalizedName")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)")
|
||||||
|
.HasColumnName("normalized_name");
|
||||||
|
|
||||||
|
b.Property<long>("Version")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("version");
|
||||||
|
|
||||||
|
b.HasKey("Id")
|
||||||
|
.HasName("pk_asp_net_roles");
|
||||||
|
|
||||||
|
b.HasIndex("NormalizedName")
|
||||||
|
.IsUnique()
|
||||||
|
.HasDatabaseName("RoleNameIndex");
|
||||||
|
|
||||||
|
b.ToTable("asp_net_roles", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Identity.Identity.Models.RoleClaim", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("integer")
|
||||||
|
.HasColumnName("id");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("ClaimType")
|
||||||
|
.HasColumnType("text")
|
||||||
|
.HasColumnName("claim_type");
|
||||||
|
|
||||||
|
b.Property<string>("ClaimValue")
|
||||||
|
.HasColumnType("text")
|
||||||
|
.HasColumnName("claim_value");
|
||||||
|
|
||||||
|
b.Property<long>("RoleId")
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("role_id");
|
||||||
|
|
||||||
|
b.Property<long>("Version")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("version");
|
||||||
|
|
||||||
|
b.HasKey("Id")
|
||||||
|
.HasName("pk_asp_net_role_claims");
|
||||||
|
|
||||||
|
b.HasIndex("RoleId")
|
||||||
|
.HasDatabaseName("ix_asp_net_role_claims_role_id");
|
||||||
|
|
||||||
|
b.ToTable("asp_net_role_claims", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Identity.Identity.Models.User", b =>
|
||||||
{
|
{
|
||||||
b.Property<long>("Id")
|
b.Property<long>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@ -107,6 +181,11 @@ namespace Identity.Data.Migrations
|
|||||||
.HasColumnType("character varying(256)")
|
.HasColumnType("character varying(256)")
|
||||||
.HasColumnName("user_name");
|
.HasColumnName("user_name");
|
||||||
|
|
||||||
|
b.Property<long>("Version")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("version");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_asp_net_users");
|
.HasName("pk_asp_net_users");
|
||||||
|
|
||||||
@ -120,71 +199,7 @@ namespace Identity.Data.Migrations
|
|||||||
b.ToTable("asp_net_users", (string)null);
|
b.ToTable("asp_net_users", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserClaim", b =>
|
||||||
{
|
|
||||||
b.Property<long>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("bigint")
|
|
||||||
.HasColumnName("id");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
|
|
||||||
|
|
||||||
b.Property<string>("ConcurrencyStamp")
|
|
||||||
.IsConcurrencyToken()
|
|
||||||
.HasColumnType("text")
|
|
||||||
.HasColumnName("concurrency_stamp");
|
|
||||||
|
|
||||||
b.Property<string>("Name")
|
|
||||||
.HasMaxLength(256)
|
|
||||||
.HasColumnType("character varying(256)")
|
|
||||||
.HasColumnName("name");
|
|
||||||
|
|
||||||
b.Property<string>("NormalizedName")
|
|
||||||
.HasMaxLength(256)
|
|
||||||
.HasColumnType("character varying(256)")
|
|
||||||
.HasColumnName("normalized_name");
|
|
||||||
|
|
||||||
b.HasKey("Id")
|
|
||||||
.HasName("pk_asp_net_roles");
|
|
||||||
|
|
||||||
b.HasIndex("NormalizedName")
|
|
||||||
.IsUnique()
|
|
||||||
.HasDatabaseName("RoleNameIndex");
|
|
||||||
|
|
||||||
b.ToTable("asp_net_roles", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<long>", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer")
|
|
||||||
.HasColumnName("id");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<string>("ClaimType")
|
|
||||||
.HasColumnType("text")
|
|
||||||
.HasColumnName("claim_type");
|
|
||||||
|
|
||||||
b.Property<string>("ClaimValue")
|
|
||||||
.HasColumnType("text")
|
|
||||||
.HasColumnName("claim_value");
|
|
||||||
|
|
||||||
b.Property<long>("RoleId")
|
|
||||||
.HasColumnType("bigint")
|
|
||||||
.HasColumnName("role_id");
|
|
||||||
|
|
||||||
b.HasKey("Id")
|
|
||||||
.HasName("pk_asp_net_role_claims");
|
|
||||||
|
|
||||||
b.HasIndex("RoleId")
|
|
||||||
.HasDatabaseName("ix_asp_net_role_claims_role_id");
|
|
||||||
|
|
||||||
b.ToTable("asp_net_role_claims", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<long>", b =>
|
|
||||||
{
|
{
|
||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@ -205,6 +220,11 @@ namespace Identity.Data.Migrations
|
|||||||
.HasColumnType("bigint")
|
.HasColumnType("bigint")
|
||||||
.HasColumnName("user_id");
|
.HasColumnName("user_id");
|
||||||
|
|
||||||
|
b.Property<long>("Version")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("version");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_asp_net_user_claims");
|
.HasName("pk_asp_net_user_claims");
|
||||||
|
|
||||||
@ -214,7 +234,7 @@ namespace Identity.Data.Migrations
|
|||||||
b.ToTable("asp_net_user_claims", (string)null);
|
b.ToTable("asp_net_user_claims", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserLogin", b =>
|
||||||
{
|
{
|
||||||
b.Property<string>("LoginProvider")
|
b.Property<string>("LoginProvider")
|
||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
@ -232,6 +252,11 @@ namespace Identity.Data.Migrations
|
|||||||
.HasColumnType("bigint")
|
.HasColumnType("bigint")
|
||||||
.HasColumnName("user_id");
|
.HasColumnName("user_id");
|
||||||
|
|
||||||
|
b.Property<long>("Version")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("version");
|
||||||
|
|
||||||
b.HasKey("LoginProvider", "ProviderKey")
|
b.HasKey("LoginProvider", "ProviderKey")
|
||||||
.HasName("pk_asp_net_user_logins");
|
.HasName("pk_asp_net_user_logins");
|
||||||
|
|
||||||
@ -241,7 +266,7 @@ namespace Identity.Data.Migrations
|
|||||||
b.ToTable("asp_net_user_logins", (string)null);
|
b.ToTable("asp_net_user_logins", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserRole", b =>
|
||||||
{
|
{
|
||||||
b.Property<long>("UserId")
|
b.Property<long>("UserId")
|
||||||
.HasColumnType("bigint")
|
.HasColumnType("bigint")
|
||||||
@ -251,6 +276,11 @@ namespace Identity.Data.Migrations
|
|||||||
.HasColumnType("bigint")
|
.HasColumnType("bigint")
|
||||||
.HasColumnName("role_id");
|
.HasColumnName("role_id");
|
||||||
|
|
||||||
|
b.Property<long>("Version")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("version");
|
||||||
|
|
||||||
b.HasKey("UserId", "RoleId")
|
b.HasKey("UserId", "RoleId")
|
||||||
.HasName("pk_asp_net_user_roles");
|
.HasName("pk_asp_net_user_roles");
|
||||||
|
|
||||||
@ -260,7 +290,7 @@ namespace Identity.Data.Migrations
|
|||||||
b.ToTable("asp_net_user_roles", (string)null);
|
b.ToTable("asp_net_user_roles", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserToken", b =>
|
||||||
{
|
{
|
||||||
b.Property<long>("UserId")
|
b.Property<long>("UserId")
|
||||||
.HasColumnType("bigint")
|
.HasColumnType("bigint")
|
||||||
@ -278,15 +308,20 @@ namespace Identity.Data.Migrations
|
|||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
.HasColumnName("value");
|
.HasColumnName("value");
|
||||||
|
|
||||||
|
b.Property<long>("Version")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("version");
|
||||||
|
|
||||||
b.HasKey("UserId", "LoginProvider", "Name")
|
b.HasKey("UserId", "LoginProvider", "Name")
|
||||||
.HasName("pk_asp_net_user_tokens");
|
.HasName("pk_asp_net_user_tokens");
|
||||||
|
|
||||||
b.ToTable("asp_net_user_tokens", (string)null);
|
b.ToTable("asp_net_user_tokens", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.RoleClaim", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole<long>", null)
|
b.HasOne("Identity.Identity.Models.Role", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("RoleId")
|
.HasForeignKey("RoleId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@ -294,9 +329,9 @@ namespace Identity.Data.Migrations
|
|||||||
.HasConstraintName("fk_asp_net_role_claims_asp_net_roles_role_id");
|
.HasConstraintName("fk_asp_net_role_claims_asp_net_roles_role_id");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserClaim", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("Identity.Identity.Models.ApplicationUser", null)
|
b.HasOne("Identity.Identity.Models.User", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@ -304,9 +339,9 @@ namespace Identity.Data.Migrations
|
|||||||
.HasConstraintName("fk_asp_net_user_claims_asp_net_users_user_id");
|
.HasConstraintName("fk_asp_net_user_claims_asp_net_users_user_id");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserLogin", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("Identity.Identity.Models.ApplicationUser", null)
|
b.HasOne("Identity.Identity.Models.User", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@ -314,16 +349,16 @@ namespace Identity.Data.Migrations
|
|||||||
.HasConstraintName("fk_asp_net_user_logins_asp_net_users_user_id");
|
.HasConstraintName("fk_asp_net_user_logins_asp_net_users_user_id");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserRole", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole<long>", null)
|
b.HasOne("Identity.Identity.Models.Role", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("RoleId")
|
.HasForeignKey("RoleId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasConstraintName("fk_asp_net_user_roles_asp_net_roles_role_id");
|
.HasConstraintName("fk_asp_net_user_roles_asp_net_roles_role_id");
|
||||||
|
|
||||||
b.HasOne("Identity.Identity.Models.ApplicationUser", null)
|
b.HasOne("Identity.Identity.Models.User", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@ -331,9 +366,9 @@ namespace Identity.Data.Migrations
|
|||||||
.HasConstraintName("fk_asp_net_user_roles_asp_net_users_user_id");
|
.HasConstraintName("fk_asp_net_user_roles_asp_net_users_user_id");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserToken", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("Identity.Identity.Models.ApplicationUser", null)
|
b.HasOne("Identity.Identity.Models.User", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@ -18,6 +18,7 @@ namespace Identity.Data.Migrations
|
|||||||
{
|
{
|
||||||
id = table.Column<long>(type: "bigint", nullable: false)
|
id = table.Column<long>(type: "bigint", nullable: false)
|
||||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
|
version = table.Column<long>(type: "bigint", nullable: false),
|
||||||
name = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
|
name = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
|
||||||
normalizedname = table.Column<string>(name: "normalized_name", type: "character varying(256)", maxLength: 256, nullable: true),
|
normalizedname = table.Column<string>(name: "normalized_name", type: "character varying(256)", maxLength: 256, nullable: true),
|
||||||
concurrencystamp = table.Column<string>(name: "concurrency_stamp", type: "text", nullable: true)
|
concurrencystamp = table.Column<string>(name: "concurrency_stamp", type: "text", nullable: true)
|
||||||
@ -36,6 +37,7 @@ namespace Identity.Data.Migrations
|
|||||||
firstname = table.Column<string>(name: "first_name", type: "text", nullable: true),
|
firstname = table.Column<string>(name: "first_name", type: "text", nullable: true),
|
||||||
lastname = table.Column<string>(name: "last_name", type: "text", nullable: true),
|
lastname = table.Column<string>(name: "last_name", type: "text", nullable: true),
|
||||||
passportnumber = table.Column<string>(name: "pass_port_number", type: "text", nullable: true),
|
passportnumber = table.Column<string>(name: "pass_port_number", type: "text", nullable: true),
|
||||||
|
version = table.Column<long>(type: "bigint", nullable: false),
|
||||||
username = table.Column<string>(name: "user_name", type: "character varying(256)", maxLength: 256, nullable: true),
|
username = table.Column<string>(name: "user_name", type: "character varying(256)", maxLength: 256, nullable: true),
|
||||||
normalizedusername = table.Column<string>(name: "normalized_user_name", type: "character varying(256)", maxLength: 256, nullable: true),
|
normalizedusername = table.Column<string>(name: "normalized_user_name", type: "character varying(256)", maxLength: 256, nullable: true),
|
||||||
email = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
|
email = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
|
||||||
@ -62,6 +64,7 @@ namespace Identity.Data.Migrations
|
|||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false)
|
id = table.Column<int>(type: "integer", nullable: false)
|
||||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
|
version = table.Column<long>(type: "bigint", nullable: false),
|
||||||
roleid = table.Column<long>(name: "role_id", type: "bigint", nullable: false),
|
roleid = table.Column<long>(name: "role_id", type: "bigint", nullable: false),
|
||||||
claimtype = table.Column<string>(name: "claim_type", type: "text", nullable: true),
|
claimtype = table.Column<string>(name: "claim_type", type: "text", nullable: true),
|
||||||
claimvalue = table.Column<string>(name: "claim_value", type: "text", nullable: true)
|
claimvalue = table.Column<string>(name: "claim_value", type: "text", nullable: true)
|
||||||
@ -83,6 +86,7 @@ namespace Identity.Data.Migrations
|
|||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false)
|
id = table.Column<int>(type: "integer", nullable: false)
|
||||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
|
version = table.Column<long>(type: "bigint", nullable: false),
|
||||||
userid = table.Column<long>(name: "user_id", type: "bigint", nullable: false),
|
userid = table.Column<long>(name: "user_id", type: "bigint", nullable: false),
|
||||||
claimtype = table.Column<string>(name: "claim_type", type: "text", nullable: true),
|
claimtype = table.Column<string>(name: "claim_type", type: "text", nullable: true),
|
||||||
claimvalue = table.Column<string>(name: "claim_value", type: "text", nullable: true)
|
claimvalue = table.Column<string>(name: "claim_value", type: "text", nullable: true)
|
||||||
@ -104,6 +108,7 @@ namespace Identity.Data.Migrations
|
|||||||
{
|
{
|
||||||
loginprovider = table.Column<string>(name: "login_provider", type: "text", nullable: false),
|
loginprovider = table.Column<string>(name: "login_provider", type: "text", nullable: false),
|
||||||
providerkey = table.Column<string>(name: "provider_key", type: "text", nullable: false),
|
providerkey = table.Column<string>(name: "provider_key", type: "text", nullable: false),
|
||||||
|
version = table.Column<long>(type: "bigint", nullable: false),
|
||||||
providerdisplayname = table.Column<string>(name: "provider_display_name", type: "text", nullable: true),
|
providerdisplayname = table.Column<string>(name: "provider_display_name", type: "text", nullable: true),
|
||||||
userid = table.Column<long>(name: "user_id", type: "bigint", nullable: false)
|
userid = table.Column<long>(name: "user_id", type: "bigint", nullable: false)
|
||||||
},
|
},
|
||||||
@ -123,7 +128,8 @@ namespace Identity.Data.Migrations
|
|||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
userid = table.Column<long>(name: "user_id", type: "bigint", nullable: false),
|
userid = table.Column<long>(name: "user_id", type: "bigint", nullable: false),
|
||||||
roleid = table.Column<long>(name: "role_id", type: "bigint", nullable: false)
|
roleid = table.Column<long>(name: "role_id", type: "bigint", nullable: false),
|
||||||
|
version = table.Column<long>(type: "bigint", nullable: false)
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@ -149,6 +155,7 @@ namespace Identity.Data.Migrations
|
|||||||
userid = table.Column<long>(name: "user_id", type: "bigint", nullable: false),
|
userid = table.Column<long>(name: "user_id", type: "bigint", nullable: false),
|
||||||
loginprovider = table.Column<string>(name: "login_provider", type: "text", nullable: false),
|
loginprovider = table.Column<string>(name: "login_provider", type: "text", nullable: false),
|
||||||
name = table.Column<string>(type: "text", nullable: false),
|
name = table.Column<string>(type: "text", nullable: false),
|
||||||
|
version = table.Column<long>(type: "bigint", nullable: false),
|
||||||
value = table.Column<string>(type: "text", nullable: true)
|
value = table.Column<string>(type: "text", nullable: true)
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
@ -22,7 +22,81 @@ namespace Identity.Data.Migrations
|
|||||||
|
|
||||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
|
|
||||||
modelBuilder.Entity("Identity.Identity.Models.ApplicationUser", b =>
|
modelBuilder.Entity("Identity.Identity.Models.Role", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("id");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("ConcurrencyStamp")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("text")
|
||||||
|
.HasColumnName("concurrency_stamp");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)")
|
||||||
|
.HasColumnName("name");
|
||||||
|
|
||||||
|
b.Property<string>("NormalizedName")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)")
|
||||||
|
.HasColumnName("normalized_name");
|
||||||
|
|
||||||
|
b.Property<long>("Version")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("version");
|
||||||
|
|
||||||
|
b.HasKey("Id")
|
||||||
|
.HasName("pk_asp_net_roles");
|
||||||
|
|
||||||
|
b.HasIndex("NormalizedName")
|
||||||
|
.IsUnique()
|
||||||
|
.HasDatabaseName("RoleNameIndex");
|
||||||
|
|
||||||
|
b.ToTable("asp_net_roles", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Identity.Identity.Models.RoleClaim", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("integer")
|
||||||
|
.HasColumnName("id");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("ClaimType")
|
||||||
|
.HasColumnType("text")
|
||||||
|
.HasColumnName("claim_type");
|
||||||
|
|
||||||
|
b.Property<string>("ClaimValue")
|
||||||
|
.HasColumnType("text")
|
||||||
|
.HasColumnName("claim_value");
|
||||||
|
|
||||||
|
b.Property<long>("RoleId")
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("role_id");
|
||||||
|
|
||||||
|
b.Property<long>("Version")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("version");
|
||||||
|
|
||||||
|
b.HasKey("Id")
|
||||||
|
.HasName("pk_asp_net_role_claims");
|
||||||
|
|
||||||
|
b.HasIndex("RoleId")
|
||||||
|
.HasDatabaseName("ix_asp_net_role_claims_role_id");
|
||||||
|
|
||||||
|
b.ToTable("asp_net_role_claims", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Identity.Identity.Models.User", b =>
|
||||||
{
|
{
|
||||||
b.Property<long>("Id")
|
b.Property<long>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@ -104,6 +178,11 @@ namespace Identity.Data.Migrations
|
|||||||
.HasColumnType("character varying(256)")
|
.HasColumnType("character varying(256)")
|
||||||
.HasColumnName("user_name");
|
.HasColumnName("user_name");
|
||||||
|
|
||||||
|
b.Property<long>("Version")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("version");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_asp_net_users");
|
.HasName("pk_asp_net_users");
|
||||||
|
|
||||||
@ -117,71 +196,7 @@ namespace Identity.Data.Migrations
|
|||||||
b.ToTable("asp_net_users", (string)null);
|
b.ToTable("asp_net_users", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserClaim", b =>
|
||||||
{
|
|
||||||
b.Property<long>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("bigint")
|
|
||||||
.HasColumnName("id");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
|
|
||||||
|
|
||||||
b.Property<string>("ConcurrencyStamp")
|
|
||||||
.IsConcurrencyToken()
|
|
||||||
.HasColumnType("text")
|
|
||||||
.HasColumnName("concurrency_stamp");
|
|
||||||
|
|
||||||
b.Property<string>("Name")
|
|
||||||
.HasMaxLength(256)
|
|
||||||
.HasColumnType("character varying(256)")
|
|
||||||
.HasColumnName("name");
|
|
||||||
|
|
||||||
b.Property<string>("NormalizedName")
|
|
||||||
.HasMaxLength(256)
|
|
||||||
.HasColumnType("character varying(256)")
|
|
||||||
.HasColumnName("normalized_name");
|
|
||||||
|
|
||||||
b.HasKey("Id")
|
|
||||||
.HasName("pk_asp_net_roles");
|
|
||||||
|
|
||||||
b.HasIndex("NormalizedName")
|
|
||||||
.IsUnique()
|
|
||||||
.HasDatabaseName("RoleNameIndex");
|
|
||||||
|
|
||||||
b.ToTable("asp_net_roles", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<long>", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer")
|
|
||||||
.HasColumnName("id");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<string>("ClaimType")
|
|
||||||
.HasColumnType("text")
|
|
||||||
.HasColumnName("claim_type");
|
|
||||||
|
|
||||||
b.Property<string>("ClaimValue")
|
|
||||||
.HasColumnType("text")
|
|
||||||
.HasColumnName("claim_value");
|
|
||||||
|
|
||||||
b.Property<long>("RoleId")
|
|
||||||
.HasColumnType("bigint")
|
|
||||||
.HasColumnName("role_id");
|
|
||||||
|
|
||||||
b.HasKey("Id")
|
|
||||||
.HasName("pk_asp_net_role_claims");
|
|
||||||
|
|
||||||
b.HasIndex("RoleId")
|
|
||||||
.HasDatabaseName("ix_asp_net_role_claims_role_id");
|
|
||||||
|
|
||||||
b.ToTable("asp_net_role_claims", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<long>", b =>
|
|
||||||
{
|
{
|
||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@ -202,6 +217,11 @@ namespace Identity.Data.Migrations
|
|||||||
.HasColumnType("bigint")
|
.HasColumnType("bigint")
|
||||||
.HasColumnName("user_id");
|
.HasColumnName("user_id");
|
||||||
|
|
||||||
|
b.Property<long>("Version")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("version");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_asp_net_user_claims");
|
.HasName("pk_asp_net_user_claims");
|
||||||
|
|
||||||
@ -211,7 +231,7 @@ namespace Identity.Data.Migrations
|
|||||||
b.ToTable("asp_net_user_claims", (string)null);
|
b.ToTable("asp_net_user_claims", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserLogin", b =>
|
||||||
{
|
{
|
||||||
b.Property<string>("LoginProvider")
|
b.Property<string>("LoginProvider")
|
||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
@ -229,6 +249,11 @@ namespace Identity.Data.Migrations
|
|||||||
.HasColumnType("bigint")
|
.HasColumnType("bigint")
|
||||||
.HasColumnName("user_id");
|
.HasColumnName("user_id");
|
||||||
|
|
||||||
|
b.Property<long>("Version")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("version");
|
||||||
|
|
||||||
b.HasKey("LoginProvider", "ProviderKey")
|
b.HasKey("LoginProvider", "ProviderKey")
|
||||||
.HasName("pk_asp_net_user_logins");
|
.HasName("pk_asp_net_user_logins");
|
||||||
|
|
||||||
@ -238,7 +263,7 @@ namespace Identity.Data.Migrations
|
|||||||
b.ToTable("asp_net_user_logins", (string)null);
|
b.ToTable("asp_net_user_logins", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserRole", b =>
|
||||||
{
|
{
|
||||||
b.Property<long>("UserId")
|
b.Property<long>("UserId")
|
||||||
.HasColumnType("bigint")
|
.HasColumnType("bigint")
|
||||||
@ -248,6 +273,11 @@ namespace Identity.Data.Migrations
|
|||||||
.HasColumnType("bigint")
|
.HasColumnType("bigint")
|
||||||
.HasColumnName("role_id");
|
.HasColumnName("role_id");
|
||||||
|
|
||||||
|
b.Property<long>("Version")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("version");
|
||||||
|
|
||||||
b.HasKey("UserId", "RoleId")
|
b.HasKey("UserId", "RoleId")
|
||||||
.HasName("pk_asp_net_user_roles");
|
.HasName("pk_asp_net_user_roles");
|
||||||
|
|
||||||
@ -257,7 +287,7 @@ namespace Identity.Data.Migrations
|
|||||||
b.ToTable("asp_net_user_roles", (string)null);
|
b.ToTable("asp_net_user_roles", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserToken", b =>
|
||||||
{
|
{
|
||||||
b.Property<long>("UserId")
|
b.Property<long>("UserId")
|
||||||
.HasColumnType("bigint")
|
.HasColumnType("bigint")
|
||||||
@ -275,15 +305,20 @@ namespace Identity.Data.Migrations
|
|||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
.HasColumnName("value");
|
.HasColumnName("value");
|
||||||
|
|
||||||
|
b.Property<long>("Version")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("bigint")
|
||||||
|
.HasColumnName("version");
|
||||||
|
|
||||||
b.HasKey("UserId", "LoginProvider", "Name")
|
b.HasKey("UserId", "LoginProvider", "Name")
|
||||||
.HasName("pk_asp_net_user_tokens");
|
.HasName("pk_asp_net_user_tokens");
|
||||||
|
|
||||||
b.ToTable("asp_net_user_tokens", (string)null);
|
b.ToTable("asp_net_user_tokens", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.RoleClaim", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole<long>", null)
|
b.HasOne("Identity.Identity.Models.Role", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("RoleId")
|
.HasForeignKey("RoleId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@ -291,9 +326,9 @@ namespace Identity.Data.Migrations
|
|||||||
.HasConstraintName("fk_asp_net_role_claims_asp_net_roles_role_id");
|
.HasConstraintName("fk_asp_net_role_claims_asp_net_roles_role_id");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserClaim", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("Identity.Identity.Models.ApplicationUser", null)
|
b.HasOne("Identity.Identity.Models.User", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@ -301,9 +336,9 @@ namespace Identity.Data.Migrations
|
|||||||
.HasConstraintName("fk_asp_net_user_claims_asp_net_users_user_id");
|
.HasConstraintName("fk_asp_net_user_claims_asp_net_users_user_id");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserLogin", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("Identity.Identity.Models.ApplicationUser", null)
|
b.HasOne("Identity.Identity.Models.User", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@ -311,16 +346,16 @@ namespace Identity.Data.Migrations
|
|||||||
.HasConstraintName("fk_asp_net_user_logins_asp_net_users_user_id");
|
.HasConstraintName("fk_asp_net_user_logins_asp_net_users_user_id");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserRole", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole<long>", null)
|
b.HasOne("Identity.Identity.Models.Role", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("RoleId")
|
.HasForeignKey("RoleId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasConstraintName("fk_asp_net_user_roles_asp_net_roles_role_id");
|
.HasConstraintName("fk_asp_net_user_roles_asp_net_roles_role_id");
|
||||||
|
|
||||||
b.HasOne("Identity.Identity.Models.ApplicationUser", null)
|
b.HasOne("Identity.Identity.Models.User", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@ -328,9 +363,9 @@ namespace Identity.Data.Migrations
|
|||||||
.HasConstraintName("fk_asp_net_user_roles_asp_net_users_user_id");
|
.HasConstraintName("fk_asp_net_user_roles_asp_net_users_user_id");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<long>", b =>
|
modelBuilder.Entity("Identity.Identity.Models.UserToken", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("Identity.Identity.Models.ApplicationUser", null)
|
b.HasOne("Identity.Identity.Models.User", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
|||||||
@ -11,12 +11,12 @@ namespace Identity.Data.Seed;
|
|||||||
|
|
||||||
public class IdentityDataSeeder : IDataSeeder
|
public class IdentityDataSeeder : IDataSeeder
|
||||||
{
|
{
|
||||||
private readonly RoleManager<IdentityRole<long>> _roleManager;
|
private readonly UserManager<User> _userManager;
|
||||||
|
private readonly RoleManager<Role> _roleManager;
|
||||||
private readonly IEventDispatcher _eventDispatcher;
|
private readonly IEventDispatcher _eventDispatcher;
|
||||||
private readonly UserManager<ApplicationUser> _userManager;
|
|
||||||
|
|
||||||
public IdentityDataSeeder(UserManager<ApplicationUser> userManager,
|
public IdentityDataSeeder(UserManager<User> userManager,
|
||||||
RoleManager<IdentityRole<long>> roleManager,
|
RoleManager<Role> roleManager,
|
||||||
IEventDispatcher eventDispatcher)
|
IEventDispatcher eventDispatcher)
|
||||||
{
|
{
|
||||||
_userManager = userManager;
|
_userManager = userManager;
|
||||||
@ -33,17 +33,17 @@ public class IdentityDataSeeder : IDataSeeder
|
|||||||
private async Task SeedRoles()
|
private async Task SeedRoles()
|
||||||
{
|
{
|
||||||
if (await _roleManager.RoleExistsAsync(Constants.Role.Admin) == false)
|
if (await _roleManager.RoleExistsAsync(Constants.Role.Admin) == false)
|
||||||
await _roleManager.CreateAsync(new(Constants.Role.Admin));
|
await _roleManager.CreateAsync(new Role {Name = Constants.Role.Admin});
|
||||||
|
|
||||||
if (await _roleManager.RoleExistsAsync(Constants.Role.User) == false)
|
if (await _roleManager.RoleExistsAsync(Constants.Role.User) == false)
|
||||||
await _roleManager.CreateAsync(new(Constants.Role.User));
|
await _roleManager.CreateAsync(new Role {Name = Constants.Role.User});
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SeedUsers()
|
private async Task SeedUsers()
|
||||||
{
|
{
|
||||||
if (await _userManager.FindByNameAsync("samh") == null)
|
if (await _userManager.FindByNameAsync("samh") == null)
|
||||||
{
|
{
|
||||||
var user = new ApplicationUser
|
var user = new User
|
||||||
{
|
{
|
||||||
FirstName = "Sam",
|
FirstName = "Sam",
|
||||||
LastName = "H",
|
LastName = "H",
|
||||||
@ -65,7 +65,7 @@ public class IdentityDataSeeder : IDataSeeder
|
|||||||
|
|
||||||
if (await _userManager.FindByNameAsync("meysamh2") == null)
|
if (await _userManager.FindByNameAsync("meysamh2") == null)
|
||||||
{
|
{
|
||||||
var user = new ApplicationUser
|
var user = new User
|
||||||
{
|
{
|
||||||
FirstName = "Sam2",
|
FirstName = "Sam2",
|
||||||
LastName = "H2",
|
LastName = "H2",
|
||||||
|
|||||||
@ -11,7 +11,7 @@ public static class IdentityServerExtensions
|
|||||||
{
|
{
|
||||||
public static IServiceCollection AddIdentityServer(this IServiceCollection services, IWebHostEnvironment env)
|
public static IServiceCollection AddIdentityServer(this IServiceCollection services, IWebHostEnvironment env)
|
||||||
{
|
{
|
||||||
services.AddIdentity<ApplicationUser, IdentityRole<long>>(config =>
|
services.AddIdentity<User, Role>(config =>
|
||||||
{
|
{
|
||||||
config.Password.RequiredLength = 6;
|
config.Password.RequiredLength = 6;
|
||||||
config.Password.RequireDigit = false;
|
config.Password.RequireDigit = false;
|
||||||
@ -32,7 +32,7 @@ public static class IdentityServerExtensions
|
|||||||
.AddInMemoryApiResources(Config.ApiResources)
|
.AddInMemoryApiResources(Config.ApiResources)
|
||||||
.AddInMemoryApiScopes(Config.ApiScopes)
|
.AddInMemoryApiScopes(Config.ApiScopes)
|
||||||
.AddInMemoryClients(Config.Clients)
|
.AddInMemoryClients(Config.Clients)
|
||||||
.AddAspNetIdentity<ApplicationUser>()
|
.AddAspNetIdentity<User>()
|
||||||
.AddResourceOwnerValidator<UserValidator>();
|
.AddResourceOwnerValidator<UserValidator>();
|
||||||
|
|
||||||
if (env.IsDevelopment())
|
if (env.IsDevelopment())
|
||||||
|
|||||||
@ -16,7 +16,6 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Data\Configurations" />
|
|
||||||
<Folder Include="Data\Migrations" />
|
<Folder Include="Data\Migrations" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@ -15,9 +15,9 @@ namespace Identity.Identity.Features.RegisterNewUser.Commands.V1;
|
|||||||
public class RegisterNewUserCommandHandler : ICommandHandler<RegisterNewUserCommand, RegisterNewUserResponseDto>
|
public class RegisterNewUserCommandHandler : ICommandHandler<RegisterNewUserCommand, RegisterNewUserResponseDto>
|
||||||
{
|
{
|
||||||
private readonly IEventDispatcher _eventDispatcher;
|
private readonly IEventDispatcher _eventDispatcher;
|
||||||
private readonly UserManager<ApplicationUser> _userManager;
|
private readonly UserManager<User> _userManager;
|
||||||
|
|
||||||
public RegisterNewUserCommandHandler(UserManager<ApplicationUser> userManager,
|
public RegisterNewUserCommandHandler(UserManager<User> userManager,
|
||||||
IEventDispatcher eventDispatcher)
|
IEventDispatcher eventDispatcher)
|
||||||
{
|
{
|
||||||
_userManager = userManager;
|
_userManager = userManager;
|
||||||
@ -29,7 +29,7 @@ public class RegisterNewUserCommandHandler : ICommandHandler<RegisterNewUserComm
|
|||||||
{
|
{
|
||||||
Guard.Against.Null(command, nameof(command));
|
Guard.Against.Null(command, nameof(command));
|
||||||
|
|
||||||
var applicationUser = new ApplicationUser()
|
var applicationUser = new User()
|
||||||
{
|
{
|
||||||
FirstName = command.FirstName,
|
FirstName = command.FirstName,
|
||||||
LastName = command.LastName,
|
LastName = command.LastName,
|
||||||
|
|||||||
@ -0,0 +1,9 @@
|
|||||||
|
namespace Identity.Identity.Models;
|
||||||
|
|
||||||
|
using BuildingBlocks.Core.Model;
|
||||||
|
using Microsoft.AspNetCore.Identity;
|
||||||
|
|
||||||
|
public class Role: IdentityRole<long>, IVersion
|
||||||
|
{
|
||||||
|
public long Version { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
namespace Identity.Identity.Models;
|
||||||
|
|
||||||
|
using BuildingBlocks.Core.Model;
|
||||||
|
using Microsoft.AspNetCore.Identity;
|
||||||
|
|
||||||
|
public class RoleClaim: IdentityRoleClaim<long>, IVersion
|
||||||
|
{
|
||||||
|
public long Version { get; set; }
|
||||||
|
}
|
||||||
@ -2,9 +2,12 @@ using Microsoft.AspNetCore.Identity;
|
|||||||
|
|
||||||
namespace Identity.Identity.Models;
|
namespace Identity.Identity.Models;
|
||||||
|
|
||||||
public class ApplicationUser : IdentityUser<long>
|
using BuildingBlocks.Core.Model;
|
||||||
|
|
||||||
|
public class User : IdentityUser<long>, IVersion
|
||||||
{
|
{
|
||||||
public string FirstName { get; init; }
|
public string FirstName { get; init; }
|
||||||
public string LastName { get; init; }
|
public string LastName { get; init; }
|
||||||
public string PassPortNumber { get; init; }
|
public string PassPortNumber { get; init; }
|
||||||
|
public long Version { get; set; }
|
||||||
}
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
namespace Identity.Identity.Models;
|
||||||
|
|
||||||
|
using BuildingBlocks.Core.Model;
|
||||||
|
using Microsoft.AspNetCore.Identity;
|
||||||
|
|
||||||
|
public class UserClaim: IdentityUserClaim<long>, IVersion
|
||||||
|
{
|
||||||
|
public long Version { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
namespace Identity.Identity.Models;
|
||||||
|
|
||||||
|
using BuildingBlocks.Core.Model;
|
||||||
|
using Microsoft.AspNetCore.Identity;
|
||||||
|
|
||||||
|
public class UserLogin: IdentityUserLogin<long>, IVersion
|
||||||
|
{
|
||||||
|
public long Version { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
namespace Identity.Identity.Models;
|
||||||
|
|
||||||
|
using BuildingBlocks.Core.Model;
|
||||||
|
using Microsoft.AspNetCore.Identity;
|
||||||
|
|
||||||
|
public class UserRole: IdentityUserRole<long>, IVersion
|
||||||
|
{
|
||||||
|
public long Version { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
namespace Identity.Identity.Models;
|
||||||
|
|
||||||
|
using BuildingBlocks.Core.Model;
|
||||||
|
using Microsoft.AspNetCore.Identity;
|
||||||
|
|
||||||
|
public class UserToken: IdentityUserToken<long>, IVersion
|
||||||
|
{
|
||||||
|
public long Version { get; set; }
|
||||||
|
}
|
||||||
@ -9,11 +9,11 @@ namespace Identity;
|
|||||||
|
|
||||||
public class UserValidator : IResourceOwnerPasswordValidator
|
public class UserValidator : IResourceOwnerPasswordValidator
|
||||||
{
|
{
|
||||||
private readonly SignInManager<ApplicationUser> _signInManager;
|
private readonly SignInManager<User> _signInManager;
|
||||||
private readonly UserManager<ApplicationUser> _userManager;
|
private readonly UserManager<User> _userManager;
|
||||||
|
|
||||||
public UserValidator(SignInManager<ApplicationUser> signInManager,
|
public UserValidator(SignInManager<User> signInManager,
|
||||||
UserManager<ApplicationUser> userManager)
|
UserManager<User> userManager)
|
||||||
{
|
{
|
||||||
_signInManager = signInManager;
|
_signInManager = signInManager;
|
||||||
_userManager = userManager;
|
_userManager = userManager;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user