< Summary - Heimdall API

Line coverage
100%
Covered lines: 1521
Uncovered lines: 0
Coverable lines: 1521
Total lines: 1627
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/20261021161812_AddAuditRetentionIndexes.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore.Migrations;
 2
 3#nullable disable
 4
 5namespace ArturRios.Heimdall.Data.Migrations
 6{
 7    /// <summary>
 8    ///     Adds two partial indexes on AUDIT_LOG.created_at — over the entries that still have an actor,
 9    ///     and over those that still have a target — so NFR-21's pass finds the entries past their
 10    ///     attribution period by reading only those, oldest first, instead of the whole trail (#206).
 11    /// </summary>
 12    /// <remarks>
 13    ///     <para>
 14    ///         The pass used to evaluate up to four correlated subqueries for every attributed entry in the
 15    ///         attribution window, so a run with nothing due still read the whole window, on every
 16    ///         instance, every run. It now asks each ground separately; the two grounds of age are served by
 17    ///         these, the grounds of identity by the existing indexes on actor_person_id and target_id. Each
 18    ///         index is partial, so it holds only the rows its query can still return and shrinks as the
 19    ///         pass clears them.
 20    ///     </para>
 21    ///     <para>
 22    ///         Built with <c>CREATE INDEX CONCURRENTLY</c>, outside the migration's transaction: audit_log
 23    ///         takes a row for every command, and a plain build would block those writes for as long as it
 24    ///         reads the table. <c>IF NOT EXISTS</c> lets a build interrupted part-way be run again; one
 25    ///         that failed leaves an invalid index, which an operator drops before re-running. Adding an
 26    ///         index is DDL, not a row change, so the append-only triggers neither see it nor need changing.
 27    ///     </para>
 28    /// </remarks>
 29    public partial class AddAuditRetentionIndexes : Migration
 30    {
 31        /// <inheritdoc />
 32        protected override void Up(MigrationBuilder migrationBuilder)
 33        {
 1934            migrationBuilder.Sql(
 1935                """
 1936                CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_audit_log_created_at_attributed
 1937                    ON heimdall.audit_log (created_at)
 1938                    WHERE actor_person_id IS NOT NULL;
 1939                """,
 1940                suppressTransaction: true);
 41
 1942            migrationBuilder.Sql(
 1943                """
 1944                CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_audit_log_created_at_targeted
 1945                    ON heimdall.audit_log (created_at)
 1946                    WHERE target_id IS NOT NULL;
 1947                """,
 1948                suppressTransaction: true);
 1949        }
 50
 51        /// <inheritdoc />
 52        protected override void Down(MigrationBuilder migrationBuilder)
 53        {
 154            migrationBuilder.Sql(
 155                "DROP INDEX CONCURRENTLY IF EXISTS heimdall.ix_audit_log_created_at_attributed;",
 156                suppressTransaction: true);
 57
 158            migrationBuilder.Sql(
 159                "DROP INDEX CONCURRENTLY IF EXISTS heimdall.ix_audit_log_created_at_targeted;",
 160                suppressTransaction: true);
 161        }
 62    }
 63}

/home/ci/agent/workspace/heimdall-api-docs_main/app/src/Infrastructure/ArturRios.Heimdall.Data/Migrations/20261021161812_AddAuditRetentionIndexes.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("20261021161812_AddAuditRetentionIndexes")]
 16    partial class AddAuditRetentionIndexes
 17    {
 18        /// <inheritdoc />
 19        protected override void BuildTargetModel(ModelBuilder modelBuilder)
 20        {
 21#pragma warning disable 612, 618
 1022            modelBuilder
 1023                .HasDefaultSchema("heimdall")
 1024                .HasAnnotation("ProductVersion", "10.0.13")
 1025                .HasAnnotation("Relational:MaxIdentifierLength", 63);
 26
 1027            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
 28
 1029            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 1030                {
 1031                    b.Property<long>("Id")
 1032                        .ValueGeneratedOnAdd()
 1033                        .HasColumnType("bigint")
 1034                        .HasColumnName("id")
 1035                        .HasColumnOrder(1);
 1036
 1037                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 1038
 1039                    b.Property<DateTime>("CreatedAt")
 1040                        .ValueGeneratedOnAdd()
 1041                        .HasColumnType("timestamp with time zone")
 1042                        .HasColumnName("created_at")
 1043                        .HasDefaultValueSql("now()");
 1044
 1045                    b.Property<bool>("IsDeleted")
 1046                        .ValueGeneratedOnAdd()
 1047                        .HasColumnType("boolean")
 1048                        .HasDefaultValue(false)
 1049                        .HasColumnName("is_deleted");
 1050
 1051                    b.Property<string>("Name")
 1052                        .IsRequired()
 1053                        .HasMaxLength(200)
 1054                        .HasColumnType("character varying(200)")
 1055                        .HasColumnName("name");
 1056
 1057                    b.Property<long>("OwnerId")
 1058                        .HasColumnType("bigint")
 1059                        .HasColumnName("owner_id");
 1060
 1061                    b.Property<Guid>("PublicId")
 1062                        .HasColumnType("uuid")
 1063                        .HasColumnName("public_id");
 1064
 1065                    b.Property<long>("ScopeId")
 1066                        .HasColumnType("bigint")
 1067                        .HasColumnName("scope_id");
 1068
 1069                    b.Property<DateTime>("UpdatedAt")
 1070                        .ValueGeneratedOnAdd()
 1071                        .HasColumnType("timestamp with time zone")
 1072                        .HasColumnName("updated_at")
 1073                        .HasDefaultValueSql("now()");
 1074
 1075                    b.HasKey("Id")
 1076                        .HasName("pk_application");
 1077
 1078                    b.HasIndex("OwnerId")
 1079                        .HasDatabaseName("ix_application_owner_id");
 1080
 1081                    b.HasIndex("PublicId")
 1082                        .IsUnique()
 1083                        .HasDatabaseName("ix_application_public_id");
 1084
 1085                    b.HasIndex("ScopeId")
 1086                        .HasDatabaseName("ix_application_scope_id");
 1087
 1088                    b.ToTable("application", "heimdall");
 2089                });
 90
 1091            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ApplicationCredential", b =>
 1092                {
 1093                    b.Property<long>("Id")
 1094                        .ValueGeneratedOnAdd()
 1095                        .HasColumnType("bigint")
 1096                        .HasColumnName("id")
 1097                        .HasColumnOrder(1);
 1098
 1099                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10100
 10101                    b.Property<long>("ApplicationId")
 10102                        .HasColumnType("bigint")
 10103                        .HasColumnName("application_id");
 10104
 10105                    b.Property<DateTime>("CreatedAt")
 10106                        .HasColumnType("timestamp with time zone")
 10107                        .HasColumnName("created_at");
 10108
 10109                    b.Property<DateTime?>("ExpiresAt")
 10110                        .HasColumnType("timestamp with time zone")
 10111                        .HasColumnName("expires_at");
 10112
 10113                    b.Property<DateTime?>("LastUsedAt")
 10114                        .HasColumnType("timestamp with time zone")
 10115                        .HasColumnName("last_used_at");
 10116
 10117                    b.Property<Guid>("PublicId")
 10118                        .HasColumnType("uuid")
 10119                        .HasColumnName("public_id");
 10120
 10121                    b.Property<DateTime?>("RevokedAt")
 10122                        .HasColumnType("timestamp with time zone")
 10123                        .HasColumnName("revoked_at");
 10124
 10125                    b.Property<string>("SecretHash")
 10126                        .IsRequired()
 10127                        .HasMaxLength(64)
 10128                        .HasColumnType("character varying(64)")
 10129                        .HasColumnName("secret_hash");
 10130
 10131                    b.HasKey("Id")
 10132                        .HasName("pk_application_credential");
 10133
 10134                    b.HasIndex("ApplicationId")
 10135                        .HasDatabaseName("ix_application_credential_application_id");
 10136
 10137                    b.HasIndex("PublicId")
 10138                        .IsUnique()
 10139                        .HasDatabaseName("ix_application_credential_public_id");
 10140
 10141                    b.HasIndex("SecretHash")
 10142                        .IsUnique()
 10143                        .HasDatabaseName("ix_application_credential_secret_hash");
 10144
 10145                    b.ToTable("application_credential", "heimdall");
 20146                });
 147
 10148            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.AttemptNoticeBudget", b =>
 10149                {
 10150                    b.Property<long>("Id")
 10151                        .ValueGeneratedOnAdd()
 10152                        .HasColumnType("bigint")
 10153                        .HasColumnName("id")
 10154                        .HasColumnOrder(1);
 10155
 10156                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10157
 10158                    b.Property<string>("AddressHash")
 10159                        .IsRequired()
 10160                        .HasMaxLength(64)
 10161                        .HasColumnType("character varying(64)")
 10162                        .HasColumnName("address_hash");
 10163
 10164                    b.Property<int>("NoticesSent")
 10165                        .HasColumnType("integer")
 10166                        .HasColumnName("notices_sent");
 10167
 10168                    b.Property<DateTime>("WindowEndsAt")
 10169                        .HasColumnType("timestamp with time zone")
 10170                        .HasColumnName("window_ends_at");
 10171
 10172                    b.HasKey("Id")
 10173                        .HasName("pk_attempt_notice_budget");
 10174
 10175                    b.HasIndex("AddressHash")
 10176                        .IsUnique()
 10177                        .HasDatabaseName("ix_attempt_notice_budget_address_hash");
 10178
 10179                    b.HasIndex("WindowEndsAt")
 10180                        .HasDatabaseName("ix_attempt_notice_budget_window_ends_at");
 10181
 10182                    b.ToTable("attempt_notice_budget", "heimdall");
 20183                });
 184
 10185            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.AuditLog", b =>
 10186                {
 10187                    b.Property<long>("Id")
 10188                        .ValueGeneratedOnAdd()
 10189                        .HasColumnType("bigint")
 10190                        .HasColumnName("id")
 10191                        .HasColumnOrder(1);
 10192
 10193                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10194
 10195                    b.Property<string>("Action")
 10196                        .IsRequired()
 10197                        .HasMaxLength(200)
 10198                        .HasColumnType("character varying(200)")
 10199                        .HasColumnName("action");
 10200
 10201                    b.Property<Guid?>("ActorPersonId")
 10202                        .HasColumnType("uuid")
 10203                        .HasColumnName("actor_person_id");
 10204
 10205                    b.Property<int?>("ActorRole")
 10206                        .HasColumnType("integer")
 10207                        .HasColumnName("actor_role");
 10208
 10209                    b.Property<DateTime>("CreatedAt")
 10210                        .ValueGeneratedOnAdd()
 10211                        .HasColumnType("timestamp with time zone")
 10212                        .HasColumnName("created_at")
 10213                        .HasDefaultValueSql("now()");
 10214
 10215                    b.Property<string>("FailureReason")
 10216                        .HasMaxLength(500)
 10217                        .HasColumnType("character varying(500)")
 10218                        .HasColumnName("failure_reason");
 10219
 10220                    b.Property<Guid>("PublicId")
 10221                        .HasColumnType("uuid")
 10222                        .HasColumnName("public_id");
 10223
 10224                    b.Property<bool>("Succeeded")
 10225                        .HasColumnType("boolean")
 10226                        .HasColumnName("succeeded");
 10227
 10228                    b.Property<Guid?>("TargetId")
 10229                        .HasColumnType("uuid")
 10230                        .HasColumnName("target_id");
 10231
 10232                    b.HasKey("Id")
 10233                        .HasName("pk_audit_log");
 10234
 10235                    b.HasIndex("ActorPersonId")
 10236                        .HasDatabaseName("ix_audit_log_actor_person_id");
 10237
 10238                    b.HasIndex("CreatedAt")
 10239                        .HasDatabaseName("ix_audit_log_created_at");
 10240
 10241                    b.HasIndex("PublicId")
 10242                        .IsUnique()
 10243                        .HasDatabaseName("ix_audit_log_public_id");
 10244
 10245                    b.HasIndex("TargetId")
 10246                        .HasDatabaseName("ix_audit_log_target_id");
 10247
 10248                    b.HasIndex(new[] { "CreatedAt" }, "ix_audit_log_created_at_attributed")
 10249                        .HasDatabaseName("ix_audit_log_created_at_attributed")
 10250                        .HasFilter("actor_person_id IS NOT NULL");
 10251
 10252                    b.HasIndex(new[] { "CreatedAt" }, "ix_audit_log_created_at_targeted")
 10253                        .HasDatabaseName("ix_audit_log_created_at_targeted")
 10254                        .HasFilter("target_id IS NOT NULL");
 10255
 10256                    b.ToTable("audit_log", "heimdall");
 20257                });
 258
 10259            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 10260                {
 10261                    b.Property<long>("Id")
 10262                        .ValueGeneratedOnAdd()
 10263                        .HasColumnType("bigint")
 10264                        .HasColumnName("id")
 10265                        .HasColumnOrder(1);
 10266
 10267                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10268
 10269                    b.Property<DateTime>("ExpiresAt")
 10270                        .HasColumnType("timestamp with time zone")
 10271                        .HasColumnName("expires_at");
 10272
 10273                    b.Property<long>("PersonId")
 10274                        .HasColumnType("bigint")
 10275                        .HasColumnName("person_id");
 10276
 10277                    b.Property<string>("TokenHash")
 10278                        .IsRequired()
 10279                        .HasMaxLength(64)
 10280                        .HasColumnType("character varying(64)")
 10281                        .HasColumnName("token_hash");
 10282
 10283                    b.Property<bool>("Used")
 10284                        .ValueGeneratedOnAdd()
 10285                        .HasColumnType("boolean")
 10286                        .HasDefaultValue(false)
 10287                        .HasColumnName("used");
 10288
 10289                    b.HasKey("Id")
 10290                        .HasName("pk_email_verification_token");
 10291
 10292                    b.HasIndex("PersonId")
 10293                        .HasDatabaseName("ix_email_verification_token_person_id");
 10294
 10295                    b.HasIndex("TokenHash")
 10296                        .IsUnique()
 10297                        .HasDatabaseName("ix_email_verification_token_token_hash");
 10298
 10299                    b.ToTable("email_verification_token", "heimdall");
 20300                });
 301
 10302            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ErasedSubject", b =>
 10303                {
 10304                    b.Property<Guid>("Id")
 10305                        .HasColumnType("uuid")
 10306                        .HasColumnName("public_id")
 10307                        .HasColumnOrder(1);
 10308
 10309                    b.Property<DateTime>("CreatedAt")
 10310                        .ValueGeneratedOnAdd()
 10311                        .HasColumnType("timestamp with time zone")
 10312                        .HasColumnName("created_at")
 10313                        .HasDefaultValueSql("now()");
 10314
 10315                    b.Property<int>("Kind")
 10316                        .HasColumnType("integer")
 10317                        .HasColumnName("kind");
 10318
 10319                    b.HasKey("Id")
 10320                        .HasName("pk_erased_subject");
 10321
 10322                    b.HasIndex("CreatedAt")
 10323                        .HasDatabaseName("ix_erased_subject_created_at");
 10324
 10325                    b.ToTable("erased_subject", "heimdall");
 20326                });
 327
 10328            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleIdTokenUse", b =>
 10329                {
 10330                    b.Property<string>("Id")
 10331                        .HasMaxLength(64)
 10332                        .HasColumnType("character varying(64)")
 10333                        .HasColumnName("token_hash")
 10334                        .HasColumnOrder(1);
 10335
 10336                    b.Property<DateTime>("ExpiresAt")
 10337                        .HasColumnType("timestamp with time zone")
 10338                        .HasColumnName("expires_at");
 10339
 10340                    b.HasKey("Id")
 10341                        .HasName("pk_google_id_token_use");
 10342
 10343                    b.HasIndex("ExpiresAt")
 10344                        .HasDatabaseName("ix_google_id_token_use_expires_at");
 10345
 10346                    b.ToTable("google_id_token_use", "heimdall");
 20347                });
 348
 10349            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 10350                {
 10351                    b.Property<long>("Id")
 10352                        .ValueGeneratedOnAdd()
 10353                        .HasColumnType("bigint")
 10354                        .HasColumnName("id")
 10355                        .HasColumnOrder(1);
 10356
 10357                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10358
 10359                    b.Property<DateTime?>("AnonymisedAt")
 10360                        .HasColumnType("timestamp with time zone")
 10361                        .HasColumnName("anonymised_at");
 10362
 10363                    b.Property<DateTime?>("BasisRecordedAt")
 10364                        .HasColumnType("timestamp with time zone")
 10365                        .HasColumnName("basis_recorded_at");
 10366
 10367                    b.Property<DateTime>("CreatedAt")
 10368                        .ValueGeneratedOnAdd()
 10369                        .HasColumnType("timestamp with time zone")
 10370                        .HasColumnName("created_at")
 10371                        .HasDefaultValueSql("now()");
 10372
 10373                    b.Property<DateTime?>("DeletedAt")
 10374                        .HasColumnType("timestamp with time zone")
 10375                        .HasColumnName("deleted_at");
 10376
 10377                    b.Property<int?>("DeletionKind")
 10378                        .HasColumnType("integer")
 10379                        .HasColumnName("deletion_kind");
 10380
 10381                    b.Property<string>("Email")
 10382                        .IsRequired()
 10383                        .HasMaxLength(256)
 10384                        .HasColumnType("character varying(256)")
 10385                        .HasColumnName("email");
 10386
 10387                    b.Property<bool>("EmailVerified")
 10388                        .ValueGeneratedOnAdd()
 10389                        .HasColumnType("boolean")
 10390                        .HasDefaultValue(false)
 10391                        .HasColumnName("email_verified");
 10392
 10393                    b.Property<string>("ErasureBlockedReason")
 10394                        .HasMaxLength(500)
 10395                        .HasColumnType("character varying(500)")
 10396                        .HasColumnName("erasure_blocked_reason");
 10397
 10398                    b.Property<DateTime?>("ErasureDueAt")
 10399                        .HasColumnType("timestamp with time zone")
 10400                        .HasColumnName("erasure_due_at");
 10401
 10402                    b.Property<DateTime?>("ErasureRequestedAt")
 10403                        .HasColumnType("timestamp with time zone")
 10404                        .HasColumnName("erasure_requested_at");
 10405
 10406                    b.Property<string>("GoogleId")
 10407                        .IsRequired()
 10408                        .HasMaxLength(255)
 10409                        .HasColumnType("character varying(255)")
 10410                        .HasColumnName("google_id");
 10411
 10412                    b.Property<bool>("IsDeleted")
 10413                        .ValueGeneratedOnAdd()
 10414                        .HasColumnType("boolean")
 10415                        .HasDefaultValue(false)
 10416                        .HasColumnName("is_deleted");
 10417
 10418                    b.Property<int>("LegalBasis")
 10419                        .ValueGeneratedOnAdd()
 10420                        .HasColumnType("integer")
 10421                        .HasDefaultValue(0)
 10422                        .HasColumnName("legal_basis");
 10423
 10424                    b.Property<string>("Name")
 10425                        .IsRequired()
 10426                        .HasMaxLength(200)
 10427                        .HasColumnType("character varying(200)")
 10428                        .HasColumnName("name");
 10429
 10430                    b.Property<string>("PrivacyNoticeVersion")
 10431                        .HasMaxLength(50)
 10432                        .HasColumnType("character varying(50)")
 10433                        .HasColumnName("privacy_notice_version");
 10434
 10435                    b.Property<DateTime?>("ProcessingRestrictedAt")
 10436                        .HasColumnType("timestamp with time zone")
 10437                        .HasColumnName("processing_restricted_at");
 10438
 10439                    b.Property<string>("ProfilePictureUrl")
 10440                        .HasMaxLength(2048)
 10441                        .HasColumnType("character varying(2048)")
 10442                        .HasColumnName("profile_picture_url");
 10443
 10444                    b.Property<Guid>("PublicId")
 10445                        .HasColumnType("uuid")
 10446                        .HasColumnName("public_id");
 10447
 10448                    b.Property<int?>("RestrictionGround")
 10449                        .HasColumnType("integer")
 10450                        .HasColumnName("restriction_ground");
 10451
 10452                    b.Property<DateTime?>("RestrictionLiftNotifiedAt")
 10453                        .HasColumnType("timestamp with time zone")
 10454                        .HasColumnName("restriction_lift_notified_at");
 10455
 10456                    b.Property<long>("ScopeId")
 10457                        .HasColumnType("bigint")
 10458                        .HasColumnName("scope_id");
 10459
 10460                    b.Property<DateTime>("UpdatedAt")
 10461                        .ValueGeneratedOnAdd()
 10462                        .HasColumnType("timestamp with time zone")
 10463                        .HasColumnName("updated_at")
 10464                        .HasDefaultValueSql("now()");
 10465
 10466                    b.HasKey("Id")
 10467                        .HasName("pk_google_user");
 10468
 10469                    b.HasIndex("DeletedAt")
 10470                        .HasDatabaseName("ix_google_user_deleted_at")
 10471                        .HasFilter("is_deleted = true AND anonymised_at IS NULL");
 10472
 10473                    b.HasIndex("ProcessingRestrictedAt")
 10474                        .HasDatabaseName("ix_google_user_processing_restricted_at")
 10475                        .HasFilter("processing_restricted_at IS NOT NULL");
 10476
 10477                    b.HasIndex("PublicId")
 10478                        .IsUnique()
 10479                        .HasDatabaseName("ix_google_user_public_id");
 10480
 10481                    b.HasIndex("ScopeId", "Email")
 10482                        .IsUnique()
 10483                        .HasDatabaseName("ix_google_user_scope_id_email");
 10484
 10485                    b.HasIndex("ScopeId", "GoogleId")
 10486                        .IsUnique()
 10487                        .HasDatabaseName("ix_google_user_scope_id_google_id");
 10488
 10489                    b.ToTable("google_user", "heimdall");
 20490                });
 491
 10492            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 10493                {
 10494                    b.Property<long>("Id")
 10495                        .ValueGeneratedOnAdd()
 10496                        .HasColumnType("bigint")
 10497                        .HasColumnName("id")
 10498                        .HasColumnOrder(1);
 10499
 10500                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10501
 10502                    b.Property<DateTime>("ExpiresAt")
 10503                        .HasColumnType("timestamp with time zone")
 10504                        .HasColumnName("expires_at");
 10505
 10506                    b.Property<long>("PersonId")
 10507                        .HasColumnType("bigint")
 10508                        .HasColumnName("person_id");
 10509
 10510                    b.Property<string>("TokenHash")
 10511                        .IsRequired()
 10512                        .HasMaxLength(64)
 10513                        .HasColumnType("character varying(64)")
 10514                        .HasColumnName("token_hash");
 10515
 10516                    b.Property<bool>("Used")
 10517                        .ValueGeneratedOnAdd()
 10518                        .HasColumnType("boolean")
 10519                        .HasDefaultValue(false)
 10520                        .HasColumnName("used");
 10521
 10522                    b.HasKey("Id")
 10523                        .HasName("pk_password_reset_token");
 10524
 10525                    b.HasIndex("PersonId")
 10526                        .HasDatabaseName("ix_password_reset_token_person_id");
 10527
 10528                    b.HasIndex("TokenHash")
 10529                        .IsUnique()
 10530                        .HasDatabaseName("ix_password_reset_token_token_hash");
 10531
 10532                    b.ToTable("password_reset_token", "heimdall");
 20533                });
 534
 10535            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PendingRegistration", b =>
 10536                {
 10537                    b.Property<long>("Id")
 10538                        .ValueGeneratedOnAdd()
 10539                        .HasColumnType("bigint")
 10540                        .HasColumnName("id")
 10541                        .HasColumnOrder(1);
 10542
 10543                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10544
 10545                    b.Property<DateTime>("CreatedAt")
 10546                        .ValueGeneratedOnAdd()
 10547                        .HasColumnType("timestamp with time zone")
 10548                        .HasColumnName("created_at")
 10549                        .HasDefaultValueSql("now()");
 10550
 10551                    b.Property<string>("Email")
 10552                        .IsRequired()
 10553                        .HasMaxLength(256)
 10554                        .HasColumnType("character varying(256)")
 10555                        .HasColumnName("email");
 10556
 10557                    b.Property<DateTime>("ExpiresAt")
 10558                        .HasColumnType("timestamp with time zone")
 10559                        .HasColumnName("expires_at");
 10560
 10561                    b.Property<int>("FailedAttempts")
 10562                        .ValueGeneratedOnAdd()
 10563                        .HasColumnType("integer")
 10564                        .HasDefaultValue(0)
 10565                        .HasColumnName("failed_attempts");
 10566
 10567                    b.Property<string>("Name")
 10568                        .IsRequired()
 10569                        .HasMaxLength(200)
 10570                        .HasColumnType("character varying(200)")
 10571                        .HasColumnName("name");
 10572
 10573                    b.Property<byte[]>("PasswordHash")
 10574                        .IsRequired()
 10575                        .HasColumnType("bytea")
 10576                        .HasColumnName("password_hash");
 10577
 10578                    b.Property<Guid>("PublicId")
 10579                        .HasColumnType("uuid")
 10580                        .HasColumnName("public_id");
 10581
 10582                    b.Property<byte[]>("Salt")
 10583                        .IsRequired()
 10584                        .HasColumnType("bytea")
 10585                        .HasColumnName("salt");
 10586
 10587                    b.Property<long>("ScopeId")
 10588                        .HasColumnType("bigint")
 10589                        .HasColumnName("scope_id");
 10590
 10591                    b.Property<string>("TokenHash")
 10592                        .IsRequired()
 10593                        .HasMaxLength(64)
 10594                        .HasColumnType("character varying(64)")
 10595                        .HasColumnName("token_hash");
 10596
 10597                    b.HasKey("Id")
 10598                        .HasName("pk_pending_registration");
 10599
 10600                    b.HasIndex("PublicId")
 10601                        .IsUnique()
 10602                        .HasDatabaseName("ix_pending_registration_public_id");
 10603
 10604                    b.HasIndex("ScopeId")
 10605                        .HasDatabaseName("ix_pending_registration_scope_id");
 10606
 10607                    b.HasIndex("TokenHash")
 10608                        .IsUnique()
 10609                        .HasDatabaseName("ix_pending_registration_token_hash");
 10610
 10611                    b.ToTable("pending_registration", "heimdall");
 20612                });
 613
 10614            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 10615                {
 10616                    b.Property<long>("Id")
 10617                        .ValueGeneratedOnAdd()
 10618                        .HasColumnType("bigint")
 10619                        .HasColumnName("id")
 10620                        .HasColumnOrder(1);
 10621
 10622                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10623
 10624                    b.Property<DateTime?>("AccountEmailLastSentAt")
 10625                        .HasColumnType("timestamp with time zone")
 10626                        .HasColumnName("account_email_last_sent_at");
 10627
 10628                    b.Property<DateTime?>("AccountEmailWindowEndsAt")
 10629                        .HasColumnType("timestamp with time zone")
 10630                        .HasColumnName("account_email_window_ends_at");
 10631
 10632                    b.Property<int>("AccountEmailsSent")
 10633                        .HasColumnType("integer")
 10634                        .HasColumnName("account_emails_sent");
 10635
 10636                    b.Property<DateTime?>("AnonymisedAt")
 10637                        .HasColumnType("timestamp with time zone")
 10638                        .HasColumnName("anonymised_at");
 10639
 10640                    b.Property<DateTime?>("BasisRecordedAt")
 10641                        .HasColumnType("timestamp with time zone")
 10642                        .HasColumnName("basis_recorded_at");
 10643
 10644                    b.Property<DateTime>("CreatedAt")
 10645                        .ValueGeneratedOnAdd()
 10646                        .HasColumnType("timestamp with time zone")
 10647                        .HasColumnName("created_at")
 10648                        .HasDefaultValueSql("now()");
 10649
 10650                    b.Property<DateTime?>("DeletedAt")
 10651                        .HasColumnType("timestamp with time zone")
 10652                        .HasColumnName("deleted_at");
 10653
 10654                    b.Property<int?>("DeletionKind")
 10655                        .HasColumnType("integer")
 10656                        .HasColumnName("deletion_kind");
 10657
 10658                    b.Property<string>("Email")
 10659                        .IsRequired()
 10660                        .HasMaxLength(256)
 10661                        .HasColumnType("character varying(256)")
 10662                        .HasColumnName("email");
 10663
 10664                    b.Property<bool>("EmailVerified")
 10665                        .ValueGeneratedOnAdd()
 10666                        .HasColumnType("boolean")
 10667                        .HasDefaultValue(false)
 10668                        .HasColumnName("email_verified");
 10669
 10670                    b.Property<string>("ErasureBlockedReason")
 10671                        .HasMaxLength(500)
 10672                        .HasColumnType("character varying(500)")
 10673                        .HasColumnName("erasure_blocked_reason");
 10674
 10675                    b.Property<DateTime?>("ErasureDueAt")
 10676                        .HasColumnType("timestamp with time zone")
 10677                        .HasColumnName("erasure_due_at");
 10678
 10679                    b.Property<DateTime?>("ErasureRequestedAt")
 10680                        .HasColumnType("timestamp with time zone")
 10681                        .HasColumnName("erasure_requested_at");
 10682
 10683                    b.Property<int>("FailedLoginAttempts")
 10684                        .HasColumnType("integer")
 10685                        .HasColumnName("failed_login_attempts");
 10686
 10687                    b.Property<int>("FailedReauthenticationAttempts")
 10688                        .HasColumnType("integer")
 10689                        .HasColumnName("failed_reauthentication_attempts");
 10690
 10691                    b.Property<int>("FailedSecondFactorAttempts")
 10692                        .HasColumnType("integer")
 10693                        .HasColumnName("failed_second_factor_attempts");
 10694
 10695                    b.Property<bool>("IsDeleted")
 10696                        .ValueGeneratedOnAdd()
 10697                        .HasColumnType("boolean")
 10698                        .HasDefaultValue(false)
 10699                        .HasColumnName("is_deleted");
 10700
 10701                    b.Property<int>("LegalBasis")
 10702                        .ValueGeneratedOnAdd()
 10703                        .HasColumnType("integer")
 10704                        .HasDefaultValue(0)
 10705                        .HasColumnName("legal_basis");
 10706
 10707                    b.Property<DateTime?>("LockedOutUntil")
 10708                        .HasColumnType("timestamp with time zone")
 10709                        .HasColumnName("locked_out_until");
 10710
 10711                    b.Property<string>("Name")
 10712                        .IsRequired()
 10713                        .HasMaxLength(200)
 10714                        .HasColumnType("character varying(200)")
 10715                        .HasColumnName("name");
 10716
 10717                    b.Property<byte[]>("PasswordHash")
 10718                        .IsRequired()
 10719                        .HasColumnType("bytea")
 10720                        .HasColumnName("password_hash");
 10721
 10722                    b.Property<string>("PrivacyNoticeVersion")
 10723                        .HasMaxLength(50)
 10724                        .HasColumnType("character varying(50)")
 10725                        .HasColumnName("privacy_notice_version");
 10726
 10727                    b.Property<DateTime?>("ProcessingRestrictedAt")
 10728                        .HasColumnType("timestamp with time zone")
 10729                        .HasColumnName("processing_restricted_at");
 10730
 10731                    b.Property<Guid>("PublicId")
 10732                        .HasColumnType("uuid")
 10733                        .HasColumnName("public_id");
 10734
 10735                    b.Property<DateTime?>("ReauthenticationPausedUntil")
 10736                        .HasColumnType("timestamp with time zone")
 10737                        .HasColumnName("reauthentication_paused_until");
 10738
 10739                    b.Property<DateTime?>("ReauthenticationWindowStartedAt")
 10740                        .HasColumnType("timestamp with time zone")
 10741                        .HasColumnName("reauthentication_window_started_at");
 10742
 10743                    b.Property<int?>("RestrictionGround")
 10744                        .HasColumnType("integer")
 10745                        .HasColumnName("restriction_ground");
 10746
 10747                    b.Property<DateTime?>("RestrictionLiftNotifiedAt")
 10748                        .HasColumnType("timestamp with time zone")
 10749                        .HasColumnName("restriction_lift_notified_at");
 10750
 10751                    b.Property<long>("RoleId")
 10752                        .HasColumnType("bigint")
 10753                        .HasColumnName("role_id");
 10754
 10755                    b.Property<byte[]>("Salt")
 10756                        .IsRequired()
 10757                        .HasColumnType("bytea")
 10758                        .HasColumnName("salt");
 10759
 10760                    b.Property<long?>("ScopeId")
 10761                        .HasColumnType("bigint")
 10762                        .HasColumnName("scope_id");
 10763
 10764                    b.Property<DateTime?>("SecondFactorLockedOutUntil")
 10765                        .HasColumnType("timestamp with time zone")
 10766                        .HasColumnName("second_factor_locked_out_until");
 10767
 10768                    b.Property<int>("SecondFactorLockouts")
 10769                        .HasColumnType("integer")
 10770                        .HasColumnName("second_factor_lockouts");
 10771
 10772                    b.Property<Guid>("SecurityStamp")
 10773                        .ValueGeneratedOnAdd()
 10774                        .HasColumnType("uuid")
 10775                        .HasColumnName("security_stamp")
 10776                        .HasDefaultValueSql("gen_random_uuid()");
 10777
 10778                    b.Property<DateTime>("UpdatedAt")
 10779                        .ValueGeneratedOnAdd()
 10780                        .HasColumnType("timestamp with time zone")
 10781                        .HasColumnName("updated_at")
 10782                        .HasDefaultValueSql("now()");
 10783
 10784                    b.HasKey("Id")
 10785                        .HasName("pk_person");
 10786
 10787                    b.HasIndex("DeletedAt")
 10788                        .HasDatabaseName("ix_person_deleted_at")
 10789                        .HasFilter("is_deleted = true AND anonymised_at IS NULL");
 10790
 10791                    b.HasIndex("Email")
 10792                        .HasDatabaseName("ix_person_email");
 10793
 10794                    b.HasIndex("ProcessingRestrictedAt")
 10795                        .HasDatabaseName("ix_person_processing_restricted_at")
 10796                        .HasFilter("processing_restricted_at IS NOT NULL");
 10797
 10798                    b.HasIndex("PublicId")
 10799                        .IsUnique()
 10800                        .HasDatabaseName("ix_person_public_id");
 10801
 10802                    b.HasIndex("RoleId")
 10803                        .HasDatabaseName("ix_person_role_id");
 10804
 10805                    b.ToTable("person", "heimdall");
 20806                });
 807
 10808            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 10809                {
 10810                    b.Property<long>("Id")
 10811                        .HasColumnType("bigint")
 10812                        .HasColumnName("id")
 10813                        .HasColumnOrder(1);
 10814
 10815                    b.Property<string>("Description")
 10816                        .HasMaxLength(500)
 10817                        .HasColumnType("character varying(500)")
 10818                        .HasColumnName("description");
 10819
 10820                    b.Property<string>("Name")
 10821                        .IsRequired()
 10822                        .HasMaxLength(200)
 10823                        .HasColumnType("character varying(200)")
 10824                        .HasColumnName("name");
 10825
 10826                    b.Property<Guid>("PublicId")
 10827                        .HasColumnType("uuid")
 10828                        .HasColumnName("public_id");
 10829
 10830                    b.HasKey("Id")
 10831                        .HasName("pk_role");
 10832
 10833                    b.HasIndex("Name")
 10834                        .IsUnique()
 10835                        .HasDatabaseName("ix_role_name");
 10836
 10837                    b.HasIndex("PublicId")
 10838                        .IsUnique()
 10839                        .HasDatabaseName("ix_role_public_id");
 10840
 10841                    b.ToTable("role", "heimdall");
 20842                });
 843
 10844            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 10845                {
 10846                    b.Property<long>("Id")
 10847                        .ValueGeneratedOnAdd()
 10848                        .HasColumnType("bigint")
 10849                        .HasColumnName("id")
 10850                        .HasColumnOrder(1);
 10851
 10852                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10853
 10854                    b.Property<DateTime>("CreatedAt")
 10855                        .ValueGeneratedOnAdd()
 10856                        .HasColumnType("timestamp with time zone")
 10857                        .HasColumnName("created_at")
 10858                        .HasDefaultValueSql("now()");
 10859
 10860                    b.Property<int?>("DefaultLegalBasis")
 10861                        .HasColumnType("integer")
 10862                        .HasColumnName("default_legal_basis");
 10863
 10864                    b.Property<string>("Description")
 10865                        .HasMaxLength(500)
 10866                        .HasColumnType("character varying(500)")
 10867                        .HasColumnName("description");
 10868
 10869                    b.Property<string>("EmailVerificationUrl")
 10870                        .HasMaxLength(2048)
 10871                        .HasColumnType("character varying(2048)")
 10872                        .HasColumnName("email_verification_url");
 10873
 10874                    b.Property<bool>("GoogleSignInEnabled")
 10875                        .ValueGeneratedOnAdd()
 10876                        .HasColumnType("boolean")
 10877                        .HasDefaultValue(false)
 10878                        .HasColumnName("google_sign_in_enabled");
 10879
 10880                    b.Property<bool>("IsDeleted")
 10881                        .ValueGeneratedOnAdd()
 10882                        .HasColumnType("boolean")
 10883                        .HasDefaultValue(false)
 10884                        .HasColumnName("is_deleted");
 10885
 10886                    b.Property<string>("Name")
 10887                        .IsRequired()
 10888                        .HasMaxLength(200)
 10889                        .HasColumnType("character varying(200)")
 10890                        .HasColumnName("name");
 10891
 10892                    b.Property<string>("PasswordResetUrl")
 10893                        .HasMaxLength(2048)
 10894                        .HasColumnType("character varying(2048)")
 10895                        .HasColumnName("password_reset_url");
 10896
 10897                    b.Property<string>("PrivacyNoticeUri")
 10898                        .HasMaxLength(2048)
 10899                        .HasColumnType("character varying(2048)")
 10900                        .HasColumnName("privacy_notice_uri");
 10901
 10902                    b.Property<Guid>("PublicId")
 10903                        .HasColumnType("uuid")
 10904                        .HasColumnName("public_id");
 10905
 10906                    b.Property<bool>("SelfRegistrationEnabled")
 10907                        .ValueGeneratedOnAdd()
 10908                        .HasColumnType("boolean")
 10909                        .HasDefaultValue(false)
 10910                        .HasColumnName("self_registration_enabled");
 10911
 10912                    b.Property<DateTime>("UpdatedAt")
 10913                        .ValueGeneratedOnAdd()
 10914                        .HasColumnType("timestamp with time zone")
 10915                        .HasColumnName("updated_at")
 10916                        .HasDefaultValueSql("now()");
 10917
 10918                    b.HasKey("Id")
 10919                        .HasName("pk_scope");
 10920
 10921                    b.HasIndex("Name")
 10922                        .IsUnique()
 10923                        .HasDatabaseName("ix_scope_name");
 10924
 10925                    b.HasIndex("PublicId")
 10926                        .IsUnique()
 10927                        .HasDatabaseName("ix_scope_public_id");
 10928
 10929                    b.ToTable("scope", "heimdall");
 20930                });
 931
 10932            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 10933                {
 10934                    b.Property<long>("ScopeId")
 10935                        .HasColumnType("bigint")
 10936                        .HasColumnName("scope_id");
 10937
 10938                    b.Property<long>("PersonId")
 10939                        .HasColumnType("bigint")
 10940                        .HasColumnName("person_id");
 10941
 10942                    b.HasKey("ScopeId", "PersonId")
 10943                        .HasName("pk_scope_owner");
 10944
 10945                    b.HasIndex("PersonId")
 10946                        .HasDatabaseName("ix_scope_owner_person_id");
 10947
 10948                    b.ToTable("scope_owner", "heimdall");
 20949                });
 950
 10951            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwnerInvitation", b =>
 10952                {
 10953                    b.Property<long>("Id")
 10954                        .ValueGeneratedOnAdd()
 10955                        .HasColumnType("bigint")
 10956                        .HasColumnName("id")
 10957                        .HasColumnOrder(1);
 10958
 10959                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10960
 10961                    b.Property<DateTime>("CreatedAt")
 10962                        .ValueGeneratedOnAdd()
 10963                        .HasColumnType("timestamp with time zone")
 10964                        .HasColumnName("created_at")
 10965                        .HasDefaultValueSql("now()");
 10966
 10967                    b.Property<DateTime?>("EndedAt")
 10968                        .HasColumnType("timestamp with time zone")
 10969                        .HasColumnName("ended_at");
 10970
 10971                    b.Property<DateTime>("ExpiresAt")
 10972                        .HasColumnType("timestamp with time zone")
 10973                        .HasColumnName("expires_at");
 10974
 10975                    b.Property<long?>("InvitedByPersonId")
 10976                        .HasColumnType("bigint")
 10977                        .HasColumnName("invited_by_person_id");
 10978
 10979                    b.Property<long>("InviteePersonId")
 10980                        .HasColumnType("bigint")
 10981                        .HasColumnName("invitee_person_id");
 10982
 10983                    b.Property<short?>("Outcome")
 10984                        .HasColumnType("smallint")
 10985                        .HasColumnName("outcome");
 10986
 10987                    b.Property<Guid>("PublicId")
 10988                        .HasColumnType("uuid")
 10989                        .HasColumnName("public_id");
 10990
 10991                    b.Property<long>("ScopeId")
 10992                        .HasColumnType("bigint")
 10993                        .HasColumnName("scope_id");
 10994
 10995                    b.HasKey("Id")
 10996                        .HasName("pk_scope_owner_invitation");
 10997
 10998                    b.HasIndex("InvitedByPersonId")
 10999                        .HasDatabaseName("ix_scope_owner_invitation_invited_by_person_id");
 101000
 101001                    b.HasIndex("InviteePersonId")
 101002                        .HasDatabaseName("ix_scope_owner_invitation_invitee_person_id");
 101003
 101004                    b.HasIndex("PublicId")
 101005                        .IsUnique()
 101006                        .HasDatabaseName("ix_scope_owner_invitation_public_id");
 101007
 101008                    b.HasIndex("ScopeId", "InviteePersonId")
 101009                        .IsUnique()
 101010                        .HasDatabaseName("ix_scope_owner_invitation_scope_id_invitee_person_id")
 101011                        .HasFilter("ended_at IS NULL");
 101012
 101013                    b.ToTable("scope_owner_invitation", "heimdall", t =>
 101014                        {
 101015                            t.HasCheckConstraint("ck_scope_owner_invitation_outcome_ends_it", "outcome IS NULL OR ended_
 101016
 101017                            t.HasCheckConstraint("ck_scope_owner_invitation_outcome_known", "outcome IS NULL OR outcome 
 201018                        });
 201019                });
 1020
 101021            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 101022                {
 101023                    b.Property<long>("Id")
 101024                        .ValueGeneratedOnAdd()
 101025                        .HasColumnType("bigint")
 101026                        .HasColumnName("id")
 101027                        .HasColumnOrder(1);
 101028
 101029                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 101030
 101031                    b.Property<DateTime>("CreatedAt")
 101032                        .ValueGeneratedOnAdd()
 101033                        .HasColumnType("timestamp with time zone")
 101034                        .HasColumnName("created_at")
 101035                        .HasDefaultValueSql("now()");
 101036
 101037                    b.Property<string>("Description")
 101038                        .HasMaxLength(500)
 101039                        .HasColumnType("character varying(500)")
 101040                        .HasColumnName("description");
 101041
 101042                    b.Property<bool>("IncludeAsJwtClaim")
 101043                        .ValueGeneratedOnAdd()
 101044                        .HasColumnType("boolean")
 101045                        .HasDefaultValue(false)
 101046                        .HasColumnName("include_as_jwt_claim");
 101047
 101048                    b.Property<bool>("IsDeleted")
 101049                        .ValueGeneratedOnAdd()
 101050                        .HasColumnType("boolean")
 101051                        .HasDefaultValue(false)
 101052                        .HasColumnName("is_deleted");
 101053
 101054                    b.Property<string>("Name")
 101055                        .IsRequired()
 101056                        .HasMaxLength(200)
 101057                        .HasColumnType("character varying(200)")
 101058                        .HasColumnName("name");
 101059
 101060                    b.Property<Guid>("PublicId")
 101061                        .HasColumnType("uuid")
 101062                        .HasColumnName("public_id");
 101063
 101064                    b.Property<long>("ScopeId")
 101065                        .HasColumnType("bigint")
 101066                        .HasColumnName("scope_id");
 101067
 101068                    b.Property<DateTime>("UpdatedAt")
 101069                        .ValueGeneratedOnAdd()
 101070                        .HasColumnType("timestamp with time zone")
 101071                        .HasColumnName("updated_at")
 101072                        .HasDefaultValueSql("now()");
 101073
 101074                    b.HasKey("Id")
 101075                        .HasName("pk_scope_permission");
 101076
 101077                    b.HasIndex("PublicId")
 101078                        .IsUnique()
 101079                        .HasDatabaseName("ix_scope_permission_public_id");
 101080
 101081                    b.HasIndex("ScopeId")
 101082                        .HasDatabaseName("ix_scope_permission_scope_id");
 101083
 101084                    b.ToTable("scope_permission", "heimdall");
 201085                });
 1086
 101087            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 101088                {
 101089                    b.Property<long>("ScopeId")
 101090                        .HasColumnType("bigint")
 101091                        .HasColumnName("scope_id");
 101092
 101093                    b.Property<long>("PersonId")
 101094                        .HasColumnType("bigint")
 101095                        .HasColumnName("person_id");
 101096
 101097                    b.HasKey("ScopeId", "PersonId")
 101098                        .HasName("pk_scope_user");
 101099
 101100                    b.HasIndex("PersonId")
 101101                        .IsUnique()
 101102                        .HasDatabaseName("ix_scope_user_person_id");
 101103
 101104                    b.ToTable("scope_user", "heimdall");
 201105                });
 1106
 101107            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 101108                {
 101109                    b.Property<long>("Id")
 101110                        .ValueGeneratedOnAdd()
 101111                        .HasColumnType("bigint")
 101112                        .HasColumnName("id")
 101113                        .HasColumnOrder(1);
 101114
 101115                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 101116
 101117                    b.Property<bool>("AppEnabled")
 101118                        .ValueGeneratedOnAdd()
 101119                        .HasColumnType("boolean")
 101120                        .HasDefaultValue(false)
 101121                        .HasColumnName("app_enabled");
 101122
 101123                    b.Property<int>("ChallengeAttempts")
 101124                        .ValueGeneratedOnAdd()
 101125                        .HasColumnType("integer")
 101126                        .HasDefaultValue(0)
 101127                        .HasColumnName("challenge_attempts");
 101128
 101129                    b.Property<Guid?>("ChallengeId")
 101130                        .HasColumnType("uuid")
 101131                        .HasColumnName("challenge_id");
 101132
 101133                    b.Property<DateTime>("CreatedAt")
 101134                        .ValueGeneratedOnAdd()
 101135                        .HasColumnType("timestamp with time zone")
 101136                        .HasColumnName("created_at")
 101137                        .HasDefaultValueSql("now()");
 101138
 101139                    b.Property<int>("EmailCodeReissueCount")
 101140                        .ValueGeneratedOnAdd()
 101141                        .HasColumnType("integer")
 101142                        .HasDefaultValue(0)
 101143                        .HasColumnName("email_code_reissue_count");
 101144
 101145                    b.Property<bool>("EmailEnabled")
 101146                        .ValueGeneratedOnAdd()
 101147                        .HasColumnType("boolean")
 101148                        .HasDefaultValue(false)
 101149                        .HasColumnName("email_enabled");
 101150
 101151                    b.Property<bool>("IsActive")
 101152                        .ValueGeneratedOnAdd()
 101153                        .HasColumnType("boolean")
 101154                        .HasDefaultValue(false)
 101155                        .HasColumnName("is_active");
 101156
 101157                    b.Property<long?>("LastTotpTimeStepUsed")
 101158                        .HasColumnType("bigint")
 101159                        .HasColumnName("last_totp_time_step_used");
 101160
 101161                    b.Property<long>("PersonId")
 101162                        .HasColumnType("bigint")
 101163                        .HasColumnName("person_id");
 101164
 101165                    b.Property<byte[]>("TotpSecretEncrypted")
 101166                        .HasColumnType("bytea")
 101167                        .HasColumnName("totp_secret_encrypted");
 101168
 101169                    b.Property<DateTime>("UpdatedAt")
 101170                        .ValueGeneratedOnAdd()
 101171                        .HasColumnType("timestamp with time zone")
 101172                        .HasColumnName("updated_at")
 101173                        .HasDefaultValueSql("now()");
 101174
 101175                    b.HasKey("Id")
 101176                        .HasName("pk_two_factor_auth");
 101177
 101178                    b.HasIndex("PersonId")
 101179                        .IsUnique()
 101180                        .HasDatabaseName("ix_two_factor_auth_person_id");
 101181
 101182                    b.ToTable("two_factor_auth", "heimdall");
 201183                });
 1184
 101185            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 101186                {
 101187                    b.Property<long>("Id")
 101188                        .ValueGeneratedOnAdd()
 101189                        .HasColumnType("bigint")
 101190                        .HasColumnName("id")
 101191                        .HasColumnOrder(1);
 101192
 101193                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 101194
 101195                    b.Property<byte[]>("CodeHash")
 101196                        .IsRequired()
 101197                        .HasColumnType("bytea")
 101198                        .HasColumnName("code_hash");
 101199
 101200                    b.Property<DateTime>("CreatedAt")
 101201                        .ValueGeneratedOnAdd()
 101202                        .HasColumnType("timestamp with time zone")
 101203                        .HasColumnName("created_at")
 101204                        .HasDefaultValueSql("now()");
 101205
 101206                    b.Property<DateTime>("ExpiresAt")
 101207                        .HasColumnType("timestamp with time zone")
 101208                        .HasColumnName("expires_at");
 101209
 101210                    b.Property<int>("FailedAttempts")
 101211                        .HasColumnType("integer")
 101212                        .HasColumnName("failed_attempts");
 101213
 101214                    b.Property<byte[]>("Salt")
 101215                        .IsRequired()
 101216                        .HasColumnType("bytea")
 101217                        .HasColumnName("salt");
 101218
 101219                    b.Property<long>("TwoFactorAuthId")
 101220                        .HasColumnType("bigint")
 101221                        .HasColumnName("two_factor_auth_id");
 101222
 101223                    b.Property<bool>("Used")
 101224                        .ValueGeneratedOnAdd()
 101225                        .HasColumnType("boolean")
 101226                        .HasDefaultValue(false)
 101227                        .HasColumnName("used");
 101228
 101229                    b.HasKey("Id")
 101230                        .HasName("pk_two_factor_email_code");
 101231
 101232                    b.HasIndex("TwoFactorAuthId")
 101233                        .HasDatabaseName("ix_two_factor_email_code_two_factor_auth_id");
 101234
 101235                    b.ToTable("two_factor_email_code", "heimdall");
 201236                });
 1237
 101238            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 101239                {
 101240                    b.Property<long>("Id")
 101241                        .ValueGeneratedOnAdd()
 101242                        .HasColumnType("bigint")
 101243                        .HasColumnName("id")
 101244                        .HasColumnOrder(1);
 101245
 101246                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 101247
 101248                    b.Property<byte[]>("CodeHash")
 101249                        .IsRequired()
 101250                        .HasColumnType("bytea")
 101251                        .HasColumnName("code_hash");
 101252
 101253                    b.Property<DateTime>("CreatedAt")
 101254                        .ValueGeneratedOnAdd()
 101255                        .HasColumnType("timestamp with time zone")
 101256                        .HasColumnName("created_at")
 101257                        .HasDefaultValueSql("now()");
 101258
 101259                    b.Property<long>("TwoFactorAuthId")
 101260                        .HasColumnType("bigint")
 101261                        .HasColumnName("two_factor_auth_id");
 101262
 101263                    b.Property<bool>("Used")
 101264                        .ValueGeneratedOnAdd()
 101265                        .HasColumnType("boolean")
 101266                        .HasDefaultValue(false)
 101267                        .HasColumnName("used");
 101268
 101269                    b.Property<DateTime?>("UsedAt")
 101270                        .HasColumnType("timestamp with time zone")
 101271                        .HasColumnName("used_at");
 101272
 101273                    b.HasKey("Id")
 101274                        .HasName("pk_two_factor_recovery_code");
 101275
 101276                    b.HasIndex("TwoFactorAuthId")
 101277                        .HasDatabaseName("ix_two_factor_recovery_code_two_factor_auth_id");
 101278
 101279                    b.ToTable("two_factor_recovery_code", "heimdall");
 201280                });
 1281
 101282            modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b =>
 101283                {
 101284                    b.Property<int>("Id")
 101285                        .ValueGeneratedOnAdd()
 101286                        .HasColumnType("integer")
 101287                        .HasColumnName("id");
 101288
 101289                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 101290
 101291                    b.Property<string>("FriendlyName")
 101292                        .HasColumnType("text")
 101293                        .HasColumnName("friendly_name");
 101294
 101295                    b.Property<string>("Xml")
 101296                        .HasColumnType("text")
 101297                        .HasColumnName("xml");
 101298
 101299                    b.HasKey("Id")
 101300                        .HasName("pk_data_protection_keys");
 101301
 101302                    b.ToTable("data_protection_keys", "heimdall");
 201303                });
 1304
 101305            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 101306                {
 101307                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Owner")
 101308                        .WithMany("OwnedApplications")
 101309                        .HasForeignKey("OwnerId")
 101310                        .OnDelete(DeleteBehavior.Cascade)
 101311                        .IsRequired()
 101312                        .HasConstraintName("fk_application_person_owner_id");
 101313
 101314                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101315                        .WithMany("Applications")
 101316                        .HasForeignKey("ScopeId")
 101317                        .OnDelete(DeleteBehavior.Cascade)
 101318                        .IsRequired()
 101319                        .HasConstraintName("fk_application_scope_scope_id");
 101320
 101321                    b.Navigation("Owner");
 101322
 101323                    b.Navigation("Scope");
 201324                });
 1325
 101326            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ApplicationCredential", b =>
 101327                {
 101328                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Application", "Application")
 101329                        .WithMany("Credentials")
 101330                        .HasForeignKey("ApplicationId")
 101331                        .OnDelete(DeleteBehavior.Cascade)
 101332                        .IsRequired()
 101333                        .HasConstraintName("fk_application_credential_application_application_id");
 101334
 101335                    b.Navigation("Application");
 201336                });
 1337
 101338            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 101339                {
 101340                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101341                        .WithMany("EmailVerificationTokens")
 101342                        .HasForeignKey("PersonId")
 101343                        .OnDelete(DeleteBehavior.Cascade)
 101344                        .IsRequired()
 101345                        .HasConstraintName("fk_email_verification_token_person_person_id");
 101346
 101347                    b.Navigation("Person");
 201348                });
 1349
 101350            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 101351                {
 101352                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101353                        .WithMany("GoogleUsers")
 101354                        .HasForeignKey("ScopeId")
 101355                        .OnDelete(DeleteBehavior.Cascade)
 101356                        .IsRequired()
 101357                        .HasConstraintName("fk_google_user_scope_scope_id");
 101358
 101359                    b.Navigation("Scope");
 201360                });
 1361
 101362            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 101363                {
 101364                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101365                        .WithMany("PasswordResetTokens")
 101366                        .HasForeignKey("PersonId")
 101367                        .OnDelete(DeleteBehavior.Cascade)
 101368                        .IsRequired()
 101369                        .HasConstraintName("fk_password_reset_token_person_person_id");
 101370
 101371                    b.Navigation("Person");
 201372                });
 1373
 101374            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PendingRegistration", b =>
 101375                {
 101376                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101377                        .WithMany()
 101378                        .HasForeignKey("ScopeId")
 101379                        .OnDelete(DeleteBehavior.Cascade)
 101380                        .IsRequired()
 101381                        .HasConstraintName("fk_pending_registration_scope_scope_id");
 101382
 101383                    b.Navigation("Scope");
 201384                });
 1385
 101386            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 101387                {
 101388                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Role", "Role")
 101389                        .WithMany("Persons")
 101390                        .HasForeignKey("RoleId")
 101391                        .OnDelete(DeleteBehavior.Restrict)
 101392                        .IsRequired()
 101393                        .HasConstraintName("fk_person_roles_role_id");
 101394
 101395                    b.Navigation("Role");
 201396                });
 1397
 101398            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 101399                {
 101400                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101401                        .WithMany("ScopeOwnerships")
 101402                        .HasForeignKey("PersonId")
 101403                        .OnDelete(DeleteBehavior.Cascade)
 101404                        .IsRequired()
 101405                        .HasConstraintName("fk_scope_owner_person_person_id");
 101406
 101407                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101408                        .WithMany("Owners")
 101409                        .HasForeignKey("ScopeId")
 101410                        .OnDelete(DeleteBehavior.Cascade)
 101411                        .IsRequired()
 101412                        .HasConstraintName("fk_scope_owner_scope_scope_id");
 101413
 101414                    b.Navigation("Person");
 101415
 101416                    b.Navigation("Scope");
 201417                });
 1418
 101419            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwnerInvitation", b =>
 101420                {
 101421                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "InvitedBy")
 101422                        .WithMany()
 101423                        .HasForeignKey("InvitedByPersonId")
 101424                        .OnDelete(DeleteBehavior.SetNull)
 101425                        .HasConstraintName("fk_scope_owner_invitation_person_invited_by_person_id");
 101426
 101427                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Invitee")
 101428                        .WithMany()
 101429                        .HasForeignKey("InviteePersonId")
 101430                        .OnDelete(DeleteBehavior.Cascade)
 101431                        .IsRequired()
 101432                        .HasConstraintName("fk_scope_owner_invitation_person_invitee_person_id");
 101433
 101434                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101435                        .WithMany()
 101436                        .HasForeignKey("ScopeId")
 101437                        .OnDelete(DeleteBehavior.Cascade)
 101438                        .IsRequired()
 101439                        .HasConstraintName("fk_scope_owner_invitation_scope_scope_id");
 101440
 101441                    b.Navigation("InvitedBy");
 101442
 101443                    b.Navigation("Invitee");
 101444
 101445                    b.Navigation("Scope");
 201446                });
 1447
 101448            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 101449                {
 101450                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101451                        .WithMany("ScopePermissions")
 101452                        .HasForeignKey("ScopeId")
 101453                        .OnDelete(DeleteBehavior.Cascade)
 101454                        .IsRequired()
 101455                        .HasConstraintName("fk_scope_permission_scope_scope_id");
 101456
 101457                    b.Navigation("Scope");
 201458                });
 1459
 101460            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 101461                {
 101462                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101463                        .WithOne("ScopeMembership")
 101464                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.ScopeUser", "PersonId")
 101465                        .OnDelete(DeleteBehavior.Cascade)
 101466                        .IsRequired()
 101467                        .HasConstraintName("fk_scope_user_person_person_id");
 101468
 101469                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101470                        .WithMany("Users")
 101471                        .HasForeignKey("ScopeId")
 101472                        .OnDelete(DeleteBehavior.Cascade)
 101473                        .IsRequired()
 101474                        .HasConstraintName("fk_scope_user_scope_scope_id");
 101475
 101476                    b.Navigation("Person");
 101477
 101478                    b.Navigation("Scope");
 201479                });
 1480
 101481            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 101482                {
 101483                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101484                        .WithOne("TwoFactorAuth")
 101485                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "PersonId")
 101486                        .OnDelete(DeleteBehavior.Cascade)
 101487                        .IsRequired()
 101488                        .HasConstraintName("fk_two_factor_auth_person_person_id");
 101489
 101490                    b.Navigation("Person");
 201491                });
 1492
 101493            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 101494                {
 101495                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 101496                        .WithMany("EmailCodes")
 101497                        .HasForeignKey("TwoFactorAuthId")
 101498                        .OnDelete(DeleteBehavior.Cascade)
 101499                        .IsRequired()
 101500                        .HasConstraintName("fk_two_factor_email_code_two_factor_auth_two_factor_auth_id");
 101501
 101502                    b.Navigation("TwoFactorAuth");
 201503                });
 1504
 101505            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 101506                {
 101507                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 101508                        .WithMany("RecoveryCodes")
 101509                        .HasForeignKey("TwoFactorAuthId")
 101510                        .OnDelete(DeleteBehavior.Cascade)
 101511                        .IsRequired()
 101512                        .HasConstraintName("fk_two_factor_recovery_code_two_factor_auth_two_factor_auth_id");
 101513
 101514                    b.Navigation("TwoFactorAuth");
 201515                });
 1516
 101517            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 101518                {
 101519                    b.Navigation("Credentials");
 201520                });
 1521
 101522            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 101523                {
 101524                    b.Navigation("EmailVerificationTokens");
 101525
 101526                    b.Navigation("OwnedApplications");
 101527
 101528                    b.Navigation("PasswordResetTokens");
 101529
 101530                    b.Navigation("ScopeMembership");
 101531
 101532                    b.Navigation("ScopeOwnerships");
 101533
 101534                    b.Navigation("TwoFactorAuth");
 201535                });
 1536
 101537            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 101538                {
 101539                    b.Navigation("Persons");
 201540                });
 1541
 101542            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 101543                {
 101544                    b.Navigation("Applications");
 101545
 101546                    b.Navigation("GoogleUsers");
 101547
 101548                    b.Navigation("Owners");
 101549
 101550                    b.Navigation("ScopePermissions");
 101551
 101552                    b.Navigation("Users");
 201553                });
 1554
 101555            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 101556                {
 101557                    b.Navigation("EmailCodes");
 101558
 101559                    b.Navigation("RecoveryCodes");
 201560                });
 1561#pragma warning restore 612, 618
 101562        }
 1563    }
 1564}