diff --git a/Modules/Devices/src/Devices.Infrastructure.Database.Postgres/Migrations/20240830164312_HashIndexesForIds.Designer.cs b/Modules/Devices/src/Devices.Infrastructure.Database.Postgres/Migrations/20240830164312_HashIndexesForIds.Designer.cs
new file mode 100644
index 0000000000..c6c32ea3df
--- /dev/null
+++ b/Modules/Devices/src/Devices.Infrastructure.Database.Postgres/Migrations/20240830164312_HashIndexesForIds.Designer.cs
@@ -0,0 +1,919 @@
+//
+using System;
+using Backbone.Modules.Devices.Infrastructure.Persistence.Database;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace Backbone.Modules.Devices.Infrastructure.Database.Postgres.Migrations
+{
+ [DbContext(typeof(DevicesDbContext))]
+ [Migration("20240830164312_HashIndexesForIds")]
+ partial class HashIndexesForIds
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasDefaultSchema("Devices")
+ .HasAnnotation("ProductVersion", "8.0.8")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Aggregates.PushNotifications.PnsRegistration", b =>
+ {
+ b.Property("DeviceId")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("AppId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("DevicePushIdentifier")
+ .IsRequired()
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("Environment")
+ .HasColumnType("integer");
+
+ b.Property("Handle")
+ .IsRequired()
+ .HasMaxLength(200)
+ .IsUnicode(true)
+ .HasColumnType("character varying(200)")
+ .IsFixedLength(false);
+
+ b.Property("IdentityAddress")
+ .IsRequired()
+ .HasMaxLength(80)
+ .IsUnicode(false)
+ .HasColumnType("character varying(80)")
+ .IsFixedLength(false);
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("DeviceId");
+
+ b.ToTable("PnsRegistrations", "Devices");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Aggregates.Tier.Tier", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("CanBeManuallyAssigned")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(true);
+
+ b.Property("CanBeUsedAsDefaultForClient")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(true);
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(30)
+ .IsUnicode(true)
+ .HasColumnType("character varying(30)")
+ .IsFixedLength(false);
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("Tiers", "Devices");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Entities.Challenge", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("ExpiresAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.ToTable("Challenges", "Challenges", t =>
+ {
+ t.ExcludeFromMigrations();
+ });
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Entities.Identities.ApplicationUser", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("AccessFailedCount")
+ .HasColumnType("integer");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasColumnType("text");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DeviceId")
+ .IsRequired()
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("LastLoginAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("LockoutEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("LockoutEnd")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("NormalizedUserName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("PasswordHash")
+ .HasColumnType("text");
+
+ b.Property("SecurityStamp")
+ .HasColumnType("text");
+
+ b.Property("UserName")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.HasKey("Id");
+
+ b.HasIndex("DeviceId")
+ .IsUnique();
+
+ b.HasIndex("NormalizedUserName")
+ .IsUnique()
+ .HasDatabaseName("UserNameIndex");
+
+ b.ToTable("AspNetUsers", "Devices");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Entities.Identities.Device", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("CommunicationLanguage")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(2)
+ .IsUnicode(false)
+ .HasColumnType("character(2)")
+ .HasDefaultValue("en")
+ .IsFixedLength();
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("CreatedByDevice")
+ .IsRequired()
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("DeletedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DeletedByDevice")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("IdentityAddress")
+ .IsRequired()
+ .HasMaxLength(80)
+ .IsUnicode(false)
+ .HasColumnType("character varying(80)")
+ .IsFixedLength(false);
+
+ b.HasKey("Id");
+
+ b.HasIndex("IdentityAddress");
+
+ b.ToTable("Devices", "Devices");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Entities.Identities.Identity", b =>
+ {
+ b.Property("Address")
+ .HasMaxLength(80)
+ .IsUnicode(false)
+ .HasColumnType("character varying(80)")
+ .IsFixedLength(false);
+
+ b.Property("ClientId")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DeletionGracePeriodEndsAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("IdentityVersion")
+ .HasColumnType("smallint");
+
+ b.Property("PublicKey")
+ .IsRequired()
+ .HasColumnType("bytea");
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.Property("TierId")
+ .IsRequired()
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("TierIdBeforeDeletion")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.HasKey("Address");
+
+ b.HasIndex("ClientId");
+
+ NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("ClientId"), "hash");
+
+ b.HasIndex("TierId");
+
+ NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("TierId"), "hash");
+
+ b.ToTable("Identities", "Devices");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Entities.Identities.IdentityDeletionProcess", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("ApprovalReminder1SentAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ApprovalReminder2SentAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ApprovalReminder3SentAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ApprovedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ApprovedByDevice")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("CancelledAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("CancelledByDevice")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DeletionStartedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("GracePeriodEndsAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("GracePeriodReminder1SentAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("GracePeriodReminder2SentAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("GracePeriodReminder3SentAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("IdentityAddress")
+ .HasMaxLength(80)
+ .IsUnicode(false)
+ .HasColumnType("character varying(80)")
+ .IsFixedLength(false);
+
+ b.Property("RejectedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("RejectedByDevice")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("IdentityAddress");
+
+ b.ToTable("IdentityDeletionProcesses", "Devices");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Entities.Identities.IdentityDeletionProcessAuditLogEntry", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("AdditionalData")
+ .HasColumnType("text");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DeviceIdHash")
+ .HasColumnType("bytea");
+
+ b.Property("IdentityAddressHash")
+ .IsRequired()
+ .HasColumnType("bytea");
+
+ b.Property("IdentityDeletionProcessId")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("MessageKey")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("NewStatus")
+ .HasColumnType("integer");
+
+ b.Property("OldStatus")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("IdentityDeletionProcessId");
+
+ b.ToTable("IdentityDeletionProcessAuditLog", "Devices");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Infrastructure.OpenIddict.CustomOpenIddictEntityFrameworkCoreApplication", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("ApplicationType")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("ClientId")
+ .HasMaxLength(100)
+ .HasColumnType("character varying(100)");
+
+ b.Property("ClientSecret")
+ .HasColumnType("text");
+
+ b.Property("ClientType")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("ConcurrencyToken")
+ .IsConcurrencyToken()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("ConsentType")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DefaultTier")
+ .IsRequired()
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("DisplayName")
+ .HasColumnType("text");
+
+ b.Property("DisplayNames")
+ .HasColumnType("text");
+
+ b.Property("JsonWebKeySet")
+ .HasColumnType("text");
+
+ b.Property("MaxIdentities")
+ .HasColumnType("integer");
+
+ b.Property("Permissions")
+ .HasColumnType("text");
+
+ b.Property("PostLogoutRedirectUris")
+ .HasColumnType("text");
+
+ b.Property("Properties")
+ .HasColumnType("text");
+
+ b.Property("RedirectUris")
+ .HasColumnType("text");
+
+ b.Property("Requirements")
+ .HasColumnType("text");
+
+ b.Property("Settings")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ClientId")
+ .IsUnique();
+
+ b.HasIndex("DefaultTier");
+
+ b.ToTable("OpenIddictApplications", "Devices");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Infrastructure.OpenIddict.CustomOpenIddictEntityFrameworkCoreAuthorization", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("ApplicationId")
+ .HasColumnType("text");
+
+ b.Property("ConcurrencyToken")
+ .IsConcurrencyToken()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Properties")
+ .HasColumnType("text");
+
+ b.Property("Scopes")
+ .HasColumnType("text");
+
+ b.Property("Status")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("Subject")
+ .HasMaxLength(400)
+ .HasColumnType("character varying(400)");
+
+ b.Property("Type")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ApplicationId", "Status", "Subject", "Type");
+
+ b.ToTable("OpenIddictAuthorizations", "Devices");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Infrastructure.OpenIddict.CustomOpenIddictEntityFrameworkCoreScope", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("ConcurrencyToken")
+ .IsConcurrencyToken()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("Description")
+ .HasColumnType("text");
+
+ b.Property("Descriptions")
+ .HasColumnType("text");
+
+ b.Property("DisplayName")
+ .HasColumnType("text");
+
+ b.Property("DisplayNames")
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("Properties")
+ .HasColumnType("text");
+
+ b.Property("Resources")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("OpenIddictScopes", "Devices");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Infrastructure.OpenIddict.CustomOpenIddictEntityFrameworkCoreToken", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("ApplicationId")
+ .HasColumnType("text");
+
+ b.Property("AuthorizationId")
+ .HasColumnType("text");
+
+ b.Property("ConcurrencyToken")
+ .IsConcurrencyToken()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ExpirationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Payload")
+ .HasColumnType("text");
+
+ b.Property("Properties")
+ .HasColumnType("text");
+
+ b.Property("RedemptionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ReferenceId")
+ .HasMaxLength(100)
+ .HasColumnType("character varying(100)");
+
+ b.Property("Status")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("Subject")
+ .HasMaxLength(400)
+ .HasColumnType("character varying(400)");
+
+ b.Property("Type")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuthorizationId");
+
+ b.HasIndex("ReferenceId")
+ .IsUnique();
+
+ b.HasIndex("ApplicationId", "Status", "Subject", "Type");
+
+ b.ToTable("OpenIddictTokens", "Devices");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ 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", "Devices");
+ });
+
+ 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")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims", "Devices");
+ });
+
+ 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")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims", "Devices");
+ });
+
+ 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")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("LoginProvider", "ProviderKey");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserLogins", "Devices");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("text");
+
+ b.Property("RoleId")
+ .HasColumnType("text");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetUserRoles", "Devices");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("text");
+
+ b.Property("LoginProvider")
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .HasColumnType("text");
+
+ b.Property("Value")
+ .HasColumnType("text");
+
+ b.HasKey("UserId", "LoginProvider", "Name");
+
+ b.ToTable("AspNetUserTokens", "Devices");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Entities.Identities.ApplicationUser", b =>
+ {
+ b.HasOne("Backbone.Modules.Devices.Domain.Entities.Identities.Device", "Device")
+ .WithOne("User")
+ .HasForeignKey("Backbone.Modules.Devices.Domain.Entities.Identities.ApplicationUser", "DeviceId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Device");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Entities.Identities.Device", b =>
+ {
+ b.HasOne("Backbone.Modules.Devices.Domain.Entities.Identities.Identity", "Identity")
+ .WithMany("Devices")
+ .HasForeignKey("IdentityAddress")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Identity");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Entities.Identities.IdentityDeletionProcess", b =>
+ {
+ b.HasOne("Backbone.Modules.Devices.Domain.Entities.Identities.Identity", null)
+ .WithMany("DeletionProcesses")
+ .HasForeignKey("IdentityAddress")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Entities.Identities.IdentityDeletionProcessAuditLogEntry", b =>
+ {
+ b.HasOne("Backbone.Modules.Devices.Domain.Entities.Identities.IdentityDeletionProcess", null)
+ .WithMany("AuditLog")
+ .HasForeignKey("IdentityDeletionProcessId")
+ .OnDelete(DeleteBehavior.SetNull);
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Infrastructure.OpenIddict.CustomOpenIddictEntityFrameworkCoreApplication", b =>
+ {
+ b.HasOne("Backbone.Modules.Devices.Domain.Aggregates.Tier.Tier", null)
+ .WithMany()
+ .HasForeignKey("DefaultTier")
+ .OnDelete(DeleteBehavior.Restrict)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Infrastructure.OpenIddict.CustomOpenIddictEntityFrameworkCoreAuthorization", b =>
+ {
+ b.HasOne("Backbone.Modules.Devices.Infrastructure.OpenIddict.CustomOpenIddictEntityFrameworkCoreApplication", "Application")
+ .WithMany("Authorizations")
+ .HasForeignKey("ApplicationId");
+
+ b.Navigation("Application");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Infrastructure.OpenIddict.CustomOpenIddictEntityFrameworkCoreToken", b =>
+ {
+ b.HasOne("Backbone.Modules.Devices.Infrastructure.OpenIddict.CustomOpenIddictEntityFrameworkCoreApplication", "Application")
+ .WithMany("Tokens")
+ .HasForeignKey("ApplicationId");
+
+ b.HasOne("Backbone.Modules.Devices.Infrastructure.OpenIddict.CustomOpenIddictEntityFrameworkCoreAuthorization", "Authorization")
+ .WithMany("Tokens")
+ .HasForeignKey("AuthorizationId");
+
+ b.Navigation("Application");
+
+ b.Navigation("Authorization");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.HasOne("Backbone.Modules.Devices.Domain.Entities.Identities.ApplicationUser", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.HasOne("Backbone.Modules.Devices.Domain.Entities.Identities.ApplicationUser", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Backbone.Modules.Devices.Domain.Entities.Identities.ApplicationUser", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.HasOne("Backbone.Modules.Devices.Domain.Entities.Identities.ApplicationUser", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Entities.Identities.Device", b =>
+ {
+ b.Navigation("User")
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Entities.Identities.Identity", b =>
+ {
+ b.Navigation("DeletionProcesses");
+
+ b.Navigation("Devices");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Domain.Entities.Identities.IdentityDeletionProcess", b =>
+ {
+ b.Navigation("AuditLog");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Infrastructure.OpenIddict.CustomOpenIddictEntityFrameworkCoreApplication", b =>
+ {
+ b.Navigation("Authorizations");
+
+ b.Navigation("Tokens");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Devices.Infrastructure.OpenIddict.CustomOpenIddictEntityFrameworkCoreAuthorization", b =>
+ {
+ b.Navigation("Tokens");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Modules/Devices/src/Devices.Infrastructure.Database.Postgres/Migrations/20240830164312_HashIndexesForIds.cs b/Modules/Devices/src/Devices.Infrastructure.Database.Postgres/Migrations/20240830164312_HashIndexesForIds.cs
new file mode 100644
index 0000000000..a9d4aff5f9
--- /dev/null
+++ b/Modules/Devices/src/Devices.Infrastructure.Database.Postgres/Migrations/20240830164312_HashIndexesForIds.cs
@@ -0,0 +1,64 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Backbone.Modules.Devices.Infrastructure.Database.Postgres.Migrations
+{
+ ///
+ public partial class HashIndexesForIds : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropIndex(
+ name: "IX_Identities_ClientId",
+ schema: "Devices",
+ table: "Identities");
+
+ migrationBuilder.DropIndex(
+ name: "IX_Identities_TierId",
+ schema: "Devices",
+ table: "Identities");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Identities_ClientId",
+ schema: "Devices",
+ table: "Identities",
+ column: "ClientId")
+ .Annotation("Npgsql:IndexMethod", "hash");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Identities_TierId",
+ schema: "Devices",
+ table: "Identities",
+ column: "TierId")
+ .Annotation("Npgsql:IndexMethod", "hash");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropIndex(
+ name: "IX_Identities_ClientId",
+ schema: "Devices",
+ table: "Identities");
+
+ migrationBuilder.DropIndex(
+ name: "IX_Identities_TierId",
+ schema: "Devices",
+ table: "Identities");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Identities_ClientId",
+ schema: "Devices",
+ table: "Identities",
+ column: "ClientId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Identities_TierId",
+ schema: "Devices",
+ table: "Identities",
+ column: "TierId");
+ }
+ }
+}
diff --git a/Modules/Devices/src/Devices.Infrastructure.Database.Postgres/Migrations/DevicesDbContextModelSnapshot.cs b/Modules/Devices/src/Devices.Infrastructure.Database.Postgres/Migrations/DevicesDbContextModelSnapshot.cs
index 56570b5c11..167c25eece 100644
--- a/Modules/Devices/src/Devices.Infrastructure.Database.Postgres/Migrations/DevicesDbContextModelSnapshot.cs
+++ b/Modules/Devices/src/Devices.Infrastructure.Database.Postgres/Migrations/DevicesDbContextModelSnapshot.cs
@@ -18,7 +18,7 @@ protected override void BuildModel(ModelBuilder modelBuilder)
#pragma warning disable 612, 618
modelBuilder
.HasDefaultSchema("Devices")
- .HasAnnotation("ProductVersion", "8.0.6")
+ .HasAnnotation("ProductVersion", "8.0.8")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
@@ -273,8 +273,12 @@ protected override void BuildModel(ModelBuilder modelBuilder)
b.HasIndex("ClientId");
+ NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("ClientId"), "hash");
+
b.HasIndex("TierId");
+ NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("TierId"), "hash");
+
b.ToTable("Identities", "Devices");
});
diff --git a/Modules/Devices/src/Devices.Infrastructure/Persistence/Database/EntityConfigurations/IdentityEntityTypeConfiguration.cs b/Modules/Devices/src/Devices.Infrastructure/Persistence/Database/EntityConfigurations/IdentityEntityTypeConfiguration.cs
index 4cd3545887..829a97379d 100644
--- a/Modules/Devices/src/Devices.Infrastructure/Persistence/Database/EntityConfigurations/IdentityEntityTypeConfiguration.cs
+++ b/Modules/Devices/src/Devices.Infrastructure/Persistence/Database/EntityConfigurations/IdentityEntityTypeConfiguration.cs
@@ -15,8 +15,8 @@ public override void Configure(EntityTypeBuilder builder)
builder.Property(x => x.ClientId).HasMaxLength(200);
builder.Property(x => x.CreatedAt);
builder.Property(x => x.PublicKey);
- builder.HasIndex(x => x.ClientId);
- builder.HasIndex(x => x.TierId);
+ builder.HasIndex(x => x.ClientId).HasMethod("hash");
+ builder.HasIndex(x => x.TierId).HasMethod("hash");
builder.HasMany(x => x.DeletionProcesses).WithOne().OnDelete(DeleteBehavior.Cascade);
}
diff --git a/Modules/Messages/src/Messages.Infrastructure.Database.Postgres/Migrations/20240830164612_HashIndexForMessageCreatedByField.Designer.cs b/Modules/Messages/src/Messages.Infrastructure.Database.Postgres/Migrations/20240830164612_HashIndexForMessageCreatedByField.Designer.cs
new file mode 100644
index 0000000000..da99e50bad
--- /dev/null
+++ b/Modules/Messages/src/Messages.Infrastructure.Database.Postgres/Migrations/20240830164612_HashIndexForMessageCreatedByField.Designer.cs
@@ -0,0 +1,202 @@
+//
+using System;
+using Backbone.Modules.Messages.Infrastructure.Persistence.Database;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace Backbone.Modules.Messages.Infrastructure.Database.Postgres.Migrations
+{
+ [DbContext(typeof(MessagesDbContext))]
+ [Migration("20240830164612_HashIndexForMessageCreatedByField")]
+ partial class HashIndexForMessageCreatedByField
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasDefaultSchema("Messages")
+ .HasAnnotation("ProductVersion", "8.0.8")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Backbone.Modules.Messages.Domain.Entities.Attachment", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("MessageId")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.HasKey("Id", "MessageId");
+
+ b.HasIndex("MessageId");
+
+ b.ToTable("Attachments", "Messages");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Messages.Domain.Entities.Message", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("Body")
+ .HasColumnType("bytea");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("CreatedBy")
+ .IsRequired()
+ .HasMaxLength(80)
+ .IsUnicode(false)
+ .HasColumnType("character varying(80)")
+ .IsFixedLength(false);
+
+ b.Property("CreatedByDevice")
+ .IsRequired()
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedBy");
+
+ NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("CreatedBy"), "hash");
+
+ b.ToTable("Messages", "Messages");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Messages.Domain.Entities.RecipientInformation", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Address")
+ .IsRequired()
+ .HasMaxLength(80)
+ .IsUnicode(false)
+ .HasColumnType("character varying(80)")
+ .IsFixedLength(false);
+
+ b.Property("EncryptedKey")
+ .IsRequired()
+ .HasColumnType("bytea");
+
+ b.Property("IsRelationshipDecomposedByRecipient")
+ .HasColumnType("boolean");
+
+ b.Property("IsRelationshipDecomposedBySender")
+ .HasColumnType("boolean");
+
+ b.Property("MessageId")
+ .IsRequired()
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("ReceivedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ReceivedByDevice")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.HasKey("Id");
+
+ b.HasIndex("MessageId");
+
+ b.HasIndex("ReceivedAt");
+
+ b.HasIndex("Address", "MessageId");
+
+ b.ToTable("RecipientInformation", "Messages");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Messages.Domain.Entities.Relationship", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("From")
+ .IsRequired()
+ .HasMaxLength(80)
+ .IsUnicode(false)
+ .HasColumnType("character varying(80)")
+ .IsFixedLength(false);
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.Property("To")
+ .IsRequired()
+ .HasMaxLength(80)
+ .IsUnicode(false)
+ .HasColumnType("character varying(80)")
+ .IsFixedLength(false);
+
+ b.HasKey("Id");
+
+ b.ToTable("Relationships", "Relationships", t =>
+ {
+ t.ExcludeFromMigrations();
+ });
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Messages.Domain.Entities.Attachment", b =>
+ {
+ b.HasOne("Backbone.Modules.Messages.Domain.Entities.Message", null)
+ .WithMany("Attachments")
+ .HasForeignKey("MessageId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Messages.Domain.Entities.RecipientInformation", b =>
+ {
+ b.HasOne("Backbone.Modules.Messages.Domain.Entities.Message", null)
+ .WithMany("Recipients")
+ .HasForeignKey("MessageId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Messages.Domain.Entities.Message", b =>
+ {
+ b.Navigation("Attachments");
+
+ b.Navigation("Recipients");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Modules/Messages/src/Messages.Infrastructure.Database.Postgres/Migrations/20240830164612_HashIndexForMessageCreatedByField.cs b/Modules/Messages/src/Messages.Infrastructure.Database.Postgres/Migrations/20240830164612_HashIndexForMessageCreatedByField.cs
new file mode 100644
index 0000000000..4ac692755b
--- /dev/null
+++ b/Modules/Messages/src/Messages.Infrastructure.Database.Postgres/Migrations/20240830164612_HashIndexForMessageCreatedByField.cs
@@ -0,0 +1,41 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Backbone.Modules.Messages.Infrastructure.Database.Postgres.Migrations
+{
+ ///
+ public partial class HashIndexForMessageCreatedByField : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropIndex(
+ name: "IX_Messages_CreatedBy",
+ schema: "Messages",
+ table: "Messages");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Messages_CreatedBy",
+ schema: "Messages",
+ table: "Messages",
+ column: "CreatedBy")
+ .Annotation("Npgsql:IndexMethod", "hash");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropIndex(
+ name: "IX_Messages_CreatedBy",
+ schema: "Messages",
+ table: "Messages");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Messages_CreatedBy",
+ schema: "Messages",
+ table: "Messages",
+ column: "CreatedBy");
+ }
+ }
+}
diff --git a/Modules/Messages/src/Messages.Infrastructure.Database.Postgres/Migrations/MessagesDbContextModelSnapshot.cs b/Modules/Messages/src/Messages.Infrastructure.Database.Postgres/Migrations/MessagesDbContextModelSnapshot.cs
index 956b5fcd75..348e5ab371 100644
--- a/Modules/Messages/src/Messages.Infrastructure.Database.Postgres/Migrations/MessagesDbContextModelSnapshot.cs
+++ b/Modules/Messages/src/Messages.Infrastructure.Database.Postgres/Migrations/MessagesDbContextModelSnapshot.cs
@@ -18,7 +18,7 @@ protected override void BuildModel(ModelBuilder modelBuilder)
#pragma warning disable 612, 618
modelBuilder
.HasDefaultSchema("Messages")
- .HasAnnotation("ProductVersion", "8.0.6")
+ .HasAnnotation("ProductVersion", "8.0.8")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
@@ -76,6 +76,8 @@ protected override void BuildModel(ModelBuilder modelBuilder)
b.HasIndex("CreatedBy");
+ NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("CreatedBy"), "hash");
+
b.ToTable("Messages", "Messages");
});
diff --git a/Modules/Messages/src/Messages.Infrastructure/Persistence/Database/EntityConfigurations/MessageEntityTypeConfiguration.cs b/Modules/Messages/src/Messages.Infrastructure/Persistence/Database/EntityConfigurations/MessageEntityTypeConfiguration.cs
index adf71b931d..de24645a19 100644
--- a/Modules/Messages/src/Messages.Infrastructure/Persistence/Database/EntityConfigurations/MessageEntityTypeConfiguration.cs
+++ b/Modules/Messages/src/Messages.Infrastructure/Persistence/Database/EntityConfigurations/MessageEntityTypeConfiguration.cs
@@ -1,5 +1,6 @@
using Backbone.BuildingBlocks.Infrastructure.Persistence.Database.EntityTypeConfigurations;
using Backbone.Modules.Messages.Domain.Entities;
+using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Backbone.Modules.Messages.Infrastructure.Persistence.Database.EntityConfigurations;
@@ -10,7 +11,7 @@ public override void Configure(EntityTypeBuilder builder)
{
base.Configure(builder);
- builder.HasIndex(m => m.CreatedBy);
+ builder.HasIndex(m => m.CreatedBy).HasMethod("hash");
builder.Property(m => m.Body).IsRequired(false);
builder.Property(x => x.CreatedByDevice);
diff --git a/Modules/Relationships/src/Relationships.Infrastructure.Database.Postgres/Migrations/20240830164658_HashIndexesForRelationshipIdentityAddresses.Designer.cs b/Modules/Relationships/src/Relationships.Infrastructure.Database.Postgres/Migrations/20240830164658_HashIndexesForRelationshipIdentityAddresses.Designer.cs
new file mode 100644
index 0000000000..083bdaeb55
--- /dev/null
+++ b/Modules/Relationships/src/Relationships.Infrastructure.Database.Postgres/Migrations/20240830164658_HashIndexesForRelationshipIdentityAddresses.Designer.cs
@@ -0,0 +1,258 @@
+//
+using System;
+using Backbone.Modules.Relationships.Infrastructure.Persistence.Database;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace Backbone.Modules.Relationships.Infrastructure.Database.Postgres.Migrations
+{
+ [DbContext(typeof(RelationshipsDbContext))]
+ [Migration("20240830164658_HashIndexesForRelationshipIdentityAddresses")]
+ partial class HashIndexesForRelationshipIdentityAddresses
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasDefaultSchema("Relationships")
+ .HasAnnotation("ProductVersion", "8.0.8")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Backbone.Modules.Relationships.Domain.Aggregates.RelationshipTemplates.RelationshipTemplate", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("Content")
+ .HasColumnType("bytea");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("CreatedBy")
+ .IsRequired()
+ .HasMaxLength(80)
+ .IsUnicode(false)
+ .HasColumnType("character varying(80)")
+ .IsFixedLength(false);
+
+ b.Property("CreatedByDevice")
+ .IsRequired()
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("ExpiresAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("MaxNumberOfAllocations")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.ToTable("RelationshipTemplates", "Relationships");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Relationships.Domain.Aggregates.RelationshipTemplates.RelationshipTemplateAllocation", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("AllocatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("AllocatedBy")
+ .IsRequired()
+ .HasMaxLength(80)
+ .IsUnicode(false)
+ .HasColumnType("character varying(80)")
+ .IsFixedLength(false);
+
+ b.Property("AllocatedByDevice")
+ .IsRequired()
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("RelationshipTemplateId")
+ .IsRequired()
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.HasKey("Id");
+
+ b.HasIndex("RelationshipTemplateId", "AllocatedBy");
+
+ b.ToTable("RelationshipTemplateAllocations", "Relationships");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Relationships.Domain.Aggregates.Relationships.Relationship", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("CreationContent")
+ .HasColumnType("bytea");
+
+ b.Property("CreationResponseContent")
+ .HasColumnType("bytea");
+
+ b.Property("From")
+ .IsRequired()
+ .HasMaxLength(80)
+ .IsUnicode(false)
+ .HasColumnType("character varying(80)")
+ .IsFixedLength(false);
+
+ b.Property("FromHasDecomposed")
+ .HasColumnType("boolean");
+
+ b.Property("RelationshipTemplateId")
+ .IsRequired()
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.Property("To")
+ .IsRequired()
+ .HasMaxLength(80)
+ .IsUnicode(false)
+ .HasColumnType("character varying(80)")
+ .IsFixedLength(false);
+
+ b.Property("ToHasDecomposed")
+ .HasColumnType("boolean");
+
+ b.HasKey("Id");
+
+ b.HasIndex("From");
+
+ NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("From"), "hash");
+
+ b.HasIndex("RelationshipTemplateId");
+
+ b.HasIndex("To");
+
+ NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("To"), "hash");
+
+ b.ToTable("Relationships", "Relationships");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Relationships.Domain.Aggregates.Relationships.RelationshipAuditLogEntry", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("CreatedBy")
+ .IsRequired()
+ .HasMaxLength(80)
+ .IsUnicode(false)
+ .HasColumnType("character varying(80)")
+ .IsFixedLength(false);
+
+ b.Property("CreatedByDevice")
+ .IsRequired()
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.Property("NewStatus")
+ .HasColumnType("integer");
+
+ b.Property("OldStatus")
+ .HasColumnType("integer");
+
+ b.Property("Reason")
+ .HasColumnType("integer");
+
+ b.Property("RelationshipId")
+ .HasMaxLength(20)
+ .IsUnicode(false)
+ .HasColumnType("character(20)")
+ .IsFixedLength();
+
+ b.HasKey("Id");
+
+ b.HasIndex("RelationshipId");
+
+ b.ToTable("RelationshipAuditLog", "Relationships");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Relationships.Domain.Aggregates.RelationshipTemplates.RelationshipTemplateAllocation", b =>
+ {
+ b.HasOne("Backbone.Modules.Relationships.Domain.Aggregates.RelationshipTemplates.RelationshipTemplate", null)
+ .WithMany("Allocations")
+ .HasForeignKey("RelationshipTemplateId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Relationships.Domain.Aggregates.Relationships.Relationship", b =>
+ {
+ b.HasOne("Backbone.Modules.Relationships.Domain.Aggregates.RelationshipTemplates.RelationshipTemplate", "RelationshipTemplate")
+ .WithMany("Relationships")
+ .HasForeignKey("RelationshipTemplateId")
+ .OnDelete(DeleteBehavior.Restrict)
+ .IsRequired();
+
+ b.Navigation("RelationshipTemplate");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Relationships.Domain.Aggregates.Relationships.RelationshipAuditLogEntry", b =>
+ {
+ b.HasOne("Backbone.Modules.Relationships.Domain.Aggregates.Relationships.Relationship", null)
+ .WithMany("AuditLog")
+ .HasForeignKey("RelationshipId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Relationships.Domain.Aggregates.RelationshipTemplates.RelationshipTemplate", b =>
+ {
+ b.Navigation("Allocations");
+
+ b.Navigation("Relationships");
+ });
+
+ modelBuilder.Entity("Backbone.Modules.Relationships.Domain.Aggregates.Relationships.Relationship", b =>
+ {
+ b.Navigation("AuditLog");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Modules/Relationships/src/Relationships.Infrastructure.Database.Postgres/Migrations/20240830164658_HashIndexesForRelationshipIdentityAddresses.cs b/Modules/Relationships/src/Relationships.Infrastructure.Database.Postgres/Migrations/20240830164658_HashIndexesForRelationshipIdentityAddresses.cs
new file mode 100644
index 0000000000..1b365b5abf
--- /dev/null
+++ b/Modules/Relationships/src/Relationships.Infrastructure.Database.Postgres/Migrations/20240830164658_HashIndexesForRelationshipIdentityAddresses.cs
@@ -0,0 +1,64 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Backbone.Modules.Relationships.Infrastructure.Database.Postgres.Migrations
+{
+ ///
+ public partial class HashIndexesForRelationshipIdentityAddresses : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropIndex(
+ name: "IX_Relationships_From",
+ schema: "Relationships",
+ table: "Relationships");
+
+ migrationBuilder.DropIndex(
+ name: "IX_Relationships_To",
+ schema: "Relationships",
+ table: "Relationships");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Relationships_From",
+ schema: "Relationships",
+ table: "Relationships",
+ column: "From")
+ .Annotation("Npgsql:IndexMethod", "hash");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Relationships_To",
+ schema: "Relationships",
+ table: "Relationships",
+ column: "To")
+ .Annotation("Npgsql:IndexMethod", "hash");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropIndex(
+ name: "IX_Relationships_From",
+ schema: "Relationships",
+ table: "Relationships");
+
+ migrationBuilder.DropIndex(
+ name: "IX_Relationships_To",
+ schema: "Relationships",
+ table: "Relationships");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Relationships_From",
+ schema: "Relationships",
+ table: "Relationships",
+ column: "From");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Relationships_To",
+ schema: "Relationships",
+ table: "Relationships",
+ column: "To");
+ }
+ }
+}
diff --git a/Modules/Relationships/src/Relationships.Infrastructure.Database.Postgres/Migrations/RelationshipsDbContextModelSnapshot.cs b/Modules/Relationships/src/Relationships.Infrastructure.Database.Postgres/Migrations/RelationshipsDbContextModelSnapshot.cs
index 30f46a2735..33fe5312f8 100644
--- a/Modules/Relationships/src/Relationships.Infrastructure.Database.Postgres/Migrations/RelationshipsDbContextModelSnapshot.cs
+++ b/Modules/Relationships/src/Relationships.Infrastructure.Database.Postgres/Migrations/RelationshipsDbContextModelSnapshot.cs
@@ -152,10 +152,14 @@ protected override void BuildModel(ModelBuilder modelBuilder)
b.HasIndex("From");
+ NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("From"), "hash");
+
b.HasIndex("RelationshipTemplateId");
b.HasIndex("To");
+ NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("To"), "hash");
+
b.ToTable("Relationships", "Relationships");
});
diff --git a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/EntityTypeConfigurations/RelationshipEntityTypeConfiguration.cs b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/EntityTypeConfigurations/RelationshipEntityTypeConfiguration.cs
index af8a5d773d..b45aed3c06 100644
--- a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/EntityTypeConfigurations/RelationshipEntityTypeConfiguration.cs
+++ b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/EntityTypeConfigurations/RelationshipEntityTypeConfiguration.cs
@@ -13,8 +13,8 @@ public override void Configure(EntityTypeBuilder builder)
base.Configure(builder);
- builder.HasIndex(x => x.From);
- builder.HasIndex(x => x.To);
+ builder.HasIndex(x => x.From).HasMethod("hash");
+ builder.HasIndex(x => x.To).HasMethod("hash");
builder.HasKey(x => x.Id);