diff --git a/booking.rest b/booking.rest index 98391e3..b3e4d4e 100644 --- a/booking.rest +++ b/booking.rest @@ -247,7 +247,7 @@ Content-Type: application/json authorization: bearer {{Authenticate.response.body.access_token}} { - "passengerId": 7225627535474688, + "passengerId": 8765596234940416, "flightId": 1, "description": "I want to fly to iran" } diff --git a/src/BuildingBlocks/Core/Model/IAggregate.cs b/src/BuildingBlocks/Core/Model/IAggregate.cs index f5e125f..c79cc90 100644 --- a/src/BuildingBlocks/Core/Model/IAggregate.cs +++ b/src/BuildingBlocks/Core/Model/IAggregate.cs @@ -2,14 +2,18 @@ namespace BuildingBlocks.Core.Model; -public interface IAggregate : IAudit +public interface IAggregate : IAudit, IVersion { IReadOnlyList DomainEvents { get; } IEvent[] ClearDomainEvents(); - long Version { get; set; } } public interface IAggregate : IAggregate { T Id { get; } } + +public interface IVersion +{ + long Version { get; set; } +} diff --git a/src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230122153121_initial.Designer.cs b/src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230122204943_initial.Designer.cs similarity index 98% rename from src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230122153121_initial.Designer.cs rename to src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230122204943_initial.Designer.cs index 55c6a0a..c6730e2 100644 --- a/src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230122153121_initial.Designer.cs +++ b/src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230122204943_initial.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace BuildingBlocks.PersistMessageProcessor.Data.Migrations { [DbContext(typeof(PersistMessageDbContext))] - [Migration("20230122153121_initial")] + [Migration("20230122204943_initial")] partial class initial { /// diff --git a/src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230122153121_initial.cs b/src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230122204943_initial.cs similarity index 100% rename from src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230122153121_initial.cs rename to src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230122204943_initial.cs diff --git a/src/BuildingBlocks/PersistMessageProcessor/Data/PersistMessageDbContext.cs b/src/BuildingBlocks/PersistMessageProcessor/Data/PersistMessageDbContext.cs index b0ecdaa..73e1f2d 100644 --- a/src/BuildingBlocks/PersistMessageProcessor/Data/PersistMessageDbContext.cs +++ b/src/BuildingBlocks/PersistMessageProcessor/Data/PersistMessageDbContext.cs @@ -5,6 +5,7 @@ namespace BuildingBlocks.PersistMessageProcessor.Data; using System.Net; using Configurations; +using Core.Model; using global::Polly; using Microsoft.Extensions.Logging; @@ -57,7 +58,9 @@ public class PersistMessageDbContext : DbContext, IPersistMessageDbContext var databaseValues = await entry.GetDatabaseValuesAsync(cancellationToken); if (databaseValues != null) + { entry.OriginalValues.SetValues(databaseValues); + } } return await base.SaveChangesAsync(cancellationToken); @@ -68,7 +71,7 @@ public class PersistMessageDbContext : DbContext, IPersistMessageDbContext private void OnBeforeSaving() { - foreach (var entry in ChangeTracker.Entries()) + foreach (var entry in ChangeTracker.Entries()) { switch (entry.State) { diff --git a/src/BuildingBlocks/PersistMessageProcessor/PersistMessage.cs b/src/BuildingBlocks/PersistMessageProcessor/PersistMessage.cs index 7752658..bd25d4e 100644 --- a/src/BuildingBlocks/PersistMessageProcessor/PersistMessage.cs +++ b/src/BuildingBlocks/PersistMessageProcessor/PersistMessage.cs @@ -1,6 +1,8 @@ namespace BuildingBlocks.PersistMessageProcessor; -public class PersistMessage +using Core.Model; + +public class PersistMessage: IVersion { public PersistMessage(long id, string dataType, string data, MessageDeliveryType deliveryType) { diff --git a/src/BuildingBlocks/PersistMessageProcessor/PersistMessageProcessor.cs b/src/BuildingBlocks/PersistMessageProcessor/PersistMessageProcessor.cs index ccbe27c..f1815a6 100644 --- a/src/BuildingBlocks/PersistMessageProcessor/PersistMessageProcessor.cs +++ b/src/BuildingBlocks/PersistMessageProcessor/PersistMessageProcessor.cs @@ -54,7 +54,7 @@ public class PersistMessageProcessor : IPersistMessageProcessor public async Task> GetByFilterAsync(Expression> predicate, CancellationToken cancellationToken = default) { - return (await _persistMessageDbContext.PersistMessages.AsNoTracking().Where(predicate).ToListAsync(cancellationToken)) + return (await _persistMessageDbContext.PersistMessages.Where(predicate).ToListAsync(cancellationToken)) .AsReadOnly(); } @@ -110,7 +110,7 @@ public class PersistMessageProcessor : IPersistMessageProcessor public async Task ProcessAllAsync(CancellationToken cancellationToken = default) { - var messages = await _persistMessageDbContext.PersistMessages.AsNoTracking() + var messages = await _persistMessageDbContext.PersistMessages .Where(x => x.MessageStatus != MessageStatus.Processed) .ToListAsync(cancellationToken); diff --git a/src/BuildingBlocks/Polly/GrpcCircuitBreaker.cs b/src/BuildingBlocks/Polly/GrpcCircuitBreaker.cs index dd2e375..ea8941c 100644 --- a/src/BuildingBlocks/Polly/GrpcCircuitBreaker.cs +++ b/src/BuildingBlocks/Polly/GrpcCircuitBreaker.cs @@ -14,7 +14,7 @@ public static class GrpcCircuitBreaker //ref: https://anthonygiretti.com/2020/03/31/grpc-asp-net-core-3-1-resiliency-with-polly/ public static IHttpClientBuilder AddGrpcCircuitBreakerPolicyHandler(this IHttpClientBuilder httpClientBuilder) { - return httpClientBuilder.AddPolicyHandler((sp, _) => + return httpClientBuilder.AddPolicyHandler((sp, _) => { var options = sp.GetRequiredService().GetOptions(nameof(PolicyOptions)); @@ -23,28 +23,7 @@ public static class GrpcCircuitBreaker var loggerFactory = sp.GetRequiredService(); var logger = loggerFactory.CreateLogger("PollyGrpcCircuitBreakerPoliciesLogger"); - // gRPC status - 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(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) - }) + return Policy.HandleResult(r => !r.IsSuccessStatusCode) .CircuitBreakerAsync( handledEventsAllowedBeforeBreaking: options.CircuitBreaker.RetryCount, 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; - } - } } diff --git a/src/BuildingBlocks/Polly/GrpcRetry.cs b/src/BuildingBlocks/Polly/GrpcRetry.cs index a273830..3c84cbf 100644 --- a/src/BuildingBlocks/Polly/GrpcRetry.cs +++ b/src/BuildingBlocks/Polly/GrpcRetry.cs @@ -20,37 +20,17 @@ public static class GrpcRetry Guard.Against.Null(options, nameof(options)); - var loggerFactory = sp.GetRequiredService(); - var logger = loggerFactory.CreateLogger("PollyGrpcRetryPoliciesLogger"); - - // gRPC status - 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(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), + return Policy + .HandleResult(r => !r.IsSuccessStatusCode) + .WaitAndRetryAsync(options.Retry.RetryCount, + retryAttempt => TimeSpan.FromSeconds(options.Retry.SleepDuration), onRetry: (response, timeSpan, retryCount, context) => { if (response?.Exception != null) { + var loggerFactory = sp.GetRequiredService(); + var logger = loggerFactory.CreateLogger("PollyGrpcRetryPoliciesLogger"); + logger.LogError(response.Exception, "Request failed with {StatusCode}. Waiting {TimeSpan} before next retry. Retry attempt {RetryCount}.", 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; - } - } } diff --git a/src/Services/Booking/src/Booking.Api/appsettings.json b/src/Services/Booking/src/Booking.Api/appsettings.json index 9796ad1..2792c24 100644 --- a/src/Services/Booking/src/Booking.Api/appsettings.json +++ b/src/Services/Booking/src/Booking.Api/appsettings.json @@ -36,7 +36,7 @@ "FlightAddress": "https://localhost:5003", "PassengerAddress": "https://localhost:5012" }, - "RetryOptions": { + "PolicyOptions": { "Retry": { "RetryCount": 3, "SleepDuration": 1 diff --git a/src/Services/Booking/src/Booking/Booking/Features/CreateBooking/Commands/V1/CreateBookingCommandHandler.cs b/src/Services/Booking/src/Booking/Booking/Features/CreateBooking/Commands/V1/CreateBookingCommandHandler.cs index 05c1ca9..87453e9 100644 --- a/src/Services/Booking/src/Booking/Booking/Features/CreateBooking/Commands/V1/CreateBookingCommandHandler.cs +++ b/src/Services/Booking/src/Booking/Booking/Features/CreateBooking/Commands/V1/CreateBookingCommandHandler.cs @@ -62,7 +62,7 @@ public class CreateBookingCommandHandler : ICommandHandler(env); app.UseCustomHealthCheck(); app.MapMetrics(); app.MapGet("/", x => x.Response.WriteAsync(appOptions.Name)); diff --git a/src/Services/Identity/src/Identity/Data/Configurations/RoleClaimConfiguration.cs b/src/Services/Identity/src/Identity/Data/Configurations/RoleClaimConfiguration.cs new file mode 100644 index 0000000..d9e285e --- /dev/null +++ b/src/Services/Identity/src/Identity/Data/Configurations/RoleClaimConfiguration.cs @@ -0,0 +1,16 @@ +namespace Identity.Data.Configurations; + +using Identity.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +public class RoleClaimConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder 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(); + } +} diff --git a/src/Services/Identity/src/Identity/Data/Configurations/RoleConfiguration.cs b/src/Services/Identity/src/Identity/Data/Configurations/RoleConfiguration.cs new file mode 100644 index 0000000..a52b7d0 --- /dev/null +++ b/src/Services/Identity/src/Identity/Data/Configurations/RoleConfiguration.cs @@ -0,0 +1,16 @@ +namespace Identity.Data.Configurations; + +using Identity.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +public class RoleConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder 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(); + } +} diff --git a/src/Services/Identity/src/Identity/Data/Configurations/UserClaimConfiguration.cs b/src/Services/Identity/src/Identity/Data/Configurations/UserClaimConfiguration.cs new file mode 100644 index 0000000..dee679c --- /dev/null +++ b/src/Services/Identity/src/Identity/Data/Configurations/UserClaimConfiguration.cs @@ -0,0 +1,16 @@ +namespace Identity.Data.Configurations; + +using Identity.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +public class UserClaimConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder 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(); + } +} diff --git a/src/Services/Identity/src/Identity/Data/Configurations/UserConfiguration.cs b/src/Services/Identity/src/Identity/Data/Configurations/UserConfiguration.cs new file mode 100644 index 0000000..71169b0 --- /dev/null +++ b/src/Services/Identity/src/Identity/Data/Configurations/UserConfiguration.cs @@ -0,0 +1,16 @@ +namespace Identity.Data.Configurations; + +using Identity.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +public class UserConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder 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(); + } +} diff --git a/src/Services/Identity/src/Identity/Data/Configurations/UserLoginConfiguration.cs b/src/Services/Identity/src/Identity/Data/Configurations/UserLoginConfiguration.cs new file mode 100644 index 0000000..d5966d5 --- /dev/null +++ b/src/Services/Identity/src/Identity/Data/Configurations/UserLoginConfiguration.cs @@ -0,0 +1,17 @@ +namespace Identity.Data.Configurations; + +using Identity.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +public class UserLoginConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder 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(); + } +} + diff --git a/src/Services/Identity/src/Identity/Data/Configurations/UserRoleConfiguration.cs b/src/Services/Identity/src/Identity/Data/Configurations/UserRoleConfiguration.cs new file mode 100644 index 0000000..3f8ca2e --- /dev/null +++ b/src/Services/Identity/src/Identity/Data/Configurations/UserRoleConfiguration.cs @@ -0,0 +1,16 @@ +namespace Identity.Data.Configurations; + +using Identity.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +public class UserRoleConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder 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(); + } +} diff --git a/src/Services/Identity/src/Identity/Data/Configurations/UserTokenConfiguration.cs b/src/Services/Identity/src/Identity/Data/Configurations/UserTokenConfiguration.cs new file mode 100644 index 0000000..a0a8b14 --- /dev/null +++ b/src/Services/Identity/src/Identity/Data/Configurations/UserTokenConfiguration.cs @@ -0,0 +1,16 @@ +namespace Identity.Data.Configurations; + +using Identity.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +public class UserTokenConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder 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(); + } +} diff --git a/src/Services/Identity/src/Identity/Data/IdentityContext.cs b/src/Services/Identity/src/Identity/Data/IdentityContext.cs index 589e9c4..f819f9a 100644 --- a/src/Services/Identity/src/Identity/Data/IdentityContext.cs +++ b/src/Services/Identity/src/Identity/Data/IdentityContext.cs @@ -8,20 +8,16 @@ using System.Threading.Tasks; using BuildingBlocks.Core.Event; using BuildingBlocks.Core.Model; using BuildingBlocks.EFCore; -using Humanizer; using Identity.Identity.Models; using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage; namespace Identity.Data; -public sealed class IdentityContext : IdentityDbContext, long, - IdentityUserClaim, - IdentityUserRole, IdentityUserLogin, IdentityRoleClaim, IdentityUserToken>, IDbContext +public sealed class IdentityContext : IdentityDbContext, IDbContext { private IDbContextTransaction _currentTransaction; @@ -38,6 +34,12 @@ public sealed class IdentityContext : IdentityDbContext SaveChangesAsync(CancellationToken cancellationToken = default) + { + OnBeforeSaving(); + return await base.SaveChangesAsync(cancellationToken); + } + public async Task BeginTransactionAsync(CancellationToken cancellationToken = default) { if (_currentTransaction != null) @@ -96,4 +98,21 @@ public sealed class IdentityContext : IdentityDbContext()) + { + switch (entry.State) + { + case EntityState.Modified: + entry.Entity.Version++; + break; + + case EntityState.Deleted: + entry.Entity.Version++; + break; + } + } + } } diff --git a/src/Services/Identity/src/Identity/Data/Migrations/20230113183552_initial.Designer.cs b/src/Services/Identity/src/Identity/Data/Migrations/20230122204905_initial.Designer.cs similarity index 82% rename from src/Services/Identity/src/Identity/Data/Migrations/20230113183552_initial.Designer.cs rename to src/Services/Identity/src/Identity/Data/Migrations/20230122204905_initial.Designer.cs index 26102ae..b61807d 100644 --- a/src/Services/Identity/src/Identity/Data/Migrations/20230113183552_initial.Designer.cs +++ b/src/Services/Identity/src/Identity/Data/Migrations/20230122204905_initial.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Identity.Data.Migrations { [DbContext(typeof(IdentityContext))] - [Migration("20230113183552_initial")] + [Migration("20230122204905_initial")] partial class initial { /// @@ -25,7 +25,81 @@ namespace Identity.Data.Migrations NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - modelBuilder.Entity("Identity.Identity.Models.ApplicationUser", b => + modelBuilder.Entity("Identity.Identity.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text") + .HasColumnName("concurrency_stamp"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("name"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("normalized_name"); + + b.Property("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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text") + .HasColumnName("claim_type"); + + b.Property("ClaimValue") + .HasColumnType("text") + .HasColumnName("claim_value"); + + b.Property("RoleId") + .HasColumnType("bigint") + .HasColumnName("role_id"); + + b.Property("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("Id") .ValueGeneratedOnAdd() @@ -107,6 +181,11 @@ namespace Identity.Data.Migrations .HasColumnType("character varying(256)") .HasColumnName("user_name"); + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("bigint") + .HasColumnName("version"); + b.HasKey("Id") .HasName("pk_asp_net_users"); @@ -120,71 +199,7 @@ namespace Identity.Data.Migrations b.ToTable("asp_net_users", (string)null); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text") - .HasColumnName("concurrency_stamp"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)") - .HasColumnName("name"); - - b.Property("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", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("text") - .HasColumnName("claim_type"); - - b.Property("ClaimValue") - .HasColumnType("text") - .HasColumnName("claim_value"); - - b.Property("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", b => + modelBuilder.Entity("Identity.Identity.Models.UserClaim", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -205,6 +220,11 @@ namespace Identity.Data.Migrations .HasColumnType("bigint") .HasColumnName("user_id"); + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("bigint") + .HasColumnName("version"); + b.HasKey("Id") .HasName("pk_asp_net_user_claims"); @@ -214,7 +234,7 @@ namespace Identity.Data.Migrations b.ToTable("asp_net_user_claims", (string)null); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + modelBuilder.Entity("Identity.Identity.Models.UserLogin", b => { b.Property("LoginProvider") .HasColumnType("text") @@ -232,6 +252,11 @@ namespace Identity.Data.Migrations .HasColumnType("bigint") .HasColumnName("user_id"); + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("bigint") + .HasColumnName("version"); + b.HasKey("LoginProvider", "ProviderKey") .HasName("pk_asp_net_user_logins"); @@ -241,7 +266,7 @@ namespace Identity.Data.Migrations b.ToTable("asp_net_user_logins", (string)null); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + modelBuilder.Entity("Identity.Identity.Models.UserRole", b => { b.Property("UserId") .HasColumnType("bigint") @@ -251,6 +276,11 @@ namespace Identity.Data.Migrations .HasColumnType("bigint") .HasColumnName("role_id"); + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("bigint") + .HasColumnName("version"); + b.HasKey("UserId", "RoleId") .HasName("pk_asp_net_user_roles"); @@ -260,7 +290,7 @@ namespace Identity.Data.Migrations b.ToTable("asp_net_user_roles", (string)null); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + modelBuilder.Entity("Identity.Identity.Models.UserToken", b => { b.Property("UserId") .HasColumnType("bigint") @@ -278,15 +308,20 @@ namespace Identity.Data.Migrations .HasColumnType("text") .HasColumnName("value"); + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("bigint") + .HasColumnName("version"); + b.HasKey("UserId", "LoginProvider", "Name") .HasName("pk_asp_net_user_tokens"); b.ToTable("asp_net_user_tokens", (string)null); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + modelBuilder.Entity("Identity.Identity.Models.RoleClaim", b => { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + b.HasOne("Identity.Identity.Models.Role", null) .WithMany() .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade) @@ -294,9 +329,9 @@ namespace Identity.Data.Migrations .HasConstraintName("fk_asp_net_role_claims_asp_net_roles_role_id"); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + modelBuilder.Entity("Identity.Identity.Models.UserClaim", b => { - b.HasOne("Identity.Identity.Models.ApplicationUser", null) + b.HasOne("Identity.Identity.Models.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) @@ -304,9 +339,9 @@ namespace Identity.Data.Migrations .HasConstraintName("fk_asp_net_user_claims_asp_net_users_user_id"); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + modelBuilder.Entity("Identity.Identity.Models.UserLogin", b => { - b.HasOne("Identity.Identity.Models.ApplicationUser", null) + b.HasOne("Identity.Identity.Models.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) @@ -314,16 +349,16 @@ namespace Identity.Data.Migrations .HasConstraintName("fk_asp_net_user_logins_asp_net_users_user_id"); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + modelBuilder.Entity("Identity.Identity.Models.UserRole", b => { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + b.HasOne("Identity.Identity.Models.Role", null) .WithMany() .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .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() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) @@ -331,9 +366,9 @@ namespace Identity.Data.Migrations .HasConstraintName("fk_asp_net_user_roles_asp_net_users_user_id"); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + modelBuilder.Entity("Identity.Identity.Models.UserToken", b => { - b.HasOne("Identity.Identity.Models.ApplicationUser", null) + b.HasOne("Identity.Identity.Models.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) diff --git a/src/Services/Identity/src/Identity/Data/Migrations/20230113183552_initial.cs b/src/Services/Identity/src/Identity/Data/Migrations/20230122204905_initial.cs similarity index 94% rename from src/Services/Identity/src/Identity/Data/Migrations/20230113183552_initial.cs rename to src/Services/Identity/src/Identity/Data/Migrations/20230122204905_initial.cs index 2fdc821..be11c3a 100644 --- a/src/Services/Identity/src/Identity/Data/Migrations/20230113183552_initial.cs +++ b/src/Services/Identity/src/Identity/Data/Migrations/20230122204905_initial.cs @@ -18,6 +18,7 @@ namespace Identity.Data.Migrations { id = table.Column(type: "bigint", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + version = table.Column(type: "bigint", nullable: false), name = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), normalizedname = table.Column(name: "normalized_name", type: "character varying(256)", maxLength: 256, nullable: true), concurrencystamp = table.Column(name: "concurrency_stamp", type: "text", nullable: true) @@ -36,6 +37,7 @@ namespace Identity.Data.Migrations firstname = table.Column(name: "first_name", type: "text", nullable: true), lastname = table.Column(name: "last_name", type: "text", nullable: true), passportnumber = table.Column(name: "pass_port_number", type: "text", nullable: true), + version = table.Column(type: "bigint", nullable: false), username = table.Column(name: "user_name", type: "character varying(256)", maxLength: 256, nullable: true), normalizedusername = table.Column(name: "normalized_user_name", type: "character varying(256)", maxLength: 256, nullable: true), email = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), @@ -62,6 +64,7 @@ namespace Identity.Data.Migrations { id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + version = table.Column(type: "bigint", nullable: false), roleid = table.Column(name: "role_id", type: "bigint", nullable: false), claimtype = table.Column(name: "claim_type", type: "text", nullable: true), claimvalue = table.Column(name: "claim_value", type: "text", nullable: true) @@ -83,6 +86,7 @@ namespace Identity.Data.Migrations { id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + version = table.Column(type: "bigint", nullable: false), userid = table.Column(name: "user_id", type: "bigint", nullable: false), claimtype = table.Column(name: "claim_type", type: "text", nullable: true), claimvalue = table.Column(name: "claim_value", type: "text", nullable: true) @@ -104,6 +108,7 @@ namespace Identity.Data.Migrations { loginprovider = table.Column(name: "login_provider", type: "text", nullable: false), providerkey = table.Column(name: "provider_key", type: "text", nullable: false), + version = table.Column(type: "bigint", nullable: false), providerdisplayname = table.Column(name: "provider_display_name", type: "text", nullable: true), userid = table.Column(name: "user_id", type: "bigint", nullable: false) }, @@ -123,7 +128,8 @@ namespace Identity.Data.Migrations columns: table => new { userid = table.Column(name: "user_id", type: "bigint", nullable: false), - roleid = table.Column(name: "role_id", type: "bigint", nullable: false) + roleid = table.Column(name: "role_id", type: "bigint", nullable: false), + version = table.Column(type: "bigint", nullable: false) }, constraints: table => { @@ -149,6 +155,7 @@ namespace Identity.Data.Migrations userid = table.Column(name: "user_id", type: "bigint", nullable: false), loginprovider = table.Column(name: "login_provider", type: "text", nullable: false), name = table.Column(type: "text", nullable: false), + version = table.Column(type: "bigint", nullable: false), value = table.Column(type: "text", nullable: true) }, constraints: table => diff --git a/src/Services/Identity/src/Identity/Data/Migrations/IdentityContextModelSnapshot.cs b/src/Services/Identity/src/Identity/Data/Migrations/IdentityContextModelSnapshot.cs index d069e54..8d2b002 100644 --- a/src/Services/Identity/src/Identity/Data/Migrations/IdentityContextModelSnapshot.cs +++ b/src/Services/Identity/src/Identity/Data/Migrations/IdentityContextModelSnapshot.cs @@ -22,7 +22,81 @@ namespace Identity.Data.Migrations NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - modelBuilder.Entity("Identity.Identity.Models.ApplicationUser", b => + modelBuilder.Entity("Identity.Identity.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text") + .HasColumnName("concurrency_stamp"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("name"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("normalized_name"); + + b.Property("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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text") + .HasColumnName("claim_type"); + + b.Property("ClaimValue") + .HasColumnType("text") + .HasColumnName("claim_value"); + + b.Property("RoleId") + .HasColumnType("bigint") + .HasColumnName("role_id"); + + b.Property("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("Id") .ValueGeneratedOnAdd() @@ -104,6 +178,11 @@ namespace Identity.Data.Migrations .HasColumnType("character varying(256)") .HasColumnName("user_name"); + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("bigint") + .HasColumnName("version"); + b.HasKey("Id") .HasName("pk_asp_net_users"); @@ -117,71 +196,7 @@ namespace Identity.Data.Migrations b.ToTable("asp_net_users", (string)null); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text") - .HasColumnName("concurrency_stamp"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)") - .HasColumnName("name"); - - b.Property("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", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("text") - .HasColumnName("claim_type"); - - b.Property("ClaimValue") - .HasColumnType("text") - .HasColumnName("claim_value"); - - b.Property("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", b => + modelBuilder.Entity("Identity.Identity.Models.UserClaim", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -202,6 +217,11 @@ namespace Identity.Data.Migrations .HasColumnType("bigint") .HasColumnName("user_id"); + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("bigint") + .HasColumnName("version"); + b.HasKey("Id") .HasName("pk_asp_net_user_claims"); @@ -211,7 +231,7 @@ namespace Identity.Data.Migrations b.ToTable("asp_net_user_claims", (string)null); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + modelBuilder.Entity("Identity.Identity.Models.UserLogin", b => { b.Property("LoginProvider") .HasColumnType("text") @@ -229,6 +249,11 @@ namespace Identity.Data.Migrations .HasColumnType("bigint") .HasColumnName("user_id"); + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("bigint") + .HasColumnName("version"); + b.HasKey("LoginProvider", "ProviderKey") .HasName("pk_asp_net_user_logins"); @@ -238,7 +263,7 @@ namespace Identity.Data.Migrations b.ToTable("asp_net_user_logins", (string)null); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + modelBuilder.Entity("Identity.Identity.Models.UserRole", b => { b.Property("UserId") .HasColumnType("bigint") @@ -248,6 +273,11 @@ namespace Identity.Data.Migrations .HasColumnType("bigint") .HasColumnName("role_id"); + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("bigint") + .HasColumnName("version"); + b.HasKey("UserId", "RoleId") .HasName("pk_asp_net_user_roles"); @@ -257,7 +287,7 @@ namespace Identity.Data.Migrations b.ToTable("asp_net_user_roles", (string)null); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + modelBuilder.Entity("Identity.Identity.Models.UserToken", b => { b.Property("UserId") .HasColumnType("bigint") @@ -275,15 +305,20 @@ namespace Identity.Data.Migrations .HasColumnType("text") .HasColumnName("value"); + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("bigint") + .HasColumnName("version"); + b.HasKey("UserId", "LoginProvider", "Name") .HasName("pk_asp_net_user_tokens"); b.ToTable("asp_net_user_tokens", (string)null); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + modelBuilder.Entity("Identity.Identity.Models.RoleClaim", b => { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + b.HasOne("Identity.Identity.Models.Role", null) .WithMany() .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade) @@ -291,9 +326,9 @@ namespace Identity.Data.Migrations .HasConstraintName("fk_asp_net_role_claims_asp_net_roles_role_id"); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + modelBuilder.Entity("Identity.Identity.Models.UserClaim", b => { - b.HasOne("Identity.Identity.Models.ApplicationUser", null) + b.HasOne("Identity.Identity.Models.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) @@ -301,9 +336,9 @@ namespace Identity.Data.Migrations .HasConstraintName("fk_asp_net_user_claims_asp_net_users_user_id"); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + modelBuilder.Entity("Identity.Identity.Models.UserLogin", b => { - b.HasOne("Identity.Identity.Models.ApplicationUser", null) + b.HasOne("Identity.Identity.Models.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) @@ -311,16 +346,16 @@ namespace Identity.Data.Migrations .HasConstraintName("fk_asp_net_user_logins_asp_net_users_user_id"); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + modelBuilder.Entity("Identity.Identity.Models.UserRole", b => { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + b.HasOne("Identity.Identity.Models.Role", null) .WithMany() .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() .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() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) @@ -328,9 +363,9 @@ namespace Identity.Data.Migrations .HasConstraintName("fk_asp_net_user_roles_asp_net_users_user_id"); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + modelBuilder.Entity("Identity.Identity.Models.UserToken", b => { - b.HasOne("Identity.Identity.Models.ApplicationUser", null) + b.HasOne("Identity.Identity.Models.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) diff --git a/src/Services/Identity/src/Identity/Data/Seed/IdentityDataSeeder.cs b/src/Services/Identity/src/Identity/Data/Seed/IdentityDataSeeder.cs index 293641c..a953735 100644 --- a/src/Services/Identity/src/Identity/Data/Seed/IdentityDataSeeder.cs +++ b/src/Services/Identity/src/Identity/Data/Seed/IdentityDataSeeder.cs @@ -11,12 +11,12 @@ namespace Identity.Data.Seed; public class IdentityDataSeeder : IDataSeeder { - private readonly RoleManager> _roleManager; + private readonly UserManager _userManager; + private readonly RoleManager _roleManager; private readonly IEventDispatcher _eventDispatcher; - private readonly UserManager _userManager; - public IdentityDataSeeder(UserManager userManager, - RoleManager> roleManager, + public IdentityDataSeeder(UserManager userManager, + RoleManager roleManager, IEventDispatcher eventDispatcher) { _userManager = userManager; @@ -33,17 +33,17 @@ public class IdentityDataSeeder : IDataSeeder private async Task SeedRoles() { 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) - await _roleManager.CreateAsync(new(Constants.Role.User)); + await _roleManager.CreateAsync(new Role {Name = Constants.Role.User}); } private async Task SeedUsers() { if (await _userManager.FindByNameAsync("samh") == null) { - var user = new ApplicationUser + var user = new User { FirstName = "Sam", LastName = "H", @@ -65,7 +65,7 @@ public class IdentityDataSeeder : IDataSeeder if (await _userManager.FindByNameAsync("meysamh2") == null) { - var user = new ApplicationUser + var user = new User { FirstName = "Sam2", LastName = "H2", diff --git a/src/Services/Identity/src/Identity/Extensions/Infrastructure/IdentityServerExtensions.cs b/src/Services/Identity/src/Identity/Extensions/Infrastructure/IdentityServerExtensions.cs index dee8487..c22ab9e 100644 --- a/src/Services/Identity/src/Identity/Extensions/Infrastructure/IdentityServerExtensions.cs +++ b/src/Services/Identity/src/Identity/Extensions/Infrastructure/IdentityServerExtensions.cs @@ -11,7 +11,7 @@ public static class IdentityServerExtensions { public static IServiceCollection AddIdentityServer(this IServiceCollection services, IWebHostEnvironment env) { - services.AddIdentity>(config => + services.AddIdentity(config => { config.Password.RequiredLength = 6; config.Password.RequireDigit = false; @@ -32,7 +32,7 @@ public static class IdentityServerExtensions .AddInMemoryApiResources(Config.ApiResources) .AddInMemoryApiScopes(Config.ApiScopes) .AddInMemoryClients(Config.Clients) - .AddAspNetIdentity() + .AddAspNetIdentity() .AddResourceOwnerValidator(); if (env.IsDevelopment()) diff --git a/src/Services/Identity/src/Identity/Identity.csproj b/src/Services/Identity/src/Identity/Identity.csproj index a5f9f70..57491c9 100644 --- a/src/Services/Identity/src/Identity/Identity.csproj +++ b/src/Services/Identity/src/Identity/Identity.csproj @@ -16,7 +16,6 @@ - diff --git a/src/Services/Identity/src/Identity/Identity/Features/RegisterNewUser/Commands/V1/RegisterNewUserCommandHandler.cs b/src/Services/Identity/src/Identity/Identity/Features/RegisterNewUser/Commands/V1/RegisterNewUserCommandHandler.cs index 6546da5..ff585fa 100644 --- a/src/Services/Identity/src/Identity/Identity/Features/RegisterNewUser/Commands/V1/RegisterNewUserCommandHandler.cs +++ b/src/Services/Identity/src/Identity/Identity/Features/RegisterNewUser/Commands/V1/RegisterNewUserCommandHandler.cs @@ -15,9 +15,9 @@ namespace Identity.Identity.Features.RegisterNewUser.Commands.V1; public class RegisterNewUserCommandHandler : ICommandHandler { private readonly IEventDispatcher _eventDispatcher; - private readonly UserManager _userManager; + private readonly UserManager _userManager; - public RegisterNewUserCommandHandler(UserManager userManager, + public RegisterNewUserCommandHandler(UserManager userManager, IEventDispatcher eventDispatcher) { _userManager = userManager; @@ -29,7 +29,7 @@ public class RegisterNewUserCommandHandler : ICommandHandler, IVersion +{ + public long Version { get; set; } +} diff --git a/src/Services/Identity/src/Identity/Identity/Models/RoleClaim.cs b/src/Services/Identity/src/Identity/Identity/Models/RoleClaim.cs new file mode 100644 index 0000000..0ad6972 --- /dev/null +++ b/src/Services/Identity/src/Identity/Identity/Models/RoleClaim.cs @@ -0,0 +1,9 @@ +namespace Identity.Identity.Models; + +using BuildingBlocks.Core.Model; +using Microsoft.AspNetCore.Identity; + +public class RoleClaim: IdentityRoleClaim, IVersion +{ + public long Version { get; set; } +} diff --git a/src/Services/Identity/src/Identity/Identity/Models/ApplicationUser.cs b/src/Services/Identity/src/Identity/Identity/Models/User.cs similarity index 63% rename from src/Services/Identity/src/Identity/Identity/Models/ApplicationUser.cs rename to src/Services/Identity/src/Identity/Identity/Models/User.cs index 29bc6dd..bfc999f 100644 --- a/src/Services/Identity/src/Identity/Identity/Models/ApplicationUser.cs +++ b/src/Services/Identity/src/Identity/Identity/Models/User.cs @@ -2,9 +2,12 @@ using Microsoft.AspNetCore.Identity; namespace Identity.Identity.Models; -public class ApplicationUser : IdentityUser +using BuildingBlocks.Core.Model; + +public class User : IdentityUser, IVersion { public string FirstName { get; init; } public string LastName { get; init; } public string PassPortNumber { get; init; } + public long Version { get; set; } } diff --git a/src/Services/Identity/src/Identity/Identity/Models/UserClaim.cs b/src/Services/Identity/src/Identity/Identity/Models/UserClaim.cs new file mode 100644 index 0000000..2e1fa22 --- /dev/null +++ b/src/Services/Identity/src/Identity/Identity/Models/UserClaim.cs @@ -0,0 +1,9 @@ +namespace Identity.Identity.Models; + +using BuildingBlocks.Core.Model; +using Microsoft.AspNetCore.Identity; + +public class UserClaim: IdentityUserClaim, IVersion +{ + public long Version { get; set; } +} diff --git a/src/Services/Identity/src/Identity/Identity/Models/UserLogin.cs b/src/Services/Identity/src/Identity/Identity/Models/UserLogin.cs new file mode 100644 index 0000000..ffe9e42 --- /dev/null +++ b/src/Services/Identity/src/Identity/Identity/Models/UserLogin.cs @@ -0,0 +1,9 @@ +namespace Identity.Identity.Models; + +using BuildingBlocks.Core.Model; +using Microsoft.AspNetCore.Identity; + +public class UserLogin: IdentityUserLogin, IVersion +{ + public long Version { get; set; } +} diff --git a/src/Services/Identity/src/Identity/Identity/Models/UserRole.cs b/src/Services/Identity/src/Identity/Identity/Models/UserRole.cs new file mode 100644 index 0000000..403a1e4 --- /dev/null +++ b/src/Services/Identity/src/Identity/Identity/Models/UserRole.cs @@ -0,0 +1,9 @@ +namespace Identity.Identity.Models; + +using BuildingBlocks.Core.Model; +using Microsoft.AspNetCore.Identity; + +public class UserRole: IdentityUserRole, IVersion +{ + public long Version { get; set; } +} diff --git a/src/Services/Identity/src/Identity/Identity/Models/UserToken.cs b/src/Services/Identity/src/Identity/Identity/Models/UserToken.cs new file mode 100644 index 0000000..8b3a8c6 --- /dev/null +++ b/src/Services/Identity/src/Identity/Identity/Models/UserToken.cs @@ -0,0 +1,9 @@ +namespace Identity.Identity.Models; + +using BuildingBlocks.Core.Model; +using Microsoft.AspNetCore.Identity; + +public class UserToken: IdentityUserToken, IVersion +{ + public long Version { get; set; } +} diff --git a/src/Services/Identity/src/Identity/UserValidator.cs b/src/Services/Identity/src/Identity/UserValidator.cs index 37b1132..6168c9a 100644 --- a/src/Services/Identity/src/Identity/UserValidator.cs +++ b/src/Services/Identity/src/Identity/UserValidator.cs @@ -9,11 +9,11 @@ namespace Identity; public class UserValidator : IResourceOwnerPasswordValidator { - private readonly SignInManager _signInManager; - private readonly UserManager _userManager; + private readonly SignInManager _signInManager; + private readonly UserManager _userManager; - public UserValidator(SignInManager signInManager, - UserManager userManager) + public UserValidator(SignInManager signInManager, + UserManager userManager) { _signInManager = signInManager; _userManager = userManager;