< Summary - Heimdall API

Line coverage
99%
Covered lines: 963
Uncovered lines: 9
Coverable lines: 972
Total lines: 1057
Line coverage: 99%
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/20260814212543_AddAuditLogOutcome.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore.Migrations;
 2
 3#nullable disable
 4
 5namespace ArturRios.Heimdall.Data.Migrations
 6{
 7    /// <summary>
 8    ///     Records the outcome of each audited operation, so the trail covers refusals as well as
 9    ///     writes (NFR-09).
 10    /// </summary>
 11    /// <remarks>
 12    ///     Every row that exists before this migration was written by the decorator's success-only
 13    ///     path, so the backfill below is a statement of fact rather than a default: those entries
 14    ///     record operations that succeeded. Leaving them at the column default would have said the
 15    ///     opposite about every write the system has ever made.
 16    /// </remarks>
 17    public partial class AddAuditLogOutcome : Migration
 18    {
 19        /// <inheritdoc />
 20        protected override void Up(MigrationBuilder migrationBuilder)
 21        {
 422            migrationBuilder.AddColumn<string>(
 423                name: "failure_reason",
 424                schema: "heimdall",
 425                table: "audit_log",
 426                type: "character varying(500)",
 427                maxLength: 500,
 428                nullable: true);
 29
 430            migrationBuilder.AddColumn<bool>(
 431                name: "succeeded",
 432                schema: "heimdall",
 433                table: "audit_log",
 434                type: "boolean",
 435                nullable: false,
 436                defaultValue: false);
 37
 438            migrationBuilder.Sql("UPDATE heimdall.audit_log SET succeeded = true;");
 439        }
 40
 41        /// <inheritdoc />
 42        protected override void Down(MigrationBuilder migrationBuilder)
 43        {
 044            migrationBuilder.DropColumn(
 045                name: "failure_reason",
 046                schema: "heimdall",
 047                table: "audit_log");
 48
 049            migrationBuilder.DropColumn(
 050                name: "succeeded",
 051                schema: "heimdall",
 052                table: "audit_log");
 053        }
 54    }
 55}

/home/runner/work/heimdall-api/heimdall-api/src/Infrastructure/ArturRios.Heimdall.Data/Migrations/20260814212543_AddAuditLogOutcome.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("20260814212543_AddAuditLogOutcome")]
 16    partial class AddAuditLogOutcome
 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>("Token")
 2173                        .IsRequired()
 2174                        .HasMaxLength(256)
 2175                        .HasColumnType("character varying(256)")
 2176                        .HasColumnName("token");
 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("Token")
 2191                        .IsUnique()
 2192                        .HasDatabaseName("ix_email_verification_token_token");
 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>("CreatedAt")
 2208                        .ValueGeneratedOnAdd()
 2209                        .HasColumnType("timestamp with time zone")
 2210                        .HasColumnName("created_at")
 2211                        .HasDefaultValueSql("now()");
 2212
 2213                    b.Property<string>("Email")
 2214                        .IsRequired()
 2215                        .HasMaxLength(256)
 2216                        .HasColumnType("character varying(256)")
 2217                        .HasColumnName("email");
 2218
 2219                    b.Property<bool>("EmailVerified")
 2220                        .ValueGeneratedOnAdd()
 2221                        .HasColumnType("boolean")
 2222                        .HasDefaultValue(false)
 2223                        .HasColumnName("email_verified");
 2224
 2225                    b.Property<string>("GoogleId")
 2226                        .IsRequired()
 2227                        .HasMaxLength(255)
 2228                        .HasColumnType("character varying(255)")
 2229                        .HasColumnName("google_id");
 2230
 2231                    b.Property<bool>("IsDeleted")
 2232                        .ValueGeneratedOnAdd()
 2233                        .HasColumnType("boolean")
 2234                        .HasDefaultValue(false)
 2235                        .HasColumnName("is_deleted");
 2236
 2237                    b.Property<string>("Name")
 2238                        .IsRequired()
 2239                        .HasMaxLength(200)
 2240                        .HasColumnType("character varying(200)")
 2241                        .HasColumnName("name");
 2242
 2243                    b.Property<string>("ProfilePictureUrl")
 2244                        .HasMaxLength(2048)
 2245                        .HasColumnType("character varying(2048)")
 2246                        .HasColumnName("profile_picture_url");
 2247
 2248                    b.Property<Guid>("PublicId")
 2249                        .HasColumnType("uuid")
 2250                        .HasColumnName("public_id");
 2251
 2252                    b.Property<long>("ScopeId")
 2253                        .HasColumnType("bigint")
 2254                        .HasColumnName("scope_id");
 2255
 2256                    b.Property<DateTime>("UpdatedAt")
 2257                        .ValueGeneratedOnAdd()
 2258                        .HasColumnType("timestamp with time zone")
 2259                        .HasColumnName("updated_at")
 2260                        .HasDefaultValueSql("now()");
 2261
 2262                    b.HasKey("Id")
 2263                        .HasName("pk_google_user");
 2264
 2265                    b.HasIndex("PublicId")
 2266                        .IsUnique()
 2267                        .HasDatabaseName("ix_google_user_public_id");
 2268
 2269                    b.HasIndex("ScopeId", "Email")
 2270                        .IsUnique()
 2271                        .HasDatabaseName("ix_google_user_scope_id_email");
 2272
 2273                    b.HasIndex("ScopeId", "GoogleId")
 2274                        .IsUnique()
 2275                        .HasDatabaseName("ix_google_user_scope_id_google_id");
 2276
 2277                    b.ToTable("google_user", "heimdall");
 4278                });
 279
 2280            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 2281                {
 2282                    b.Property<long>("Id")
 2283                        .ValueGeneratedOnAdd()
 2284                        .HasColumnType("bigint")
 2285                        .HasColumnName("id")
 2286                        .HasColumnOrder(1);
 2287
 2288                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2289
 2290                    b.Property<DateTime>("ExpiresAt")
 2291                        .HasColumnType("timestamp with time zone")
 2292                        .HasColumnName("expires_at");
 2293
 2294                    b.Property<long>("PersonId")
 2295                        .HasColumnType("bigint")
 2296                        .HasColumnName("person_id");
 2297
 2298                    b.Property<string>("Token")
 2299                        .IsRequired()
 2300                        .HasMaxLength(256)
 2301                        .HasColumnType("character varying(256)")
 2302                        .HasColumnName("token");
 2303
 2304                    b.Property<bool>("Used")
 2305                        .ValueGeneratedOnAdd()
 2306                        .HasColumnType("boolean")
 2307                        .HasDefaultValue(false)
 2308                        .HasColumnName("used");
 2309
 2310                    b.HasKey("Id")
 2311                        .HasName("pk_password_reset_token");
 2312
 2313                    b.HasIndex("PersonId")
 2314                        .HasDatabaseName("ix_password_reset_token_person_id");
 2315
 2316                    b.HasIndex("Token")
 2317                        .IsUnique()
 2318                        .HasDatabaseName("ix_password_reset_token_token");
 2319
 2320                    b.ToTable("password_reset_token", "heimdall");
 4321                });
 322
 2323            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 2324                {
 2325                    b.Property<long>("Id")
 2326                        .ValueGeneratedOnAdd()
 2327                        .HasColumnType("bigint")
 2328                        .HasColumnName("id")
 2329                        .HasColumnOrder(1);
 2330
 2331                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2332
 2333                    b.Property<DateTime>("CreatedAt")
 2334                        .ValueGeneratedOnAdd()
 2335                        .HasColumnType("timestamp with time zone")
 2336                        .HasColumnName("created_at")
 2337                        .HasDefaultValueSql("now()");
 2338
 2339                    b.Property<string>("Email")
 2340                        .IsRequired()
 2341                        .HasMaxLength(256)
 2342                        .HasColumnType("character varying(256)")
 2343                        .HasColumnName("email");
 2344
 2345                    b.Property<bool>("EmailVerified")
 2346                        .ValueGeneratedOnAdd()
 2347                        .HasColumnType("boolean")
 2348                        .HasDefaultValue(false)
 2349                        .HasColumnName("email_verified");
 2350
 2351                    b.Property<int>("FailedLoginAttempts")
 2352                        .HasColumnType("integer")
 2353                        .HasColumnName("failed_login_attempts");
 2354
 2355                    b.Property<bool>("IsDeleted")
 2356                        .ValueGeneratedOnAdd()
 2357                        .HasColumnType("boolean")
 2358                        .HasDefaultValue(false)
 2359                        .HasColumnName("is_deleted");
 2360
 2361                    b.Property<DateTime?>("LockedOutUntil")
 2362                        .HasColumnType("timestamp with time zone")
 2363                        .HasColumnName("locked_out_until");
 2364
 2365                    b.Property<string>("Name")
 2366                        .IsRequired()
 2367                        .HasMaxLength(200)
 2368                        .HasColumnType("character varying(200)")
 2369                        .HasColumnName("name");
 2370
 2371                    b.Property<byte[]>("PasswordHash")
 2372                        .IsRequired()
 2373                        .HasColumnType("bytea")
 2374                        .HasColumnName("password_hash");
 2375
 2376                    b.Property<Guid>("PublicId")
 2377                        .HasColumnType("uuid")
 2378                        .HasColumnName("public_id");
 2379
 2380                    b.Property<long>("RoleId")
 2381                        .HasColumnType("bigint")
 2382                        .HasColumnName("role_id");
 2383
 2384                    b.Property<byte[]>("Salt")
 2385                        .IsRequired()
 2386                        .HasColumnType("bytea")
 2387                        .HasColumnName("salt");
 2388
 2389                    b.Property<long?>("ScopeId")
 2390                        .HasColumnType("bigint")
 2391                        .HasColumnName("scope_id");
 2392
 2393                    b.Property<DateTime>("UpdatedAt")
 2394                        .ValueGeneratedOnAdd()
 2395                        .HasColumnType("timestamp with time zone")
 2396                        .HasColumnName("updated_at")
 2397                        .HasDefaultValueSql("now()");
 2398
 2399                    b.HasKey("Id")
 2400                        .HasName("pk_person");
 2401
 2402                    b.HasIndex("Email")
 2403                        .HasDatabaseName("ix_person_email");
 2404
 2405                    b.HasIndex("PublicId")
 2406                        .IsUnique()
 2407                        .HasDatabaseName("ix_person_public_id");
 2408
 2409                    b.HasIndex("RoleId")
 2410                        .HasDatabaseName("ix_person_role_id");
 2411
 2412                    b.ToTable("person", "heimdall");
 4413                });
 414
 2415            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 2416                {
 2417                    b.Property<long>("Id")
 2418                        .HasColumnType("bigint")
 2419                        .HasColumnName("id")
 2420                        .HasColumnOrder(1);
 2421
 2422                    b.Property<string>("Description")
 2423                        .HasMaxLength(500)
 2424                        .HasColumnType("character varying(500)")
 2425                        .HasColumnName("description");
 2426
 2427                    b.Property<string>("Name")
 2428                        .IsRequired()
 2429                        .HasMaxLength(200)
 2430                        .HasColumnType("character varying(200)")
 2431                        .HasColumnName("name");
 2432
 2433                    b.Property<Guid>("PublicId")
 2434                        .HasColumnType("uuid")
 2435                        .HasColumnName("public_id");
 2436
 2437                    b.HasKey("Id")
 2438                        .HasName("pk_role");
 2439
 2440                    b.HasIndex("Name")
 2441                        .IsUnique()
 2442                        .HasDatabaseName("ix_role_name");
 2443
 2444                    b.HasIndex("PublicId")
 2445                        .IsUnique()
 2446                        .HasDatabaseName("ix_role_public_id");
 2447
 2448                    b.ToTable("role", "heimdall");
 4449                });
 450
 2451            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 2452                {
 2453                    b.Property<long>("Id")
 2454                        .ValueGeneratedOnAdd()
 2455                        .HasColumnType("bigint")
 2456                        .HasColumnName("id")
 2457                        .HasColumnOrder(1);
 2458
 2459                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2460
 2461                    b.Property<DateTime>("CreatedAt")
 2462                        .ValueGeneratedOnAdd()
 2463                        .HasColumnType("timestamp with time zone")
 2464                        .HasColumnName("created_at")
 2465                        .HasDefaultValueSql("now()");
 2466
 2467                    b.Property<string>("Description")
 2468                        .HasMaxLength(500)
 2469                        .HasColumnType("character varying(500)")
 2470                        .HasColumnName("description");
 2471
 2472                    b.Property<bool>("GoogleSignInEnabled")
 2473                        .ValueGeneratedOnAdd()
 2474                        .HasColumnType("boolean")
 2475                        .HasDefaultValue(false)
 2476                        .HasColumnName("google_sign_in_enabled");
 2477
 2478                    b.Property<bool>("IsDeleted")
 2479                        .ValueGeneratedOnAdd()
 2480                        .HasColumnType("boolean")
 2481                        .HasDefaultValue(false)
 2482                        .HasColumnName("is_deleted");
 2483
 2484                    b.Property<string>("Name")
 2485                        .IsRequired()
 2486                        .HasMaxLength(200)
 2487                        .HasColumnType("character varying(200)")
 2488                        .HasColumnName("name");
 2489
 2490                    b.Property<Guid>("PublicId")
 2491                        .HasColumnType("uuid")
 2492                        .HasColumnName("public_id");
 2493
 2494                    b.Property<DateTime>("UpdatedAt")
 2495                        .ValueGeneratedOnAdd()
 2496                        .HasColumnType("timestamp with time zone")
 2497                        .HasColumnName("updated_at")
 2498                        .HasDefaultValueSql("now()");
 2499
 2500                    b.HasKey("Id")
 2501                        .HasName("pk_scope");
 2502
 2503                    b.HasIndex("Name")
 2504                        .IsUnique()
 2505                        .HasDatabaseName("ix_scope_name");
 2506
 2507                    b.HasIndex("PublicId")
 2508                        .IsUnique()
 2509                        .HasDatabaseName("ix_scope_public_id");
 2510
 2511                    b.ToTable("scope", "heimdall");
 4512                });
 513
 2514            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 2515                {
 2516                    b.Property<long>("ScopeId")
 2517                        .HasColumnType("bigint")
 2518                        .HasColumnName("scope_id");
 2519
 2520                    b.Property<long>("PersonId")
 2521                        .HasColumnType("bigint")
 2522                        .HasColumnName("person_id");
 2523
 2524                    b.HasKey("ScopeId", "PersonId")
 2525                        .HasName("pk_scope_owner");
 2526
 2527                    b.HasIndex("PersonId")
 2528                        .HasDatabaseName("ix_scope_owner_person_id");
 2529
 2530                    b.ToTable("scope_owner", "heimdall");
 4531                });
 532
 2533            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 2534                {
 2535                    b.Property<long>("Id")
 2536                        .ValueGeneratedOnAdd()
 2537                        .HasColumnType("bigint")
 2538                        .HasColumnName("id")
 2539                        .HasColumnOrder(1);
 2540
 2541                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2542
 2543                    b.Property<DateTime>("CreatedAt")
 2544                        .ValueGeneratedOnAdd()
 2545                        .HasColumnType("timestamp with time zone")
 2546                        .HasColumnName("created_at")
 2547                        .HasDefaultValueSql("now()");
 2548
 2549                    b.Property<string>("Description")
 2550                        .HasMaxLength(500)
 2551                        .HasColumnType("character varying(500)")
 2552                        .HasColumnName("description");
 2553
 2554                    b.Property<bool>("IncludeAsJwtClaim")
 2555                        .ValueGeneratedOnAdd()
 2556                        .HasColumnType("boolean")
 2557                        .HasDefaultValue(false)
 2558                        .HasColumnName("include_as_jwt_claim");
 2559
 2560                    b.Property<bool>("IsDeleted")
 2561                        .ValueGeneratedOnAdd()
 2562                        .HasColumnType("boolean")
 2563                        .HasDefaultValue(false)
 2564                        .HasColumnName("is_deleted");
 2565
 2566                    b.Property<string>("Name")
 2567                        .IsRequired()
 2568                        .HasMaxLength(200)
 2569                        .HasColumnType("character varying(200)")
 2570                        .HasColumnName("name");
 2571
 2572                    b.Property<Guid>("PublicId")
 2573                        .HasColumnType("uuid")
 2574                        .HasColumnName("public_id");
 2575
 2576                    b.Property<long>("ScopeId")
 2577                        .HasColumnType("bigint")
 2578                        .HasColumnName("scope_id");
 2579
 2580                    b.Property<DateTime>("UpdatedAt")
 2581                        .ValueGeneratedOnAdd()
 2582                        .HasColumnType("timestamp with time zone")
 2583                        .HasColumnName("updated_at")
 2584                        .HasDefaultValueSql("now()");
 2585
 2586                    b.HasKey("Id")
 2587                        .HasName("pk_scope_permission");
 2588
 2589                    b.HasIndex("PublicId")
 2590                        .IsUnique()
 2591                        .HasDatabaseName("ix_scope_permission_public_id");
 2592
 2593                    b.HasIndex("ScopeId")
 2594                        .HasDatabaseName("ix_scope_permission_scope_id");
 2595
 2596                    b.ToTable("scope_permission", "heimdall");
 4597                });
 598
 2599            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 2600                {
 2601                    b.Property<long>("ScopeId")
 2602                        .HasColumnType("bigint")
 2603                        .HasColumnName("scope_id");
 2604
 2605                    b.Property<long>("PersonId")
 2606                        .HasColumnType("bigint")
 2607                        .HasColumnName("person_id");
 2608
 2609                    b.HasKey("ScopeId", "PersonId")
 2610                        .HasName("pk_scope_user");
 2611
 2612                    b.HasIndex("PersonId")
 2613                        .IsUnique()
 2614                        .HasDatabaseName("ix_scope_user_person_id");
 2615
 2616                    b.ToTable("scope_user", "heimdall");
 4617                });
 618
 2619            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 2620                {
 2621                    b.Property<long>("Id")
 2622                        .ValueGeneratedOnAdd()
 2623                        .HasColumnType("bigint")
 2624                        .HasColumnName("id")
 2625                        .HasColumnOrder(1);
 2626
 2627                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2628
 2629                    b.Property<bool>("AppEnabled")
 2630                        .ValueGeneratedOnAdd()
 2631                        .HasColumnType("boolean")
 2632                        .HasDefaultValue(false)
 2633                        .HasColumnName("app_enabled");
 2634
 2635                    b.Property<DateTime>("CreatedAt")
 2636                        .ValueGeneratedOnAdd()
 2637                        .HasColumnType("timestamp with time zone")
 2638                        .HasColumnName("created_at")
 2639                        .HasDefaultValueSql("now()");
 2640
 2641                    b.Property<bool>("EmailEnabled")
 2642                        .ValueGeneratedOnAdd()
 2643                        .HasColumnType("boolean")
 2644                        .HasDefaultValue(false)
 2645                        .HasColumnName("email_enabled");
 2646
 2647                    b.Property<bool>("IsActive")
 2648                        .ValueGeneratedOnAdd()
 2649                        .HasColumnType("boolean")
 2650                        .HasDefaultValue(false)
 2651                        .HasColumnName("is_active");
 2652
 2653                    b.Property<long?>("LastTotpTimeStepUsed")
 2654                        .HasColumnType("bigint")
 2655                        .HasColumnName("last_totp_time_step_used");
 2656
 2657                    b.Property<long>("PersonId")
 2658                        .HasColumnType("bigint")
 2659                        .HasColumnName("person_id");
 2660
 2661                    b.Property<byte[]>("TotpSecretEncrypted")
 2662                        .HasColumnType("bytea")
 2663                        .HasColumnName("totp_secret_encrypted");
 2664
 2665                    b.Property<DateTime>("UpdatedAt")
 2666                        .ValueGeneratedOnAdd()
 2667                        .HasColumnType("timestamp with time zone")
 2668                        .HasColumnName("updated_at")
 2669                        .HasDefaultValueSql("now()");
 2670
 2671                    b.HasKey("Id")
 2672                        .HasName("pk_two_factor_auth");
 2673
 2674                    b.HasIndex("PersonId")
 2675                        .IsUnique()
 2676                        .HasDatabaseName("ix_two_factor_auth_person_id");
 2677
 2678                    b.ToTable("two_factor_auth", "heimdall");
 4679                });
 680
 2681            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 2682                {
 2683                    b.Property<long>("Id")
 2684                        .ValueGeneratedOnAdd()
 2685                        .HasColumnType("bigint")
 2686                        .HasColumnName("id")
 2687                        .HasColumnOrder(1);
 2688
 2689                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2690
 2691                    b.Property<byte[]>("CodeHash")
 2692                        .IsRequired()
 2693                        .HasColumnType("bytea")
 2694                        .HasColumnName("code_hash");
 2695
 2696                    b.Property<DateTime>("CreatedAt")
 2697                        .ValueGeneratedOnAdd()
 2698                        .HasColumnType("timestamp with time zone")
 2699                        .HasColumnName("created_at")
 2700                        .HasDefaultValueSql("now()");
 2701
 2702                    b.Property<DateTime>("ExpiresAt")
 2703                        .HasColumnType("timestamp with time zone")
 2704                        .HasColumnName("expires_at");
 2705
 2706                    b.Property<int>("FailedAttempts")
 2707                        .HasColumnType("integer")
 2708                        .HasColumnName("failed_attempts");
 2709
 2710                    b.Property<byte[]>("Salt")
 2711                        .IsRequired()
 2712                        .HasColumnType("bytea")
 2713                        .HasColumnName("salt");
 2714
 2715                    b.Property<long>("TwoFactorAuthId")
 2716                        .HasColumnType("bigint")
 2717                        .HasColumnName("two_factor_auth_id");
 2718
 2719                    b.Property<bool>("Used")
 2720                        .ValueGeneratedOnAdd()
 2721                        .HasColumnType("boolean")
 2722                        .HasDefaultValue(false)
 2723                        .HasColumnName("used");
 2724
 2725                    b.HasKey("Id")
 2726                        .HasName("pk_two_factor_email_code");
 2727
 2728                    b.HasIndex("TwoFactorAuthId")
 2729                        .HasDatabaseName("ix_two_factor_email_code_two_factor_auth_id");
 2730
 2731                    b.ToTable("two_factor_email_code", "heimdall");
 4732                });
 733
 2734            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 2735                {
 2736                    b.Property<long>("Id")
 2737                        .ValueGeneratedOnAdd()
 2738                        .HasColumnType("bigint")
 2739                        .HasColumnName("id")
 2740                        .HasColumnOrder(1);
 2741
 2742                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 2743
 2744                    b.Property<byte[]>("CodeHash")
 2745                        .IsRequired()
 2746                        .HasColumnType("bytea")
 2747                        .HasColumnName("code_hash");
 2748
 2749                    b.Property<DateTime>("CreatedAt")
 2750                        .ValueGeneratedOnAdd()
 2751                        .HasColumnType("timestamp with time zone")
 2752                        .HasColumnName("created_at")
 2753                        .HasDefaultValueSql("now()");
 2754
 2755                    b.Property<long>("TwoFactorAuthId")
 2756                        .HasColumnType("bigint")
 2757                        .HasColumnName("two_factor_auth_id");
 2758
 2759                    b.Property<bool>("Used")
 2760                        .ValueGeneratedOnAdd()
 2761                        .HasColumnType("boolean")
 2762                        .HasDefaultValue(false)
 2763                        .HasColumnName("used");
 2764
 2765                    b.Property<DateTime?>("UsedAt")
 2766                        .HasColumnType("timestamp with time zone")
 2767                        .HasColumnName("used_at");
 2768
 2769                    b.HasKey("Id")
 2770                        .HasName("pk_two_factor_recovery_code");
 2771
 2772                    b.HasIndex("TwoFactorAuthId")
 2773                        .HasDatabaseName("ix_two_factor_recovery_code_two_factor_auth_id");
 2774
 2775                    b.ToTable("two_factor_recovery_code", "heimdall");
 4776                });
 777
 2778            modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b =>
 2779                {
 2780                    b.Property<int>("Id")
 2781                        .ValueGeneratedOnAdd()
 2782                        .HasColumnType("integer")
 2783                        .HasColumnName("id");
 2784
 2785                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 2786
 2787                    b.Property<string>("FriendlyName")
 2788                        .HasColumnType("text")
 2789                        .HasColumnName("friendly_name");
 2790
 2791                    b.Property<string>("Xml")
 2792                        .HasColumnType("text")
 2793                        .HasColumnName("xml");
 2794
 2795                    b.HasKey("Id")
 2796                        .HasName("pk_data_protection_keys");
 2797
 2798                    b.ToTable("data_protection_keys", "heimdall");
 4799                });
 800
 2801            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 2802                {
 2803                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Owner")
 2804                        .WithMany("OwnedApplications")
 2805                        .HasForeignKey("OwnerId")
 2806                        .OnDelete(DeleteBehavior.Cascade)
 2807                        .IsRequired()
 2808                        .HasConstraintName("fk_application_person_owner_id");
 2809
 2810                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 2811                        .WithMany("Applications")
 2812                        .HasForeignKey("ScopeId")
 2813                        .OnDelete(DeleteBehavior.Cascade)
 2814                        .IsRequired()
 2815                        .HasConstraintName("fk_application_scope_scope_id");
 2816
 2817                    b.Navigation("Owner");
 2818
 2819                    b.Navigation("Scope");
 4820                });
 821
 2822            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 2823                {
 2824                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 2825                        .WithMany("EmailVerificationTokens")
 2826                        .HasForeignKey("PersonId")
 2827                        .OnDelete(DeleteBehavior.Cascade)
 2828                        .IsRequired()
 2829                        .HasConstraintName("fk_email_verification_token_person_person_id");
 2830
 2831                    b.Navigation("Person");
 4832                });
 833
 2834            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 2835                {
 2836                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 2837                        .WithMany("GoogleUsers")
 2838                        .HasForeignKey("ScopeId")
 2839                        .OnDelete(DeleteBehavior.Cascade)
 2840                        .IsRequired()
 2841                        .HasConstraintName("fk_google_user_scope_scope_id");
 2842
 2843                    b.Navigation("Scope");
 4844                });
 845
 2846            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 2847                {
 2848                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 2849                        .WithMany("PasswordResetTokens")
 2850                        .HasForeignKey("PersonId")
 2851                        .OnDelete(DeleteBehavior.Cascade)
 2852                        .IsRequired()
 2853                        .HasConstraintName("fk_password_reset_token_person_person_id");
 2854
 2855                    b.Navigation("Person");
 4856                });
 857
 2858            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 2859                {
 2860                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Role", "Role")
 2861                        .WithMany("Persons")
 2862                        .HasForeignKey("RoleId")
 2863                        .OnDelete(DeleteBehavior.Restrict)
 2864                        .IsRequired()
 2865                        .HasConstraintName("fk_person_roles_role_id");
 2866
 2867                    b.Navigation("Role");
 4868                });
 869
 2870            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 2871                {
 2872                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 2873                        .WithMany("ScopeOwnerships")
 2874                        .HasForeignKey("PersonId")
 2875                        .OnDelete(DeleteBehavior.Cascade)
 2876                        .IsRequired()
 2877                        .HasConstraintName("fk_scope_owner_person_person_id");
 2878
 2879                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 2880                        .WithMany("Owners")
 2881                        .HasForeignKey("ScopeId")
 2882                        .OnDelete(DeleteBehavior.Cascade)
 2883                        .IsRequired()
 2884                        .HasConstraintName("fk_scope_owner_scope_scope_id");
 2885
 2886                    b.Navigation("Person");
 2887
 2888                    b.Navigation("Scope");
 4889                });
 890
 2891            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 2892                {
 2893                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 2894                        .WithMany("ScopePermissions")
 2895                        .HasForeignKey("ScopeId")
 2896                        .OnDelete(DeleteBehavior.Cascade)
 2897                        .IsRequired()
 2898                        .HasConstraintName("fk_scope_permission_scope_scope_id");
 2899
 2900                    b.Navigation("Scope");
 4901                });
 902
 2903            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 2904                {
 2905                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 2906                        .WithOne("ScopeMembership")
 2907                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.ScopeUser", "PersonId")
 2908                        .OnDelete(DeleteBehavior.Cascade)
 2909                        .IsRequired()
 2910                        .HasConstraintName("fk_scope_user_person_person_id");
 2911
 2912                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 2913                        .WithMany("Users")
 2914                        .HasForeignKey("ScopeId")
 2915                        .OnDelete(DeleteBehavior.Cascade)
 2916                        .IsRequired()
 2917                        .HasConstraintName("fk_scope_user_scope_scope_id");
 2918
 2919                    b.Navigation("Person");
 2920
 2921                    b.Navigation("Scope");
 4922                });
 923
 2924            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 2925                {
 2926                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 2927                        .WithOne("TwoFactorAuth")
 2928                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "PersonId")
 2929                        .OnDelete(DeleteBehavior.Cascade)
 2930                        .IsRequired()
 2931                        .HasConstraintName("fk_two_factor_auth_person_person_id");
 2932
 2933                    b.Navigation("Person");
 4934                });
 935
 2936            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 2937                {
 2938                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 2939                        .WithMany("EmailCodes")
 2940                        .HasForeignKey("TwoFactorAuthId")
 2941                        .OnDelete(DeleteBehavior.Cascade)
 2942                        .IsRequired()
 2943                        .HasConstraintName("fk_two_factor_email_code_two_factor_auth_two_factor_auth_id");
 2944
 2945                    b.Navigation("TwoFactorAuth");
 4946                });
 947
 2948            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 2949                {
 2950                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 2951                        .WithMany("RecoveryCodes")
 2952                        .HasForeignKey("TwoFactorAuthId")
 2953                        .OnDelete(DeleteBehavior.Cascade)
 2954                        .IsRequired()
 2955                        .HasConstraintName("fk_two_factor_recovery_code_two_factor_auth_two_factor_auth_id");
 2956
 2957                    b.Navigation("TwoFactorAuth");
 4958                });
 959
 2960            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 2961                {
 2962                    b.Navigation("EmailVerificationTokens");
 2963
 2964                    b.Navigation("OwnedApplications");
 2965
 2966                    b.Navigation("PasswordResetTokens");
 2967
 2968                    b.Navigation("ScopeMembership");
 2969
 2970                    b.Navigation("ScopeOwnerships");
 2971
 2972                    b.Navigation("TwoFactorAuth");
 4973                });
 974
 2975            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 2976                {
 2977                    b.Navigation("Persons");
 4978                });
 979
 2980            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 2981                {
 2982                    b.Navigation("Applications");
 2983
 2984                    b.Navigation("GoogleUsers");
 2985
 2986                    b.Navigation("Owners");
 2987
 2988                    b.Navigation("ScopePermissions");
 2989
 2990                    b.Navigation("Users");
 4991                });
 992
 2993            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 2994                {
 2995                    b.Navigation("EmailCodes");
 2996
 2997                    b.Navigation("RecoveryCodes");
 4998                });
 999#pragma warning restore 612, 618
 21000        }
 1001    }
 1002}