diff --git a/src/FiscalOS.Infra/Data/AppDbContext.cs b/src/FiscalOS.Infra/Data/AppDbContext.cs index db90d6f..c57edf8 100644 --- a/src/FiscalOS.Infra/Data/AppDbContext.cs +++ b/src/FiscalOS.Infra/Data/AppDbContext.cs @@ -45,18 +45,24 @@ public sealed class AppDbContext(IOptions ctxOptions) : DbC modelBuilder.Entity(static eb => { + eb.HasMany(static u => u.RefreshTokens) .WithOne(static t => t.User) .HasForeignKey(static t => t.UserId) .OnDelete(DeleteBehavior.Cascade); eb.Property(static u => u.Username); - eb.Property(static u => u.HashedPassword); }); + eb.HasIndex(static u => u.Username).IsUnique(); + + eb.Property(static u => u.HashedPassword); + }); modelBuilder.Entity(static eb => { eb.Property(static t => t.Id); eb.Property(static t => t.ExpiresAt); + eb.Property(static t => t.Token); + eb.HasIndex(static t => t.Token).IsUnique(); }); } } \ No newline at end of file diff --git a/src/FiscalOS.Infra/Migrations/20260202214513_AddIndexesWithUniquenessToModels.Designer.cs b/src/FiscalOS.Infra/Migrations/20260202214513_AddIndexesWithUniquenessToModels.Designer.cs new file mode 100644 index 0000000..9a16ce5 --- /dev/null +++ b/src/FiscalOS.Infra/Migrations/20260202214513_AddIndexesWithUniquenessToModels.Designer.cs @@ -0,0 +1,101 @@ +// +using System; +using FiscalOS.Infra.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace FiscalOS.Infra.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20260202214513_AddIndexesWithUniquenessToModels")] + partial class AddIndexesWithUniquenessToModels + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "10.0.2"); + + modelBuilder.Entity("FiscalOS.Core.Identity.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreatedAt") + .HasColumnType("TEXT"); + + b.Property("ExpiresAt") + .HasColumnType("TEXT"); + + b.Property("Token") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedAt") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("Token") + .IsUnique(); + + b.HasIndex("UserId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("FiscalOS.Core.Identity.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreatedAt") + .HasColumnType("TEXT"); + + b.Property("HashedPassword") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedAt") + .HasColumnType("TEXT"); + + b.Property("Username") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("Username") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("FiscalOS.Core.Identity.RefreshToken", b => + { + b.HasOne("FiscalOS.Core.Identity.User", "User") + .WithMany("RefreshTokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("FiscalOS.Core.Identity.User", b => + { + b.Navigation("RefreshTokens"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/FiscalOS.Infra/Migrations/20260202214513_AddIndexesWithUniquenessToModels.cs b/src/FiscalOS.Infra/Migrations/20260202214513_AddIndexesWithUniquenessToModels.cs new file mode 100644 index 0000000..7206d67 --- /dev/null +++ b/src/FiscalOS.Infra/Migrations/20260202214513_AddIndexesWithUniquenessToModels.cs @@ -0,0 +1,38 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace FiscalOS.Infra.Migrations +{ + /// + public partial class AddIndexesWithUniquenessToModels : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateIndex( + name: "IX_Users_Username", + table: "Users", + column: "Username", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_RefreshTokens_Token", + table: "RefreshTokens", + column: "Token", + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_Users_Username", + table: "Users"); + + migrationBuilder.DropIndex( + name: "IX_RefreshTokens_Token", + table: "RefreshTokens"); + } + } +} diff --git a/src/FiscalOS.Infra/Migrations/AppDbContextModelSnapshot.cs b/src/FiscalOS.Infra/Migrations/AppDbContextModelSnapshot.cs index 0a74549..9228af1 100644 --- a/src/FiscalOS.Infra/Migrations/AppDbContextModelSnapshot.cs +++ b/src/FiscalOS.Infra/Migrations/AppDbContextModelSnapshot.cs @@ -41,6 +41,9 @@ namespace FiscalOS.Infra.Migrations b.HasKey("Id"); + b.HasIndex("Token") + .IsUnique(); + b.HasIndex("UserId"); b.ToTable("RefreshTokens"); @@ -68,6 +71,9 @@ namespace FiscalOS.Infra.Migrations b.HasKey("Id"); + b.HasIndex("Username") + .IsUnique(); + b.ToTable("Users"); });