< Summary - Heimdall API

Line coverage
100%
Covered lines: 1073
Uncovered lines: 0
Coverable lines: 1073
Total lines: 1181
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/20260909163322_AnonymiseDeletedIdentities.cs

#LineLine coverage
 1using System;
 2using Microsoft.EntityFrameworkCore.Migrations;
 3
 4#nullable disable
 5
 6namespace ArturRios.Heimdall.Data.Migrations
 7{
 8    /// <summary>
 9    ///     Adds the deletion metadata NFR-20's retention window is measured from: when a record was
 10    ///     logically deleted, why, and whether it has since been anonymised.
 11    /// </summary>
 12    public partial class AnonymiseDeletedIdentities : Migration
 13    {
 14        /// <inheritdoc />
 15        protected override void Up(MigrationBuilder migrationBuilder)
 16        {
 1917            migrationBuilder.AddColumn<DateTime>(
 1918                name: "anonymised_at",
 1919                schema: "heimdall",
 1920                table: "person",
 1921                type: "timestamp with time zone",
 1922                nullable: true);
 23
 1924            migrationBuilder.AddColumn<DateTime>(
 1925                name: "deleted_at",
 1926                schema: "heimdall",
 1927                table: "person",
 1928                type: "timestamp with time zone",
 1929                nullable: true);
 30
 1931            migrationBuilder.AddColumn<int>(
 1932                name: "deletion_kind",
 1933                schema: "heimdall",
 1934                table: "person",
 1935                type: "integer",
 1936                nullable: true);
 37
 1938            migrationBuilder.AddColumn<DateTime>(
 1939                name: "anonymised_at",
 1940                schema: "heimdall",
 1941                table: "google_user",
 1942                type: "timestamp with time zone",
 1943                nullable: true);
 44
 1945            migrationBuilder.AddColumn<DateTime>(
 1946                name: "deleted_at",
 1947                schema: "heimdall",
 1948                table: "google_user",
 1949                type: "timestamp with time zone",
 1950                nullable: true);
 51
 1952            migrationBuilder.AddColumn<int>(
 1953                name: "deletion_kind",
 1954                schema: "heimdall",
 1955                table: "google_user",
 1956                type: "integer",
 1957                nullable: true);
 58
 1959            migrationBuilder.CreateIndex(
 1960                name: "ix_person_deleted_at",
 1961                schema: "heimdall",
 1962                table: "person",
 1963                column: "deleted_at",
 1964                filter: "is_deleted = true AND anonymised_at IS NULL");
 65
 1966            migrationBuilder.CreateIndex(
 1967                name: "ix_google_user_deleted_at",
 1968                schema: "heimdall",
 1969                table: "google_user",
 1970                column: "deleted_at",
 1971                filter: "is_deleted = true AND anonymised_at IS NULL");
 72
 73            // Rows logically deleted before this migration carry no deletion date, and the
 74            // anonymisation pass deliberately skips a record whose window cannot be shown to have
 75            // elapsed. Without a backfill those rows would be the one set the schedule never
 76            // reaches — exactly the indefinitely retained data NFR-20 exists to end.
 77            //
 78            // updated_at is the only evidence available. It is a proxy, not the true deletion date:
 79            // the logical deletes stamp it, but any later write to the row moves it. That makes it
 80            // equal to or later than the real deletion, never earlier, so the backfilled window
 81            // closes on time or late and can never erase a record early. Erring late is the safe
 82            // direction here; erring early would destroy data before its window was up.
 83            //
 84            // The kind is Administrative because it is the only one that could have been recorded:
 85            // there was no way to request an erasure before this, so no row can be a subject
 86            // request, and assuming otherwise would apply the shorter statutory deadline to
 87            // deletions nobody asked for.
 1988            migrationBuilder.Sql(
 1989                """
 1990                UPDATE heimdall.person
 1991                SET deleted_at = updated_at, deletion_kind = 1
 1992                WHERE is_deleted = true AND deleted_at IS NULL;
 1993                """);
 94
 1995            migrationBuilder.Sql(
 1996                """
 1997                UPDATE heimdall.google_user
 1998                SET deleted_at = updated_at, deletion_kind = 1
 1999                WHERE is_deleted = true AND deleted_at IS NULL;
 19100                """);
 19101        }
 102
 103        /// <inheritdoc />
 104        protected override void Down(MigrationBuilder migrationBuilder)
 105        {
 1106            migrationBuilder.DropIndex(
 1107                name: "ix_person_deleted_at",
 1108                schema: "heimdall",
 1109                table: "person");
 110
 1111            migrationBuilder.DropIndex(
 1112                name: "ix_google_user_deleted_at",
 1113                schema: "heimdall",
 1114                table: "google_user");
 115
 1116            migrationBuilder.DropColumn(
 1117                name: "anonymised_at",
 1118                schema: "heimdall",
 1119                table: "person");
 120
 1121            migrationBuilder.DropColumn(
 1122                name: "deleted_at",
 1123                schema: "heimdall",
 1124                table: "person");
 125
 1126            migrationBuilder.DropColumn(
 1127                name: "deletion_kind",
 1128                schema: "heimdall",
 1129                table: "person");
 130
 1131            migrationBuilder.DropColumn(
 1132                name: "anonymised_at",
 1133                schema: "heimdall",
 1134                table: "google_user");
 135
 1136            migrationBuilder.DropColumn(
 1137                name: "deleted_at",
 1138                schema: "heimdall",
 1139                table: "google_user");
 140
 1141            migrationBuilder.DropColumn(
 1142                name: "deletion_kind",
 1143                schema: "heimdall",
 1144                table: "google_user");
 1145        }
 146    }
 147}

/home/ci/agent/workspace/heimdall-api-docs_main/app/src/Infrastructure/ArturRios.Heimdall.Data/Migrations/20260909163322_AnonymiseDeletedIdentities.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("20260909163322_AnonymiseDeletedIdentities")]
 16    partial class AnonymiseDeletedIdentities
 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.11")
 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.AuditLog", 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<string>("Action")
 10102                        .IsRequired()
 10103                        .HasMaxLength(200)
 10104                        .HasColumnType("character varying(200)")
 10105                        .HasColumnName("action");
 10106
 10107                    b.Property<Guid?>("ActorPersonId")
 10108                        .HasColumnType("uuid")
 10109                        .HasColumnName("actor_person_id");
 10110
 10111                    b.Property<int?>("ActorRole")
 10112                        .HasColumnType("integer")
 10113                        .HasColumnName("actor_role");
 10114
 10115                    b.Property<DateTime>("CreatedAt")
 10116                        .ValueGeneratedOnAdd()
 10117                        .HasColumnType("timestamp with time zone")
 10118                        .HasColumnName("created_at")
 10119                        .HasDefaultValueSql("now()");
 10120
 10121                    b.Property<string>("FailureReason")
 10122                        .HasMaxLength(500)
 10123                        .HasColumnType("character varying(500)")
 10124                        .HasColumnName("failure_reason");
 10125
 10126                    b.Property<Guid>("PublicId")
 10127                        .HasColumnType("uuid")
 10128                        .HasColumnName("public_id");
 10129
 10130                    b.Property<bool>("Succeeded")
 10131                        .HasColumnType("boolean")
 10132                        .HasColumnName("succeeded");
 10133
 10134                    b.Property<Guid?>("TargetId")
 10135                        .HasColumnType("uuid")
 10136                        .HasColumnName("target_id");
 10137
 10138                    b.HasKey("Id")
 10139                        .HasName("pk_audit_log");
 10140
 10141                    b.HasIndex("ActorPersonId")
 10142                        .HasDatabaseName("ix_audit_log_actor_person_id");
 10143
 10144                    b.HasIndex("CreatedAt")
 10145                        .HasDatabaseName("ix_audit_log_created_at");
 10146
 10147                    b.HasIndex("PublicId")
 10148                        .IsUnique()
 10149                        .HasDatabaseName("ix_audit_log_public_id");
 10150
 10151                    b.ToTable("audit_log", "heimdall");
 20152                });
 153
 10154            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 10155                {
 10156                    b.Property<long>("Id")
 10157                        .ValueGeneratedOnAdd()
 10158                        .HasColumnType("bigint")
 10159                        .HasColumnName("id")
 10160                        .HasColumnOrder(1);
 10161
 10162                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10163
 10164                    b.Property<DateTime>("ExpiresAt")
 10165                        .HasColumnType("timestamp with time zone")
 10166                        .HasColumnName("expires_at");
 10167
 10168                    b.Property<long>("PersonId")
 10169                        .HasColumnType("bigint")
 10170                        .HasColumnName("person_id");
 10171
 10172                    b.Property<string>("TokenHash")
 10173                        .IsRequired()
 10174                        .HasMaxLength(64)
 10175                        .HasColumnType("character varying(64)")
 10176                        .HasColumnName("token_hash");
 10177
 10178                    b.Property<bool>("Used")
 10179                        .ValueGeneratedOnAdd()
 10180                        .HasColumnType("boolean")
 10181                        .HasDefaultValue(false)
 10182                        .HasColumnName("used");
 10183
 10184                    b.HasKey("Id")
 10185                        .HasName("pk_email_verification_token");
 10186
 10187                    b.HasIndex("PersonId")
 10188                        .HasDatabaseName("ix_email_verification_token_person_id");
 10189
 10190                    b.HasIndex("TokenHash")
 10191                        .IsUnique()
 10192                        .HasDatabaseName("ix_email_verification_token_token_hash");
 10193
 10194                    b.ToTable("email_verification_token", "heimdall");
 20195                });
 196
 10197            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 10198                {
 10199                    b.Property<long>("Id")
 10200                        .ValueGeneratedOnAdd()
 10201                        .HasColumnType("bigint")
 10202                        .HasColumnName("id")
 10203                        .HasColumnOrder(1);
 10204
 10205                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10206
 10207                    b.Property<DateTime?>("AnonymisedAt")
 10208                        .HasColumnType("timestamp with time zone")
 10209                        .HasColumnName("anonymised_at");
 10210
 10211                    b.Property<DateTime>("CreatedAt")
 10212                        .ValueGeneratedOnAdd()
 10213                        .HasColumnType("timestamp with time zone")
 10214                        .HasColumnName("created_at")
 10215                        .HasDefaultValueSql("now()");
 10216
 10217                    b.Property<DateTime?>("DeletedAt")
 10218                        .HasColumnType("timestamp with time zone")
 10219                        .HasColumnName("deleted_at");
 10220
 10221                    b.Property<int?>("DeletionKind")
 10222                        .HasColumnType("integer")
 10223                        .HasColumnName("deletion_kind");
 10224
 10225                    b.Property<string>("Email")
 10226                        .IsRequired()
 10227                        .HasMaxLength(256)
 10228                        .HasColumnType("character varying(256)")
 10229                        .HasColumnName("email");
 10230
 10231                    b.Property<bool>("EmailVerified")
 10232                        .ValueGeneratedOnAdd()
 10233                        .HasColumnType("boolean")
 10234                        .HasDefaultValue(false)
 10235                        .HasColumnName("email_verified");
 10236
 10237                    b.Property<string>("GoogleId")
 10238                        .IsRequired()
 10239                        .HasMaxLength(255)
 10240                        .HasColumnType("character varying(255)")
 10241                        .HasColumnName("google_id");
 10242
 10243                    b.Property<bool>("IsDeleted")
 10244                        .ValueGeneratedOnAdd()
 10245                        .HasColumnType("boolean")
 10246                        .HasDefaultValue(false)
 10247                        .HasColumnName("is_deleted");
 10248
 10249                    b.Property<string>("Name")
 10250                        .IsRequired()
 10251                        .HasMaxLength(200)
 10252                        .HasColumnType("character varying(200)")
 10253                        .HasColumnName("name");
 10254
 10255                    b.Property<string>("ProfilePictureUrl")
 10256                        .HasMaxLength(2048)
 10257                        .HasColumnType("character varying(2048)")
 10258                        .HasColumnName("profile_picture_url");
 10259
 10260                    b.Property<Guid>("PublicId")
 10261                        .HasColumnType("uuid")
 10262                        .HasColumnName("public_id");
 10263
 10264                    b.Property<long>("ScopeId")
 10265                        .HasColumnType("bigint")
 10266                        .HasColumnName("scope_id");
 10267
 10268                    b.Property<DateTime>("UpdatedAt")
 10269                        .ValueGeneratedOnAdd()
 10270                        .HasColumnType("timestamp with time zone")
 10271                        .HasColumnName("updated_at")
 10272                        .HasDefaultValueSql("now()");
 10273
 10274                    b.HasKey("Id")
 10275                        .HasName("pk_google_user");
 10276
 10277                    b.HasIndex("DeletedAt")
 10278                        .HasDatabaseName("ix_google_user_deleted_at")
 10279                        .HasFilter("is_deleted = true AND anonymised_at IS NULL");
 10280
 10281                    b.HasIndex("PublicId")
 10282                        .IsUnique()
 10283                        .HasDatabaseName("ix_google_user_public_id");
 10284
 10285                    b.HasIndex("ScopeId", "Email")
 10286                        .IsUnique()
 10287                        .HasDatabaseName("ix_google_user_scope_id_email");
 10288
 10289                    b.HasIndex("ScopeId", "GoogleId")
 10290                        .IsUnique()
 10291                        .HasDatabaseName("ix_google_user_scope_id_google_id");
 10292
 10293                    b.ToTable("google_user", "heimdall");
 20294                });
 295
 10296            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 10297                {
 10298                    b.Property<long>("Id")
 10299                        .ValueGeneratedOnAdd()
 10300                        .HasColumnType("bigint")
 10301                        .HasColumnName("id")
 10302                        .HasColumnOrder(1);
 10303
 10304                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10305
 10306                    b.Property<DateTime>("ExpiresAt")
 10307                        .HasColumnType("timestamp with time zone")
 10308                        .HasColumnName("expires_at");
 10309
 10310                    b.Property<long>("PersonId")
 10311                        .HasColumnType("bigint")
 10312                        .HasColumnName("person_id");
 10313
 10314                    b.Property<string>("TokenHash")
 10315                        .IsRequired()
 10316                        .HasMaxLength(64)
 10317                        .HasColumnType("character varying(64)")
 10318                        .HasColumnName("token_hash");
 10319
 10320                    b.Property<bool>("Used")
 10321                        .ValueGeneratedOnAdd()
 10322                        .HasColumnType("boolean")
 10323                        .HasDefaultValue(false)
 10324                        .HasColumnName("used");
 10325
 10326                    b.HasKey("Id")
 10327                        .HasName("pk_password_reset_token");
 10328
 10329                    b.HasIndex("PersonId")
 10330                        .HasDatabaseName("ix_password_reset_token_person_id");
 10331
 10332                    b.HasIndex("TokenHash")
 10333                        .IsUnique()
 10334                        .HasDatabaseName("ix_password_reset_token_token_hash");
 10335
 10336                    b.ToTable("password_reset_token", "heimdall");
 20337                });
 338
 10339            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 10340                {
 10341                    b.Property<long>("Id")
 10342                        .ValueGeneratedOnAdd()
 10343                        .HasColumnType("bigint")
 10344                        .HasColumnName("id")
 10345                        .HasColumnOrder(1);
 10346
 10347                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10348
 10349                    b.Property<DateTime?>("AnonymisedAt")
 10350                        .HasColumnType("timestamp with time zone")
 10351                        .HasColumnName("anonymised_at");
 10352
 10353                    b.Property<DateTime>("CreatedAt")
 10354                        .ValueGeneratedOnAdd()
 10355                        .HasColumnType("timestamp with time zone")
 10356                        .HasColumnName("created_at")
 10357                        .HasDefaultValueSql("now()");
 10358
 10359                    b.Property<DateTime?>("DeletedAt")
 10360                        .HasColumnType("timestamp with time zone")
 10361                        .HasColumnName("deleted_at");
 10362
 10363                    b.Property<int?>("DeletionKind")
 10364                        .HasColumnType("integer")
 10365                        .HasColumnName("deletion_kind");
 10366
 10367                    b.Property<string>("Email")
 10368                        .IsRequired()
 10369                        .HasMaxLength(256)
 10370                        .HasColumnType("character varying(256)")
 10371                        .HasColumnName("email");
 10372
 10373                    b.Property<bool>("EmailVerified")
 10374                        .ValueGeneratedOnAdd()
 10375                        .HasColumnType("boolean")
 10376                        .HasDefaultValue(false)
 10377                        .HasColumnName("email_verified");
 10378
 10379                    b.Property<int>("FailedLoginAttempts")
 10380                        .HasColumnType("integer")
 10381                        .HasColumnName("failed_login_attempts");
 10382
 10383                    b.Property<bool>("IsDeleted")
 10384                        .ValueGeneratedOnAdd()
 10385                        .HasColumnType("boolean")
 10386                        .HasDefaultValue(false)
 10387                        .HasColumnName("is_deleted");
 10388
 10389                    b.Property<DateTime?>("LockedOutUntil")
 10390                        .HasColumnType("timestamp with time zone")
 10391                        .HasColumnName("locked_out_until");
 10392
 10393                    b.Property<string>("Name")
 10394                        .IsRequired()
 10395                        .HasMaxLength(200)
 10396                        .HasColumnType("character varying(200)")
 10397                        .HasColumnName("name");
 10398
 10399                    b.Property<byte[]>("PasswordHash")
 10400                        .IsRequired()
 10401                        .HasColumnType("bytea")
 10402                        .HasColumnName("password_hash");
 10403
 10404                    b.Property<Guid>("PublicId")
 10405                        .HasColumnType("uuid")
 10406                        .HasColumnName("public_id");
 10407
 10408                    b.Property<long>("RoleId")
 10409                        .HasColumnType("bigint")
 10410                        .HasColumnName("role_id");
 10411
 10412                    b.Property<byte[]>("Salt")
 10413                        .IsRequired()
 10414                        .HasColumnType("bytea")
 10415                        .HasColumnName("salt");
 10416
 10417                    b.Property<long?>("ScopeId")
 10418                        .HasColumnType("bigint")
 10419                        .HasColumnName("scope_id");
 10420
 10421                    b.Property<DateTime>("UpdatedAt")
 10422                        .ValueGeneratedOnAdd()
 10423                        .HasColumnType("timestamp with time zone")
 10424                        .HasColumnName("updated_at")
 10425                        .HasDefaultValueSql("now()");
 10426
 10427                    b.HasKey("Id")
 10428                        .HasName("pk_person");
 10429
 10430                    b.HasIndex("DeletedAt")
 10431                        .HasDatabaseName("ix_person_deleted_at")
 10432                        .HasFilter("is_deleted = true AND anonymised_at IS NULL");
 10433
 10434                    b.HasIndex("Email")
 10435                        .HasDatabaseName("ix_person_email");
 10436
 10437                    b.HasIndex("PublicId")
 10438                        .IsUnique()
 10439                        .HasDatabaseName("ix_person_public_id");
 10440
 10441                    b.HasIndex("RoleId")
 10442                        .HasDatabaseName("ix_person_role_id");
 10443
 10444                    b.ToTable("person", "heimdall");
 20445                });
 446
 10447            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 10448                {
 10449                    b.Property<long>("Id")
 10450                        .HasColumnType("bigint")
 10451                        .HasColumnName("id")
 10452                        .HasColumnOrder(1);
 10453
 10454                    b.Property<string>("Description")
 10455                        .HasMaxLength(500)
 10456                        .HasColumnType("character varying(500)")
 10457                        .HasColumnName("description");
 10458
 10459                    b.Property<string>("Name")
 10460                        .IsRequired()
 10461                        .HasMaxLength(200)
 10462                        .HasColumnType("character varying(200)")
 10463                        .HasColumnName("name");
 10464
 10465                    b.Property<Guid>("PublicId")
 10466                        .HasColumnType("uuid")
 10467                        .HasColumnName("public_id");
 10468
 10469                    b.HasKey("Id")
 10470                        .HasName("pk_role");
 10471
 10472                    b.HasIndex("Name")
 10473                        .IsUnique()
 10474                        .HasDatabaseName("ix_role_name");
 10475
 10476                    b.HasIndex("PublicId")
 10477                        .IsUnique()
 10478                        .HasDatabaseName("ix_role_public_id");
 10479
 10480                    b.ToTable("role", "heimdall");
 20481                });
 482
 10483            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 10484                {
 10485                    b.Property<long>("Id")
 10486                        .ValueGeneratedOnAdd()
 10487                        .HasColumnType("bigint")
 10488                        .HasColumnName("id")
 10489                        .HasColumnOrder(1);
 10490
 10491                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10492
 10493                    b.Property<DateTime>("CreatedAt")
 10494                        .ValueGeneratedOnAdd()
 10495                        .HasColumnType("timestamp with time zone")
 10496                        .HasColumnName("created_at")
 10497                        .HasDefaultValueSql("now()");
 10498
 10499                    b.Property<string>("Description")
 10500                        .HasMaxLength(500)
 10501                        .HasColumnType("character varying(500)")
 10502                        .HasColumnName("description");
 10503
 10504                    b.Property<bool>("GoogleSignInEnabled")
 10505                        .ValueGeneratedOnAdd()
 10506                        .HasColumnType("boolean")
 10507                        .HasDefaultValue(false)
 10508                        .HasColumnName("google_sign_in_enabled");
 10509
 10510                    b.Property<bool>("IsDeleted")
 10511                        .ValueGeneratedOnAdd()
 10512                        .HasColumnType("boolean")
 10513                        .HasDefaultValue(false)
 10514                        .HasColumnName("is_deleted");
 10515
 10516                    b.Property<string>("Name")
 10517                        .IsRequired()
 10518                        .HasMaxLength(200)
 10519                        .HasColumnType("character varying(200)")
 10520                        .HasColumnName("name");
 10521
 10522                    b.Property<Guid>("PublicId")
 10523                        .HasColumnType("uuid")
 10524                        .HasColumnName("public_id");
 10525
 10526                    b.Property<DateTime>("UpdatedAt")
 10527                        .ValueGeneratedOnAdd()
 10528                        .HasColumnType("timestamp with time zone")
 10529                        .HasColumnName("updated_at")
 10530                        .HasDefaultValueSql("now()");
 10531
 10532                    b.HasKey("Id")
 10533                        .HasName("pk_scope");
 10534
 10535                    b.HasIndex("Name")
 10536                        .IsUnique()
 10537                        .HasDatabaseName("ix_scope_name");
 10538
 10539                    b.HasIndex("PublicId")
 10540                        .IsUnique()
 10541                        .HasDatabaseName("ix_scope_public_id");
 10542
 10543                    b.ToTable("scope", "heimdall");
 20544                });
 545
 10546            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 10547                {
 10548                    b.Property<long>("ScopeId")
 10549                        .HasColumnType("bigint")
 10550                        .HasColumnName("scope_id");
 10551
 10552                    b.Property<long>("PersonId")
 10553                        .HasColumnType("bigint")
 10554                        .HasColumnName("person_id");
 10555
 10556                    b.HasKey("ScopeId", "PersonId")
 10557                        .HasName("pk_scope_owner");
 10558
 10559                    b.HasIndex("PersonId")
 10560                        .HasDatabaseName("ix_scope_owner_person_id");
 10561
 10562                    b.ToTable("scope_owner", "heimdall");
 20563                });
 564
 10565            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 10566                {
 10567                    b.Property<long>("Id")
 10568                        .ValueGeneratedOnAdd()
 10569                        .HasColumnType("bigint")
 10570                        .HasColumnName("id")
 10571                        .HasColumnOrder(1);
 10572
 10573                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10574
 10575                    b.Property<DateTime>("CreatedAt")
 10576                        .ValueGeneratedOnAdd()
 10577                        .HasColumnType("timestamp with time zone")
 10578                        .HasColumnName("created_at")
 10579                        .HasDefaultValueSql("now()");
 10580
 10581                    b.Property<string>("Description")
 10582                        .HasMaxLength(500)
 10583                        .HasColumnType("character varying(500)")
 10584                        .HasColumnName("description");
 10585
 10586                    b.Property<bool>("IncludeAsJwtClaim")
 10587                        .ValueGeneratedOnAdd()
 10588                        .HasColumnType("boolean")
 10589                        .HasDefaultValue(false)
 10590                        .HasColumnName("include_as_jwt_claim");
 10591
 10592                    b.Property<bool>("IsDeleted")
 10593                        .ValueGeneratedOnAdd()
 10594                        .HasColumnType("boolean")
 10595                        .HasDefaultValue(false)
 10596                        .HasColumnName("is_deleted");
 10597
 10598                    b.Property<string>("Name")
 10599                        .IsRequired()
 10600                        .HasMaxLength(200)
 10601                        .HasColumnType("character varying(200)")
 10602                        .HasColumnName("name");
 10603
 10604                    b.Property<Guid>("PublicId")
 10605                        .HasColumnType("uuid")
 10606                        .HasColumnName("public_id");
 10607
 10608                    b.Property<long>("ScopeId")
 10609                        .HasColumnType("bigint")
 10610                        .HasColumnName("scope_id");
 10611
 10612                    b.Property<DateTime>("UpdatedAt")
 10613                        .ValueGeneratedOnAdd()
 10614                        .HasColumnType("timestamp with time zone")
 10615                        .HasColumnName("updated_at")
 10616                        .HasDefaultValueSql("now()");
 10617
 10618                    b.HasKey("Id")
 10619                        .HasName("pk_scope_permission");
 10620
 10621                    b.HasIndex("PublicId")
 10622                        .IsUnique()
 10623                        .HasDatabaseName("ix_scope_permission_public_id");
 10624
 10625                    b.HasIndex("ScopeId")
 10626                        .HasDatabaseName("ix_scope_permission_scope_id");
 10627
 10628                    b.ToTable("scope_permission", "heimdall");
 20629                });
 630
 10631            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 10632                {
 10633                    b.Property<long>("ScopeId")
 10634                        .HasColumnType("bigint")
 10635                        .HasColumnName("scope_id");
 10636
 10637                    b.Property<long>("PersonId")
 10638                        .HasColumnType("bigint")
 10639                        .HasColumnName("person_id");
 10640
 10641                    b.HasKey("ScopeId", "PersonId")
 10642                        .HasName("pk_scope_user");
 10643
 10644                    b.HasIndex("PersonId")
 10645                        .IsUnique()
 10646                        .HasDatabaseName("ix_scope_user_person_id");
 10647
 10648                    b.ToTable("scope_user", "heimdall");
 20649                });
 650
 10651            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 10652                {
 10653                    b.Property<long>("Id")
 10654                        .ValueGeneratedOnAdd()
 10655                        .HasColumnType("bigint")
 10656                        .HasColumnName("id")
 10657                        .HasColumnOrder(1);
 10658
 10659                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10660
 10661                    b.Property<bool>("AppEnabled")
 10662                        .ValueGeneratedOnAdd()
 10663                        .HasColumnType("boolean")
 10664                        .HasDefaultValue(false)
 10665                        .HasColumnName("app_enabled");
 10666
 10667                    b.Property<DateTime>("CreatedAt")
 10668                        .ValueGeneratedOnAdd()
 10669                        .HasColumnType("timestamp with time zone")
 10670                        .HasColumnName("created_at")
 10671                        .HasDefaultValueSql("now()");
 10672
 10673                    b.Property<bool>("EmailEnabled")
 10674                        .ValueGeneratedOnAdd()
 10675                        .HasColumnType("boolean")
 10676                        .HasDefaultValue(false)
 10677                        .HasColumnName("email_enabled");
 10678
 10679                    b.Property<bool>("IsActive")
 10680                        .ValueGeneratedOnAdd()
 10681                        .HasColumnType("boolean")
 10682                        .HasDefaultValue(false)
 10683                        .HasColumnName("is_active");
 10684
 10685                    b.Property<long?>("LastTotpTimeStepUsed")
 10686                        .HasColumnType("bigint")
 10687                        .HasColumnName("last_totp_time_step_used");
 10688
 10689                    b.Property<long>("PersonId")
 10690                        .HasColumnType("bigint")
 10691                        .HasColumnName("person_id");
 10692
 10693                    b.Property<byte[]>("TotpSecretEncrypted")
 10694                        .HasColumnType("bytea")
 10695                        .HasColumnName("totp_secret_encrypted");
 10696
 10697                    b.Property<DateTime>("UpdatedAt")
 10698                        .ValueGeneratedOnAdd()
 10699                        .HasColumnType("timestamp with time zone")
 10700                        .HasColumnName("updated_at")
 10701                        .HasDefaultValueSql("now()");
 10702
 10703                    b.HasKey("Id")
 10704                        .HasName("pk_two_factor_auth");
 10705
 10706                    b.HasIndex("PersonId")
 10707                        .IsUnique()
 10708                        .HasDatabaseName("ix_two_factor_auth_person_id");
 10709
 10710                    b.ToTable("two_factor_auth", "heimdall");
 20711                });
 712
 10713            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 10714                {
 10715                    b.Property<long>("Id")
 10716                        .ValueGeneratedOnAdd()
 10717                        .HasColumnType("bigint")
 10718                        .HasColumnName("id")
 10719                        .HasColumnOrder(1);
 10720
 10721                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10722
 10723                    b.Property<byte[]>("CodeHash")
 10724                        .IsRequired()
 10725                        .HasColumnType("bytea")
 10726                        .HasColumnName("code_hash");
 10727
 10728                    b.Property<DateTime>("CreatedAt")
 10729                        .ValueGeneratedOnAdd()
 10730                        .HasColumnType("timestamp with time zone")
 10731                        .HasColumnName("created_at")
 10732                        .HasDefaultValueSql("now()");
 10733
 10734                    b.Property<DateTime>("ExpiresAt")
 10735                        .HasColumnType("timestamp with time zone")
 10736                        .HasColumnName("expires_at");
 10737
 10738                    b.Property<int>("FailedAttempts")
 10739                        .HasColumnType("integer")
 10740                        .HasColumnName("failed_attempts");
 10741
 10742                    b.Property<byte[]>("Salt")
 10743                        .IsRequired()
 10744                        .HasColumnType("bytea")
 10745                        .HasColumnName("salt");
 10746
 10747                    b.Property<long>("TwoFactorAuthId")
 10748                        .HasColumnType("bigint")
 10749                        .HasColumnName("two_factor_auth_id");
 10750
 10751                    b.Property<bool>("Used")
 10752                        .ValueGeneratedOnAdd()
 10753                        .HasColumnType("boolean")
 10754                        .HasDefaultValue(false)
 10755                        .HasColumnName("used");
 10756
 10757                    b.HasKey("Id")
 10758                        .HasName("pk_two_factor_email_code");
 10759
 10760                    b.HasIndex("TwoFactorAuthId")
 10761                        .HasDatabaseName("ix_two_factor_email_code_two_factor_auth_id");
 10762
 10763                    b.ToTable("two_factor_email_code", "heimdall");
 20764                });
 765
 10766            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 10767                {
 10768                    b.Property<long>("Id")
 10769                        .ValueGeneratedOnAdd()
 10770                        .HasColumnType("bigint")
 10771                        .HasColumnName("id")
 10772                        .HasColumnOrder(1);
 10773
 10774                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10775
 10776                    b.Property<byte[]>("CodeHash")
 10777                        .IsRequired()
 10778                        .HasColumnType("bytea")
 10779                        .HasColumnName("code_hash");
 10780
 10781                    b.Property<DateTime>("CreatedAt")
 10782                        .ValueGeneratedOnAdd()
 10783                        .HasColumnType("timestamp with time zone")
 10784                        .HasColumnName("created_at")
 10785                        .HasDefaultValueSql("now()");
 10786
 10787                    b.Property<long>("TwoFactorAuthId")
 10788                        .HasColumnType("bigint")
 10789                        .HasColumnName("two_factor_auth_id");
 10790
 10791                    b.Property<bool>("Used")
 10792                        .ValueGeneratedOnAdd()
 10793                        .HasColumnType("boolean")
 10794                        .HasDefaultValue(false)
 10795                        .HasColumnName("used");
 10796
 10797                    b.Property<DateTime?>("UsedAt")
 10798                        .HasColumnType("timestamp with time zone")
 10799                        .HasColumnName("used_at");
 10800
 10801                    b.HasKey("Id")
 10802                        .HasName("pk_two_factor_recovery_code");
 10803
 10804                    b.HasIndex("TwoFactorAuthId")
 10805                        .HasDatabaseName("ix_two_factor_recovery_code_two_factor_auth_id");
 10806
 10807                    b.ToTable("two_factor_recovery_code", "heimdall");
 20808                });
 809
 10810            modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b =>
 10811                {
 10812                    b.Property<int>("Id")
 10813                        .ValueGeneratedOnAdd()
 10814                        .HasColumnType("integer")
 10815                        .HasColumnName("id");
 10816
 10817                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 10818
 10819                    b.Property<string>("FriendlyName")
 10820                        .HasColumnType("text")
 10821                        .HasColumnName("friendly_name");
 10822
 10823                    b.Property<string>("Xml")
 10824                        .HasColumnType("text")
 10825                        .HasColumnName("xml");
 10826
 10827                    b.HasKey("Id")
 10828                        .HasName("pk_data_protection_keys");
 10829
 10830                    b.ToTable("data_protection_keys", "heimdall");
 20831                });
 832
 10833            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 10834                {
 10835                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Owner")
 10836                        .WithMany("OwnedApplications")
 10837                        .HasForeignKey("OwnerId")
 10838                        .OnDelete(DeleteBehavior.Cascade)
 10839                        .IsRequired()
 10840                        .HasConstraintName("fk_application_person_owner_id");
 10841
 10842                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 10843                        .WithMany("Applications")
 10844                        .HasForeignKey("ScopeId")
 10845                        .OnDelete(DeleteBehavior.Cascade)
 10846                        .IsRequired()
 10847                        .HasConstraintName("fk_application_scope_scope_id");
 10848
 10849                    b.Navigation("Owner");
 10850
 10851                    b.Navigation("Scope");
 20852                });
 853
 10854            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 10855                {
 10856                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 10857                        .WithMany("EmailVerificationTokens")
 10858                        .HasForeignKey("PersonId")
 10859                        .OnDelete(DeleteBehavior.Cascade)
 10860                        .IsRequired()
 10861                        .HasConstraintName("fk_email_verification_token_person_person_id");
 10862
 10863                    b.Navigation("Person");
 20864                });
 865
 10866            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 10867                {
 10868                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 10869                        .WithMany("GoogleUsers")
 10870                        .HasForeignKey("ScopeId")
 10871                        .OnDelete(DeleteBehavior.Cascade)
 10872                        .IsRequired()
 10873                        .HasConstraintName("fk_google_user_scope_scope_id");
 10874
 10875                    b.Navigation("Scope");
 20876                });
 877
 10878            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 10879                {
 10880                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 10881                        .WithMany("PasswordResetTokens")
 10882                        .HasForeignKey("PersonId")
 10883                        .OnDelete(DeleteBehavior.Cascade)
 10884                        .IsRequired()
 10885                        .HasConstraintName("fk_password_reset_token_person_person_id");
 10886
 10887                    b.Navigation("Person");
 20888                });
 889
 10890            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 10891                {
 10892                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Role", "Role")
 10893                        .WithMany("Persons")
 10894                        .HasForeignKey("RoleId")
 10895                        .OnDelete(DeleteBehavior.Restrict)
 10896                        .IsRequired()
 10897                        .HasConstraintName("fk_person_roles_role_id");
 10898
 10899                    b.Navigation("Role");
 20900                });
 901
 10902            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 10903                {
 10904                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 10905                        .WithMany("ScopeOwnerships")
 10906                        .HasForeignKey("PersonId")
 10907                        .OnDelete(DeleteBehavior.Cascade)
 10908                        .IsRequired()
 10909                        .HasConstraintName("fk_scope_owner_person_person_id");
 10910
 10911                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 10912                        .WithMany("Owners")
 10913                        .HasForeignKey("ScopeId")
 10914                        .OnDelete(DeleteBehavior.Cascade)
 10915                        .IsRequired()
 10916                        .HasConstraintName("fk_scope_owner_scope_scope_id");
 10917
 10918                    b.Navigation("Person");
 10919
 10920                    b.Navigation("Scope");
 20921                });
 922
 10923            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 10924                {
 10925                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 10926                        .WithMany("ScopePermissions")
 10927                        .HasForeignKey("ScopeId")
 10928                        .OnDelete(DeleteBehavior.Cascade)
 10929                        .IsRequired()
 10930                        .HasConstraintName("fk_scope_permission_scope_scope_id");
 10931
 10932                    b.Navigation("Scope");
 20933                });
 934
 10935            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 10936                {
 10937                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 10938                        .WithOne("ScopeMembership")
 10939                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.ScopeUser", "PersonId")
 10940                        .OnDelete(DeleteBehavior.Cascade)
 10941                        .IsRequired()
 10942                        .HasConstraintName("fk_scope_user_person_person_id");
 10943
 10944                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 10945                        .WithMany("Users")
 10946                        .HasForeignKey("ScopeId")
 10947                        .OnDelete(DeleteBehavior.Cascade)
 10948                        .IsRequired()
 10949                        .HasConstraintName("fk_scope_user_scope_scope_id");
 10950
 10951                    b.Navigation("Person");
 10952
 10953                    b.Navigation("Scope");
 20954                });
 955
 10956            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 10957                {
 10958                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 10959                        .WithOne("TwoFactorAuth")
 10960                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "PersonId")
 10961                        .OnDelete(DeleteBehavior.Cascade)
 10962                        .IsRequired()
 10963                        .HasConstraintName("fk_two_factor_auth_person_person_id");
 10964
 10965                    b.Navigation("Person");
 20966                });
 967
 10968            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 10969                {
 10970                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 10971                        .WithMany("EmailCodes")
 10972                        .HasForeignKey("TwoFactorAuthId")
 10973                        .OnDelete(DeleteBehavior.Cascade)
 10974                        .IsRequired()
 10975                        .HasConstraintName("fk_two_factor_email_code_two_factor_auth_two_factor_auth_id");
 10976
 10977                    b.Navigation("TwoFactorAuth");
 20978                });
 979
 10980            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 10981                {
 10982                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 10983                        .WithMany("RecoveryCodes")
 10984                        .HasForeignKey("TwoFactorAuthId")
 10985                        .OnDelete(DeleteBehavior.Cascade)
 10986                        .IsRequired()
 10987                        .HasConstraintName("fk_two_factor_recovery_code_two_factor_auth_two_factor_auth_id");
 10988
 10989                    b.Navigation("TwoFactorAuth");
 20990                });
 991
 10992            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 10993                {
 10994                    b.Navigation("EmailVerificationTokens");
 10995
 10996                    b.Navigation("OwnedApplications");
 10997
 10998                    b.Navigation("PasswordResetTokens");
 10999
 101000                    b.Navigation("ScopeMembership");
 101001
 101002                    b.Navigation("ScopeOwnerships");
 101003
 101004                    b.Navigation("TwoFactorAuth");
 201005                });
 1006
 101007            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 101008                {
 101009                    b.Navigation("Persons");
 201010                });
 1011
 101012            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 101013                {
 101014                    b.Navigation("Applications");
 101015
 101016                    b.Navigation("GoogleUsers");
 101017
 101018                    b.Navigation("Owners");
 101019
 101020                    b.Navigation("ScopePermissions");
 101021
 101022                    b.Navigation("Users");
 201023                });
 1024
 101025            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 101026                {
 101027                    b.Navigation("EmailCodes");
 101028
 101029                    b.Navigation("RecoveryCodes");
 201030                });
 1031#pragma warning restore 612, 618
 101032        }
 1033    }
 1034}