< Summary - Heimdall API

Line coverage
97%
Covered lines: 1098
Uncovered lines: 33
Coverable lines: 1131
Total lines: 1235
Line coverage: 97%
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/20260909193718_RecordLegalBasis.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 lawful basis and privacy notice version recorded against each identity, and the
 10    ///     tenant-level declaration they are resolved from (NFR-23).
 11    /// </summary>
 12    public partial class RecordLegalBasis : Migration
 13    {
 14        /// <inheritdoc />
 15        protected override void Up(MigrationBuilder migrationBuilder)
 16        {
 417            migrationBuilder.AddColumn<int>(
 418                name: "default_legal_basis",
 419                schema: "heimdall",
 420                table: "scope",
 421                type: "integer",
 422                nullable: true);
 23
 424            migrationBuilder.AddColumn<string>(
 425                name: "privacy_notice_uri",
 426                schema: "heimdall",
 427                table: "scope",
 428                type: "character varying(2048)",
 429                maxLength: 2048,
 430                nullable: true);
 31
 432            migrationBuilder.AddColumn<DateTime>(
 433                name: "basis_recorded_at",
 434                schema: "heimdall",
 435                table: "person",
 436                type: "timestamp with time zone",
 437                nullable: true);
 38
 439            migrationBuilder.AddColumn<int>(
 440                name: "legal_basis",
 441                schema: "heimdall",
 442                table: "person",
 443                type: "integer",
 444                nullable: false,
 445                defaultValue: 0);
 46
 447            migrationBuilder.AddColumn<string>(
 448                name: "privacy_notice_version",
 449                schema: "heimdall",
 450                table: "person",
 451                type: "character varying(50)",
 452                maxLength: 50,
 453                nullable: true);
 54
 455            migrationBuilder.AddColumn<DateTime>(
 456                name: "basis_recorded_at",
 457                schema: "heimdall",
 458                table: "google_user",
 459                type: "timestamp with time zone",
 460                nullable: true);
 61
 462            migrationBuilder.AddColumn<int>(
 463                name: "legal_basis",
 464                schema: "heimdall",
 465                table: "google_user",
 466                type: "integer",
 467                nullable: false,
 468                defaultValue: 0);
 69
 470            migrationBuilder.AddColumn<string>(
 471                name: "privacy_notice_version",
 472                schema: "heimdall",
 473                table: "google_user",
 474                type: "character varying(50)",
 475                maxLength: 50,
 476                nullable: true);
 77
 78            // Existing rows keep LegalBasis = 0, which the enum names Unrecorded, and a null notice
 79            // version. That is deliberate and is the whole point of having an Unrecorded member.
 80            //
 81            // Contract performance almost certainly applied to every one of them — it is the basis
 82            // for every identity this system has ever created. Writing it here would nonetheless be
 83            // asserting, in the record the controller shows a regulator, something nobody checked
 84            // for those particular rows. Accountability under GDPR Art. 5(2) is the ability to
 85            // demonstrate the basis, and a backfilled guess demonstrates only that a migration ran.
 86            //
 87            // So they are left visibly unrecorded: honest, and obviously a thing to fix rather than
 88            // silently indistinguishable from a row that was recorded properly.
 89
 490        }
 91
 92        /// <inheritdoc />
 93        protected override void Down(MigrationBuilder migrationBuilder)
 94        {
 095            migrationBuilder.DropColumn(
 096                name: "default_legal_basis",
 097                schema: "heimdall",
 098                table: "scope");
 99
 0100            migrationBuilder.DropColumn(
 0101                name: "privacy_notice_uri",
 0102                schema: "heimdall",
 0103                table: "scope");
 104
 0105            migrationBuilder.DropColumn(
 0106                name: "basis_recorded_at",
 0107                schema: "heimdall",
 0108                table: "person");
 109
 0110            migrationBuilder.DropColumn(
 0111                name: "legal_basis",
 0112                schema: "heimdall",
 0113                table: "person");
 114
 0115            migrationBuilder.DropColumn(
 0116                name: "privacy_notice_version",
 0117                schema: "heimdall",
 0118                table: "person");
 119
 0120            migrationBuilder.DropColumn(
 0121                name: "basis_recorded_at",
 0122                schema: "heimdall",
 0123                table: "google_user");
 124
 0125            migrationBuilder.DropColumn(
 0126                name: "legal_basis",
 0127                schema: "heimdall",
 0128                table: "google_user");
 129
 0130            migrationBuilder.DropColumn(
 0131                name: "privacy_notice_version",
 0132                schema: "heimdall",
 0133                table: "google_user");
 0134        }
 135    }
 136}

/home/runner/work/heimdall-api/heimdall-api/src/Infrastructure/ArturRios.Heimdall.Data/Migrations/20260909193718_RecordLegalBasis.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("20260909193718_RecordLegalBasis")]
 16    partial class RecordLegalBasis
 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.11")
 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.AuditLog", 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<string>("Action")
 2102                        .IsRequired()
 2103                        .HasMaxLength(200)
 2104                        .HasColumnType("character varying(200)")
 2105                        .HasColumnName("action");
 2106
 2107                    b.Property<Guid?>("ActorPersonId")
 2108                        .HasColumnType("uuid")
 2109                        .HasColumnName("actor_person_id");
 2110
 2111                    b.Property<int?>("ActorRole")
 2112                        .HasColumnType("integer")
 2113                        .HasColumnName("actor_role");
 2114
 2115                    b.Property<DateTime>("CreatedAt")
 2116                        .ValueGeneratedOnAdd()
 2117                        .HasColumnType("timestamp with time zone")
 2118                        .HasColumnName("created_at")
 2119                        .HasDefaultValueSql("now()");
 2120
 2121                    b.Property<string>("FailureReason")
 2122                        .HasMaxLength(500)
 2123                        .HasColumnType("character varying(500)")
 2124                        .HasColumnName("failure_reason");
 2125
 2126                    b.Property<Guid>("PublicId")
 2127                        .HasColumnType("uuid")
 2128                        .HasColumnName("public_id");
 2129
 2130                    b.Property<bool>("Succeeded")
 2131                        .HasColumnType("boolean")
 2132                        .HasColumnName("succeeded");
 2133
 2134                    b.Property<Guid?>("TargetId")
 2135                        .HasColumnType("uuid")
 2136                        .HasColumnName("target_id");
 2137
 2138                    b.HasKey("Id")
 2139                        .HasName("pk_audit_log");
 2140
 2141                    b.HasIndex("ActorPersonId")
 2142                        .HasDatabaseName("ix_audit_log_actor_person_id");
 2143
 2144                    b.HasIndex("CreatedAt")
 2145                        .HasDatabaseName("ix_audit_log_created_at");
 2146
 2147                    b.HasIndex("PublicId")
 2148                        .IsUnique()
 2149                        .HasDatabaseName("ix_audit_log_public_id");
 2150
 2151                    b.ToTable("audit_log", "heimdall");
 4152                });
 153
 2154            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 2155                {
 2156                    b.Property<long>("Id")
 2157                        .ValueGeneratedOnAdd()
 2158                        .HasColumnType("bigint")
 2159                        .HasColumnName("id")
 2160                        .HasColumnOrder(1);
 2161
 2162                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2163
 2164                    b.Property<DateTime>("ExpiresAt")
 2165                        .HasColumnType("timestamp with time zone")
 2166                        .HasColumnName("expires_at");
 2167
 2168                    b.Property<long>("PersonId")
 2169                        .HasColumnType("bigint")
 2170                        .HasColumnName("person_id");
 2171
 2172                    b.Property<string>("TokenHash")
 2173                        .IsRequired()
 2174                        .HasMaxLength(64)
 2175                        .HasColumnType("character varying(64)")
 2176                        .HasColumnName("token_hash");
 2177
 2178                    b.Property<bool>("Used")
 2179                        .ValueGeneratedOnAdd()
 2180                        .HasColumnType("boolean")
 2181                        .HasDefaultValue(false)
 2182                        .HasColumnName("used");
 2183
 2184                    b.HasKey("Id")
 2185                        .HasName("pk_email_verification_token");
 2186
 2187                    b.HasIndex("PersonId")
 2188                        .HasDatabaseName("ix_email_verification_token_person_id");
 2189
 2190                    b.HasIndex("TokenHash")
 2191                        .IsUnique()
 2192                        .HasDatabaseName("ix_email_verification_token_token_hash");
 2193
 2194                    b.ToTable("email_verification_token", "heimdall");
 4195                });
 196
 2197            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 2198                {
 2199                    b.Property<long>("Id")
 2200                        .ValueGeneratedOnAdd()
 2201                        .HasColumnType("bigint")
 2202                        .HasColumnName("id")
 2203                        .HasColumnOrder(1);
 2204
 2205                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2206
 2207                    b.Property<DateTime?>("AnonymisedAt")
 2208                        .HasColumnType("timestamp with time zone")
 2209                        .HasColumnName("anonymised_at");
 2210
 2211                    b.Property<DateTime?>("BasisRecordedAt")
 2212                        .HasColumnType("timestamp with time zone")
 2213                        .HasColumnName("basis_recorded_at");
 2214
 2215                    b.Property<DateTime>("CreatedAt")
 2216                        .ValueGeneratedOnAdd()
 2217                        .HasColumnType("timestamp with time zone")
 2218                        .HasColumnName("created_at")
 2219                        .HasDefaultValueSql("now()");
 2220
 2221                    b.Property<DateTime?>("DeletedAt")
 2222                        .HasColumnType("timestamp with time zone")
 2223                        .HasColumnName("deleted_at");
 2224
 2225                    b.Property<int?>("DeletionKind")
 2226                        .HasColumnType("integer")
 2227                        .HasColumnName("deletion_kind");
 2228
 2229                    b.Property<string>("Email")
 2230                        .IsRequired()
 2231                        .HasMaxLength(256)
 2232                        .HasColumnType("character varying(256)")
 2233                        .HasColumnName("email");
 2234
 2235                    b.Property<bool>("EmailVerified")
 2236                        .ValueGeneratedOnAdd()
 2237                        .HasColumnType("boolean")
 2238                        .HasDefaultValue(false)
 2239                        .HasColumnName("email_verified");
 2240
 2241                    b.Property<string>("ErasureBlockedReason")
 2242                        .HasMaxLength(500)
 2243                        .HasColumnType("character varying(500)")
 2244                        .HasColumnName("erasure_blocked_reason");
 2245
 2246                    b.Property<DateTime?>("ErasureDueAt")
 2247                        .HasColumnType("timestamp with time zone")
 2248                        .HasColumnName("erasure_due_at");
 2249
 2250                    b.Property<DateTime?>("ErasureRequestedAt")
 2251                        .HasColumnType("timestamp with time zone")
 2252                        .HasColumnName("erasure_requested_at");
 2253
 2254                    b.Property<string>("GoogleId")
 2255                        .IsRequired()
 2256                        .HasMaxLength(255)
 2257                        .HasColumnType("character varying(255)")
 2258                        .HasColumnName("google_id");
 2259
 2260                    b.Property<bool>("IsDeleted")
 2261                        .ValueGeneratedOnAdd()
 2262                        .HasColumnType("boolean")
 2263                        .HasDefaultValue(false)
 2264                        .HasColumnName("is_deleted");
 2265
 2266                    b.Property<int>("LegalBasis")
 2267                        .ValueGeneratedOnAdd()
 2268                        .HasColumnType("integer")
 2269                        .HasDefaultValue(0)
 2270                        .HasColumnName("legal_basis");
 2271
 2272                    b.Property<string>("Name")
 2273                        .IsRequired()
 2274                        .HasMaxLength(200)
 2275                        .HasColumnType("character varying(200)")
 2276                        .HasColumnName("name");
 2277
 2278                    b.Property<string>("PrivacyNoticeVersion")
 2279                        .HasMaxLength(50)
 2280                        .HasColumnType("character varying(50)")
 2281                        .HasColumnName("privacy_notice_version");
 2282
 2283                    b.Property<string>("ProfilePictureUrl")
 2284                        .HasMaxLength(2048)
 2285                        .HasColumnType("character varying(2048)")
 2286                        .HasColumnName("profile_picture_url");
 2287
 2288                    b.Property<Guid>("PublicId")
 2289                        .HasColumnType("uuid")
 2290                        .HasColumnName("public_id");
 2291
 2292                    b.Property<long>("ScopeId")
 2293                        .HasColumnType("bigint")
 2294                        .HasColumnName("scope_id");
 2295
 2296                    b.Property<DateTime>("UpdatedAt")
 2297                        .ValueGeneratedOnAdd()
 2298                        .HasColumnType("timestamp with time zone")
 2299                        .HasColumnName("updated_at")
 2300                        .HasDefaultValueSql("now()");
 2301
 2302                    b.HasKey("Id")
 2303                        .HasName("pk_google_user");
 2304
 2305                    b.HasIndex("DeletedAt")
 2306                        .HasDatabaseName("ix_google_user_deleted_at")
 2307                        .HasFilter("is_deleted = true AND anonymised_at IS NULL");
 2308
 2309                    b.HasIndex("PublicId")
 2310                        .IsUnique()
 2311                        .HasDatabaseName("ix_google_user_public_id");
 2312
 2313                    b.HasIndex("ScopeId", "Email")
 2314                        .IsUnique()
 2315                        .HasDatabaseName("ix_google_user_scope_id_email");
 2316
 2317                    b.HasIndex("ScopeId", "GoogleId")
 2318                        .IsUnique()
 2319                        .HasDatabaseName("ix_google_user_scope_id_google_id");
 2320
 2321                    b.ToTable("google_user", "heimdall");
 4322                });
 323
 2324            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 2325                {
 2326                    b.Property<long>("Id")
 2327                        .ValueGeneratedOnAdd()
 2328                        .HasColumnType("bigint")
 2329                        .HasColumnName("id")
 2330                        .HasColumnOrder(1);
 2331
 2332                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2333
 2334                    b.Property<DateTime>("ExpiresAt")
 2335                        .HasColumnType("timestamp with time zone")
 2336                        .HasColumnName("expires_at");
 2337
 2338                    b.Property<long>("PersonId")
 2339                        .HasColumnType("bigint")
 2340                        .HasColumnName("person_id");
 2341
 2342                    b.Property<string>("TokenHash")
 2343                        .IsRequired()
 2344                        .HasMaxLength(64)
 2345                        .HasColumnType("character varying(64)")
 2346                        .HasColumnName("token_hash");
 2347
 2348                    b.Property<bool>("Used")
 2349                        .ValueGeneratedOnAdd()
 2350                        .HasColumnType("boolean")
 2351                        .HasDefaultValue(false)
 2352                        .HasColumnName("used");
 2353
 2354                    b.HasKey("Id")
 2355                        .HasName("pk_password_reset_token");
 2356
 2357                    b.HasIndex("PersonId")
 2358                        .HasDatabaseName("ix_password_reset_token_person_id");
 2359
 2360                    b.HasIndex("TokenHash")
 2361                        .IsUnique()
 2362                        .HasDatabaseName("ix_password_reset_token_token_hash");
 2363
 2364                    b.ToTable("password_reset_token", "heimdall");
 4365                });
 366
 2367            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 2368                {
 2369                    b.Property<long>("Id")
 2370                        .ValueGeneratedOnAdd()
 2371                        .HasColumnType("bigint")
 2372                        .HasColumnName("id")
 2373                        .HasColumnOrder(1);
 2374
 2375                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2376
 2377                    b.Property<DateTime?>("AnonymisedAt")
 2378                        .HasColumnType("timestamp with time zone")
 2379                        .HasColumnName("anonymised_at");
 2380
 2381                    b.Property<DateTime?>("BasisRecordedAt")
 2382                        .HasColumnType("timestamp with time zone")
 2383                        .HasColumnName("basis_recorded_at");
 2384
 2385                    b.Property<DateTime>("CreatedAt")
 2386                        .ValueGeneratedOnAdd()
 2387                        .HasColumnType("timestamp with time zone")
 2388                        .HasColumnName("created_at")
 2389                        .HasDefaultValueSql("now()");
 2390
 2391                    b.Property<DateTime?>("DeletedAt")
 2392                        .HasColumnType("timestamp with time zone")
 2393                        .HasColumnName("deleted_at");
 2394
 2395                    b.Property<int?>("DeletionKind")
 2396                        .HasColumnType("integer")
 2397                        .HasColumnName("deletion_kind");
 2398
 2399                    b.Property<string>("Email")
 2400                        .IsRequired()
 2401                        .HasMaxLength(256)
 2402                        .HasColumnType("character varying(256)")
 2403                        .HasColumnName("email");
 2404
 2405                    b.Property<bool>("EmailVerified")
 2406                        .ValueGeneratedOnAdd()
 2407                        .HasColumnType("boolean")
 2408                        .HasDefaultValue(false)
 2409                        .HasColumnName("email_verified");
 2410
 2411                    b.Property<string>("ErasureBlockedReason")
 2412                        .HasMaxLength(500)
 2413                        .HasColumnType("character varying(500)")
 2414                        .HasColumnName("erasure_blocked_reason");
 2415
 2416                    b.Property<DateTime?>("ErasureDueAt")
 2417                        .HasColumnType("timestamp with time zone")
 2418                        .HasColumnName("erasure_due_at");
 2419
 2420                    b.Property<DateTime?>("ErasureRequestedAt")
 2421                        .HasColumnType("timestamp with time zone")
 2422                        .HasColumnName("erasure_requested_at");
 2423
 2424                    b.Property<int>("FailedLoginAttempts")
 2425                        .HasColumnType("integer")
 2426                        .HasColumnName("failed_login_attempts");
 2427
 2428                    b.Property<bool>("IsDeleted")
 2429                        .ValueGeneratedOnAdd()
 2430                        .HasColumnType("boolean")
 2431                        .HasDefaultValue(false)
 2432                        .HasColumnName("is_deleted");
 2433
 2434                    b.Property<int>("LegalBasis")
 2435                        .ValueGeneratedOnAdd()
 2436                        .HasColumnType("integer")
 2437                        .HasDefaultValue(0)
 2438                        .HasColumnName("legal_basis");
 2439
 2440                    b.Property<DateTime?>("LockedOutUntil")
 2441                        .HasColumnType("timestamp with time zone")
 2442                        .HasColumnName("locked_out_until");
 2443
 2444                    b.Property<string>("Name")
 2445                        .IsRequired()
 2446                        .HasMaxLength(200)
 2447                        .HasColumnType("character varying(200)")
 2448                        .HasColumnName("name");
 2449
 2450                    b.Property<byte[]>("PasswordHash")
 2451                        .IsRequired()
 2452                        .HasColumnType("bytea")
 2453                        .HasColumnName("password_hash");
 2454
 2455                    b.Property<string>("PrivacyNoticeVersion")
 2456                        .HasMaxLength(50)
 2457                        .HasColumnType("character varying(50)")
 2458                        .HasColumnName("privacy_notice_version");
 2459
 2460                    b.Property<Guid>("PublicId")
 2461                        .HasColumnType("uuid")
 2462                        .HasColumnName("public_id");
 2463
 2464                    b.Property<long>("RoleId")
 2465                        .HasColumnType("bigint")
 2466                        .HasColumnName("role_id");
 2467
 2468                    b.Property<byte[]>("Salt")
 2469                        .IsRequired()
 2470                        .HasColumnType("bytea")
 2471                        .HasColumnName("salt");
 2472
 2473                    b.Property<long?>("ScopeId")
 2474                        .HasColumnType("bigint")
 2475                        .HasColumnName("scope_id");
 2476
 2477                    b.Property<DateTime>("UpdatedAt")
 2478                        .ValueGeneratedOnAdd()
 2479                        .HasColumnType("timestamp with time zone")
 2480                        .HasColumnName("updated_at")
 2481                        .HasDefaultValueSql("now()");
 2482
 2483                    b.HasKey("Id")
 2484                        .HasName("pk_person");
 2485
 2486                    b.HasIndex("DeletedAt")
 2487                        .HasDatabaseName("ix_person_deleted_at")
 2488                        .HasFilter("is_deleted = true AND anonymised_at IS NULL");
 2489
 2490                    b.HasIndex("Email")
 2491                        .HasDatabaseName("ix_person_email");
 2492
 2493                    b.HasIndex("PublicId")
 2494                        .IsUnique()
 2495                        .HasDatabaseName("ix_person_public_id");
 2496
 2497                    b.HasIndex("RoleId")
 2498                        .HasDatabaseName("ix_person_role_id");
 2499
 2500                    b.ToTable("person", "heimdall");
 4501                });
 502
 2503            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 2504                {
 2505                    b.Property<long>("Id")
 2506                        .HasColumnType("bigint")
 2507                        .HasColumnName("id")
 2508                        .HasColumnOrder(1);
 2509
 2510                    b.Property<string>("Description")
 2511                        .HasMaxLength(500)
 2512                        .HasColumnType("character varying(500)")
 2513                        .HasColumnName("description");
 2514
 2515                    b.Property<string>("Name")
 2516                        .IsRequired()
 2517                        .HasMaxLength(200)
 2518                        .HasColumnType("character varying(200)")
 2519                        .HasColumnName("name");
 2520
 2521                    b.Property<Guid>("PublicId")
 2522                        .HasColumnType("uuid")
 2523                        .HasColumnName("public_id");
 2524
 2525                    b.HasKey("Id")
 2526                        .HasName("pk_role");
 2527
 2528                    b.HasIndex("Name")
 2529                        .IsUnique()
 2530                        .HasDatabaseName("ix_role_name");
 2531
 2532                    b.HasIndex("PublicId")
 2533                        .IsUnique()
 2534                        .HasDatabaseName("ix_role_public_id");
 2535
 2536                    b.ToTable("role", "heimdall");
 4537                });
 538
 2539            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 2540                {
 2541                    b.Property<long>("Id")
 2542                        .ValueGeneratedOnAdd()
 2543                        .HasColumnType("bigint")
 2544                        .HasColumnName("id")
 2545                        .HasColumnOrder(1);
 2546
 2547                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2548
 2549                    b.Property<DateTime>("CreatedAt")
 2550                        .ValueGeneratedOnAdd()
 2551                        .HasColumnType("timestamp with time zone")
 2552                        .HasColumnName("created_at")
 2553                        .HasDefaultValueSql("now()");
 2554
 2555                    b.Property<int?>("DefaultLegalBasis")
 2556                        .HasColumnType("integer")
 2557                        .HasColumnName("default_legal_basis");
 2558
 2559                    b.Property<string>("Description")
 2560                        .HasMaxLength(500)
 2561                        .HasColumnType("character varying(500)")
 2562                        .HasColumnName("description");
 2563
 2564                    b.Property<bool>("GoogleSignInEnabled")
 2565                        .ValueGeneratedOnAdd()
 2566                        .HasColumnType("boolean")
 2567                        .HasDefaultValue(false)
 2568                        .HasColumnName("google_sign_in_enabled");
 2569
 2570                    b.Property<bool>("IsDeleted")
 2571                        .ValueGeneratedOnAdd()
 2572                        .HasColumnType("boolean")
 2573                        .HasDefaultValue(false)
 2574                        .HasColumnName("is_deleted");
 2575
 2576                    b.Property<string>("Name")
 2577                        .IsRequired()
 2578                        .HasMaxLength(200)
 2579                        .HasColumnType("character varying(200)")
 2580                        .HasColumnName("name");
 2581
 2582                    b.Property<string>("PrivacyNoticeUri")
 2583                        .HasMaxLength(2048)
 2584                        .HasColumnType("character varying(2048)")
 2585                        .HasColumnName("privacy_notice_uri");
 2586
 2587                    b.Property<Guid>("PublicId")
 2588                        .HasColumnType("uuid")
 2589                        .HasColumnName("public_id");
 2590
 2591                    b.Property<DateTime>("UpdatedAt")
 2592                        .ValueGeneratedOnAdd()
 2593                        .HasColumnType("timestamp with time zone")
 2594                        .HasColumnName("updated_at")
 2595                        .HasDefaultValueSql("now()");
 2596
 2597                    b.HasKey("Id")
 2598                        .HasName("pk_scope");
 2599
 2600                    b.HasIndex("Name")
 2601                        .IsUnique()
 2602                        .HasDatabaseName("ix_scope_name");
 2603
 2604                    b.HasIndex("PublicId")
 2605                        .IsUnique()
 2606                        .HasDatabaseName("ix_scope_public_id");
 2607
 2608                    b.ToTable("scope", "heimdall");
 4609                });
 610
 2611            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 2612                {
 2613                    b.Property<long>("ScopeId")
 2614                        .HasColumnType("bigint")
 2615                        .HasColumnName("scope_id");
 2616
 2617                    b.Property<long>("PersonId")
 2618                        .HasColumnType("bigint")
 2619                        .HasColumnName("person_id");
 2620
 2621                    b.HasKey("ScopeId", "PersonId")
 2622                        .HasName("pk_scope_owner");
 2623
 2624                    b.HasIndex("PersonId")
 2625                        .HasDatabaseName("ix_scope_owner_person_id");
 2626
 2627                    b.ToTable("scope_owner", "heimdall");
 4628                });
 629
 2630            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 2631                {
 2632                    b.Property<long>("Id")
 2633                        .ValueGeneratedOnAdd()
 2634                        .HasColumnType("bigint")
 2635                        .HasColumnName("id")
 2636                        .HasColumnOrder(1);
 2637
 2638                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2639
 2640                    b.Property<DateTime>("CreatedAt")
 2641                        .ValueGeneratedOnAdd()
 2642                        .HasColumnType("timestamp with time zone")
 2643                        .HasColumnName("created_at")
 2644                        .HasDefaultValueSql("now()");
 2645
 2646                    b.Property<string>("Description")
 2647                        .HasMaxLength(500)
 2648                        .HasColumnType("character varying(500)")
 2649                        .HasColumnName("description");
 2650
 2651                    b.Property<bool>("IncludeAsJwtClaim")
 2652                        .ValueGeneratedOnAdd()
 2653                        .HasColumnType("boolean")
 2654                        .HasDefaultValue(false)
 2655                        .HasColumnName("include_as_jwt_claim");
 2656
 2657                    b.Property<bool>("IsDeleted")
 2658                        .ValueGeneratedOnAdd()
 2659                        .HasColumnType("boolean")
 2660                        .HasDefaultValue(false)
 2661                        .HasColumnName("is_deleted");
 2662
 2663                    b.Property<string>("Name")
 2664                        .IsRequired()
 2665                        .HasMaxLength(200)
 2666                        .HasColumnType("character varying(200)")
 2667                        .HasColumnName("name");
 2668
 2669                    b.Property<Guid>("PublicId")
 2670                        .HasColumnType("uuid")
 2671                        .HasColumnName("public_id");
 2672
 2673                    b.Property<long>("ScopeId")
 2674                        .HasColumnType("bigint")
 2675                        .HasColumnName("scope_id");
 2676
 2677                    b.Property<DateTime>("UpdatedAt")
 2678                        .ValueGeneratedOnAdd()
 2679                        .HasColumnType("timestamp with time zone")
 2680                        .HasColumnName("updated_at")
 2681                        .HasDefaultValueSql("now()");
 2682
 2683                    b.HasKey("Id")
 2684                        .HasName("pk_scope_permission");
 2685
 2686                    b.HasIndex("PublicId")
 2687                        .IsUnique()
 2688                        .HasDatabaseName("ix_scope_permission_public_id");
 2689
 2690                    b.HasIndex("ScopeId")
 2691                        .HasDatabaseName("ix_scope_permission_scope_id");
 2692
 2693                    b.ToTable("scope_permission", "heimdall");
 4694                });
 695
 2696            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 2697                {
 2698                    b.Property<long>("ScopeId")
 2699                        .HasColumnType("bigint")
 2700                        .HasColumnName("scope_id");
 2701
 2702                    b.Property<long>("PersonId")
 2703                        .HasColumnType("bigint")
 2704                        .HasColumnName("person_id");
 2705
 2706                    b.HasKey("ScopeId", "PersonId")
 2707                        .HasName("pk_scope_user");
 2708
 2709                    b.HasIndex("PersonId")
 2710                        .IsUnique()
 2711                        .HasDatabaseName("ix_scope_user_person_id");
 2712
 2713                    b.ToTable("scope_user", "heimdall");
 4714                });
 715
 2716            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 2717                {
 2718                    b.Property<long>("Id")
 2719                        .ValueGeneratedOnAdd()
 2720                        .HasColumnType("bigint")
 2721                        .HasColumnName("id")
 2722                        .HasColumnOrder(1);
 2723
 2724                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2725
 2726                    b.Property<bool>("AppEnabled")
 2727                        .ValueGeneratedOnAdd()
 2728                        .HasColumnType("boolean")
 2729                        .HasDefaultValue(false)
 2730                        .HasColumnName("app_enabled");
 2731
 2732                    b.Property<DateTime>("CreatedAt")
 2733                        .ValueGeneratedOnAdd()
 2734                        .HasColumnType("timestamp with time zone")
 2735                        .HasColumnName("created_at")
 2736                        .HasDefaultValueSql("now()");
 2737
 2738                    b.Property<bool>("EmailEnabled")
 2739                        .ValueGeneratedOnAdd()
 2740                        .HasColumnType("boolean")
 2741                        .HasDefaultValue(false)
 2742                        .HasColumnName("email_enabled");
 2743
 2744                    b.Property<bool>("IsActive")
 2745                        .ValueGeneratedOnAdd()
 2746                        .HasColumnType("boolean")
 2747                        .HasDefaultValue(false)
 2748                        .HasColumnName("is_active");
 2749
 2750                    b.Property<long?>("LastTotpTimeStepUsed")
 2751                        .HasColumnType("bigint")
 2752                        .HasColumnName("last_totp_time_step_used");
 2753
 2754                    b.Property<long>("PersonId")
 2755                        .HasColumnType("bigint")
 2756                        .HasColumnName("person_id");
 2757
 2758                    b.Property<byte[]>("TotpSecretEncrypted")
 2759                        .HasColumnType("bytea")
 2760                        .HasColumnName("totp_secret_encrypted");
 2761
 2762                    b.Property<DateTime>("UpdatedAt")
 2763                        .ValueGeneratedOnAdd()
 2764                        .HasColumnType("timestamp with time zone")
 2765                        .HasColumnName("updated_at")
 2766                        .HasDefaultValueSql("now()");
 2767
 2768                    b.HasKey("Id")
 2769                        .HasName("pk_two_factor_auth");
 2770
 2771                    b.HasIndex("PersonId")
 2772                        .IsUnique()
 2773                        .HasDatabaseName("ix_two_factor_auth_person_id");
 2774
 2775                    b.ToTable("two_factor_auth", "heimdall");
 4776                });
 777
 2778            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 2779                {
 2780                    b.Property<long>("Id")
 2781                        .ValueGeneratedOnAdd()
 2782                        .HasColumnType("bigint")
 2783                        .HasColumnName("id")
 2784                        .HasColumnOrder(1);
 2785
 2786                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2787
 2788                    b.Property<byte[]>("CodeHash")
 2789                        .IsRequired()
 2790                        .HasColumnType("bytea")
 2791                        .HasColumnName("code_hash");
 2792
 2793                    b.Property<DateTime>("CreatedAt")
 2794                        .ValueGeneratedOnAdd()
 2795                        .HasColumnType("timestamp with time zone")
 2796                        .HasColumnName("created_at")
 2797                        .HasDefaultValueSql("now()");
 2798
 2799                    b.Property<DateTime>("ExpiresAt")
 2800                        .HasColumnType("timestamp with time zone")
 2801                        .HasColumnName("expires_at");
 2802
 2803                    b.Property<int>("FailedAttempts")
 2804                        .HasColumnType("integer")
 2805                        .HasColumnName("failed_attempts");
 2806
 2807                    b.Property<byte[]>("Salt")
 2808                        .IsRequired()
 2809                        .HasColumnType("bytea")
 2810                        .HasColumnName("salt");
 2811
 2812                    b.Property<long>("TwoFactorAuthId")
 2813                        .HasColumnType("bigint")
 2814                        .HasColumnName("two_factor_auth_id");
 2815
 2816                    b.Property<bool>("Used")
 2817                        .ValueGeneratedOnAdd()
 2818                        .HasColumnType("boolean")
 2819                        .HasDefaultValue(false)
 2820                        .HasColumnName("used");
 2821
 2822                    b.HasKey("Id")
 2823                        .HasName("pk_two_factor_email_code");
 2824
 2825                    b.HasIndex("TwoFactorAuthId")
 2826                        .HasDatabaseName("ix_two_factor_email_code_two_factor_auth_id");
 2827
 2828                    b.ToTable("two_factor_email_code", "heimdall");
 4829                });
 830
 2831            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 2832                {
 2833                    b.Property<long>("Id")
 2834                        .ValueGeneratedOnAdd()
 2835                        .HasColumnType("bigint")
 2836                        .HasColumnName("id")
 2837                        .HasColumnOrder(1);
 2838
 2839                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2840
 2841                    b.Property<byte[]>("CodeHash")
 2842                        .IsRequired()
 2843                        .HasColumnType("bytea")
 2844                        .HasColumnName("code_hash");
 2845
 2846                    b.Property<DateTime>("CreatedAt")
 2847                        .ValueGeneratedOnAdd()
 2848                        .HasColumnType("timestamp with time zone")
 2849                        .HasColumnName("created_at")
 2850                        .HasDefaultValueSql("now()");
 2851
 2852                    b.Property<long>("TwoFactorAuthId")
 2853                        .HasColumnType("bigint")
 2854                        .HasColumnName("two_factor_auth_id");
 2855
 2856                    b.Property<bool>("Used")
 2857                        .ValueGeneratedOnAdd()
 2858                        .HasColumnType("boolean")
 2859                        .HasDefaultValue(false)
 2860                        .HasColumnName("used");
 2861
 2862                    b.Property<DateTime?>("UsedAt")
 2863                        .HasColumnType("timestamp with time zone")
 2864                        .HasColumnName("used_at");
 2865
 2866                    b.HasKey("Id")
 2867                        .HasName("pk_two_factor_recovery_code");
 2868
 2869                    b.HasIndex("TwoFactorAuthId")
 2870                        .HasDatabaseName("ix_two_factor_recovery_code_two_factor_auth_id");
 2871
 2872                    b.ToTable("two_factor_recovery_code", "heimdall");
 4873                });
 874
 2875            modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b =>
 2876                {
 2877                    b.Property<int>("Id")
 2878                        .ValueGeneratedOnAdd()
 2879                        .HasColumnType("integer")
 2880                        .HasColumnName("id");
 2881
 2882                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 2883
 2884                    b.Property<string>("FriendlyName")
 2885                        .HasColumnType("text")
 2886                        .HasColumnName("friendly_name");
 2887
 2888                    b.Property<string>("Xml")
 2889                        .HasColumnType("text")
 2890                        .HasColumnName("xml");
 2891
 2892                    b.HasKey("Id")
 2893                        .HasName("pk_data_protection_keys");
 2894
 2895                    b.ToTable("data_protection_keys", "heimdall");
 4896                });
 897
 2898            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 2899                {
 2900                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Owner")
 2901                        .WithMany("OwnedApplications")
 2902                        .HasForeignKey("OwnerId")
 2903                        .OnDelete(DeleteBehavior.Cascade)
 2904                        .IsRequired()
 2905                        .HasConstraintName("fk_application_person_owner_id");
 2906
 2907                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 2908                        .WithMany("Applications")
 2909                        .HasForeignKey("ScopeId")
 2910                        .OnDelete(DeleteBehavior.Cascade)
 2911                        .IsRequired()
 2912                        .HasConstraintName("fk_application_scope_scope_id");
 2913
 2914                    b.Navigation("Owner");
 2915
 2916                    b.Navigation("Scope");
 4917                });
 918
 2919            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 2920                {
 2921                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 2922                        .WithMany("EmailVerificationTokens")
 2923                        .HasForeignKey("PersonId")
 2924                        .OnDelete(DeleteBehavior.Cascade)
 2925                        .IsRequired()
 2926                        .HasConstraintName("fk_email_verification_token_person_person_id");
 2927
 2928                    b.Navigation("Person");
 4929                });
 930
 2931            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 2932                {
 2933                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 2934                        .WithMany("GoogleUsers")
 2935                        .HasForeignKey("ScopeId")
 2936                        .OnDelete(DeleteBehavior.Cascade)
 2937                        .IsRequired()
 2938                        .HasConstraintName("fk_google_user_scope_scope_id");
 2939
 2940                    b.Navigation("Scope");
 4941                });
 942
 2943            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 2944                {
 2945                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 2946                        .WithMany("PasswordResetTokens")
 2947                        .HasForeignKey("PersonId")
 2948                        .OnDelete(DeleteBehavior.Cascade)
 2949                        .IsRequired()
 2950                        .HasConstraintName("fk_password_reset_token_person_person_id");
 2951
 2952                    b.Navigation("Person");
 4953                });
 954
 2955            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 2956                {
 2957                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Role", "Role")
 2958                        .WithMany("Persons")
 2959                        .HasForeignKey("RoleId")
 2960                        .OnDelete(DeleteBehavior.Restrict)
 2961                        .IsRequired()
 2962                        .HasConstraintName("fk_person_roles_role_id");
 2963
 2964                    b.Navigation("Role");
 4965                });
 966
 2967            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 2968                {
 2969                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 2970                        .WithMany("ScopeOwnerships")
 2971                        .HasForeignKey("PersonId")
 2972                        .OnDelete(DeleteBehavior.Cascade)
 2973                        .IsRequired()
 2974                        .HasConstraintName("fk_scope_owner_person_person_id");
 2975
 2976                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 2977                        .WithMany("Owners")
 2978                        .HasForeignKey("ScopeId")
 2979                        .OnDelete(DeleteBehavior.Cascade)
 2980                        .IsRequired()
 2981                        .HasConstraintName("fk_scope_owner_scope_scope_id");
 2982
 2983                    b.Navigation("Person");
 2984
 2985                    b.Navigation("Scope");
 4986                });
 987
 2988            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 2989                {
 2990                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 2991                        .WithMany("ScopePermissions")
 2992                        .HasForeignKey("ScopeId")
 2993                        .OnDelete(DeleteBehavior.Cascade)
 2994                        .IsRequired()
 2995                        .HasConstraintName("fk_scope_permission_scope_scope_id");
 2996
 2997                    b.Navigation("Scope");
 4998                });
 999
 21000            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 21001                {
 21002                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 21003                        .WithOne("ScopeMembership")
 21004                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.ScopeUser", "PersonId")
 21005                        .OnDelete(DeleteBehavior.Cascade)
 21006                        .IsRequired()
 21007                        .HasConstraintName("fk_scope_user_person_person_id");
 21008
 21009                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 21010                        .WithMany("Users")
 21011                        .HasForeignKey("ScopeId")
 21012                        .OnDelete(DeleteBehavior.Cascade)
 21013                        .IsRequired()
 21014                        .HasConstraintName("fk_scope_user_scope_scope_id");
 21015
 21016                    b.Navigation("Person");
 21017
 21018                    b.Navigation("Scope");
 41019                });
 1020
 21021            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 21022                {
 21023                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 21024                        .WithOne("TwoFactorAuth")
 21025                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "PersonId")
 21026                        .OnDelete(DeleteBehavior.Cascade)
 21027                        .IsRequired()
 21028                        .HasConstraintName("fk_two_factor_auth_person_person_id");
 21029
 21030                    b.Navigation("Person");
 41031                });
 1032
 21033            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 21034                {
 21035                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 21036                        .WithMany("EmailCodes")
 21037                        .HasForeignKey("TwoFactorAuthId")
 21038                        .OnDelete(DeleteBehavior.Cascade)
 21039                        .IsRequired()
 21040                        .HasConstraintName("fk_two_factor_email_code_two_factor_auth_two_factor_auth_id");
 21041
 21042                    b.Navigation("TwoFactorAuth");
 41043                });
 1044
 21045            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 21046                {
 21047                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 21048                        .WithMany("RecoveryCodes")
 21049                        .HasForeignKey("TwoFactorAuthId")
 21050                        .OnDelete(DeleteBehavior.Cascade)
 21051                        .IsRequired()
 21052                        .HasConstraintName("fk_two_factor_recovery_code_two_factor_auth_two_factor_auth_id");
 21053
 21054                    b.Navigation("TwoFactorAuth");
 41055                });
 1056
 21057            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 21058                {
 21059                    b.Navigation("EmailVerificationTokens");
 21060
 21061                    b.Navigation("OwnedApplications");
 21062
 21063                    b.Navigation("PasswordResetTokens");
 21064
 21065                    b.Navigation("ScopeMembership");
 21066
 21067                    b.Navigation("ScopeOwnerships");
 21068
 21069                    b.Navigation("TwoFactorAuth");
 41070                });
 1071
 21072            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 21073                {
 21074                    b.Navigation("Persons");
 41075                });
 1076
 21077            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 21078                {
 21079                    b.Navigation("Applications");
 21080
 21081                    b.Navigation("GoogleUsers");
 21082
 21083                    b.Navigation("Owners");
 21084
 21085                    b.Navigation("ScopePermissions");
 21086
 21087                    b.Navigation("Users");
 41088                });
 1089
 21090            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 21091                {
 21092                    b.Navigation("EmailCodes");
 21093
 21094                    b.Navigation("RecoveryCodes");
 41095                });
 1096#pragma warning restore 612, 618
 21097        }
 1098    }
 1099}