< Summary - Heimdall API

Line coverage
100%
Covered lines: 1516
Uncovered lines: 0
Coverable lines: 1516
Total lines: 1622
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage
100%
Covered methods: 3
Fully covered methods: 3
Total methods: 3
Method coverage: 100%
Full method coverage: 100%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
File 1: Up(...)100%11100%
File 1: Down(...)100%11100%
File 2: BuildTargetModel(...)100%11100%

File(s)

/home/ci/agent/workspace/heimdall-api-docs_main/app/src/Infrastructure/ArturRios.Heimdall.Data/Migrations/20261021183451_AddPersonLowerEmailIndex.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore.Migrations;
 2
 3#nullable disable
 4
 5namespace ArturRios.Heimdall.Data.Migrations
 6{
 7    /// <summary>
 8    ///     Indexes PERSON by <c>LOWER(email)</c> and drops the index on the raw column, so the login,
 9    ///     password-recovery, registration and Google sign-in lookups no longer scan the table (#207).
 10    /// </summary>
 11    /// <remarks>
 12    ///     <para>
 13    ///         Those lookups compare <c>LOWER(email)</c> and deliberately leave out <c>is_deleted</c>, so
 14    ///         that a deleted person is found and refused. <c>ix_person_email</c> on the raw column cannot
 15    ///         serve that expression, and the two partial unique indexes on <c>LOWER(email)</c> require
 16    ///         <c>is_deleted = false</c>, which the query does not state. PostgreSQL read the whole table,
 17    ///         before the password hash, on the two hottest anonymous endpoints. The old index served no
 18    ///         query and cost a write on every insert and update, so it goes.
 19    ///     </para>
 20    ///     <para>
 21    ///         Built with <c>CREATE INDEX CONCURRENTLY</c>, outside the migration's transaction, so
 22    ///         sign-ups and updates are not blocked while it reads the table. <c>IF NOT EXISTS</c> lets a
 23    ///         build interrupted part-way be run again; one that failed leaves an invalid index, which an
 24    ///         operator drops before re-running. On the way down the old index is built before the new
 25    ///         one is dropped. EF cannot express an index on an expression, so the model snapshot
 26    ///         knows neither this index nor the partial ones; it only loses <c>ix_person_email</c>.
 27    ///     </para>
 28    /// </remarks>
 29    public partial class AddPersonLowerEmailIndex : Migration
 30    {
 31        /// <inheritdoc />
 32        protected override void Up(MigrationBuilder migrationBuilder)
 33        {
 1934            migrationBuilder.Sql(
 1935                """
 1936                CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_person_lower_email
 1937                    ON heimdall.person (LOWER(email));
 1938                """,
 1939                suppressTransaction: true);
 40
 1941            migrationBuilder.Sql(
 1942                "DROP INDEX CONCURRENTLY IF EXISTS heimdall.ix_person_email;",
 1943                suppressTransaction: true);
 1944        }
 45
 46        /// <inheritdoc />
 47        protected override void Down(MigrationBuilder migrationBuilder)
 48        {
 149            migrationBuilder.Sql(
 150                """
 151                CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_person_email
 152                    ON heimdall.person (email);
 153                """,
 154                suppressTransaction: true);
 55
 156            migrationBuilder.Sql(
 157                "DROP INDEX CONCURRENTLY IF EXISTS heimdall.ix_person_lower_email;",
 158                suppressTransaction: true);
 159        }
 60    }
 61}

/home/ci/agent/workspace/heimdall-api-docs_main/app/src/Infrastructure/ArturRios.Heimdall.Data/Migrations/20261021183451_AddPersonLowerEmailIndex.Designer.cs

#LineLine coverage
 1// <auto-generated />
 2using System;
 3using ArturRios.Heimdall.Data.Configuration;
 4using Microsoft.EntityFrameworkCore;
 5using Microsoft.EntityFrameworkCore.Infrastructure;
 6using Microsoft.EntityFrameworkCore.Migrations;
 7using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
 8using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
 9
 10#nullable disable
 11
 12namespace ArturRios.Heimdall.Data.Migrations
 13{
 14    [DbContext(typeof(AppDbContext))]
 15    [Migration("20261021183451_AddPersonLowerEmailIndex")]
 16    partial class AddPersonLowerEmailIndex
 17    {
 18        /// <inheritdoc />
 19        protected override void BuildTargetModel(ModelBuilder modelBuilder)
 20        {
 21#pragma warning disable 612, 618
 922            modelBuilder
 923                .HasDefaultSchema("heimdall")
 924                .HasAnnotation("ProductVersion", "10.0.13")
 925                .HasAnnotation("Relational:MaxIdentifierLength", 63);
 26
 927            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
 28
 929            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 930                {
 931                    b.Property<long>("Id")
 932                        .ValueGeneratedOnAdd()
 933                        .HasColumnType("bigint")
 934                        .HasColumnName("id")
 935                        .HasColumnOrder(1);
 936
 937                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 938
 939                    b.Property<DateTime>("CreatedAt")
 940                        .ValueGeneratedOnAdd()
 941                        .HasColumnType("timestamp with time zone")
 942                        .HasColumnName("created_at")
 943                        .HasDefaultValueSql("now()");
 944
 945                    b.Property<bool>("IsDeleted")
 946                        .ValueGeneratedOnAdd()
 947                        .HasColumnType("boolean")
 948                        .HasDefaultValue(false)
 949                        .HasColumnName("is_deleted");
 950
 951                    b.Property<string>("Name")
 952                        .IsRequired()
 953                        .HasMaxLength(200)
 954                        .HasColumnType("character varying(200)")
 955                        .HasColumnName("name");
 956
 957                    b.Property<long>("OwnerId")
 958                        .HasColumnType("bigint")
 959                        .HasColumnName("owner_id");
 960
 961                    b.Property<Guid>("PublicId")
 962                        .HasColumnType("uuid")
 963                        .HasColumnName("public_id");
 964
 965                    b.Property<long>("ScopeId")
 966                        .HasColumnType("bigint")
 967                        .HasColumnName("scope_id");
 968
 969                    b.Property<DateTime>("UpdatedAt")
 970                        .ValueGeneratedOnAdd()
 971                        .HasColumnType("timestamp with time zone")
 972                        .HasColumnName("updated_at")
 973                        .HasDefaultValueSql("now()");
 974
 975                    b.HasKey("Id")
 976                        .HasName("pk_application");
 977
 978                    b.HasIndex("OwnerId")
 979                        .HasDatabaseName("ix_application_owner_id");
 980
 981                    b.HasIndex("PublicId")
 982                        .IsUnique()
 983                        .HasDatabaseName("ix_application_public_id");
 984
 985                    b.HasIndex("ScopeId")
 986                        .HasDatabaseName("ix_application_scope_id");
 987
 988                    b.ToTable("application", "heimdall");
 1889                });
 90
 991            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ApplicationCredential", b =>
 992                {
 993                    b.Property<long>("Id")
 994                        .ValueGeneratedOnAdd()
 995                        .HasColumnType("bigint")
 996                        .HasColumnName("id")
 997                        .HasColumnOrder(1);
 998
 999                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 9100
 9101                    b.Property<long>("ApplicationId")
 9102                        .HasColumnType("bigint")
 9103                        .HasColumnName("application_id");
 9104
 9105                    b.Property<DateTime>("CreatedAt")
 9106                        .HasColumnType("timestamp with time zone")
 9107                        .HasColumnName("created_at");
 9108
 9109                    b.Property<DateTime?>("ExpiresAt")
 9110                        .HasColumnType("timestamp with time zone")
 9111                        .HasColumnName("expires_at");
 9112
 9113                    b.Property<DateTime?>("LastUsedAt")
 9114                        .HasColumnType("timestamp with time zone")
 9115                        .HasColumnName("last_used_at");
 9116
 9117                    b.Property<Guid>("PublicId")
 9118                        .HasColumnType("uuid")
 9119                        .HasColumnName("public_id");
 9120
 9121                    b.Property<DateTime?>("RevokedAt")
 9122                        .HasColumnType("timestamp with time zone")
 9123                        .HasColumnName("revoked_at");
 9124
 9125                    b.Property<string>("SecretHash")
 9126                        .IsRequired()
 9127                        .HasMaxLength(64)
 9128                        .HasColumnType("character varying(64)")
 9129                        .HasColumnName("secret_hash");
 9130
 9131                    b.HasKey("Id")
 9132                        .HasName("pk_application_credential");
 9133
 9134                    b.HasIndex("ApplicationId")
 9135                        .HasDatabaseName("ix_application_credential_application_id");
 9136
 9137                    b.HasIndex("PublicId")
 9138                        .IsUnique()
 9139                        .HasDatabaseName("ix_application_credential_public_id");
 9140
 9141                    b.HasIndex("SecretHash")
 9142                        .IsUnique()
 9143                        .HasDatabaseName("ix_application_credential_secret_hash");
 9144
 9145                    b.ToTable("application_credential", "heimdall");
 18146                });
 147
 9148            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.AttemptNoticeBudget", b =>
 9149                {
 9150                    b.Property<long>("Id")
 9151                        .ValueGeneratedOnAdd()
 9152                        .HasColumnType("bigint")
 9153                        .HasColumnName("id")
 9154                        .HasColumnOrder(1);
 9155
 9156                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 9157
 9158                    b.Property<string>("AddressHash")
 9159                        .IsRequired()
 9160                        .HasMaxLength(64)
 9161                        .HasColumnType("character varying(64)")
 9162                        .HasColumnName("address_hash");
 9163
 9164                    b.Property<int>("NoticesSent")
 9165                        .HasColumnType("integer")
 9166                        .HasColumnName("notices_sent");
 9167
 9168                    b.Property<DateTime>("WindowEndsAt")
 9169                        .HasColumnType("timestamp with time zone")
 9170                        .HasColumnName("window_ends_at");
 9171
 9172                    b.HasKey("Id")
 9173                        .HasName("pk_attempt_notice_budget");
 9174
 9175                    b.HasIndex("AddressHash")
 9176                        .IsUnique()
 9177                        .HasDatabaseName("ix_attempt_notice_budget_address_hash");
 9178
 9179                    b.HasIndex("WindowEndsAt")
 9180                        .HasDatabaseName("ix_attempt_notice_budget_window_ends_at");
 9181
 9182                    b.ToTable("attempt_notice_budget", "heimdall");
 18183                });
 184
 9185            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.AuditLog", b =>
 9186                {
 9187                    b.Property<long>("Id")
 9188                        .ValueGeneratedOnAdd()
 9189                        .HasColumnType("bigint")
 9190                        .HasColumnName("id")
 9191                        .HasColumnOrder(1);
 9192
 9193                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 9194
 9195                    b.Property<string>("Action")
 9196                        .IsRequired()
 9197                        .HasMaxLength(200)
 9198                        .HasColumnType("character varying(200)")
 9199                        .HasColumnName("action");
 9200
 9201                    b.Property<Guid?>("ActorPersonId")
 9202                        .HasColumnType("uuid")
 9203                        .HasColumnName("actor_person_id");
 9204
 9205                    b.Property<int?>("ActorRole")
 9206                        .HasColumnType("integer")
 9207                        .HasColumnName("actor_role");
 9208
 9209                    b.Property<DateTime>("CreatedAt")
 9210                        .ValueGeneratedOnAdd()
 9211                        .HasColumnType("timestamp with time zone")
 9212                        .HasColumnName("created_at")
 9213                        .HasDefaultValueSql("now()");
 9214
 9215                    b.Property<string>("FailureReason")
 9216                        .HasMaxLength(500)
 9217                        .HasColumnType("character varying(500)")
 9218                        .HasColumnName("failure_reason");
 9219
 9220                    b.Property<Guid>("PublicId")
 9221                        .HasColumnType("uuid")
 9222                        .HasColumnName("public_id");
 9223
 9224                    b.Property<bool>("Succeeded")
 9225                        .HasColumnType("boolean")
 9226                        .HasColumnName("succeeded");
 9227
 9228                    b.Property<Guid?>("TargetId")
 9229                        .HasColumnType("uuid")
 9230                        .HasColumnName("target_id");
 9231
 9232                    b.HasKey("Id")
 9233                        .HasName("pk_audit_log");
 9234
 9235                    b.HasIndex("ActorPersonId")
 9236                        .HasDatabaseName("ix_audit_log_actor_person_id");
 9237
 9238                    b.HasIndex("CreatedAt")
 9239                        .HasDatabaseName("ix_audit_log_created_at");
 9240
 9241                    b.HasIndex("PublicId")
 9242                        .IsUnique()
 9243                        .HasDatabaseName("ix_audit_log_public_id");
 9244
 9245                    b.HasIndex("TargetId")
 9246                        .HasDatabaseName("ix_audit_log_target_id");
 9247
 9248                    b.HasIndex(new[] { "CreatedAt" }, "ix_audit_log_created_at_attributed")
 9249                        .HasDatabaseName("ix_audit_log_created_at_attributed")
 9250                        .HasFilter("actor_person_id IS NOT NULL");
 9251
 9252                    b.HasIndex(new[] { "CreatedAt" }, "ix_audit_log_created_at_targeted")
 9253                        .HasDatabaseName("ix_audit_log_created_at_targeted")
 9254                        .HasFilter("target_id IS NOT NULL");
 9255
 9256                    b.ToTable("audit_log", "heimdall");
 18257                });
 258
 9259            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 9260                {
 9261                    b.Property<long>("Id")
 9262                        .ValueGeneratedOnAdd()
 9263                        .HasColumnType("bigint")
 9264                        .HasColumnName("id")
 9265                        .HasColumnOrder(1);
 9266
 9267                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 9268
 9269                    b.Property<DateTime>("ExpiresAt")
 9270                        .HasColumnType("timestamp with time zone")
 9271                        .HasColumnName("expires_at");
 9272
 9273                    b.Property<long>("PersonId")
 9274                        .HasColumnType("bigint")
 9275                        .HasColumnName("person_id");
 9276
 9277                    b.Property<string>("TokenHash")
 9278                        .IsRequired()
 9279                        .HasMaxLength(64)
 9280                        .HasColumnType("character varying(64)")
 9281                        .HasColumnName("token_hash");
 9282
 9283                    b.Property<bool>("Used")
 9284                        .ValueGeneratedOnAdd()
 9285                        .HasColumnType("boolean")
 9286                        .HasDefaultValue(false)
 9287                        .HasColumnName("used");
 9288
 9289                    b.HasKey("Id")
 9290                        .HasName("pk_email_verification_token");
 9291
 9292                    b.HasIndex("PersonId")
 9293                        .HasDatabaseName("ix_email_verification_token_person_id");
 9294
 9295                    b.HasIndex("TokenHash")
 9296                        .IsUnique()
 9297                        .HasDatabaseName("ix_email_verification_token_token_hash");
 9298
 9299                    b.ToTable("email_verification_token", "heimdall");
 18300                });
 301
 9302            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ErasedSubject", b =>
 9303                {
 9304                    b.Property<Guid>("Id")
 9305                        .HasColumnType("uuid")
 9306                        .HasColumnName("public_id")
 9307                        .HasColumnOrder(1);
 9308
 9309                    b.Property<DateTime>("CreatedAt")
 9310                        .ValueGeneratedOnAdd()
 9311                        .HasColumnType("timestamp with time zone")
 9312                        .HasColumnName("created_at")
 9313                        .HasDefaultValueSql("now()");
 9314
 9315                    b.Property<int>("Kind")
 9316                        .HasColumnType("integer")
 9317                        .HasColumnName("kind");
 9318
 9319                    b.HasKey("Id")
 9320                        .HasName("pk_erased_subject");
 9321
 9322                    b.HasIndex("CreatedAt")
 9323                        .HasDatabaseName("ix_erased_subject_created_at");
 9324
 9325                    b.ToTable("erased_subject", "heimdall");
 18326                });
 327
 9328            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleIdTokenUse", b =>
 9329                {
 9330                    b.Property<string>("Id")
 9331                        .HasMaxLength(64)
 9332                        .HasColumnType("character varying(64)")
 9333                        .HasColumnName("token_hash")
 9334                        .HasColumnOrder(1);
 9335
 9336                    b.Property<DateTime>("ExpiresAt")
 9337                        .HasColumnType("timestamp with time zone")
 9338                        .HasColumnName("expires_at");
 9339
 9340                    b.HasKey("Id")
 9341                        .HasName("pk_google_id_token_use");
 9342
 9343                    b.HasIndex("ExpiresAt")
 9344                        .HasDatabaseName("ix_google_id_token_use_expires_at");
 9345
 9346                    b.ToTable("google_id_token_use", "heimdall");
 18347                });
 348
 9349            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 9350                {
 9351                    b.Property<long>("Id")
 9352                        .ValueGeneratedOnAdd()
 9353                        .HasColumnType("bigint")
 9354                        .HasColumnName("id")
 9355                        .HasColumnOrder(1);
 9356
 9357                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 9358
 9359                    b.Property<DateTime?>("AnonymisedAt")
 9360                        .HasColumnType("timestamp with time zone")
 9361                        .HasColumnName("anonymised_at");
 9362
 9363                    b.Property<DateTime?>("BasisRecordedAt")
 9364                        .HasColumnType("timestamp with time zone")
 9365                        .HasColumnName("basis_recorded_at");
 9366
 9367                    b.Property<DateTime>("CreatedAt")
 9368                        .ValueGeneratedOnAdd()
 9369                        .HasColumnType("timestamp with time zone")
 9370                        .HasColumnName("created_at")
 9371                        .HasDefaultValueSql("now()");
 9372
 9373                    b.Property<DateTime?>("DeletedAt")
 9374                        .HasColumnType("timestamp with time zone")
 9375                        .HasColumnName("deleted_at");
 9376
 9377                    b.Property<int?>("DeletionKind")
 9378                        .HasColumnType("integer")
 9379                        .HasColumnName("deletion_kind");
 9380
 9381                    b.Property<string>("Email")
 9382                        .IsRequired()
 9383                        .HasMaxLength(256)
 9384                        .HasColumnType("character varying(256)")
 9385                        .HasColumnName("email");
 9386
 9387                    b.Property<bool>("EmailVerified")
 9388                        .ValueGeneratedOnAdd()
 9389                        .HasColumnType("boolean")
 9390                        .HasDefaultValue(false)
 9391                        .HasColumnName("email_verified");
 9392
 9393                    b.Property<string>("ErasureBlockedReason")
 9394                        .HasMaxLength(500)
 9395                        .HasColumnType("character varying(500)")
 9396                        .HasColumnName("erasure_blocked_reason");
 9397
 9398                    b.Property<DateTime?>("ErasureDueAt")
 9399                        .HasColumnType("timestamp with time zone")
 9400                        .HasColumnName("erasure_due_at");
 9401
 9402                    b.Property<DateTime?>("ErasureRequestedAt")
 9403                        .HasColumnType("timestamp with time zone")
 9404                        .HasColumnName("erasure_requested_at");
 9405
 9406                    b.Property<string>("GoogleId")
 9407                        .IsRequired()
 9408                        .HasMaxLength(255)
 9409                        .HasColumnType("character varying(255)")
 9410                        .HasColumnName("google_id");
 9411
 9412                    b.Property<bool>("IsDeleted")
 9413                        .ValueGeneratedOnAdd()
 9414                        .HasColumnType("boolean")
 9415                        .HasDefaultValue(false)
 9416                        .HasColumnName("is_deleted");
 9417
 9418                    b.Property<int>("LegalBasis")
 9419                        .ValueGeneratedOnAdd()
 9420                        .HasColumnType("integer")
 9421                        .HasDefaultValue(0)
 9422                        .HasColumnName("legal_basis");
 9423
 9424                    b.Property<string>("Name")
 9425                        .IsRequired()
 9426                        .HasMaxLength(200)
 9427                        .HasColumnType("character varying(200)")
 9428                        .HasColumnName("name");
 9429
 9430                    b.Property<string>("PrivacyNoticeVersion")
 9431                        .HasMaxLength(50)
 9432                        .HasColumnType("character varying(50)")
 9433                        .HasColumnName("privacy_notice_version");
 9434
 9435                    b.Property<DateTime?>("ProcessingRestrictedAt")
 9436                        .HasColumnType("timestamp with time zone")
 9437                        .HasColumnName("processing_restricted_at");
 9438
 9439                    b.Property<string>("ProfilePictureUrl")
 9440                        .HasMaxLength(2048)
 9441                        .HasColumnType("character varying(2048)")
 9442                        .HasColumnName("profile_picture_url");
 9443
 9444                    b.Property<Guid>("PublicId")
 9445                        .HasColumnType("uuid")
 9446                        .HasColumnName("public_id");
 9447
 9448                    b.Property<int?>("RestrictionGround")
 9449                        .HasColumnType("integer")
 9450                        .HasColumnName("restriction_ground");
 9451
 9452                    b.Property<DateTime?>("RestrictionLiftNotifiedAt")
 9453                        .HasColumnType("timestamp with time zone")
 9454                        .HasColumnName("restriction_lift_notified_at");
 9455
 9456                    b.Property<long>("ScopeId")
 9457                        .HasColumnType("bigint")
 9458                        .HasColumnName("scope_id");
 9459
 9460                    b.Property<DateTime>("UpdatedAt")
 9461                        .ValueGeneratedOnAdd()
 9462                        .HasColumnType("timestamp with time zone")
 9463                        .HasColumnName("updated_at")
 9464                        .HasDefaultValueSql("now()");
 9465
 9466                    b.HasKey("Id")
 9467                        .HasName("pk_google_user");
 9468
 9469                    b.HasIndex("DeletedAt")
 9470                        .HasDatabaseName("ix_google_user_deleted_at")
 9471                        .HasFilter("is_deleted = true AND anonymised_at IS NULL");
 9472
 9473                    b.HasIndex("ProcessingRestrictedAt")
 9474                        .HasDatabaseName("ix_google_user_processing_restricted_at")
 9475                        .HasFilter("processing_restricted_at IS NOT NULL");
 9476
 9477                    b.HasIndex("PublicId")
 9478                        .IsUnique()
 9479                        .HasDatabaseName("ix_google_user_public_id");
 9480
 9481                    b.HasIndex("ScopeId", "Email")
 9482                        .IsUnique()
 9483                        .HasDatabaseName("ix_google_user_scope_id_email");
 9484
 9485                    b.HasIndex("ScopeId", "GoogleId")
 9486                        .IsUnique()
 9487                        .HasDatabaseName("ix_google_user_scope_id_google_id");
 9488
 9489                    b.ToTable("google_user", "heimdall");
 18490                });
 491
 9492            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 9493                {
 9494                    b.Property<long>("Id")
 9495                        .ValueGeneratedOnAdd()
 9496                        .HasColumnType("bigint")
 9497                        .HasColumnName("id")
 9498                        .HasColumnOrder(1);
 9499
 9500                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 9501
 9502                    b.Property<DateTime>("ExpiresAt")
 9503                        .HasColumnType("timestamp with time zone")
 9504                        .HasColumnName("expires_at");
 9505
 9506                    b.Property<long>("PersonId")
 9507                        .HasColumnType("bigint")
 9508                        .HasColumnName("person_id");
 9509
 9510                    b.Property<string>("TokenHash")
 9511                        .IsRequired()
 9512                        .HasMaxLength(64)
 9513                        .HasColumnType("character varying(64)")
 9514                        .HasColumnName("token_hash");
 9515
 9516                    b.Property<bool>("Used")
 9517                        .ValueGeneratedOnAdd()
 9518                        .HasColumnType("boolean")
 9519                        .HasDefaultValue(false)
 9520                        .HasColumnName("used");
 9521
 9522                    b.HasKey("Id")
 9523                        .HasName("pk_password_reset_token");
 9524
 9525                    b.HasIndex("PersonId")
 9526                        .HasDatabaseName("ix_password_reset_token_person_id");
 9527
 9528                    b.HasIndex("TokenHash")
 9529                        .IsUnique()
 9530                        .HasDatabaseName("ix_password_reset_token_token_hash");
 9531
 9532                    b.ToTable("password_reset_token", "heimdall");
 18533                });
 534
 9535            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PendingRegistration", b =>
 9536                {
 9537                    b.Property<long>("Id")
 9538                        .ValueGeneratedOnAdd()
 9539                        .HasColumnType("bigint")
 9540                        .HasColumnName("id")
 9541                        .HasColumnOrder(1);
 9542
 9543                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 9544
 9545                    b.Property<DateTime>("CreatedAt")
 9546                        .ValueGeneratedOnAdd()
 9547                        .HasColumnType("timestamp with time zone")
 9548                        .HasColumnName("created_at")
 9549                        .HasDefaultValueSql("now()");
 9550
 9551                    b.Property<string>("Email")
 9552                        .IsRequired()
 9553                        .HasMaxLength(256)
 9554                        .HasColumnType("character varying(256)")
 9555                        .HasColumnName("email");
 9556
 9557                    b.Property<DateTime>("ExpiresAt")
 9558                        .HasColumnType("timestamp with time zone")
 9559                        .HasColumnName("expires_at");
 9560
 9561                    b.Property<int>("FailedAttempts")
 9562                        .ValueGeneratedOnAdd()
 9563                        .HasColumnType("integer")
 9564                        .HasDefaultValue(0)
 9565                        .HasColumnName("failed_attempts");
 9566
 9567                    b.Property<string>("Name")
 9568                        .IsRequired()
 9569                        .HasMaxLength(200)
 9570                        .HasColumnType("character varying(200)")
 9571                        .HasColumnName("name");
 9572
 9573                    b.Property<byte[]>("PasswordHash")
 9574                        .IsRequired()
 9575                        .HasColumnType("bytea")
 9576                        .HasColumnName("password_hash");
 9577
 9578                    b.Property<Guid>("PublicId")
 9579                        .HasColumnType("uuid")
 9580                        .HasColumnName("public_id");
 9581
 9582                    b.Property<byte[]>("Salt")
 9583                        .IsRequired()
 9584                        .HasColumnType("bytea")
 9585                        .HasColumnName("salt");
 9586
 9587                    b.Property<long>("ScopeId")
 9588                        .HasColumnType("bigint")
 9589                        .HasColumnName("scope_id");
 9590
 9591                    b.Property<string>("TokenHash")
 9592                        .IsRequired()
 9593                        .HasMaxLength(64)
 9594                        .HasColumnType("character varying(64)")
 9595                        .HasColumnName("token_hash");
 9596
 9597                    b.HasKey("Id")
 9598                        .HasName("pk_pending_registration");
 9599
 9600                    b.HasIndex("PublicId")
 9601                        .IsUnique()
 9602                        .HasDatabaseName("ix_pending_registration_public_id");
 9603
 9604                    b.HasIndex("ScopeId")
 9605                        .HasDatabaseName("ix_pending_registration_scope_id");
 9606
 9607                    b.HasIndex("TokenHash")
 9608                        .IsUnique()
 9609                        .HasDatabaseName("ix_pending_registration_token_hash");
 9610
 9611                    b.ToTable("pending_registration", "heimdall");
 18612                });
 613
 9614            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 9615                {
 9616                    b.Property<long>("Id")
 9617                        .ValueGeneratedOnAdd()
 9618                        .HasColumnType("bigint")
 9619                        .HasColumnName("id")
 9620                        .HasColumnOrder(1);
 9621
 9622                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 9623
 9624                    b.Property<DateTime?>("AccountEmailLastSentAt")
 9625                        .HasColumnType("timestamp with time zone")
 9626                        .HasColumnName("account_email_last_sent_at");
 9627
 9628                    b.Property<DateTime?>("AccountEmailWindowEndsAt")
 9629                        .HasColumnType("timestamp with time zone")
 9630                        .HasColumnName("account_email_window_ends_at");
 9631
 9632                    b.Property<int>("AccountEmailsSent")
 9633                        .HasColumnType("integer")
 9634                        .HasColumnName("account_emails_sent");
 9635
 9636                    b.Property<DateTime?>("AnonymisedAt")
 9637                        .HasColumnType("timestamp with time zone")
 9638                        .HasColumnName("anonymised_at");
 9639
 9640                    b.Property<DateTime?>("BasisRecordedAt")
 9641                        .HasColumnType("timestamp with time zone")
 9642                        .HasColumnName("basis_recorded_at");
 9643
 9644                    b.Property<DateTime>("CreatedAt")
 9645                        .ValueGeneratedOnAdd()
 9646                        .HasColumnType("timestamp with time zone")
 9647                        .HasColumnName("created_at")
 9648                        .HasDefaultValueSql("now()");
 9649
 9650                    b.Property<DateTime?>("DeletedAt")
 9651                        .HasColumnType("timestamp with time zone")
 9652                        .HasColumnName("deleted_at");
 9653
 9654                    b.Property<int?>("DeletionKind")
 9655                        .HasColumnType("integer")
 9656                        .HasColumnName("deletion_kind");
 9657
 9658                    b.Property<string>("Email")
 9659                        .IsRequired()
 9660                        .HasMaxLength(256)
 9661                        .HasColumnType("character varying(256)")
 9662                        .HasColumnName("email");
 9663
 9664                    b.Property<bool>("EmailVerified")
 9665                        .ValueGeneratedOnAdd()
 9666                        .HasColumnType("boolean")
 9667                        .HasDefaultValue(false)
 9668                        .HasColumnName("email_verified");
 9669
 9670                    b.Property<string>("ErasureBlockedReason")
 9671                        .HasMaxLength(500)
 9672                        .HasColumnType("character varying(500)")
 9673                        .HasColumnName("erasure_blocked_reason");
 9674
 9675                    b.Property<DateTime?>("ErasureDueAt")
 9676                        .HasColumnType("timestamp with time zone")
 9677                        .HasColumnName("erasure_due_at");
 9678
 9679                    b.Property<DateTime?>("ErasureRequestedAt")
 9680                        .HasColumnType("timestamp with time zone")
 9681                        .HasColumnName("erasure_requested_at");
 9682
 9683                    b.Property<int>("FailedLoginAttempts")
 9684                        .HasColumnType("integer")
 9685                        .HasColumnName("failed_login_attempts");
 9686
 9687                    b.Property<int>("FailedReauthenticationAttempts")
 9688                        .HasColumnType("integer")
 9689                        .HasColumnName("failed_reauthentication_attempts");
 9690
 9691                    b.Property<int>("FailedSecondFactorAttempts")
 9692                        .HasColumnType("integer")
 9693                        .HasColumnName("failed_second_factor_attempts");
 9694
 9695                    b.Property<bool>("IsDeleted")
 9696                        .ValueGeneratedOnAdd()
 9697                        .HasColumnType("boolean")
 9698                        .HasDefaultValue(false)
 9699                        .HasColumnName("is_deleted");
 9700
 9701                    b.Property<int>("LegalBasis")
 9702                        .ValueGeneratedOnAdd()
 9703                        .HasColumnType("integer")
 9704                        .HasDefaultValue(0)
 9705                        .HasColumnName("legal_basis");
 9706
 9707                    b.Property<DateTime?>("LockedOutUntil")
 9708                        .HasColumnType("timestamp with time zone")
 9709                        .HasColumnName("locked_out_until");
 9710
 9711                    b.Property<string>("Name")
 9712                        .IsRequired()
 9713                        .HasMaxLength(200)
 9714                        .HasColumnType("character varying(200)")
 9715                        .HasColumnName("name");
 9716
 9717                    b.Property<byte[]>("PasswordHash")
 9718                        .IsRequired()
 9719                        .HasColumnType("bytea")
 9720                        .HasColumnName("password_hash");
 9721
 9722                    b.Property<string>("PrivacyNoticeVersion")
 9723                        .HasMaxLength(50)
 9724                        .HasColumnType("character varying(50)")
 9725                        .HasColumnName("privacy_notice_version");
 9726
 9727                    b.Property<DateTime?>("ProcessingRestrictedAt")
 9728                        .HasColumnType("timestamp with time zone")
 9729                        .HasColumnName("processing_restricted_at");
 9730
 9731                    b.Property<Guid>("PublicId")
 9732                        .HasColumnType("uuid")
 9733                        .HasColumnName("public_id");
 9734
 9735                    b.Property<DateTime?>("ReauthenticationPausedUntil")
 9736                        .HasColumnType("timestamp with time zone")
 9737                        .HasColumnName("reauthentication_paused_until");
 9738
 9739                    b.Property<DateTime?>("ReauthenticationWindowStartedAt")
 9740                        .HasColumnType("timestamp with time zone")
 9741                        .HasColumnName("reauthentication_window_started_at");
 9742
 9743                    b.Property<int?>("RestrictionGround")
 9744                        .HasColumnType("integer")
 9745                        .HasColumnName("restriction_ground");
 9746
 9747                    b.Property<DateTime?>("RestrictionLiftNotifiedAt")
 9748                        .HasColumnType("timestamp with time zone")
 9749                        .HasColumnName("restriction_lift_notified_at");
 9750
 9751                    b.Property<long>("RoleId")
 9752                        .HasColumnType("bigint")
 9753                        .HasColumnName("role_id");
 9754
 9755                    b.Property<byte[]>("Salt")
 9756                        .IsRequired()
 9757                        .HasColumnType("bytea")
 9758                        .HasColumnName("salt");
 9759
 9760                    b.Property<long?>("ScopeId")
 9761                        .HasColumnType("bigint")
 9762                        .HasColumnName("scope_id");
 9763
 9764                    b.Property<DateTime?>("SecondFactorLockedOutUntil")
 9765                        .HasColumnType("timestamp with time zone")
 9766                        .HasColumnName("second_factor_locked_out_until");
 9767
 9768                    b.Property<int>("SecondFactorLockouts")
 9769                        .HasColumnType("integer")
 9770                        .HasColumnName("second_factor_lockouts");
 9771
 9772                    b.Property<Guid>("SecurityStamp")
 9773                        .ValueGeneratedOnAdd()
 9774                        .HasColumnType("uuid")
 9775                        .HasColumnName("security_stamp")
 9776                        .HasDefaultValueSql("gen_random_uuid()");
 9777
 9778                    b.Property<DateTime>("UpdatedAt")
 9779                        .ValueGeneratedOnAdd()
 9780                        .HasColumnType("timestamp with time zone")
 9781                        .HasColumnName("updated_at")
 9782                        .HasDefaultValueSql("now()");
 9783
 9784                    b.HasKey("Id")
 9785                        .HasName("pk_person");
 9786
 9787                    b.HasIndex("DeletedAt")
 9788                        .HasDatabaseName("ix_person_deleted_at")
 9789                        .HasFilter("is_deleted = true AND anonymised_at IS NULL");
 9790
 9791                    b.HasIndex("ProcessingRestrictedAt")
 9792                        .HasDatabaseName("ix_person_processing_restricted_at")
 9793                        .HasFilter("processing_restricted_at IS NOT NULL");
 9794
 9795                    b.HasIndex("PublicId")
 9796                        .IsUnique()
 9797                        .HasDatabaseName("ix_person_public_id");
 9798
 9799                    b.HasIndex("RoleId")
 9800                        .HasDatabaseName("ix_person_role_id");
 9801
 9802                    b.ToTable("person", "heimdall");
 18803                });
 804
 9805            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 9806                {
 9807                    b.Property<long>("Id")
 9808                        .HasColumnType("bigint")
 9809                        .HasColumnName("id")
 9810                        .HasColumnOrder(1);
 9811
 9812                    b.Property<string>("Description")
 9813                        .HasMaxLength(500)
 9814                        .HasColumnType("character varying(500)")
 9815                        .HasColumnName("description");
 9816
 9817                    b.Property<string>("Name")
 9818                        .IsRequired()
 9819                        .HasMaxLength(200)
 9820                        .HasColumnType("character varying(200)")
 9821                        .HasColumnName("name");
 9822
 9823                    b.Property<Guid>("PublicId")
 9824                        .HasColumnType("uuid")
 9825                        .HasColumnName("public_id");
 9826
 9827                    b.HasKey("Id")
 9828                        .HasName("pk_role");
 9829
 9830                    b.HasIndex("Name")
 9831                        .IsUnique()
 9832                        .HasDatabaseName("ix_role_name");
 9833
 9834                    b.HasIndex("PublicId")
 9835                        .IsUnique()
 9836                        .HasDatabaseName("ix_role_public_id");
 9837
 9838                    b.ToTable("role", "heimdall");
 18839                });
 840
 9841            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 9842                {
 9843                    b.Property<long>("Id")
 9844                        .ValueGeneratedOnAdd()
 9845                        .HasColumnType("bigint")
 9846                        .HasColumnName("id")
 9847                        .HasColumnOrder(1);
 9848
 9849                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 9850
 9851                    b.Property<DateTime>("CreatedAt")
 9852                        .ValueGeneratedOnAdd()
 9853                        .HasColumnType("timestamp with time zone")
 9854                        .HasColumnName("created_at")
 9855                        .HasDefaultValueSql("now()");
 9856
 9857                    b.Property<int?>("DefaultLegalBasis")
 9858                        .HasColumnType("integer")
 9859                        .HasColumnName("default_legal_basis");
 9860
 9861                    b.Property<string>("Description")
 9862                        .HasMaxLength(500)
 9863                        .HasColumnType("character varying(500)")
 9864                        .HasColumnName("description");
 9865
 9866                    b.Property<string>("EmailVerificationUrl")
 9867                        .HasMaxLength(2048)
 9868                        .HasColumnType("character varying(2048)")
 9869                        .HasColumnName("email_verification_url");
 9870
 9871                    b.Property<bool>("GoogleSignInEnabled")
 9872                        .ValueGeneratedOnAdd()
 9873                        .HasColumnType("boolean")
 9874                        .HasDefaultValue(false)
 9875                        .HasColumnName("google_sign_in_enabled");
 9876
 9877                    b.Property<bool>("IsDeleted")
 9878                        .ValueGeneratedOnAdd()
 9879                        .HasColumnType("boolean")
 9880                        .HasDefaultValue(false)
 9881                        .HasColumnName("is_deleted");
 9882
 9883                    b.Property<string>("Name")
 9884                        .IsRequired()
 9885                        .HasMaxLength(200)
 9886                        .HasColumnType("character varying(200)")
 9887                        .HasColumnName("name");
 9888
 9889                    b.Property<string>("PasswordResetUrl")
 9890                        .HasMaxLength(2048)
 9891                        .HasColumnType("character varying(2048)")
 9892                        .HasColumnName("password_reset_url");
 9893
 9894                    b.Property<string>("PrivacyNoticeUri")
 9895                        .HasMaxLength(2048)
 9896                        .HasColumnType("character varying(2048)")
 9897                        .HasColumnName("privacy_notice_uri");
 9898
 9899                    b.Property<Guid>("PublicId")
 9900                        .HasColumnType("uuid")
 9901                        .HasColumnName("public_id");
 9902
 9903                    b.Property<bool>("SelfRegistrationEnabled")
 9904                        .ValueGeneratedOnAdd()
 9905                        .HasColumnType("boolean")
 9906                        .HasDefaultValue(false)
 9907                        .HasColumnName("self_registration_enabled");
 9908
 9909                    b.Property<DateTime>("UpdatedAt")
 9910                        .ValueGeneratedOnAdd()
 9911                        .HasColumnType("timestamp with time zone")
 9912                        .HasColumnName("updated_at")
 9913                        .HasDefaultValueSql("now()");
 9914
 9915                    b.HasKey("Id")
 9916                        .HasName("pk_scope");
 9917
 9918                    b.HasIndex("Name")
 9919                        .IsUnique()
 9920                        .HasDatabaseName("ix_scope_name");
 9921
 9922                    b.HasIndex("PublicId")
 9923                        .IsUnique()
 9924                        .HasDatabaseName("ix_scope_public_id");
 9925
 9926                    b.ToTable("scope", "heimdall");
 18927                });
 928
 9929            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 9930                {
 9931                    b.Property<long>("ScopeId")
 9932                        .HasColumnType("bigint")
 9933                        .HasColumnName("scope_id");
 9934
 9935                    b.Property<long>("PersonId")
 9936                        .HasColumnType("bigint")
 9937                        .HasColumnName("person_id");
 9938
 9939                    b.HasKey("ScopeId", "PersonId")
 9940                        .HasName("pk_scope_owner");
 9941
 9942                    b.HasIndex("PersonId")
 9943                        .HasDatabaseName("ix_scope_owner_person_id");
 9944
 9945                    b.ToTable("scope_owner", "heimdall");
 18946                });
 947
 9948            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwnerInvitation", b =>
 9949                {
 9950                    b.Property<long>("Id")
 9951                        .ValueGeneratedOnAdd()
 9952                        .HasColumnType("bigint")
 9953                        .HasColumnName("id")
 9954                        .HasColumnOrder(1);
 9955
 9956                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 9957
 9958                    b.Property<DateTime>("CreatedAt")
 9959                        .ValueGeneratedOnAdd()
 9960                        .HasColumnType("timestamp with time zone")
 9961                        .HasColumnName("created_at")
 9962                        .HasDefaultValueSql("now()");
 9963
 9964                    b.Property<DateTime?>("EndedAt")
 9965                        .HasColumnType("timestamp with time zone")
 9966                        .HasColumnName("ended_at");
 9967
 9968                    b.Property<DateTime>("ExpiresAt")
 9969                        .HasColumnType("timestamp with time zone")
 9970                        .HasColumnName("expires_at");
 9971
 9972                    b.Property<long?>("InvitedByPersonId")
 9973                        .HasColumnType("bigint")
 9974                        .HasColumnName("invited_by_person_id");
 9975
 9976                    b.Property<long>("InviteePersonId")
 9977                        .HasColumnType("bigint")
 9978                        .HasColumnName("invitee_person_id");
 9979
 9980                    b.Property<short?>("Outcome")
 9981                        .HasColumnType("smallint")
 9982                        .HasColumnName("outcome");
 9983
 9984                    b.Property<Guid>("PublicId")
 9985                        .HasColumnType("uuid")
 9986                        .HasColumnName("public_id");
 9987
 9988                    b.Property<long>("ScopeId")
 9989                        .HasColumnType("bigint")
 9990                        .HasColumnName("scope_id");
 9991
 9992                    b.HasKey("Id")
 9993                        .HasName("pk_scope_owner_invitation");
 9994
 9995                    b.HasIndex("InvitedByPersonId")
 9996                        .HasDatabaseName("ix_scope_owner_invitation_invited_by_person_id");
 9997
 9998                    b.HasIndex("InviteePersonId")
 9999                        .HasDatabaseName("ix_scope_owner_invitation_invitee_person_id");
 91000
 91001                    b.HasIndex("PublicId")
 91002                        .IsUnique()
 91003                        .HasDatabaseName("ix_scope_owner_invitation_public_id");
 91004
 91005                    b.HasIndex("ScopeId", "InviteePersonId")
 91006                        .IsUnique()
 91007                        .HasDatabaseName("ix_scope_owner_invitation_scope_id_invitee_person_id")
 91008                        .HasFilter("ended_at IS NULL");
 91009
 91010                    b.ToTable("scope_owner_invitation", "heimdall", t =>
 91011                        {
 91012                            t.HasCheckConstraint("ck_scope_owner_invitation_outcome_ends_it", "outcome IS NULL OR ended_
 91013
 91014                            t.HasCheckConstraint("ck_scope_owner_invitation_outcome_known", "outcome IS NULL OR outcome 
 181015                        });
 181016                });
 1017
 91018            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 91019                {
 91020                    b.Property<long>("Id")
 91021                        .ValueGeneratedOnAdd()
 91022                        .HasColumnType("bigint")
 91023                        .HasColumnName("id")
 91024                        .HasColumnOrder(1);
 91025
 91026                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 91027
 91028                    b.Property<DateTime>("CreatedAt")
 91029                        .ValueGeneratedOnAdd()
 91030                        .HasColumnType("timestamp with time zone")
 91031                        .HasColumnName("created_at")
 91032                        .HasDefaultValueSql("now()");
 91033
 91034                    b.Property<string>("Description")
 91035                        .HasMaxLength(500)
 91036                        .HasColumnType("character varying(500)")
 91037                        .HasColumnName("description");
 91038
 91039                    b.Property<bool>("IncludeAsJwtClaim")
 91040                        .ValueGeneratedOnAdd()
 91041                        .HasColumnType("boolean")
 91042                        .HasDefaultValue(false)
 91043                        .HasColumnName("include_as_jwt_claim");
 91044
 91045                    b.Property<bool>("IsDeleted")
 91046                        .ValueGeneratedOnAdd()
 91047                        .HasColumnType("boolean")
 91048                        .HasDefaultValue(false)
 91049                        .HasColumnName("is_deleted");
 91050
 91051                    b.Property<string>("Name")
 91052                        .IsRequired()
 91053                        .HasMaxLength(200)
 91054                        .HasColumnType("character varying(200)")
 91055                        .HasColumnName("name");
 91056
 91057                    b.Property<Guid>("PublicId")
 91058                        .HasColumnType("uuid")
 91059                        .HasColumnName("public_id");
 91060
 91061                    b.Property<long>("ScopeId")
 91062                        .HasColumnType("bigint")
 91063                        .HasColumnName("scope_id");
 91064
 91065                    b.Property<DateTime>("UpdatedAt")
 91066                        .ValueGeneratedOnAdd()
 91067                        .HasColumnType("timestamp with time zone")
 91068                        .HasColumnName("updated_at")
 91069                        .HasDefaultValueSql("now()");
 91070
 91071                    b.HasKey("Id")
 91072                        .HasName("pk_scope_permission");
 91073
 91074                    b.HasIndex("PublicId")
 91075                        .IsUnique()
 91076                        .HasDatabaseName("ix_scope_permission_public_id");
 91077
 91078                    b.HasIndex("ScopeId")
 91079                        .HasDatabaseName("ix_scope_permission_scope_id");
 91080
 91081                    b.ToTable("scope_permission", "heimdall");
 181082                });
 1083
 91084            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 91085                {
 91086                    b.Property<long>("ScopeId")
 91087                        .HasColumnType("bigint")
 91088                        .HasColumnName("scope_id");
 91089
 91090                    b.Property<long>("PersonId")
 91091                        .HasColumnType("bigint")
 91092                        .HasColumnName("person_id");
 91093
 91094                    b.HasKey("ScopeId", "PersonId")
 91095                        .HasName("pk_scope_user");
 91096
 91097                    b.HasIndex("PersonId")
 91098                        .IsUnique()
 91099                        .HasDatabaseName("ix_scope_user_person_id");
 91100
 91101                    b.ToTable("scope_user", "heimdall");
 181102                });
 1103
 91104            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 91105                {
 91106                    b.Property<long>("Id")
 91107                        .ValueGeneratedOnAdd()
 91108                        .HasColumnType("bigint")
 91109                        .HasColumnName("id")
 91110                        .HasColumnOrder(1);
 91111
 91112                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 91113
 91114                    b.Property<bool>("AppEnabled")
 91115                        .ValueGeneratedOnAdd()
 91116                        .HasColumnType("boolean")
 91117                        .HasDefaultValue(false)
 91118                        .HasColumnName("app_enabled");
 91119
 91120                    b.Property<int>("ChallengeAttempts")
 91121                        .ValueGeneratedOnAdd()
 91122                        .HasColumnType("integer")
 91123                        .HasDefaultValue(0)
 91124                        .HasColumnName("challenge_attempts");
 91125
 91126                    b.Property<Guid?>("ChallengeId")
 91127                        .HasColumnType("uuid")
 91128                        .HasColumnName("challenge_id");
 91129
 91130                    b.Property<DateTime>("CreatedAt")
 91131                        .ValueGeneratedOnAdd()
 91132                        .HasColumnType("timestamp with time zone")
 91133                        .HasColumnName("created_at")
 91134                        .HasDefaultValueSql("now()");
 91135
 91136                    b.Property<int>("EmailCodeReissueCount")
 91137                        .ValueGeneratedOnAdd()
 91138                        .HasColumnType("integer")
 91139                        .HasDefaultValue(0)
 91140                        .HasColumnName("email_code_reissue_count");
 91141
 91142                    b.Property<bool>("EmailEnabled")
 91143                        .ValueGeneratedOnAdd()
 91144                        .HasColumnType("boolean")
 91145                        .HasDefaultValue(false)
 91146                        .HasColumnName("email_enabled");
 91147
 91148                    b.Property<bool>("IsActive")
 91149                        .ValueGeneratedOnAdd()
 91150                        .HasColumnType("boolean")
 91151                        .HasDefaultValue(false)
 91152                        .HasColumnName("is_active");
 91153
 91154                    b.Property<long?>("LastTotpTimeStepUsed")
 91155                        .HasColumnType("bigint")
 91156                        .HasColumnName("last_totp_time_step_used");
 91157
 91158                    b.Property<long>("PersonId")
 91159                        .HasColumnType("bigint")
 91160                        .HasColumnName("person_id");
 91161
 91162                    b.Property<byte[]>("TotpSecretEncrypted")
 91163                        .HasColumnType("bytea")
 91164                        .HasColumnName("totp_secret_encrypted");
 91165
 91166                    b.Property<DateTime>("UpdatedAt")
 91167                        .ValueGeneratedOnAdd()
 91168                        .HasColumnType("timestamp with time zone")
 91169                        .HasColumnName("updated_at")
 91170                        .HasDefaultValueSql("now()");
 91171
 91172                    b.HasKey("Id")
 91173                        .HasName("pk_two_factor_auth");
 91174
 91175                    b.HasIndex("PersonId")
 91176                        .IsUnique()
 91177                        .HasDatabaseName("ix_two_factor_auth_person_id");
 91178
 91179                    b.ToTable("two_factor_auth", "heimdall");
 181180                });
 1181
 91182            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 91183                {
 91184                    b.Property<long>("Id")
 91185                        .ValueGeneratedOnAdd()
 91186                        .HasColumnType("bigint")
 91187                        .HasColumnName("id")
 91188                        .HasColumnOrder(1);
 91189
 91190                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 91191
 91192                    b.Property<byte[]>("CodeHash")
 91193                        .IsRequired()
 91194                        .HasColumnType("bytea")
 91195                        .HasColumnName("code_hash");
 91196
 91197                    b.Property<DateTime>("CreatedAt")
 91198                        .ValueGeneratedOnAdd()
 91199                        .HasColumnType("timestamp with time zone")
 91200                        .HasColumnName("created_at")
 91201                        .HasDefaultValueSql("now()");
 91202
 91203                    b.Property<DateTime>("ExpiresAt")
 91204                        .HasColumnType("timestamp with time zone")
 91205                        .HasColumnName("expires_at");
 91206
 91207                    b.Property<int>("FailedAttempts")
 91208                        .HasColumnType("integer")
 91209                        .HasColumnName("failed_attempts");
 91210
 91211                    b.Property<byte[]>("Salt")
 91212                        .IsRequired()
 91213                        .HasColumnType("bytea")
 91214                        .HasColumnName("salt");
 91215
 91216                    b.Property<long>("TwoFactorAuthId")
 91217                        .HasColumnType("bigint")
 91218                        .HasColumnName("two_factor_auth_id");
 91219
 91220                    b.Property<bool>("Used")
 91221                        .ValueGeneratedOnAdd()
 91222                        .HasColumnType("boolean")
 91223                        .HasDefaultValue(false)
 91224                        .HasColumnName("used");
 91225
 91226                    b.HasKey("Id")
 91227                        .HasName("pk_two_factor_email_code");
 91228
 91229                    b.HasIndex("TwoFactorAuthId")
 91230                        .HasDatabaseName("ix_two_factor_email_code_two_factor_auth_id");
 91231
 91232                    b.ToTable("two_factor_email_code", "heimdall");
 181233                });
 1234
 91235            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 91236                {
 91237                    b.Property<long>("Id")
 91238                        .ValueGeneratedOnAdd()
 91239                        .HasColumnType("bigint")
 91240                        .HasColumnName("id")
 91241                        .HasColumnOrder(1);
 91242
 91243                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 91244
 91245                    b.Property<byte[]>("CodeHash")
 91246                        .IsRequired()
 91247                        .HasColumnType("bytea")
 91248                        .HasColumnName("code_hash");
 91249
 91250                    b.Property<DateTime>("CreatedAt")
 91251                        .ValueGeneratedOnAdd()
 91252                        .HasColumnType("timestamp with time zone")
 91253                        .HasColumnName("created_at")
 91254                        .HasDefaultValueSql("now()");
 91255
 91256                    b.Property<long>("TwoFactorAuthId")
 91257                        .HasColumnType("bigint")
 91258                        .HasColumnName("two_factor_auth_id");
 91259
 91260                    b.Property<bool>("Used")
 91261                        .ValueGeneratedOnAdd()
 91262                        .HasColumnType("boolean")
 91263                        .HasDefaultValue(false)
 91264                        .HasColumnName("used");
 91265
 91266                    b.Property<DateTime?>("UsedAt")
 91267                        .HasColumnType("timestamp with time zone")
 91268                        .HasColumnName("used_at");
 91269
 91270                    b.HasKey("Id")
 91271                        .HasName("pk_two_factor_recovery_code");
 91272
 91273                    b.HasIndex("TwoFactorAuthId")
 91274                        .HasDatabaseName("ix_two_factor_recovery_code_two_factor_auth_id");
 91275
 91276                    b.ToTable("two_factor_recovery_code", "heimdall");
 181277                });
 1278
 91279            modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b =>
 91280                {
 91281                    b.Property<int>("Id")
 91282                        .ValueGeneratedOnAdd()
 91283                        .HasColumnType("integer")
 91284                        .HasColumnName("id");
 91285
 91286                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 91287
 91288                    b.Property<string>("FriendlyName")
 91289                        .HasColumnType("text")
 91290                        .HasColumnName("friendly_name");
 91291
 91292                    b.Property<string>("Xml")
 91293                        .HasColumnType("text")
 91294                        .HasColumnName("xml");
 91295
 91296                    b.HasKey("Id")
 91297                        .HasName("pk_data_protection_keys");
 91298
 91299                    b.ToTable("data_protection_keys", "heimdall");
 181300                });
 1301
 91302            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 91303                {
 91304                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Owner")
 91305                        .WithMany("OwnedApplications")
 91306                        .HasForeignKey("OwnerId")
 91307                        .OnDelete(DeleteBehavior.Cascade)
 91308                        .IsRequired()
 91309                        .HasConstraintName("fk_application_person_owner_id");
 91310
 91311                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 91312                        .WithMany("Applications")
 91313                        .HasForeignKey("ScopeId")
 91314                        .OnDelete(DeleteBehavior.Cascade)
 91315                        .IsRequired()
 91316                        .HasConstraintName("fk_application_scope_scope_id");
 91317
 91318                    b.Navigation("Owner");
 91319
 91320                    b.Navigation("Scope");
 181321                });
 1322
 91323            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ApplicationCredential", b =>
 91324                {
 91325                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Application", "Application")
 91326                        .WithMany("Credentials")
 91327                        .HasForeignKey("ApplicationId")
 91328                        .OnDelete(DeleteBehavior.Cascade)
 91329                        .IsRequired()
 91330                        .HasConstraintName("fk_application_credential_application_application_id");
 91331
 91332                    b.Navigation("Application");
 181333                });
 1334
 91335            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 91336                {
 91337                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 91338                        .WithMany("EmailVerificationTokens")
 91339                        .HasForeignKey("PersonId")
 91340                        .OnDelete(DeleteBehavior.Cascade)
 91341                        .IsRequired()
 91342                        .HasConstraintName("fk_email_verification_token_person_person_id");
 91343
 91344                    b.Navigation("Person");
 181345                });
 1346
 91347            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 91348                {
 91349                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 91350                        .WithMany("GoogleUsers")
 91351                        .HasForeignKey("ScopeId")
 91352                        .OnDelete(DeleteBehavior.Cascade)
 91353                        .IsRequired()
 91354                        .HasConstraintName("fk_google_user_scope_scope_id");
 91355
 91356                    b.Navigation("Scope");
 181357                });
 1358
 91359            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 91360                {
 91361                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 91362                        .WithMany("PasswordResetTokens")
 91363                        .HasForeignKey("PersonId")
 91364                        .OnDelete(DeleteBehavior.Cascade)
 91365                        .IsRequired()
 91366                        .HasConstraintName("fk_password_reset_token_person_person_id");
 91367
 91368                    b.Navigation("Person");
 181369                });
 1370
 91371            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PendingRegistration", b =>
 91372                {
 91373                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 91374                        .WithMany()
 91375                        .HasForeignKey("ScopeId")
 91376                        .OnDelete(DeleteBehavior.Cascade)
 91377                        .IsRequired()
 91378                        .HasConstraintName("fk_pending_registration_scope_scope_id");
 91379
 91380                    b.Navigation("Scope");
 181381                });
 1382
 91383            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 91384                {
 91385                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Role", "Role")
 91386                        .WithMany("Persons")
 91387                        .HasForeignKey("RoleId")
 91388                        .OnDelete(DeleteBehavior.Restrict)
 91389                        .IsRequired()
 91390                        .HasConstraintName("fk_person_roles_role_id");
 91391
 91392                    b.Navigation("Role");
 181393                });
 1394
 91395            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 91396                {
 91397                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 91398                        .WithMany("ScopeOwnerships")
 91399                        .HasForeignKey("PersonId")
 91400                        .OnDelete(DeleteBehavior.Cascade)
 91401                        .IsRequired()
 91402                        .HasConstraintName("fk_scope_owner_person_person_id");
 91403
 91404                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 91405                        .WithMany("Owners")
 91406                        .HasForeignKey("ScopeId")
 91407                        .OnDelete(DeleteBehavior.Cascade)
 91408                        .IsRequired()
 91409                        .HasConstraintName("fk_scope_owner_scope_scope_id");
 91410
 91411                    b.Navigation("Person");
 91412
 91413                    b.Navigation("Scope");
 181414                });
 1415
 91416            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwnerInvitation", b =>
 91417                {
 91418                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "InvitedBy")
 91419                        .WithMany()
 91420                        .HasForeignKey("InvitedByPersonId")
 91421                        .OnDelete(DeleteBehavior.SetNull)
 91422                        .HasConstraintName("fk_scope_owner_invitation_person_invited_by_person_id");
 91423
 91424                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Invitee")
 91425                        .WithMany()
 91426                        .HasForeignKey("InviteePersonId")
 91427                        .OnDelete(DeleteBehavior.Cascade)
 91428                        .IsRequired()
 91429                        .HasConstraintName("fk_scope_owner_invitation_person_invitee_person_id");
 91430
 91431                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 91432                        .WithMany()
 91433                        .HasForeignKey("ScopeId")
 91434                        .OnDelete(DeleteBehavior.Cascade)
 91435                        .IsRequired()
 91436                        .HasConstraintName("fk_scope_owner_invitation_scope_scope_id");
 91437
 91438                    b.Navigation("InvitedBy");
 91439
 91440                    b.Navigation("Invitee");
 91441
 91442                    b.Navigation("Scope");
 181443                });
 1444
 91445            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 91446                {
 91447                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 91448                        .WithMany("ScopePermissions")
 91449                        .HasForeignKey("ScopeId")
 91450                        .OnDelete(DeleteBehavior.Cascade)
 91451                        .IsRequired()
 91452                        .HasConstraintName("fk_scope_permission_scope_scope_id");
 91453
 91454                    b.Navigation("Scope");
 181455                });
 1456
 91457            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 91458                {
 91459                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 91460                        .WithOne("ScopeMembership")
 91461                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.ScopeUser", "PersonId")
 91462                        .OnDelete(DeleteBehavior.Cascade)
 91463                        .IsRequired()
 91464                        .HasConstraintName("fk_scope_user_person_person_id");
 91465
 91466                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 91467                        .WithMany("Users")
 91468                        .HasForeignKey("ScopeId")
 91469                        .OnDelete(DeleteBehavior.Cascade)
 91470                        .IsRequired()
 91471                        .HasConstraintName("fk_scope_user_scope_scope_id");
 91472
 91473                    b.Navigation("Person");
 91474
 91475                    b.Navigation("Scope");
 181476                });
 1477
 91478            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 91479                {
 91480                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 91481                        .WithOne("TwoFactorAuth")
 91482                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "PersonId")
 91483                        .OnDelete(DeleteBehavior.Cascade)
 91484                        .IsRequired()
 91485                        .HasConstraintName("fk_two_factor_auth_person_person_id");
 91486
 91487                    b.Navigation("Person");
 181488                });
 1489
 91490            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 91491                {
 91492                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 91493                        .WithMany("EmailCodes")
 91494                        .HasForeignKey("TwoFactorAuthId")
 91495                        .OnDelete(DeleteBehavior.Cascade)
 91496                        .IsRequired()
 91497                        .HasConstraintName("fk_two_factor_email_code_two_factor_auth_two_factor_auth_id");
 91498
 91499                    b.Navigation("TwoFactorAuth");
 181500                });
 1501
 91502            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 91503                {
 91504                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 91505                        .WithMany("RecoveryCodes")
 91506                        .HasForeignKey("TwoFactorAuthId")
 91507                        .OnDelete(DeleteBehavior.Cascade)
 91508                        .IsRequired()
 91509                        .HasConstraintName("fk_two_factor_recovery_code_two_factor_auth_two_factor_auth_id");
 91510
 91511                    b.Navigation("TwoFactorAuth");
 181512                });
 1513
 91514            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 91515                {
 91516                    b.Navigation("Credentials");
 181517                });
 1518
 91519            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 91520                {
 91521                    b.Navigation("EmailVerificationTokens");
 91522
 91523                    b.Navigation("OwnedApplications");
 91524
 91525                    b.Navigation("PasswordResetTokens");
 91526
 91527                    b.Navigation("ScopeMembership");
 91528
 91529                    b.Navigation("ScopeOwnerships");
 91530
 91531                    b.Navigation("TwoFactorAuth");
 181532                });
 1533
 91534            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 91535                {
 91536                    b.Navigation("Persons");
 181537                });
 1538
 91539            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 91540                {
 91541                    b.Navigation("Applications");
 91542
 91543                    b.Navigation("GoogleUsers");
 91544
 91545                    b.Navigation("Owners");
 91546
 91547                    b.Navigation("ScopePermissions");
 91548
 91549                    b.Navigation("Users");
 181550                });
 1551
 91552            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 91553                {
 91554                    b.Navigation("EmailCodes");
 91555
 91556                    b.Navigation("RecoveryCodes");
 181557                });
 1558#pragma warning restore 612, 618
 91559        }
 1560    }
 1561}