diff --git a/backend/create-sql-scripts.sh b/backend/create-sql-scripts.sh index 4c0e3ee..a08bbeb 100644 --- a/backend/create-sql-scripts.sh +++ b/backend/create-sql-scripts.sh @@ -3,7 +3,7 @@ dotnet ef migrations script \ --startup-project src/Web/Web.csproj \ --project src/Web/Web.csproj \ - --context Hutopy.Web.Features.Users.Data.IdentityDbContext \ + --context Hutopy.Web.Features.Users.Data.ApplicationDbContext \ --configuration Debug \ --output create-identity-db.sql \ --idempotent \ diff --git a/backend/src/Web/DependencyInjection.cs b/backend/src/Web/DependencyInjection.cs index a6490d8..cdc4275 100644 --- a/backend/src/Web/DependencyInjection.cs +++ b/backend/src/Web/DependencyInjection.cs @@ -19,7 +19,7 @@ public static class DependencyInjection services.AddHttpContextAccessor(); services.AddHealthChecks() - .AddDbContextCheck(); + .AddDbContextCheck(); services.AddRazorPages(); diff --git a/backend/src/Web/Features/Users/Data/IdentityDbContext.cs b/backend/src/Web/Features/Users/Data/ApplicationDbContext.cs similarity index 83% rename from backend/src/Web/Features/Users/Data/IdentityDbContext.cs rename to backend/src/Web/Features/Users/Data/ApplicationDbContext.cs index c7a5d42..0e8d0c1 100644 --- a/backend/src/Web/Features/Users/Data/IdentityDbContext.cs +++ b/backend/src/Web/Features/Users/Data/ApplicationDbContext.cs @@ -2,8 +2,8 @@ namespace Hutopy.Web.Features.Users.Data { - public class IdentityDbContext( - DbContextOptions options) + public class ApplicationDbContext( + DbContextOptions options) : IdentityDbContext(options) { public const string SchemaName = "Identity"; diff --git a/backend/src/Web/Features/Users/Data/IdentityDbContextInitializer.cs b/backend/src/Web/Features/Users/Data/ApplicationDbContextInitializer.cs similarity index 89% rename from backend/src/Web/Features/Users/Data/IdentityDbContextInitializer.cs rename to backend/src/Web/Features/Users/Data/ApplicationDbContextInitializer.cs index 5be1dcf..a93926b 100644 --- a/backend/src/Web/Features/Users/Data/IdentityDbContextInitializer.cs +++ b/backend/src/Web/Features/Users/Data/ApplicationDbContextInitializer.cs @@ -8,7 +8,7 @@ public static class InitializerExtensions { using var scope = app.Services.CreateScope(); - var initializer = scope.ServiceProvider.GetRequiredService(); + var initializer = scope.ServiceProvider.GetRequiredService(); await initializer.InitialiseAsync(); @@ -16,9 +16,9 @@ public static class InitializerExtensions } } -public class IdentityDbContextInitializer( - ILogger logger, - IdentityDbContext context, +public class ApplicationDbContextInitializer( + ILogger logger, + ApplicationDbContext context, RoleManager roleManager) { public async Task InitialiseAsync() diff --git a/backend/src/Web/Features/Users/Data/Migrations/20241020183421_Initial.Designer.cs b/backend/src/Web/Features/Users/Data/Migrations/20241020183421_Initial.Designer.cs index 1770d40..31f6784 100644 --- a/backend/src/Web/Features/Users/Data/Migrations/20241020183421_Initial.Designer.cs +++ b/backend/src/Web/Features/Users/Data/Migrations/20241020183421_Initial.Designer.cs @@ -11,7 +11,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Hutopy.Web.Features.Users.Data.Migrations { - [DbContext(typeof(IdentityDbContext))] + [DbContext(typeof(ApplicationDbContext))] [Migration("20241020183421_Initial")] partial class Initial { diff --git a/backend/src/Web/Features/Users/Data/Migrations/20250217034117_Add_FacebookId.Designer.cs b/backend/src/Web/Features/Users/Data/Migrations/20250217034117_Add_FacebookId.Designer.cs index 574c2dc..4ac6cd4 100644 --- a/backend/src/Web/Features/Users/Data/Migrations/20250217034117_Add_FacebookId.Designer.cs +++ b/backend/src/Web/Features/Users/Data/Migrations/20250217034117_Add_FacebookId.Designer.cs @@ -11,7 +11,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Hutopy.Web.Features.Users.Data.Migrations { - [DbContext(typeof(IdentityDbContext))] + [DbContext(typeof(ApplicationDbContext))] [Migration("20250217034117_Add_FacebookId")] partial class Add_FacebookId { diff --git a/backend/src/Web/Features/Users/Data/Migrations/20250402025554_FixUrlsTo1024Chars.Designer.cs b/backend/src/Web/Features/Users/Data/Migrations/20250402025554_FixUrlsTo1024Chars.Designer.cs new file mode 100644 index 0000000..b93de58 --- /dev/null +++ b/backend/src/Web/Features/Users/Data/Migrations/20250402025554_FixUrlsTo1024Chars.Designer.cs @@ -0,0 +1,308 @@ +// +using System; +using Hutopy.Web.Features.Users.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Hutopy.Web.Features.Users.Data.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20250402025554_FixUrlsTo1024Chars")] + partial class FixUrlsTo1024Chars + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("Identity") + .HasAnnotation("ProductVersion", "9.0.3") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Hutopy.Web.Features.Users.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", "Identity"); + }); + + modelBuilder.Entity("Hutopy.Web.Features.Users.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("Address") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Alias") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("BirthDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("FacebookId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Firstname") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("GoogleId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Lastname") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("PortraitUrl") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", "Identity"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", "Identity"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", "Identity"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", "Identity"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", "Identity"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", "Identity"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Hutopy.Web.Features.Users.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Hutopy.Web.Features.Users.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Hutopy.Web.Features.Users.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Hutopy.Web.Features.Users.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Hutopy.Web.Features.Users.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Hutopy.Web.Features.Users.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/backend/src/Web/Features/Users/Data/Migrations/20250402025554_FixUrlsTo1024Chars.cs b/backend/src/Web/Features/Users/Data/Migrations/20250402025554_FixUrlsTo1024Chars.cs new file mode 100644 index 0000000..ffaabcb --- /dev/null +++ b/backend/src/Web/Features/Users/Data/Migrations/20250402025554_FixUrlsTo1024Chars.cs @@ -0,0 +1,42 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Hutopy.Web.Features.Users.Data.Migrations +{ + /// + public partial class FixUrlsTo1024Chars : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "PortraitUrl", + schema: "Identity", + table: "AspNetUsers", + type: "character varying(1024)", + maxLength: 1024, + nullable: true, + oldClrType: typeof(string), + oldType: "character varying(255)", + oldMaxLength: 255, + oldNullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "PortraitUrl", + schema: "Identity", + table: "AspNetUsers", + type: "character varying(255)", + maxLength: 255, + nullable: true, + oldClrType: typeof(string), + oldType: "character varying(1024)", + oldMaxLength: 1024, + oldNullable: true); + } + } +} diff --git a/backend/src/Web/Features/Users/Data/Migrations/ApplicationDbContextModelSnapshot.cs b/backend/src/Web/Features/Users/Data/Migrations/ApplicationDbContextModelSnapshot.cs index c139c9e..f2bdbd1 100644 --- a/backend/src/Web/Features/Users/Data/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/backend/src/Web/Features/Users/Data/Migrations/ApplicationDbContextModelSnapshot.cs @@ -10,7 +10,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Hutopy.Web.Features.Users.Data.Migrations { - [DbContext(typeof(IdentityDbContext))] + [DbContext(typeof(ApplicationDbContext))] partial class ApplicationDbContextModelSnapshot : ModelSnapshot { protected override void BuildModel(ModelBuilder modelBuilder) @@ -18,7 +18,7 @@ namespace Hutopy.Web.Features.Users.Data.Migrations #pragma warning disable 612, 618 modelBuilder .HasDefaultSchema("Identity") - .HasAnnotation("ProductVersion", "8.0.10") + .HasAnnotation("ProductVersion", "9.0.3") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); @@ -121,8 +121,8 @@ namespace Hutopy.Web.Features.Users.Data.Migrations .HasColumnType("boolean"); b.Property("PortraitUrl") - .HasMaxLength(255) - .HasColumnType("character varying(255)"); + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); b.Property("SecurityStamp") .HasColumnType("text"); diff --git a/backend/src/Web/Features/Users/DependencyInjection.cs b/backend/src/Web/Features/Users/DependencyInjection.cs index 0ac396f..5ef9e3a 100644 --- a/backend/src/Web/Features/Users/DependencyInjection.cs +++ b/backend/src/Web/Features/Users/DependencyInjection.cs @@ -14,8 +14,8 @@ public static class DependencyInjection builder.Services.AddDbContext(configureAction); builder.Services.AddScoped(); - builder.Services.AddDbContext(configureAction); - builder.Services.AddScoped(); + builder.Services.AddDbContext(configureAction); + builder.Services.AddScoped(); builder.Services.AddAuthentication() .AddBearerToken(IdentityConstants.BearerScheme); @@ -26,7 +26,7 @@ public static class DependencyInjection .AddIdentityCore() .AddUserManager() .AddRoles() - .AddEntityFrameworkStores() + .AddEntityFrameworkStores() .AddApiEndpoints() .AddSignInManager>() .AddDefaultTokenProviders(); diff --git a/backend/src/Web/Features/Users/IdentityUser.cs b/backend/src/Web/Features/Users/IdentityUser.cs index 0819994..78cd32e 100644 --- a/backend/src/Web/Features/Users/IdentityUser.cs +++ b/backend/src/Web/Features/Users/IdentityUser.cs @@ -10,7 +10,7 @@ public class IdentityUser : IdentityUser [MaxLength(255)] public string? Lastname { get; set; } public DateTime? BirthDate { get; set; } [MaxLength(255)] public string? Address { get; set; } - [MaxLength(255)] public string? PortraitUrl { get; set; } + [MaxLength(1024)] public string? PortraitUrl { get; set; } [MaxLength(255)] public string? GoogleId { get; set; } [MaxLength(255)] public string? FacebookId { get; set; } } diff --git a/backend/src/Web/Program.cs b/backend/src/Web/Program.cs index 784e06d..511695a 100644 --- a/backend/src/Web/Program.cs +++ b/backend/src/Web/Program.cs @@ -70,7 +70,7 @@ builder.Services.AddFastEndpoints(); builder.AddIdentityModule(options => options.UseNpgsql( postgresConnectionString, - o => o.MigrationsHistoryTable("__EFMigrationsHistory", IdentityDbContext.SchemaName))); + o => o.MigrationsHistoryTable("__EFMigrationsHistory", ApplicationDbContext.SchemaName))); builder.AddContentModule(options => options.UseNpgsql( postgresConnectionString, diff --git a/backend/update-databases.sh b/backend/update-databases.sh index 53d7127..49c5ed6 100644 --- a/backend/update-databases.sh +++ b/backend/update-databases.sh @@ -3,7 +3,7 @@ dotnet ef database update \ --startup-project src/Web/Web.csproj \ --project src/Web/Web.csproj \ - --context Hutopy.Web.Features.Users.Data.IdentityDbContext \ + --context Hutopy.Web.Features.Users.Data.ApplicationDbContext \ --configuration Debug \ --no-build