< Summary - Heimdall API

Line coverage
98%
Covered lines: 1347
Uncovered lines: 16
Coverable lines: 1363
Total lines: 1471
Line coverage: 98.8%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage
66%
Covered methods: 2
Fully covered methods: 2
Total methods: 3
Method coverage: 66.6%
Full method coverage: 66.6%

Metrics

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

File(s)

/home/runner/work/heimdall-api/heimdall-api/src/Infrastructure/ArturRios.Heimdall.Data/Migrations/20261015041235_ProtectEntityPublicIds.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore.Migrations;
 2
 3#nullable disable
 4
 5namespace ArturRios.Heimdall.Data.Migrations
 6{
 7    /// <summary>
 8    ///     Guards <c>public_id</c> on every other table the identity check trusts: <c>scope</c>,
 9    ///     <c>application</c>, <c>application_credential</c>, <c>scope_permission</c>, <c>role</c> and
 10    ///     <c>pending_registration</c> become immutable, and refuse a new row whose id another guarded
 11    ///     table holds (#199, R2 and R3; Threat Model TH-18 and §6.1).
 12    /// </summary>
 13    /// <remarks>
 14    ///     <para>
 15    ///         <c>ProtectIdentityPublicIds</c> refuses a new person or Google User whose
 16    ///         <c>public_id</c> another entity holds, but it can only see who holds an id at that
 17    ///         moment, and only when the identity comes second. Two DML paths were left. While these
 18    ///         tables' ids could be rewritten, a scope could be moved off its id, a person inserted with
 19    ///         the freed id and anonymised, every audit target naming the scope cleared, and the scope
 20    ///         moved back. And while only the identity tables were checked, a person could be inserted
 21    ///         with a fresh id first and a scope with the same id after it, so that every entry later
 22    ///         naming the scope was clearable through the person.
 23    ///     </para>
 24    ///     <para>
 25    ///         Each table therefore gets the same two row-level triggers as the identity tables:
 26    ///         <c>*_public_id_is_immutable</c> (<c>BEFORE UPDATE</c>, <c>public_id_is_immutable()</c>)
 27    ///         and <c>*_public_id_is_unused</c> (<c>BEFORE INSERT</c>, <c>public_id_is_unused()</c>).
 28    ///         The functions name the table through <c>TG_TABLE_NAME</c> and leave its own table to its
 29    ///         unique index, so they need no change. Their audit-trail check applies to the identity
 30    ///         tables only, as that function's comment explains. Every other column stays writable.
 31    ///         The application never changes these ids and always creates them fresh with
 32    ///         <c>Guid.NewGuid()</c>, the seeder's roles included, and its role realignment writes only
 33    ///         the name and description. Down drops the twelve triggers; the functions stay with the
 34    ///         migration that created them.
 35    ///     </para>
 36    /// </remarks>
 37    public partial class ProtectEntityPublicIds : Migration
 38    {
 39        /// <inheritdoc />
 40        protected override void Up(MigrationBuilder migrationBuilder)
 41        {
 442            migrationBuilder.Sql(
 443                """
 444                CREATE TRIGGER scope_public_id_is_immutable
 445                BEFORE UPDATE ON heimdall.scope
 446                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_immutable();
 447
 448                CREATE TRIGGER scope_public_id_is_unused
 449                BEFORE INSERT ON heimdall.scope
 450                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_unused();
 451
 452                CREATE TRIGGER application_public_id_is_immutable
 453                BEFORE UPDATE ON heimdall.application
 454                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_immutable();
 455
 456                CREATE TRIGGER application_public_id_is_unused
 457                BEFORE INSERT ON heimdall.application
 458                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_unused();
 459
 460                CREATE TRIGGER application_credential_public_id_is_immutable
 461                BEFORE UPDATE ON heimdall.application_credential
 462                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_immutable();
 463
 464                CREATE TRIGGER application_credential_public_id_is_unused
 465                BEFORE INSERT ON heimdall.application_credential
 466                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_unused();
 467
 468                CREATE TRIGGER scope_permission_public_id_is_immutable
 469                BEFORE UPDATE ON heimdall.scope_permission
 470                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_immutable();
 471
 472                CREATE TRIGGER scope_permission_public_id_is_unused
 473                BEFORE INSERT ON heimdall.scope_permission
 474                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_unused();
 475
 476                CREATE TRIGGER role_public_id_is_immutable
 477                BEFORE UPDATE ON heimdall.role
 478                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_immutable();
 479
 480                CREATE TRIGGER role_public_id_is_unused
 481                BEFORE INSERT ON heimdall.role
 482                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_unused();
 483
 484                CREATE TRIGGER pending_registration_public_id_is_immutable
 485                BEFORE UPDATE ON heimdall.pending_registration
 486                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_immutable();
 487
 488                CREATE TRIGGER pending_registration_public_id_is_unused
 489                BEFORE INSERT ON heimdall.pending_registration
 490                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_unused();
 491                """);
 492        }
 93
 94        /// <inheritdoc />
 95        protected override void Down(MigrationBuilder migrationBuilder)
 96        {
 097            migrationBuilder.Sql(
 098                """
 099                DROP TRIGGER IF EXISTS pending_registration_public_id_is_unused ON heimdall.pending_registration;
 0100                DROP TRIGGER IF EXISTS pending_registration_public_id_is_immutable ON heimdall.pending_registration;
 0101                DROP TRIGGER IF EXISTS role_public_id_is_unused ON heimdall.role;
 0102                DROP TRIGGER IF EXISTS role_public_id_is_immutable ON heimdall.role;
 0103                DROP TRIGGER IF EXISTS scope_permission_public_id_is_unused ON heimdall.scope_permission;
 0104                DROP TRIGGER IF EXISTS scope_permission_public_id_is_immutable ON heimdall.scope_permission;
 0105                DROP TRIGGER IF EXISTS application_credential_public_id_is_unused ON heimdall.application_credential;
 0106                DROP TRIGGER IF EXISTS application_credential_public_id_is_immutable ON heimdall.application_credential;
 0107                DROP TRIGGER IF EXISTS application_public_id_is_unused ON heimdall.application;
 0108                DROP TRIGGER IF EXISTS application_public_id_is_immutable ON heimdall.application;
 0109                DROP TRIGGER IF EXISTS scope_public_id_is_unused ON heimdall.scope;
 0110                DROP TRIGGER IF EXISTS scope_public_id_is_immutable ON heimdall.scope;
 0111                """);
 0112        }
 113    }
 114}

/home/runner/work/heimdall-api/heimdall-api/src/Infrastructure/ArturRios.Heimdall.Data/Migrations/20261015041235_ProtectEntityPublicIds.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("20261015041235_ProtectEntityPublicIds")]
 16    partial class ProtectEntityPublicIds
 17    {
 18        /// <inheritdoc />
 19        protected override void BuildTargetModel(ModelBuilder modelBuilder)
 20        {
 21#pragma warning disable 612, 618
 222            modelBuilder
 223                .HasDefaultSchema("heimdall")
 224                .HasAnnotation("ProductVersion", "10.0.13")
 225                .HasAnnotation("Relational:MaxIdentifierLength", 63);
 26
 227            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
 28
 229            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 230                {
 231                    b.Property<long>("Id")
 232                        .ValueGeneratedOnAdd()
 233                        .HasColumnType("bigint")
 234                        .HasColumnName("id")
 235                        .HasColumnOrder(1);
 236
 237                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 238
 239                    b.Property<DateTime>("CreatedAt")
 240                        .ValueGeneratedOnAdd()
 241                        .HasColumnType("timestamp with time zone")
 242                        .HasColumnName("created_at")
 243                        .HasDefaultValueSql("now()");
 244
 245                    b.Property<bool>("IsDeleted")
 246                        .ValueGeneratedOnAdd()
 247                        .HasColumnType("boolean")
 248                        .HasDefaultValue(false)
 249                        .HasColumnName("is_deleted");
 250
 251                    b.Property<string>("Name")
 252                        .IsRequired()
 253                        .HasMaxLength(200)
 254                        .HasColumnType("character varying(200)")
 255                        .HasColumnName("name");
 256
 257                    b.Property<long>("OwnerId")
 258                        .HasColumnType("bigint")
 259                        .HasColumnName("owner_id");
 260
 261                    b.Property<Guid>("PublicId")
 262                        .HasColumnType("uuid")
 263                        .HasColumnName("public_id");
 264
 265                    b.Property<long>("ScopeId")
 266                        .HasColumnType("bigint")
 267                        .HasColumnName("scope_id");
 268
 269                    b.Property<DateTime>("UpdatedAt")
 270                        .ValueGeneratedOnAdd()
 271                        .HasColumnType("timestamp with time zone")
 272                        .HasColumnName("updated_at")
 273                        .HasDefaultValueSql("now()");
 274
 275                    b.HasKey("Id")
 276                        .HasName("pk_application");
 277
 278                    b.HasIndex("OwnerId")
 279                        .HasDatabaseName("ix_application_owner_id");
 280
 281                    b.HasIndex("PublicId")
 282                        .IsUnique()
 283                        .HasDatabaseName("ix_application_public_id");
 284
 285                    b.HasIndex("ScopeId")
 286                        .HasDatabaseName("ix_application_scope_id");
 287
 288                    b.ToTable("application", "heimdall");
 489                });
 90
 291            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ApplicationCredential", b =>
 292                {
 293                    b.Property<long>("Id")
 294                        .ValueGeneratedOnAdd()
 295                        .HasColumnType("bigint")
 296                        .HasColumnName("id")
 297                        .HasColumnOrder(1);
 298
 299                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2100
 2101                    b.Property<long>("ApplicationId")
 2102                        .HasColumnType("bigint")
 2103                        .HasColumnName("application_id");
 2104
 2105                    b.Property<DateTime>("CreatedAt")
 2106                        .HasColumnType("timestamp with time zone")
 2107                        .HasColumnName("created_at");
 2108
 2109                    b.Property<DateTime?>("ExpiresAt")
 2110                        .HasColumnType("timestamp with time zone")
 2111                        .HasColumnName("expires_at");
 2112
 2113                    b.Property<DateTime?>("LastUsedAt")
 2114                        .HasColumnType("timestamp with time zone")
 2115                        .HasColumnName("last_used_at");
 2116
 2117                    b.Property<Guid>("PublicId")
 2118                        .HasColumnType("uuid")
 2119                        .HasColumnName("public_id");
 2120
 2121                    b.Property<DateTime?>("RevokedAt")
 2122                        .HasColumnType("timestamp with time zone")
 2123                        .HasColumnName("revoked_at");
 2124
 2125                    b.Property<string>("SecretHash")
 2126                        .IsRequired()
 2127                        .HasMaxLength(64)
 2128                        .HasColumnType("character varying(64)")
 2129                        .HasColumnName("secret_hash");
 2130
 2131                    b.HasKey("Id")
 2132                        .HasName("pk_application_credential");
 2133
 2134                    b.HasIndex("ApplicationId")
 2135                        .HasDatabaseName("ix_application_credential_application_id");
 2136
 2137                    b.HasIndex("PublicId")
 2138                        .IsUnique()
 2139                        .HasDatabaseName("ix_application_credential_public_id");
 2140
 2141                    b.HasIndex("SecretHash")
 2142                        .IsUnique()
 2143                        .HasDatabaseName("ix_application_credential_secret_hash");
 2144
 2145                    b.ToTable("application_credential", "heimdall");
 4146                });
 147
 2148            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.AuditLog", b =>
 2149                {
 2150                    b.Property<long>("Id")
 2151                        .ValueGeneratedOnAdd()
 2152                        .HasColumnType("bigint")
 2153                        .HasColumnName("id")
 2154                        .HasColumnOrder(1);
 2155
 2156                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2157
 2158                    b.Property<string>("Action")
 2159                        .IsRequired()
 2160                        .HasMaxLength(200)
 2161                        .HasColumnType("character varying(200)")
 2162                        .HasColumnName("action");
 2163
 2164                    b.Property<Guid?>("ActorPersonId")
 2165                        .HasColumnType("uuid")
 2166                        .HasColumnName("actor_person_id");
 2167
 2168                    b.Property<int?>("ActorRole")
 2169                        .HasColumnType("integer")
 2170                        .HasColumnName("actor_role");
 2171
 2172                    b.Property<DateTime>("CreatedAt")
 2173                        .ValueGeneratedOnAdd()
 2174                        .HasColumnType("timestamp with time zone")
 2175                        .HasColumnName("created_at")
 2176                        .HasDefaultValueSql("now()");
 2177
 2178                    b.Property<string>("FailureReason")
 2179                        .HasMaxLength(500)
 2180                        .HasColumnType("character varying(500)")
 2181                        .HasColumnName("failure_reason");
 2182
 2183                    b.Property<Guid>("PublicId")
 2184                        .HasColumnType("uuid")
 2185                        .HasColumnName("public_id");
 2186
 2187                    b.Property<bool>("Succeeded")
 2188                        .HasColumnType("boolean")
 2189                        .HasColumnName("succeeded");
 2190
 2191                    b.Property<Guid?>("TargetId")
 2192                        .HasColumnType("uuid")
 2193                        .HasColumnName("target_id");
 2194
 2195                    b.HasKey("Id")
 2196                        .HasName("pk_audit_log");
 2197
 2198                    b.HasIndex("ActorPersonId")
 2199                        .HasDatabaseName("ix_audit_log_actor_person_id");
 2200
 2201                    b.HasIndex("CreatedAt")
 2202                        .HasDatabaseName("ix_audit_log_created_at");
 2203
 2204                    b.HasIndex("PublicId")
 2205                        .IsUnique()
 2206                        .HasDatabaseName("ix_audit_log_public_id");
 2207
 2208                    b.HasIndex("TargetId")
 2209                        .HasDatabaseName("ix_audit_log_target_id");
 2210
 2211                    b.ToTable("audit_log", "heimdall");
 4212                });
 213
 2214            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 2215                {
 2216                    b.Property<long>("Id")
 2217                        .ValueGeneratedOnAdd()
 2218                        .HasColumnType("bigint")
 2219                        .HasColumnName("id")
 2220                        .HasColumnOrder(1);
 2221
 2222                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2223
 2224                    b.Property<DateTime>("ExpiresAt")
 2225                        .HasColumnType("timestamp with time zone")
 2226                        .HasColumnName("expires_at");
 2227
 2228                    b.Property<long>("PersonId")
 2229                        .HasColumnType("bigint")
 2230                        .HasColumnName("person_id");
 2231
 2232                    b.Property<string>("TokenHash")
 2233                        .IsRequired()
 2234                        .HasMaxLength(64)
 2235                        .HasColumnType("character varying(64)")
 2236                        .HasColumnName("token_hash");
 2237
 2238                    b.Property<bool>("Used")
 2239                        .ValueGeneratedOnAdd()
 2240                        .HasColumnType("boolean")
 2241                        .HasDefaultValue(false)
 2242                        .HasColumnName("used");
 2243
 2244                    b.HasKey("Id")
 2245                        .HasName("pk_email_verification_token");
 2246
 2247                    b.HasIndex("PersonId")
 2248                        .HasDatabaseName("ix_email_verification_token_person_id");
 2249
 2250                    b.HasIndex("TokenHash")
 2251                        .IsUnique()
 2252                        .HasDatabaseName("ix_email_verification_token_token_hash");
 2253
 2254                    b.ToTable("email_verification_token", "heimdall");
 4255                });
 256
 2257            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ErasedSubject", b =>
 2258                {
 2259                    b.Property<Guid>("Id")
 2260                        .HasColumnType("uuid")
 2261                        .HasColumnName("public_id")
 2262                        .HasColumnOrder(1);
 2263
 2264                    b.Property<DateTime>("CreatedAt")
 2265                        .ValueGeneratedOnAdd()
 2266                        .HasColumnType("timestamp with time zone")
 2267                        .HasColumnName("created_at")
 2268                        .HasDefaultValueSql("now()");
 2269
 2270                    b.Property<int>("Kind")
 2271                        .HasColumnType("integer")
 2272                        .HasColumnName("kind");
 2273
 2274                    b.HasKey("Id")
 2275                        .HasName("pk_erased_subject");
 2276
 2277                    b.HasIndex("CreatedAt")
 2278                        .HasDatabaseName("ix_erased_subject_created_at");
 2279
 2280                    b.ToTable("erased_subject", "heimdall");
 4281                });
 282
 2283            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 2284                {
 2285                    b.Property<long>("Id")
 2286                        .ValueGeneratedOnAdd()
 2287                        .HasColumnType("bigint")
 2288                        .HasColumnName("id")
 2289                        .HasColumnOrder(1);
 2290
 2291                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2292
 2293                    b.Property<DateTime?>("AnonymisedAt")
 2294                        .HasColumnType("timestamp with time zone")
 2295                        .HasColumnName("anonymised_at");
 2296
 2297                    b.Property<DateTime?>("BasisRecordedAt")
 2298                        .HasColumnType("timestamp with time zone")
 2299                        .HasColumnName("basis_recorded_at");
 2300
 2301                    b.Property<DateTime>("CreatedAt")
 2302                        .ValueGeneratedOnAdd()
 2303                        .HasColumnType("timestamp with time zone")
 2304                        .HasColumnName("created_at")
 2305                        .HasDefaultValueSql("now()");
 2306
 2307                    b.Property<DateTime?>("DeletedAt")
 2308                        .HasColumnType("timestamp with time zone")
 2309                        .HasColumnName("deleted_at");
 2310
 2311                    b.Property<int?>("DeletionKind")
 2312                        .HasColumnType("integer")
 2313                        .HasColumnName("deletion_kind");
 2314
 2315                    b.Property<string>("Email")
 2316                        .IsRequired()
 2317                        .HasMaxLength(256)
 2318                        .HasColumnType("character varying(256)")
 2319                        .HasColumnName("email");
 2320
 2321                    b.Property<bool>("EmailVerified")
 2322                        .ValueGeneratedOnAdd()
 2323                        .HasColumnType("boolean")
 2324                        .HasDefaultValue(false)
 2325                        .HasColumnName("email_verified");
 2326
 2327                    b.Property<string>("ErasureBlockedReason")
 2328                        .HasMaxLength(500)
 2329                        .HasColumnType("character varying(500)")
 2330                        .HasColumnName("erasure_blocked_reason");
 2331
 2332                    b.Property<DateTime?>("ErasureDueAt")
 2333                        .HasColumnType("timestamp with time zone")
 2334                        .HasColumnName("erasure_due_at");
 2335
 2336                    b.Property<DateTime?>("ErasureRequestedAt")
 2337                        .HasColumnType("timestamp with time zone")
 2338                        .HasColumnName("erasure_requested_at");
 2339
 2340                    b.Property<string>("GoogleId")
 2341                        .IsRequired()
 2342                        .HasMaxLength(255)
 2343                        .HasColumnType("character varying(255)")
 2344                        .HasColumnName("google_id");
 2345
 2346                    b.Property<bool>("IsDeleted")
 2347                        .ValueGeneratedOnAdd()
 2348                        .HasColumnType("boolean")
 2349                        .HasDefaultValue(false)
 2350                        .HasColumnName("is_deleted");
 2351
 2352                    b.Property<int>("LegalBasis")
 2353                        .ValueGeneratedOnAdd()
 2354                        .HasColumnType("integer")
 2355                        .HasDefaultValue(0)
 2356                        .HasColumnName("legal_basis");
 2357
 2358                    b.Property<string>("Name")
 2359                        .IsRequired()
 2360                        .HasMaxLength(200)
 2361                        .HasColumnType("character varying(200)")
 2362                        .HasColumnName("name");
 2363
 2364                    b.Property<string>("PrivacyNoticeVersion")
 2365                        .HasMaxLength(50)
 2366                        .HasColumnType("character varying(50)")
 2367                        .HasColumnName("privacy_notice_version");
 2368
 2369                    b.Property<DateTime?>("ProcessingRestrictedAt")
 2370                        .HasColumnType("timestamp with time zone")
 2371                        .HasColumnName("processing_restricted_at");
 2372
 2373                    b.Property<string>("ProfilePictureUrl")
 2374                        .HasMaxLength(2048)
 2375                        .HasColumnType("character varying(2048)")
 2376                        .HasColumnName("profile_picture_url");
 2377
 2378                    b.Property<Guid>("PublicId")
 2379                        .HasColumnType("uuid")
 2380                        .HasColumnName("public_id");
 2381
 2382                    b.Property<int?>("RestrictionGround")
 2383                        .HasColumnType("integer")
 2384                        .HasColumnName("restriction_ground");
 2385
 2386                    b.Property<DateTime?>("RestrictionLiftNotifiedAt")
 2387                        .HasColumnType("timestamp with time zone")
 2388                        .HasColumnName("restriction_lift_notified_at");
 2389
 2390                    b.Property<long>("ScopeId")
 2391                        .HasColumnType("bigint")
 2392                        .HasColumnName("scope_id");
 2393
 2394                    b.Property<DateTime>("UpdatedAt")
 2395                        .ValueGeneratedOnAdd()
 2396                        .HasColumnType("timestamp with time zone")
 2397                        .HasColumnName("updated_at")
 2398                        .HasDefaultValueSql("now()");
 2399
 2400                    b.HasKey("Id")
 2401                        .HasName("pk_google_user");
 2402
 2403                    b.HasIndex("DeletedAt")
 2404                        .HasDatabaseName("ix_google_user_deleted_at")
 2405                        .HasFilter("is_deleted = true AND anonymised_at IS NULL");
 2406
 2407                    b.HasIndex("ProcessingRestrictedAt")
 2408                        .HasDatabaseName("ix_google_user_processing_restricted_at")
 2409                        .HasFilter("processing_restricted_at IS NOT NULL");
 2410
 2411                    b.HasIndex("PublicId")
 2412                        .IsUnique()
 2413                        .HasDatabaseName("ix_google_user_public_id");
 2414
 2415                    b.HasIndex("ScopeId", "Email")
 2416                        .IsUnique()
 2417                        .HasDatabaseName("ix_google_user_scope_id_email");
 2418
 2419                    b.HasIndex("ScopeId", "GoogleId")
 2420                        .IsUnique()
 2421                        .HasDatabaseName("ix_google_user_scope_id_google_id");
 2422
 2423                    b.ToTable("google_user", "heimdall");
 4424                });
 425
 2426            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 2427                {
 2428                    b.Property<long>("Id")
 2429                        .ValueGeneratedOnAdd()
 2430                        .HasColumnType("bigint")
 2431                        .HasColumnName("id")
 2432                        .HasColumnOrder(1);
 2433
 2434                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2435
 2436                    b.Property<DateTime>("ExpiresAt")
 2437                        .HasColumnType("timestamp with time zone")
 2438                        .HasColumnName("expires_at");
 2439
 2440                    b.Property<long>("PersonId")
 2441                        .HasColumnType("bigint")
 2442                        .HasColumnName("person_id");
 2443
 2444                    b.Property<string>("TokenHash")
 2445                        .IsRequired()
 2446                        .HasMaxLength(64)
 2447                        .HasColumnType("character varying(64)")
 2448                        .HasColumnName("token_hash");
 2449
 2450                    b.Property<bool>("Used")
 2451                        .ValueGeneratedOnAdd()
 2452                        .HasColumnType("boolean")
 2453                        .HasDefaultValue(false)
 2454                        .HasColumnName("used");
 2455
 2456                    b.HasKey("Id")
 2457                        .HasName("pk_password_reset_token");
 2458
 2459                    b.HasIndex("PersonId")
 2460                        .HasDatabaseName("ix_password_reset_token_person_id");
 2461
 2462                    b.HasIndex("TokenHash")
 2463                        .IsUnique()
 2464                        .HasDatabaseName("ix_password_reset_token_token_hash");
 2465
 2466                    b.ToTable("password_reset_token", "heimdall");
 4467                });
 468
 2469            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PendingRegistration", b =>
 2470                {
 2471                    b.Property<long>("Id")
 2472                        .ValueGeneratedOnAdd()
 2473                        .HasColumnType("bigint")
 2474                        .HasColumnName("id")
 2475                        .HasColumnOrder(1);
 2476
 2477                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2478
 2479                    b.Property<DateTime>("CreatedAt")
 2480                        .ValueGeneratedOnAdd()
 2481                        .HasColumnType("timestamp with time zone")
 2482                        .HasColumnName("created_at")
 2483                        .HasDefaultValueSql("now()");
 2484
 2485                    b.Property<string>("Email")
 2486                        .IsRequired()
 2487                        .HasMaxLength(256)
 2488                        .HasColumnType("character varying(256)")
 2489                        .HasColumnName("email");
 2490
 2491                    b.Property<DateTime>("ExpiresAt")
 2492                        .HasColumnType("timestamp with time zone")
 2493                        .HasColumnName("expires_at");
 2494
 2495                    b.Property<int>("FailedAttempts")
 2496                        .ValueGeneratedOnAdd()
 2497                        .HasColumnType("integer")
 2498                        .HasDefaultValue(0)
 2499                        .HasColumnName("failed_attempts");
 2500
 2501                    b.Property<string>("Name")
 2502                        .IsRequired()
 2503                        .HasMaxLength(200)
 2504                        .HasColumnType("character varying(200)")
 2505                        .HasColumnName("name");
 2506
 2507                    b.Property<byte[]>("PasswordHash")
 2508                        .IsRequired()
 2509                        .HasColumnType("bytea")
 2510                        .HasColumnName("password_hash");
 2511
 2512                    b.Property<Guid>("PublicId")
 2513                        .HasColumnType("uuid")
 2514                        .HasColumnName("public_id");
 2515
 2516                    b.Property<byte[]>("Salt")
 2517                        .IsRequired()
 2518                        .HasColumnType("bytea")
 2519                        .HasColumnName("salt");
 2520
 2521                    b.Property<long>("ScopeId")
 2522                        .HasColumnType("bigint")
 2523                        .HasColumnName("scope_id");
 2524
 2525                    b.Property<string>("TokenHash")
 2526                        .IsRequired()
 2527                        .HasMaxLength(64)
 2528                        .HasColumnType("character varying(64)")
 2529                        .HasColumnName("token_hash");
 2530
 2531                    b.HasKey("Id")
 2532                        .HasName("pk_pending_registration");
 2533
 2534                    b.HasIndex("PublicId")
 2535                        .IsUnique()
 2536                        .HasDatabaseName("ix_pending_registration_public_id");
 2537
 2538                    b.HasIndex("ScopeId")
 2539                        .HasDatabaseName("ix_pending_registration_scope_id");
 2540
 2541                    b.HasIndex("TokenHash")
 2542                        .IsUnique()
 2543                        .HasDatabaseName("ix_pending_registration_token_hash");
 2544
 2545                    b.ToTable("pending_registration", "heimdall");
 4546                });
 547
 2548            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 2549                {
 2550                    b.Property<long>("Id")
 2551                        .ValueGeneratedOnAdd()
 2552                        .HasColumnType("bigint")
 2553                        .HasColumnName("id")
 2554                        .HasColumnOrder(1);
 2555
 2556                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2557
 2558                    b.Property<DateTime?>("AnonymisedAt")
 2559                        .HasColumnType("timestamp with time zone")
 2560                        .HasColumnName("anonymised_at");
 2561
 2562                    b.Property<DateTime?>("BasisRecordedAt")
 2563                        .HasColumnType("timestamp with time zone")
 2564                        .HasColumnName("basis_recorded_at");
 2565
 2566                    b.Property<DateTime>("CreatedAt")
 2567                        .ValueGeneratedOnAdd()
 2568                        .HasColumnType("timestamp with time zone")
 2569                        .HasColumnName("created_at")
 2570                        .HasDefaultValueSql("now()");
 2571
 2572                    b.Property<DateTime?>("DeletedAt")
 2573                        .HasColumnType("timestamp with time zone")
 2574                        .HasColumnName("deleted_at");
 2575
 2576                    b.Property<int?>("DeletionKind")
 2577                        .HasColumnType("integer")
 2578                        .HasColumnName("deletion_kind");
 2579
 2580                    b.Property<string>("Email")
 2581                        .IsRequired()
 2582                        .HasMaxLength(256)
 2583                        .HasColumnType("character varying(256)")
 2584                        .HasColumnName("email");
 2585
 2586                    b.Property<bool>("EmailVerified")
 2587                        .ValueGeneratedOnAdd()
 2588                        .HasColumnType("boolean")
 2589                        .HasDefaultValue(false)
 2590                        .HasColumnName("email_verified");
 2591
 2592                    b.Property<string>("ErasureBlockedReason")
 2593                        .HasMaxLength(500)
 2594                        .HasColumnType("character varying(500)")
 2595                        .HasColumnName("erasure_blocked_reason");
 2596
 2597                    b.Property<DateTime?>("ErasureDueAt")
 2598                        .HasColumnType("timestamp with time zone")
 2599                        .HasColumnName("erasure_due_at");
 2600
 2601                    b.Property<DateTime?>("ErasureRequestedAt")
 2602                        .HasColumnType("timestamp with time zone")
 2603                        .HasColumnName("erasure_requested_at");
 2604
 2605                    b.Property<int>("FailedLoginAttempts")
 2606                        .HasColumnType("integer")
 2607                        .HasColumnName("failed_login_attempts");
 2608
 2609                    b.Property<bool>("IsDeleted")
 2610                        .ValueGeneratedOnAdd()
 2611                        .HasColumnType("boolean")
 2612                        .HasDefaultValue(false)
 2613                        .HasColumnName("is_deleted");
 2614
 2615                    b.Property<int>("LegalBasis")
 2616                        .ValueGeneratedOnAdd()
 2617                        .HasColumnType("integer")
 2618                        .HasDefaultValue(0)
 2619                        .HasColumnName("legal_basis");
 2620
 2621                    b.Property<DateTime?>("LockedOutUntil")
 2622                        .HasColumnType("timestamp with time zone")
 2623                        .HasColumnName("locked_out_until");
 2624
 2625                    b.Property<string>("Name")
 2626                        .IsRequired()
 2627                        .HasMaxLength(200)
 2628                        .HasColumnType("character varying(200)")
 2629                        .HasColumnName("name");
 2630
 2631                    b.Property<byte[]>("PasswordHash")
 2632                        .IsRequired()
 2633                        .HasColumnType("bytea")
 2634                        .HasColumnName("password_hash");
 2635
 2636                    b.Property<string>("PrivacyNoticeVersion")
 2637                        .HasMaxLength(50)
 2638                        .HasColumnType("character varying(50)")
 2639                        .HasColumnName("privacy_notice_version");
 2640
 2641                    b.Property<DateTime?>("ProcessingRestrictedAt")
 2642                        .HasColumnType("timestamp with time zone")
 2643                        .HasColumnName("processing_restricted_at");
 2644
 2645                    b.Property<Guid>("PublicId")
 2646                        .HasColumnType("uuid")
 2647                        .HasColumnName("public_id");
 2648
 2649                    b.Property<int?>("RestrictionGround")
 2650                        .HasColumnType("integer")
 2651                        .HasColumnName("restriction_ground");
 2652
 2653                    b.Property<DateTime?>("RestrictionLiftNotifiedAt")
 2654                        .HasColumnType("timestamp with time zone")
 2655                        .HasColumnName("restriction_lift_notified_at");
 2656
 2657                    b.Property<long>("RoleId")
 2658                        .HasColumnType("bigint")
 2659                        .HasColumnName("role_id");
 2660
 2661                    b.Property<byte[]>("Salt")
 2662                        .IsRequired()
 2663                        .HasColumnType("bytea")
 2664                        .HasColumnName("salt");
 2665
 2666                    b.Property<long?>("ScopeId")
 2667                        .HasColumnType("bigint")
 2668                        .HasColumnName("scope_id");
 2669
 2670                    b.Property<DateTime>("UpdatedAt")
 2671                        .ValueGeneratedOnAdd()
 2672                        .HasColumnType("timestamp with time zone")
 2673                        .HasColumnName("updated_at")
 2674                        .HasDefaultValueSql("now()");
 2675
 2676                    b.HasKey("Id")
 2677                        .HasName("pk_person");
 2678
 2679                    b.HasIndex("DeletedAt")
 2680                        .HasDatabaseName("ix_person_deleted_at")
 2681                        .HasFilter("is_deleted = true AND anonymised_at IS NULL");
 2682
 2683                    b.HasIndex("Email")
 2684                        .HasDatabaseName("ix_person_email");
 2685
 2686                    b.HasIndex("ProcessingRestrictedAt")
 2687                        .HasDatabaseName("ix_person_processing_restricted_at")
 2688                        .HasFilter("processing_restricted_at IS NOT NULL");
 2689
 2690                    b.HasIndex("PublicId")
 2691                        .IsUnique()
 2692                        .HasDatabaseName("ix_person_public_id");
 2693
 2694                    b.HasIndex("RoleId")
 2695                        .HasDatabaseName("ix_person_role_id");
 2696
 2697                    b.ToTable("person", "heimdall");
 4698                });
 699
 2700            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 2701                {
 2702                    b.Property<long>("Id")
 2703                        .HasColumnType("bigint")
 2704                        .HasColumnName("id")
 2705                        .HasColumnOrder(1);
 2706
 2707                    b.Property<string>("Description")
 2708                        .HasMaxLength(500)
 2709                        .HasColumnType("character varying(500)")
 2710                        .HasColumnName("description");
 2711
 2712                    b.Property<string>("Name")
 2713                        .IsRequired()
 2714                        .HasMaxLength(200)
 2715                        .HasColumnType("character varying(200)")
 2716                        .HasColumnName("name");
 2717
 2718                    b.Property<Guid>("PublicId")
 2719                        .HasColumnType("uuid")
 2720                        .HasColumnName("public_id");
 2721
 2722                    b.HasKey("Id")
 2723                        .HasName("pk_role");
 2724
 2725                    b.HasIndex("Name")
 2726                        .IsUnique()
 2727                        .HasDatabaseName("ix_role_name");
 2728
 2729                    b.HasIndex("PublicId")
 2730                        .IsUnique()
 2731                        .HasDatabaseName("ix_role_public_id");
 2732
 2733                    b.ToTable("role", "heimdall");
 4734                });
 735
 2736            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 2737                {
 2738                    b.Property<long>("Id")
 2739                        .ValueGeneratedOnAdd()
 2740                        .HasColumnType("bigint")
 2741                        .HasColumnName("id")
 2742                        .HasColumnOrder(1);
 2743
 2744                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2745
 2746                    b.Property<DateTime>("CreatedAt")
 2747                        .ValueGeneratedOnAdd()
 2748                        .HasColumnType("timestamp with time zone")
 2749                        .HasColumnName("created_at")
 2750                        .HasDefaultValueSql("now()");
 2751
 2752                    b.Property<int?>("DefaultLegalBasis")
 2753                        .HasColumnType("integer")
 2754                        .HasColumnName("default_legal_basis");
 2755
 2756                    b.Property<string>("Description")
 2757                        .HasMaxLength(500)
 2758                        .HasColumnType("character varying(500)")
 2759                        .HasColumnName("description");
 2760
 2761                    b.Property<string>("EmailVerificationUrl")
 2762                        .HasMaxLength(2048)
 2763                        .HasColumnType("character varying(2048)")
 2764                        .HasColumnName("email_verification_url");
 2765
 2766                    b.Property<bool>("GoogleSignInEnabled")
 2767                        .ValueGeneratedOnAdd()
 2768                        .HasColumnType("boolean")
 2769                        .HasDefaultValue(false)
 2770                        .HasColumnName("google_sign_in_enabled");
 2771
 2772                    b.Property<bool>("IsDeleted")
 2773                        .ValueGeneratedOnAdd()
 2774                        .HasColumnType("boolean")
 2775                        .HasDefaultValue(false)
 2776                        .HasColumnName("is_deleted");
 2777
 2778                    b.Property<string>("Name")
 2779                        .IsRequired()
 2780                        .HasMaxLength(200)
 2781                        .HasColumnType("character varying(200)")
 2782                        .HasColumnName("name");
 2783
 2784                    b.Property<string>("PasswordResetUrl")
 2785                        .HasMaxLength(2048)
 2786                        .HasColumnType("character varying(2048)")
 2787                        .HasColumnName("password_reset_url");
 2788
 2789                    b.Property<string>("PrivacyNoticeUri")
 2790                        .HasMaxLength(2048)
 2791                        .HasColumnType("character varying(2048)")
 2792                        .HasColumnName("privacy_notice_uri");
 2793
 2794                    b.Property<Guid>("PublicId")
 2795                        .HasColumnType("uuid")
 2796                        .HasColumnName("public_id");
 2797
 2798                    b.Property<bool>("SelfRegistrationEnabled")
 2799                        .ValueGeneratedOnAdd()
 2800                        .HasColumnType("boolean")
 2801                        .HasDefaultValue(false)
 2802                        .HasColumnName("self_registration_enabled");
 2803
 2804                    b.Property<DateTime>("UpdatedAt")
 2805                        .ValueGeneratedOnAdd()
 2806                        .HasColumnType("timestamp with time zone")
 2807                        .HasColumnName("updated_at")
 2808                        .HasDefaultValueSql("now()");
 2809
 2810                    b.HasKey("Id")
 2811                        .HasName("pk_scope");
 2812
 2813                    b.HasIndex("Name")
 2814                        .IsUnique()
 2815                        .HasDatabaseName("ix_scope_name");
 2816
 2817                    b.HasIndex("PublicId")
 2818                        .IsUnique()
 2819                        .HasDatabaseName("ix_scope_public_id");
 2820
 2821                    b.ToTable("scope", "heimdall");
 4822                });
 823
 2824            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 2825                {
 2826                    b.Property<long>("ScopeId")
 2827                        .HasColumnType("bigint")
 2828                        .HasColumnName("scope_id");
 2829
 2830                    b.Property<long>("PersonId")
 2831                        .HasColumnType("bigint")
 2832                        .HasColumnName("person_id");
 2833
 2834                    b.HasKey("ScopeId", "PersonId")
 2835                        .HasName("pk_scope_owner");
 2836
 2837                    b.HasIndex("PersonId")
 2838                        .HasDatabaseName("ix_scope_owner_person_id");
 2839
 2840                    b.ToTable("scope_owner", "heimdall");
 4841                });
 842
 2843            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 2844                {
 2845                    b.Property<long>("Id")
 2846                        .ValueGeneratedOnAdd()
 2847                        .HasColumnType("bigint")
 2848                        .HasColumnName("id")
 2849                        .HasColumnOrder(1);
 2850
 2851                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2852
 2853                    b.Property<DateTime>("CreatedAt")
 2854                        .ValueGeneratedOnAdd()
 2855                        .HasColumnType("timestamp with time zone")
 2856                        .HasColumnName("created_at")
 2857                        .HasDefaultValueSql("now()");
 2858
 2859                    b.Property<string>("Description")
 2860                        .HasMaxLength(500)
 2861                        .HasColumnType("character varying(500)")
 2862                        .HasColumnName("description");
 2863
 2864                    b.Property<bool>("IncludeAsJwtClaim")
 2865                        .ValueGeneratedOnAdd()
 2866                        .HasColumnType("boolean")
 2867                        .HasDefaultValue(false)
 2868                        .HasColumnName("include_as_jwt_claim");
 2869
 2870                    b.Property<bool>("IsDeleted")
 2871                        .ValueGeneratedOnAdd()
 2872                        .HasColumnType("boolean")
 2873                        .HasDefaultValue(false)
 2874                        .HasColumnName("is_deleted");
 2875
 2876                    b.Property<string>("Name")
 2877                        .IsRequired()
 2878                        .HasMaxLength(200)
 2879                        .HasColumnType("character varying(200)")
 2880                        .HasColumnName("name");
 2881
 2882                    b.Property<Guid>("PublicId")
 2883                        .HasColumnType("uuid")
 2884                        .HasColumnName("public_id");
 2885
 2886                    b.Property<long>("ScopeId")
 2887                        .HasColumnType("bigint")
 2888                        .HasColumnName("scope_id");
 2889
 2890                    b.Property<DateTime>("UpdatedAt")
 2891                        .ValueGeneratedOnAdd()
 2892                        .HasColumnType("timestamp with time zone")
 2893                        .HasColumnName("updated_at")
 2894                        .HasDefaultValueSql("now()");
 2895
 2896                    b.HasKey("Id")
 2897                        .HasName("pk_scope_permission");
 2898
 2899                    b.HasIndex("PublicId")
 2900                        .IsUnique()
 2901                        .HasDatabaseName("ix_scope_permission_public_id");
 2902
 2903                    b.HasIndex("ScopeId")
 2904                        .HasDatabaseName("ix_scope_permission_scope_id");
 2905
 2906                    b.ToTable("scope_permission", "heimdall");
 4907                });
 908
 2909            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 2910                {
 2911                    b.Property<long>("ScopeId")
 2912                        .HasColumnType("bigint")
 2913                        .HasColumnName("scope_id");
 2914
 2915                    b.Property<long>("PersonId")
 2916                        .HasColumnType("bigint")
 2917                        .HasColumnName("person_id");
 2918
 2919                    b.HasKey("ScopeId", "PersonId")
 2920                        .HasName("pk_scope_user");
 2921
 2922                    b.HasIndex("PersonId")
 2923                        .IsUnique()
 2924                        .HasDatabaseName("ix_scope_user_person_id");
 2925
 2926                    b.ToTable("scope_user", "heimdall");
 4927                });
 928
 2929            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 2930                {
 2931                    b.Property<long>("Id")
 2932                        .ValueGeneratedOnAdd()
 2933                        .HasColumnType("bigint")
 2934                        .HasColumnName("id")
 2935                        .HasColumnOrder(1);
 2936
 2937                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2938
 2939                    b.Property<bool>("AppEnabled")
 2940                        .ValueGeneratedOnAdd()
 2941                        .HasColumnType("boolean")
 2942                        .HasDefaultValue(false)
 2943                        .HasColumnName("app_enabled");
 2944
 2945                    b.Property<int>("ChallengeAttempts")
 2946                        .ValueGeneratedOnAdd()
 2947                        .HasColumnType("integer")
 2948                        .HasDefaultValue(0)
 2949                        .HasColumnName("challenge_attempts");
 2950
 2951                    b.Property<Guid?>("ChallengeId")
 2952                        .HasColumnType("uuid")
 2953                        .HasColumnName("challenge_id");
 2954
 2955                    b.Property<DateTime>("CreatedAt")
 2956                        .ValueGeneratedOnAdd()
 2957                        .HasColumnType("timestamp with time zone")
 2958                        .HasColumnName("created_at")
 2959                        .HasDefaultValueSql("now()");
 2960
 2961                    b.Property<int>("EmailCodeReissueCount")
 2962                        .ValueGeneratedOnAdd()
 2963                        .HasColumnType("integer")
 2964                        .HasDefaultValue(0)
 2965                        .HasColumnName("email_code_reissue_count");
 2966
 2967                    b.Property<bool>("EmailEnabled")
 2968                        .ValueGeneratedOnAdd()
 2969                        .HasColumnType("boolean")
 2970                        .HasDefaultValue(false)
 2971                        .HasColumnName("email_enabled");
 2972
 2973                    b.Property<bool>("IsActive")
 2974                        .ValueGeneratedOnAdd()
 2975                        .HasColumnType("boolean")
 2976                        .HasDefaultValue(false)
 2977                        .HasColumnName("is_active");
 2978
 2979                    b.Property<long?>("LastTotpTimeStepUsed")
 2980                        .HasColumnType("bigint")
 2981                        .HasColumnName("last_totp_time_step_used");
 2982
 2983                    b.Property<long>("PersonId")
 2984                        .HasColumnType("bigint")
 2985                        .HasColumnName("person_id");
 2986
 2987                    b.Property<byte[]>("TotpSecretEncrypted")
 2988                        .HasColumnType("bytea")
 2989                        .HasColumnName("totp_secret_encrypted");
 2990
 2991                    b.Property<DateTime>("UpdatedAt")
 2992                        .ValueGeneratedOnAdd()
 2993                        .HasColumnType("timestamp with time zone")
 2994                        .HasColumnName("updated_at")
 2995                        .HasDefaultValueSql("now()");
 2996
 2997                    b.HasKey("Id")
 2998                        .HasName("pk_two_factor_auth");
 2999
 21000                    b.HasIndex("PersonId")
 21001                        .IsUnique()
 21002                        .HasDatabaseName("ix_two_factor_auth_person_id");
 21003
 21004                    b.ToTable("two_factor_auth", "heimdall");
 41005                });
 1006
 21007            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 21008                {
 21009                    b.Property<long>("Id")
 21010                        .ValueGeneratedOnAdd()
 21011                        .HasColumnType("bigint")
 21012                        .HasColumnName("id")
 21013                        .HasColumnOrder(1);
 21014
 21015                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 21016
 21017                    b.Property<byte[]>("CodeHash")
 21018                        .IsRequired()
 21019                        .HasColumnType("bytea")
 21020                        .HasColumnName("code_hash");
 21021
 21022                    b.Property<DateTime>("CreatedAt")
 21023                        .ValueGeneratedOnAdd()
 21024                        .HasColumnType("timestamp with time zone")
 21025                        .HasColumnName("created_at")
 21026                        .HasDefaultValueSql("now()");
 21027
 21028                    b.Property<DateTime>("ExpiresAt")
 21029                        .HasColumnType("timestamp with time zone")
 21030                        .HasColumnName("expires_at");
 21031
 21032                    b.Property<int>("FailedAttempts")
 21033                        .HasColumnType("integer")
 21034                        .HasColumnName("failed_attempts");
 21035
 21036                    b.Property<byte[]>("Salt")
 21037                        .IsRequired()
 21038                        .HasColumnType("bytea")
 21039                        .HasColumnName("salt");
 21040
 21041                    b.Property<long>("TwoFactorAuthId")
 21042                        .HasColumnType("bigint")
 21043                        .HasColumnName("two_factor_auth_id");
 21044
 21045                    b.Property<bool>("Used")
 21046                        .ValueGeneratedOnAdd()
 21047                        .HasColumnType("boolean")
 21048                        .HasDefaultValue(false)
 21049                        .HasColumnName("used");
 21050
 21051                    b.HasKey("Id")
 21052                        .HasName("pk_two_factor_email_code");
 21053
 21054                    b.HasIndex("TwoFactorAuthId")
 21055                        .HasDatabaseName("ix_two_factor_email_code_two_factor_auth_id");
 21056
 21057                    b.ToTable("two_factor_email_code", "heimdall");
 41058                });
 1059
 21060            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 21061                {
 21062                    b.Property<long>("Id")
 21063                        .ValueGeneratedOnAdd()
 21064                        .HasColumnType("bigint")
 21065                        .HasColumnName("id")
 21066                        .HasColumnOrder(1);
 21067
 21068                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 21069
 21070                    b.Property<byte[]>("CodeHash")
 21071                        .IsRequired()
 21072                        .HasColumnType("bytea")
 21073                        .HasColumnName("code_hash");
 21074
 21075                    b.Property<DateTime>("CreatedAt")
 21076                        .ValueGeneratedOnAdd()
 21077                        .HasColumnType("timestamp with time zone")
 21078                        .HasColumnName("created_at")
 21079                        .HasDefaultValueSql("now()");
 21080
 21081                    b.Property<long>("TwoFactorAuthId")
 21082                        .HasColumnType("bigint")
 21083                        .HasColumnName("two_factor_auth_id");
 21084
 21085                    b.Property<bool>("Used")
 21086                        .ValueGeneratedOnAdd()
 21087                        .HasColumnType("boolean")
 21088                        .HasDefaultValue(false)
 21089                        .HasColumnName("used");
 21090
 21091                    b.Property<DateTime?>("UsedAt")
 21092                        .HasColumnType("timestamp with time zone")
 21093                        .HasColumnName("used_at");
 21094
 21095                    b.HasKey("Id")
 21096                        .HasName("pk_two_factor_recovery_code");
 21097
 21098                    b.HasIndex("TwoFactorAuthId")
 21099                        .HasDatabaseName("ix_two_factor_recovery_code_two_factor_auth_id");
 21100
 21101                    b.ToTable("two_factor_recovery_code", "heimdall");
 41102                });
 1103
 21104            modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b =>
 21105                {
 21106                    b.Property<int>("Id")
 21107                        .ValueGeneratedOnAdd()
 21108                        .HasColumnType("integer")
 21109                        .HasColumnName("id");
 21110
 21111                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 21112
 21113                    b.Property<string>("FriendlyName")
 21114                        .HasColumnType("text")
 21115                        .HasColumnName("friendly_name");
 21116
 21117                    b.Property<string>("Xml")
 21118                        .HasColumnType("text")
 21119                        .HasColumnName("xml");
 21120
 21121                    b.HasKey("Id")
 21122                        .HasName("pk_data_protection_keys");
 21123
 21124                    b.ToTable("data_protection_keys", "heimdall");
 41125                });
 1126
 21127            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 21128                {
 21129                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Owner")
 21130                        .WithMany("OwnedApplications")
 21131                        .HasForeignKey("OwnerId")
 21132                        .OnDelete(DeleteBehavior.Cascade)
 21133                        .IsRequired()
 21134                        .HasConstraintName("fk_application_person_owner_id");
 21135
 21136                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 21137                        .WithMany("Applications")
 21138                        .HasForeignKey("ScopeId")
 21139                        .OnDelete(DeleteBehavior.Cascade)
 21140                        .IsRequired()
 21141                        .HasConstraintName("fk_application_scope_scope_id");
 21142
 21143                    b.Navigation("Owner");
 21144
 21145                    b.Navigation("Scope");
 41146                });
 1147
 21148            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ApplicationCredential", b =>
 21149                {
 21150                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Application", "Application")
 21151                        .WithMany("Credentials")
 21152                        .HasForeignKey("ApplicationId")
 21153                        .OnDelete(DeleteBehavior.Cascade)
 21154                        .IsRequired()
 21155                        .HasConstraintName("fk_application_credential_application_application_id");
 21156
 21157                    b.Navigation("Application");
 41158                });
 1159
 21160            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 21161                {
 21162                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 21163                        .WithMany("EmailVerificationTokens")
 21164                        .HasForeignKey("PersonId")
 21165                        .OnDelete(DeleteBehavior.Cascade)
 21166                        .IsRequired()
 21167                        .HasConstraintName("fk_email_verification_token_person_person_id");
 21168
 21169                    b.Navigation("Person");
 41170                });
 1171
 21172            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 21173                {
 21174                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 21175                        .WithMany("GoogleUsers")
 21176                        .HasForeignKey("ScopeId")
 21177                        .OnDelete(DeleteBehavior.Cascade)
 21178                        .IsRequired()
 21179                        .HasConstraintName("fk_google_user_scope_scope_id");
 21180
 21181                    b.Navigation("Scope");
 41182                });
 1183
 21184            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 21185                {
 21186                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 21187                        .WithMany("PasswordResetTokens")
 21188                        .HasForeignKey("PersonId")
 21189                        .OnDelete(DeleteBehavior.Cascade)
 21190                        .IsRequired()
 21191                        .HasConstraintName("fk_password_reset_token_person_person_id");
 21192
 21193                    b.Navigation("Person");
 41194                });
 1195
 21196            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PendingRegistration", b =>
 21197                {
 21198                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 21199                        .WithMany()
 21200                        .HasForeignKey("ScopeId")
 21201                        .OnDelete(DeleteBehavior.Cascade)
 21202                        .IsRequired()
 21203                        .HasConstraintName("fk_pending_registration_scope_scope_id");
 21204
 21205                    b.Navigation("Scope");
 41206                });
 1207
 21208            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 21209                {
 21210                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Role", "Role")
 21211                        .WithMany("Persons")
 21212                        .HasForeignKey("RoleId")
 21213                        .OnDelete(DeleteBehavior.Restrict)
 21214                        .IsRequired()
 21215                        .HasConstraintName("fk_person_roles_role_id");
 21216
 21217                    b.Navigation("Role");
 41218                });
 1219
 21220            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 21221                {
 21222                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 21223                        .WithMany("ScopeOwnerships")
 21224                        .HasForeignKey("PersonId")
 21225                        .OnDelete(DeleteBehavior.Cascade)
 21226                        .IsRequired()
 21227                        .HasConstraintName("fk_scope_owner_person_person_id");
 21228
 21229                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 21230                        .WithMany("Owners")
 21231                        .HasForeignKey("ScopeId")
 21232                        .OnDelete(DeleteBehavior.Cascade)
 21233                        .IsRequired()
 21234                        .HasConstraintName("fk_scope_owner_scope_scope_id");
 21235
 21236                    b.Navigation("Person");
 21237
 21238                    b.Navigation("Scope");
 41239                });
 1240
 21241            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 21242                {
 21243                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 21244                        .WithMany("ScopePermissions")
 21245                        .HasForeignKey("ScopeId")
 21246                        .OnDelete(DeleteBehavior.Cascade)
 21247                        .IsRequired()
 21248                        .HasConstraintName("fk_scope_permission_scope_scope_id");
 21249
 21250                    b.Navigation("Scope");
 41251                });
 1252
 21253            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 21254                {
 21255                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 21256                        .WithOne("ScopeMembership")
 21257                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.ScopeUser", "PersonId")
 21258                        .OnDelete(DeleteBehavior.Cascade)
 21259                        .IsRequired()
 21260                        .HasConstraintName("fk_scope_user_person_person_id");
 21261
 21262                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 21263                        .WithMany("Users")
 21264                        .HasForeignKey("ScopeId")
 21265                        .OnDelete(DeleteBehavior.Cascade)
 21266                        .IsRequired()
 21267                        .HasConstraintName("fk_scope_user_scope_scope_id");
 21268
 21269                    b.Navigation("Person");
 21270
 21271                    b.Navigation("Scope");
 41272                });
 1273
 21274            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 21275                {
 21276                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 21277                        .WithOne("TwoFactorAuth")
 21278                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "PersonId")
 21279                        .OnDelete(DeleteBehavior.Cascade)
 21280                        .IsRequired()
 21281                        .HasConstraintName("fk_two_factor_auth_person_person_id");
 21282
 21283                    b.Navigation("Person");
 41284                });
 1285
 21286            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 21287                {
 21288                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 21289                        .WithMany("EmailCodes")
 21290                        .HasForeignKey("TwoFactorAuthId")
 21291                        .OnDelete(DeleteBehavior.Cascade)
 21292                        .IsRequired()
 21293                        .HasConstraintName("fk_two_factor_email_code_two_factor_auth_two_factor_auth_id");
 21294
 21295                    b.Navigation("TwoFactorAuth");
 41296                });
 1297
 21298            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 21299                {
 21300                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 21301                        .WithMany("RecoveryCodes")
 21302                        .HasForeignKey("TwoFactorAuthId")
 21303                        .OnDelete(DeleteBehavior.Cascade)
 21304                        .IsRequired()
 21305                        .HasConstraintName("fk_two_factor_recovery_code_two_factor_auth_two_factor_auth_id");
 21306
 21307                    b.Navigation("TwoFactorAuth");
 41308                });
 1309
 21310            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 21311                {
 21312                    b.Navigation("Credentials");
 41313                });
 1314
 21315            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 21316                {
 21317                    b.Navigation("EmailVerificationTokens");
 21318
 21319                    b.Navigation("OwnedApplications");
 21320
 21321                    b.Navigation("PasswordResetTokens");
 21322
 21323                    b.Navigation("ScopeMembership");
 21324
 21325                    b.Navigation("ScopeOwnerships");
 21326
 21327                    b.Navigation("TwoFactorAuth");
 41328                });
 1329
 21330            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 21331                {
 21332                    b.Navigation("Persons");
 41333                });
 1334
 21335            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 21336                {
 21337                    b.Navigation("Applications");
 21338
 21339                    b.Navigation("GoogleUsers");
 21340
 21341                    b.Navigation("Owners");
 21342
 21343                    b.Navigation("ScopePermissions");
 21344
 21345                    b.Navigation("Users");
 41346                });
 1347
 21348            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 21349                {
 21350                    b.Navigation("EmailCodes");
 21351
 21352                    b.Navigation("RecoveryCodes");
 41353                });
 1354#pragma warning restore 612, 618
 21355        }
 1356    }
 1357}