< Summary - Heimdall API

Line coverage
100%
Covered lines: 1363
Uncovered lines: 0
Coverable lines: 1363
Total lines: 1471
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage
100%
Covered methods: 3
Fully covered methods: 3
Total methods: 3
Method coverage: 100%
Full method coverage: 100%

Metrics

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

File(s)

/home/ci/agent/workspace/heimdall-api-docs_main/app/src/Infrastructure/ArturRios.Heimdall.Data/Migrations/20261015041235_ProtectEntityPublicIds.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore.Migrations;
 2
 3#nullable disable
 4
 5namespace ArturRios.Heimdall.Data.Migrations
 6{
 7    /// <summary>
 8    ///     Guards <c>public_id</c> on every other table the identity check trusts: <c>scope</c>,
 9    ///     <c>application</c>, <c>application_credential</c>, <c>scope_permission</c>, <c>role</c> and
 10    ///     <c>pending_registration</c> become immutable, and refuse a new row whose id another guarded
 11    ///     table holds (#199, R2 and R3; Threat Model TH-18 and §6.1).
 12    /// </summary>
 13    /// <remarks>
 14    ///     <para>
 15    ///         <c>ProtectIdentityPublicIds</c> refuses a new person or Google User whose
 16    ///         <c>public_id</c> another entity holds, but it can only see who holds an id at that
 17    ///         moment, and only when the identity comes second. Two DML paths were left. While these
 18    ///         tables' ids could be rewritten, a scope could be moved off its id, a person inserted with
 19    ///         the freed id and anonymised, every audit target naming the scope cleared, and the scope
 20    ///         moved back. And while only the identity tables were checked, a person could be inserted
 21    ///         with a fresh id first and a scope with the same id after it, so that every entry later
 22    ///         naming the scope was clearable through the person.
 23    ///     </para>
 24    ///     <para>
 25    ///         Each table therefore gets the same two row-level triggers as the identity tables:
 26    ///         <c>*_public_id_is_immutable</c> (<c>BEFORE UPDATE</c>, <c>public_id_is_immutable()</c>)
 27    ///         and <c>*_public_id_is_unused</c> (<c>BEFORE INSERT</c>, <c>public_id_is_unused()</c>).
 28    ///         The functions name the table through <c>TG_TABLE_NAME</c> and leave its own table to its
 29    ///         unique index, so they need no change. Their audit-trail check applies to the identity
 30    ///         tables only, as that function's comment explains. Every other column stays writable.
 31    ///         The application never changes these ids and always creates them fresh with
 32    ///         <c>Guid.NewGuid()</c>, the seeder's roles included, and its role realignment writes only
 33    ///         the name and description. Down drops the twelve triggers; the functions stay with the
 34    ///         migration that created them.
 35    ///     </para>
 36    /// </remarks>
 37    public partial class ProtectEntityPublicIds : Migration
 38    {
 39        /// <inheritdoc />
 40        protected override void Up(MigrationBuilder migrationBuilder)
 41        {
 1942            migrationBuilder.Sql(
 1943                """
 1944                CREATE TRIGGER scope_public_id_is_immutable
 1945                BEFORE UPDATE ON heimdall.scope
 1946                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_immutable();
 1947
 1948                CREATE TRIGGER scope_public_id_is_unused
 1949                BEFORE INSERT ON heimdall.scope
 1950                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_unused();
 1951
 1952                CREATE TRIGGER application_public_id_is_immutable
 1953                BEFORE UPDATE ON heimdall.application
 1954                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_immutable();
 1955
 1956                CREATE TRIGGER application_public_id_is_unused
 1957                BEFORE INSERT ON heimdall.application
 1958                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_unused();
 1959
 1960                CREATE TRIGGER application_credential_public_id_is_immutable
 1961                BEFORE UPDATE ON heimdall.application_credential
 1962                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_immutable();
 1963
 1964                CREATE TRIGGER application_credential_public_id_is_unused
 1965                BEFORE INSERT ON heimdall.application_credential
 1966                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_unused();
 1967
 1968                CREATE TRIGGER scope_permission_public_id_is_immutable
 1969                BEFORE UPDATE ON heimdall.scope_permission
 1970                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_immutable();
 1971
 1972                CREATE TRIGGER scope_permission_public_id_is_unused
 1973                BEFORE INSERT ON heimdall.scope_permission
 1974                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_unused();
 1975
 1976                CREATE TRIGGER role_public_id_is_immutable
 1977                BEFORE UPDATE ON heimdall.role
 1978                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_immutable();
 1979
 1980                CREATE TRIGGER role_public_id_is_unused
 1981                BEFORE INSERT ON heimdall.role
 1982                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_unused();
 1983
 1984                CREATE TRIGGER pending_registration_public_id_is_immutable
 1985                BEFORE UPDATE ON heimdall.pending_registration
 1986                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_immutable();
 1987
 1988                CREATE TRIGGER pending_registration_public_id_is_unused
 1989                BEFORE INSERT ON heimdall.pending_registration
 1990                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_unused();
 1991                """);
 1992        }
 93
 94        /// <inheritdoc />
 95        protected override void Down(MigrationBuilder migrationBuilder)
 96        {
 197            migrationBuilder.Sql(
 198                """
 199                DROP TRIGGER IF EXISTS pending_registration_public_id_is_unused ON heimdall.pending_registration;
 1100                DROP TRIGGER IF EXISTS pending_registration_public_id_is_immutable ON heimdall.pending_registration;
 1101                DROP TRIGGER IF EXISTS role_public_id_is_unused ON heimdall.role;
 1102                DROP TRIGGER IF EXISTS role_public_id_is_immutable ON heimdall.role;
 1103                DROP TRIGGER IF EXISTS scope_permission_public_id_is_unused ON heimdall.scope_permission;
 1104                DROP TRIGGER IF EXISTS scope_permission_public_id_is_immutable ON heimdall.scope_permission;
 1105                DROP TRIGGER IF EXISTS application_credential_public_id_is_unused ON heimdall.application_credential;
 1106                DROP TRIGGER IF EXISTS application_credential_public_id_is_immutable ON heimdall.application_credential;
 1107                DROP TRIGGER IF EXISTS application_public_id_is_unused ON heimdall.application;
 1108                DROP TRIGGER IF EXISTS application_public_id_is_immutable ON heimdall.application;
 1109                DROP TRIGGER IF EXISTS scope_public_id_is_unused ON heimdall.scope;
 1110                DROP TRIGGER IF EXISTS scope_public_id_is_immutable ON heimdall.scope;
 1111                """);
 1112        }
 113    }
 114}

/home/ci/agent/workspace/heimdall-api-docs_main/app/src/Infrastructure/ArturRios.Heimdall.Data/Migrations/20261015041235_ProtectEntityPublicIds.Designer.cs

#LineLine coverage
 1// <auto-generated />
 2using System;
 3using ArturRios.Heimdall.Data.Configuration;
 4using Microsoft.EntityFrameworkCore;
 5using Microsoft.EntityFrameworkCore.Infrastructure;
 6using Microsoft.EntityFrameworkCore.Migrations;
 7using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
 8using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
 9
 10#nullable disable
 11
 12namespace ArturRios.Heimdall.Data.Migrations
 13{
 14    [DbContext(typeof(AppDbContext))]
 15    [Migration("20261015041235_ProtectEntityPublicIds")]
 16    partial class ProtectEntityPublicIds
 17    {
 18        /// <inheritdoc />
 19        protected override void BuildTargetModel(ModelBuilder modelBuilder)
 20        {
 21#pragma warning disable 612, 618
 1022            modelBuilder
 1023                .HasDefaultSchema("heimdall")
 1024                .HasAnnotation("ProductVersion", "10.0.13")
 1025                .HasAnnotation("Relational:MaxIdentifierLength", 63);
 26
 1027            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
 28
 1029            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 1030                {
 1031                    b.Property<long>("Id")
 1032                        .ValueGeneratedOnAdd()
 1033                        .HasColumnType("bigint")
 1034                        .HasColumnName("id")
 1035                        .HasColumnOrder(1);
 1036
 1037                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 1038
 1039                    b.Property<DateTime>("CreatedAt")
 1040                        .ValueGeneratedOnAdd()
 1041                        .HasColumnType("timestamp with time zone")
 1042                        .HasColumnName("created_at")
 1043                        .HasDefaultValueSql("now()");
 1044
 1045                    b.Property<bool>("IsDeleted")
 1046                        .ValueGeneratedOnAdd()
 1047                        .HasColumnType("boolean")
 1048                        .HasDefaultValue(false)
 1049                        .HasColumnName("is_deleted");
 1050
 1051                    b.Property<string>("Name")
 1052                        .IsRequired()
 1053                        .HasMaxLength(200)
 1054                        .HasColumnType("character varying(200)")
 1055                        .HasColumnName("name");
 1056
 1057                    b.Property<long>("OwnerId")
 1058                        .HasColumnType("bigint")
 1059                        .HasColumnName("owner_id");
 1060
 1061                    b.Property<Guid>("PublicId")
 1062                        .HasColumnType("uuid")
 1063                        .HasColumnName("public_id");
 1064
 1065                    b.Property<long>("ScopeId")
 1066                        .HasColumnType("bigint")
 1067                        .HasColumnName("scope_id");
 1068
 1069                    b.Property<DateTime>("UpdatedAt")
 1070                        .ValueGeneratedOnAdd()
 1071                        .HasColumnType("timestamp with time zone")
 1072                        .HasColumnName("updated_at")
 1073                        .HasDefaultValueSql("now()");
 1074
 1075                    b.HasKey("Id")
 1076                        .HasName("pk_application");
 1077
 1078                    b.HasIndex("OwnerId")
 1079                        .HasDatabaseName("ix_application_owner_id");
 1080
 1081                    b.HasIndex("PublicId")
 1082                        .IsUnique()
 1083                        .HasDatabaseName("ix_application_public_id");
 1084
 1085                    b.HasIndex("ScopeId")
 1086                        .HasDatabaseName("ix_application_scope_id");
 1087
 1088                    b.ToTable("application", "heimdall");
 2089                });
 90
 1091            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ApplicationCredential", b =>
 1092                {
 1093                    b.Property<long>("Id")
 1094                        .ValueGeneratedOnAdd()
 1095                        .HasColumnType("bigint")
 1096                        .HasColumnName("id")
 1097                        .HasColumnOrder(1);
 1098
 1099                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10100
 10101                    b.Property<long>("ApplicationId")
 10102                        .HasColumnType("bigint")
 10103                        .HasColumnName("application_id");
 10104
 10105                    b.Property<DateTime>("CreatedAt")
 10106                        .HasColumnType("timestamp with time zone")
 10107                        .HasColumnName("created_at");
 10108
 10109                    b.Property<DateTime?>("ExpiresAt")
 10110                        .HasColumnType("timestamp with time zone")
 10111                        .HasColumnName("expires_at");
 10112
 10113                    b.Property<DateTime?>("LastUsedAt")
 10114                        .HasColumnType("timestamp with time zone")
 10115                        .HasColumnName("last_used_at");
 10116
 10117                    b.Property<Guid>("PublicId")
 10118                        .HasColumnType("uuid")
 10119                        .HasColumnName("public_id");
 10120
 10121                    b.Property<DateTime?>("RevokedAt")
 10122                        .HasColumnType("timestamp with time zone")
 10123                        .HasColumnName("revoked_at");
 10124
 10125                    b.Property<string>("SecretHash")
 10126                        .IsRequired()
 10127                        .HasMaxLength(64)
 10128                        .HasColumnType("character varying(64)")
 10129                        .HasColumnName("secret_hash");
 10130
 10131                    b.HasKey("Id")
 10132                        .HasName("pk_application_credential");
 10133
 10134                    b.HasIndex("ApplicationId")
 10135                        .HasDatabaseName("ix_application_credential_application_id");
 10136
 10137                    b.HasIndex("PublicId")
 10138                        .IsUnique()
 10139                        .HasDatabaseName("ix_application_credential_public_id");
 10140
 10141                    b.HasIndex("SecretHash")
 10142                        .IsUnique()
 10143                        .HasDatabaseName("ix_application_credential_secret_hash");
 10144
 10145                    b.ToTable("application_credential", "heimdall");
 20146                });
 147
 10148            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.AuditLog", b =>
 10149                {
 10150                    b.Property<long>("Id")
 10151                        .ValueGeneratedOnAdd()
 10152                        .HasColumnType("bigint")
 10153                        .HasColumnName("id")
 10154                        .HasColumnOrder(1);
 10155
 10156                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10157
 10158                    b.Property<string>("Action")
 10159                        .IsRequired()
 10160                        .HasMaxLength(200)
 10161                        .HasColumnType("character varying(200)")
 10162                        .HasColumnName("action");
 10163
 10164                    b.Property<Guid?>("ActorPersonId")
 10165                        .HasColumnType("uuid")
 10166                        .HasColumnName("actor_person_id");
 10167
 10168                    b.Property<int?>("ActorRole")
 10169                        .HasColumnType("integer")
 10170                        .HasColumnName("actor_role");
 10171
 10172                    b.Property<DateTime>("CreatedAt")
 10173                        .ValueGeneratedOnAdd()
 10174                        .HasColumnType("timestamp with time zone")
 10175                        .HasColumnName("created_at")
 10176                        .HasDefaultValueSql("now()");
 10177
 10178                    b.Property<string>("FailureReason")
 10179                        .HasMaxLength(500)
 10180                        .HasColumnType("character varying(500)")
 10181                        .HasColumnName("failure_reason");
 10182
 10183                    b.Property<Guid>("PublicId")
 10184                        .HasColumnType("uuid")
 10185                        .HasColumnName("public_id");
 10186
 10187                    b.Property<bool>("Succeeded")
 10188                        .HasColumnType("boolean")
 10189                        .HasColumnName("succeeded");
 10190
 10191                    b.Property<Guid?>("TargetId")
 10192                        .HasColumnType("uuid")
 10193                        .HasColumnName("target_id");
 10194
 10195                    b.HasKey("Id")
 10196                        .HasName("pk_audit_log");
 10197
 10198                    b.HasIndex("ActorPersonId")
 10199                        .HasDatabaseName("ix_audit_log_actor_person_id");
 10200
 10201                    b.HasIndex("CreatedAt")
 10202                        .HasDatabaseName("ix_audit_log_created_at");
 10203
 10204                    b.HasIndex("PublicId")
 10205                        .IsUnique()
 10206                        .HasDatabaseName("ix_audit_log_public_id");
 10207
 10208                    b.HasIndex("TargetId")
 10209                        .HasDatabaseName("ix_audit_log_target_id");
 10210
 10211                    b.ToTable("audit_log", "heimdall");
 20212                });
 213
 10214            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 10215                {
 10216                    b.Property<long>("Id")
 10217                        .ValueGeneratedOnAdd()
 10218                        .HasColumnType("bigint")
 10219                        .HasColumnName("id")
 10220                        .HasColumnOrder(1);
 10221
 10222                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10223
 10224                    b.Property<DateTime>("ExpiresAt")
 10225                        .HasColumnType("timestamp with time zone")
 10226                        .HasColumnName("expires_at");
 10227
 10228                    b.Property<long>("PersonId")
 10229                        .HasColumnType("bigint")
 10230                        .HasColumnName("person_id");
 10231
 10232                    b.Property<string>("TokenHash")
 10233                        .IsRequired()
 10234                        .HasMaxLength(64)
 10235                        .HasColumnType("character varying(64)")
 10236                        .HasColumnName("token_hash");
 10237
 10238                    b.Property<bool>("Used")
 10239                        .ValueGeneratedOnAdd()
 10240                        .HasColumnType("boolean")
 10241                        .HasDefaultValue(false)
 10242                        .HasColumnName("used");
 10243
 10244                    b.HasKey("Id")
 10245                        .HasName("pk_email_verification_token");
 10246
 10247                    b.HasIndex("PersonId")
 10248                        .HasDatabaseName("ix_email_verification_token_person_id");
 10249
 10250                    b.HasIndex("TokenHash")
 10251                        .IsUnique()
 10252                        .HasDatabaseName("ix_email_verification_token_token_hash");
 10253
 10254                    b.ToTable("email_verification_token", "heimdall");
 20255                });
 256
 10257            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ErasedSubject", b =>
 10258                {
 10259                    b.Property<Guid>("Id")
 10260                        .HasColumnType("uuid")
 10261                        .HasColumnName("public_id")
 10262                        .HasColumnOrder(1);
 10263
 10264                    b.Property<DateTime>("CreatedAt")
 10265                        .ValueGeneratedOnAdd()
 10266                        .HasColumnType("timestamp with time zone")
 10267                        .HasColumnName("created_at")
 10268                        .HasDefaultValueSql("now()");
 10269
 10270                    b.Property<int>("Kind")
 10271                        .HasColumnType("integer")
 10272                        .HasColumnName("kind");
 10273
 10274                    b.HasKey("Id")
 10275                        .HasName("pk_erased_subject");
 10276
 10277                    b.HasIndex("CreatedAt")
 10278                        .HasDatabaseName("ix_erased_subject_created_at");
 10279
 10280                    b.ToTable("erased_subject", "heimdall");
 20281                });
 282
 10283            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 10284                {
 10285                    b.Property<long>("Id")
 10286                        .ValueGeneratedOnAdd()
 10287                        .HasColumnType("bigint")
 10288                        .HasColumnName("id")
 10289                        .HasColumnOrder(1);
 10290
 10291                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10292
 10293                    b.Property<DateTime?>("AnonymisedAt")
 10294                        .HasColumnType("timestamp with time zone")
 10295                        .HasColumnName("anonymised_at");
 10296
 10297                    b.Property<DateTime?>("BasisRecordedAt")
 10298                        .HasColumnType("timestamp with time zone")
 10299                        .HasColumnName("basis_recorded_at");
 10300
 10301                    b.Property<DateTime>("CreatedAt")
 10302                        .ValueGeneratedOnAdd()
 10303                        .HasColumnType("timestamp with time zone")
 10304                        .HasColumnName("created_at")
 10305                        .HasDefaultValueSql("now()");
 10306
 10307                    b.Property<DateTime?>("DeletedAt")
 10308                        .HasColumnType("timestamp with time zone")
 10309                        .HasColumnName("deleted_at");
 10310
 10311                    b.Property<int?>("DeletionKind")
 10312                        .HasColumnType("integer")
 10313                        .HasColumnName("deletion_kind");
 10314
 10315                    b.Property<string>("Email")
 10316                        .IsRequired()
 10317                        .HasMaxLength(256)
 10318                        .HasColumnType("character varying(256)")
 10319                        .HasColumnName("email");
 10320
 10321                    b.Property<bool>("EmailVerified")
 10322                        .ValueGeneratedOnAdd()
 10323                        .HasColumnType("boolean")
 10324                        .HasDefaultValue(false)
 10325                        .HasColumnName("email_verified");
 10326
 10327                    b.Property<string>("ErasureBlockedReason")
 10328                        .HasMaxLength(500)
 10329                        .HasColumnType("character varying(500)")
 10330                        .HasColumnName("erasure_blocked_reason");
 10331
 10332                    b.Property<DateTime?>("ErasureDueAt")
 10333                        .HasColumnType("timestamp with time zone")
 10334                        .HasColumnName("erasure_due_at");
 10335
 10336                    b.Property<DateTime?>("ErasureRequestedAt")
 10337                        .HasColumnType("timestamp with time zone")
 10338                        .HasColumnName("erasure_requested_at");
 10339
 10340                    b.Property<string>("GoogleId")
 10341                        .IsRequired()
 10342                        .HasMaxLength(255)
 10343                        .HasColumnType("character varying(255)")
 10344                        .HasColumnName("google_id");
 10345
 10346                    b.Property<bool>("IsDeleted")
 10347                        .ValueGeneratedOnAdd()
 10348                        .HasColumnType("boolean")
 10349                        .HasDefaultValue(false)
 10350                        .HasColumnName("is_deleted");
 10351
 10352                    b.Property<int>("LegalBasis")
 10353                        .ValueGeneratedOnAdd()
 10354                        .HasColumnType("integer")
 10355                        .HasDefaultValue(0)
 10356                        .HasColumnName("legal_basis");
 10357
 10358                    b.Property<string>("Name")
 10359                        .IsRequired()
 10360                        .HasMaxLength(200)
 10361                        .HasColumnType("character varying(200)")
 10362                        .HasColumnName("name");
 10363
 10364                    b.Property<string>("PrivacyNoticeVersion")
 10365                        .HasMaxLength(50)
 10366                        .HasColumnType("character varying(50)")
 10367                        .HasColumnName("privacy_notice_version");
 10368
 10369                    b.Property<DateTime?>("ProcessingRestrictedAt")
 10370                        .HasColumnType("timestamp with time zone")
 10371                        .HasColumnName("processing_restricted_at");
 10372
 10373                    b.Property<string>("ProfilePictureUrl")
 10374                        .HasMaxLength(2048)
 10375                        .HasColumnType("character varying(2048)")
 10376                        .HasColumnName("profile_picture_url");
 10377
 10378                    b.Property<Guid>("PublicId")
 10379                        .HasColumnType("uuid")
 10380                        .HasColumnName("public_id");
 10381
 10382                    b.Property<int?>("RestrictionGround")
 10383                        .HasColumnType("integer")
 10384                        .HasColumnName("restriction_ground");
 10385
 10386                    b.Property<DateTime?>("RestrictionLiftNotifiedAt")
 10387                        .HasColumnType("timestamp with time zone")
 10388                        .HasColumnName("restriction_lift_notified_at");
 10389
 10390                    b.Property<long>("ScopeId")
 10391                        .HasColumnType("bigint")
 10392                        .HasColumnName("scope_id");
 10393
 10394                    b.Property<DateTime>("UpdatedAt")
 10395                        .ValueGeneratedOnAdd()
 10396                        .HasColumnType("timestamp with time zone")
 10397                        .HasColumnName("updated_at")
 10398                        .HasDefaultValueSql("now()");
 10399
 10400                    b.HasKey("Id")
 10401                        .HasName("pk_google_user");
 10402
 10403                    b.HasIndex("DeletedAt")
 10404                        .HasDatabaseName("ix_google_user_deleted_at")
 10405                        .HasFilter("is_deleted = true AND anonymised_at IS NULL");
 10406
 10407                    b.HasIndex("ProcessingRestrictedAt")
 10408                        .HasDatabaseName("ix_google_user_processing_restricted_at")
 10409                        .HasFilter("processing_restricted_at IS NOT NULL");
 10410
 10411                    b.HasIndex("PublicId")
 10412                        .IsUnique()
 10413                        .HasDatabaseName("ix_google_user_public_id");
 10414
 10415                    b.HasIndex("ScopeId", "Email")
 10416                        .IsUnique()
 10417                        .HasDatabaseName("ix_google_user_scope_id_email");
 10418
 10419                    b.HasIndex("ScopeId", "GoogleId")
 10420                        .IsUnique()
 10421                        .HasDatabaseName("ix_google_user_scope_id_google_id");
 10422
 10423                    b.ToTable("google_user", "heimdall");
 20424                });
 425
 10426            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 10427                {
 10428                    b.Property<long>("Id")
 10429                        .ValueGeneratedOnAdd()
 10430                        .HasColumnType("bigint")
 10431                        .HasColumnName("id")
 10432                        .HasColumnOrder(1);
 10433
 10434                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10435
 10436                    b.Property<DateTime>("ExpiresAt")
 10437                        .HasColumnType("timestamp with time zone")
 10438                        .HasColumnName("expires_at");
 10439
 10440                    b.Property<long>("PersonId")
 10441                        .HasColumnType("bigint")
 10442                        .HasColumnName("person_id");
 10443
 10444                    b.Property<string>("TokenHash")
 10445                        .IsRequired()
 10446                        .HasMaxLength(64)
 10447                        .HasColumnType("character varying(64)")
 10448                        .HasColumnName("token_hash");
 10449
 10450                    b.Property<bool>("Used")
 10451                        .ValueGeneratedOnAdd()
 10452                        .HasColumnType("boolean")
 10453                        .HasDefaultValue(false)
 10454                        .HasColumnName("used");
 10455
 10456                    b.HasKey("Id")
 10457                        .HasName("pk_password_reset_token");
 10458
 10459                    b.HasIndex("PersonId")
 10460                        .HasDatabaseName("ix_password_reset_token_person_id");
 10461
 10462                    b.HasIndex("TokenHash")
 10463                        .IsUnique()
 10464                        .HasDatabaseName("ix_password_reset_token_token_hash");
 10465
 10466                    b.ToTable("password_reset_token", "heimdall");
 20467                });
 468
 10469            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PendingRegistration", b =>
 10470                {
 10471                    b.Property<long>("Id")
 10472                        .ValueGeneratedOnAdd()
 10473                        .HasColumnType("bigint")
 10474                        .HasColumnName("id")
 10475                        .HasColumnOrder(1);
 10476
 10477                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10478
 10479                    b.Property<DateTime>("CreatedAt")
 10480                        .ValueGeneratedOnAdd()
 10481                        .HasColumnType("timestamp with time zone")
 10482                        .HasColumnName("created_at")
 10483                        .HasDefaultValueSql("now()");
 10484
 10485                    b.Property<string>("Email")
 10486                        .IsRequired()
 10487                        .HasMaxLength(256)
 10488                        .HasColumnType("character varying(256)")
 10489                        .HasColumnName("email");
 10490
 10491                    b.Property<DateTime>("ExpiresAt")
 10492                        .HasColumnType("timestamp with time zone")
 10493                        .HasColumnName("expires_at");
 10494
 10495                    b.Property<int>("FailedAttempts")
 10496                        .ValueGeneratedOnAdd()
 10497                        .HasColumnType("integer")
 10498                        .HasDefaultValue(0)
 10499                        .HasColumnName("failed_attempts");
 10500
 10501                    b.Property<string>("Name")
 10502                        .IsRequired()
 10503                        .HasMaxLength(200)
 10504                        .HasColumnType("character varying(200)")
 10505                        .HasColumnName("name");
 10506
 10507                    b.Property<byte[]>("PasswordHash")
 10508                        .IsRequired()
 10509                        .HasColumnType("bytea")
 10510                        .HasColumnName("password_hash");
 10511
 10512                    b.Property<Guid>("PublicId")
 10513                        .HasColumnType("uuid")
 10514                        .HasColumnName("public_id");
 10515
 10516                    b.Property<byte[]>("Salt")
 10517                        .IsRequired()
 10518                        .HasColumnType("bytea")
 10519                        .HasColumnName("salt");
 10520
 10521                    b.Property<long>("ScopeId")
 10522                        .HasColumnType("bigint")
 10523                        .HasColumnName("scope_id");
 10524
 10525                    b.Property<string>("TokenHash")
 10526                        .IsRequired()
 10527                        .HasMaxLength(64)
 10528                        .HasColumnType("character varying(64)")
 10529                        .HasColumnName("token_hash");
 10530
 10531                    b.HasKey("Id")
 10532                        .HasName("pk_pending_registration");
 10533
 10534                    b.HasIndex("PublicId")
 10535                        .IsUnique()
 10536                        .HasDatabaseName("ix_pending_registration_public_id");
 10537
 10538                    b.HasIndex("ScopeId")
 10539                        .HasDatabaseName("ix_pending_registration_scope_id");
 10540
 10541                    b.HasIndex("TokenHash")
 10542                        .IsUnique()
 10543                        .HasDatabaseName("ix_pending_registration_token_hash");
 10544
 10545                    b.ToTable("pending_registration", "heimdall");
 20546                });
 547
 10548            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 10549                {
 10550                    b.Property<long>("Id")
 10551                        .ValueGeneratedOnAdd()
 10552                        .HasColumnType("bigint")
 10553                        .HasColumnName("id")
 10554                        .HasColumnOrder(1);
 10555
 10556                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10557
 10558                    b.Property<DateTime?>("AnonymisedAt")
 10559                        .HasColumnType("timestamp with time zone")
 10560                        .HasColumnName("anonymised_at");
 10561
 10562                    b.Property<DateTime?>("BasisRecordedAt")
 10563                        .HasColumnType("timestamp with time zone")
 10564                        .HasColumnName("basis_recorded_at");
 10565
 10566                    b.Property<DateTime>("CreatedAt")
 10567                        .ValueGeneratedOnAdd()
 10568                        .HasColumnType("timestamp with time zone")
 10569                        .HasColumnName("created_at")
 10570                        .HasDefaultValueSql("now()");
 10571
 10572                    b.Property<DateTime?>("DeletedAt")
 10573                        .HasColumnType("timestamp with time zone")
 10574                        .HasColumnName("deleted_at");
 10575
 10576                    b.Property<int?>("DeletionKind")
 10577                        .HasColumnType("integer")
 10578                        .HasColumnName("deletion_kind");
 10579
 10580                    b.Property<string>("Email")
 10581                        .IsRequired()
 10582                        .HasMaxLength(256)
 10583                        .HasColumnType("character varying(256)")
 10584                        .HasColumnName("email");
 10585
 10586                    b.Property<bool>("EmailVerified")
 10587                        .ValueGeneratedOnAdd()
 10588                        .HasColumnType("boolean")
 10589                        .HasDefaultValue(false)
 10590                        .HasColumnName("email_verified");
 10591
 10592                    b.Property<string>("ErasureBlockedReason")
 10593                        .HasMaxLength(500)
 10594                        .HasColumnType("character varying(500)")
 10595                        .HasColumnName("erasure_blocked_reason");
 10596
 10597                    b.Property<DateTime?>("ErasureDueAt")
 10598                        .HasColumnType("timestamp with time zone")
 10599                        .HasColumnName("erasure_due_at");
 10600
 10601                    b.Property<DateTime?>("ErasureRequestedAt")
 10602                        .HasColumnType("timestamp with time zone")
 10603                        .HasColumnName("erasure_requested_at");
 10604
 10605                    b.Property<int>("FailedLoginAttempts")
 10606                        .HasColumnType("integer")
 10607                        .HasColumnName("failed_login_attempts");
 10608
 10609                    b.Property<bool>("IsDeleted")
 10610                        .ValueGeneratedOnAdd()
 10611                        .HasColumnType("boolean")
 10612                        .HasDefaultValue(false)
 10613                        .HasColumnName("is_deleted");
 10614
 10615                    b.Property<int>("LegalBasis")
 10616                        .ValueGeneratedOnAdd()
 10617                        .HasColumnType("integer")
 10618                        .HasDefaultValue(0)
 10619                        .HasColumnName("legal_basis");
 10620
 10621                    b.Property<DateTime?>("LockedOutUntil")
 10622                        .HasColumnType("timestamp with time zone")
 10623                        .HasColumnName("locked_out_until");
 10624
 10625                    b.Property<string>("Name")
 10626                        .IsRequired()
 10627                        .HasMaxLength(200)
 10628                        .HasColumnType("character varying(200)")
 10629                        .HasColumnName("name");
 10630
 10631                    b.Property<byte[]>("PasswordHash")
 10632                        .IsRequired()
 10633                        .HasColumnType("bytea")
 10634                        .HasColumnName("password_hash");
 10635
 10636                    b.Property<string>("PrivacyNoticeVersion")
 10637                        .HasMaxLength(50)
 10638                        .HasColumnType("character varying(50)")
 10639                        .HasColumnName("privacy_notice_version");
 10640
 10641                    b.Property<DateTime?>("ProcessingRestrictedAt")
 10642                        .HasColumnType("timestamp with time zone")
 10643                        .HasColumnName("processing_restricted_at");
 10644
 10645                    b.Property<Guid>("PublicId")
 10646                        .HasColumnType("uuid")
 10647                        .HasColumnName("public_id");
 10648
 10649                    b.Property<int?>("RestrictionGround")
 10650                        .HasColumnType("integer")
 10651                        .HasColumnName("restriction_ground");
 10652
 10653                    b.Property<DateTime?>("RestrictionLiftNotifiedAt")
 10654                        .HasColumnType("timestamp with time zone")
 10655                        .HasColumnName("restriction_lift_notified_at");
 10656
 10657                    b.Property<long>("RoleId")
 10658                        .HasColumnType("bigint")
 10659                        .HasColumnName("role_id");
 10660
 10661                    b.Property<byte[]>("Salt")
 10662                        .IsRequired()
 10663                        .HasColumnType("bytea")
 10664                        .HasColumnName("salt");
 10665
 10666                    b.Property<long?>("ScopeId")
 10667                        .HasColumnType("bigint")
 10668                        .HasColumnName("scope_id");
 10669
 10670                    b.Property<DateTime>("UpdatedAt")
 10671                        .ValueGeneratedOnAdd()
 10672                        .HasColumnType("timestamp with time zone")
 10673                        .HasColumnName("updated_at")
 10674                        .HasDefaultValueSql("now()");
 10675
 10676                    b.HasKey("Id")
 10677                        .HasName("pk_person");
 10678
 10679                    b.HasIndex("DeletedAt")
 10680                        .HasDatabaseName("ix_person_deleted_at")
 10681                        .HasFilter("is_deleted = true AND anonymised_at IS NULL");
 10682
 10683                    b.HasIndex("Email")
 10684                        .HasDatabaseName("ix_person_email");
 10685
 10686                    b.HasIndex("ProcessingRestrictedAt")
 10687                        .HasDatabaseName("ix_person_processing_restricted_at")
 10688                        .HasFilter("processing_restricted_at IS NOT NULL");
 10689
 10690                    b.HasIndex("PublicId")
 10691                        .IsUnique()
 10692                        .HasDatabaseName("ix_person_public_id");
 10693
 10694                    b.HasIndex("RoleId")
 10695                        .HasDatabaseName("ix_person_role_id");
 10696
 10697                    b.ToTable("person", "heimdall");
 20698                });
 699
 10700            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 10701                {
 10702                    b.Property<long>("Id")
 10703                        .HasColumnType("bigint")
 10704                        .HasColumnName("id")
 10705                        .HasColumnOrder(1);
 10706
 10707                    b.Property<string>("Description")
 10708                        .HasMaxLength(500)
 10709                        .HasColumnType("character varying(500)")
 10710                        .HasColumnName("description");
 10711
 10712                    b.Property<string>("Name")
 10713                        .IsRequired()
 10714                        .HasMaxLength(200)
 10715                        .HasColumnType("character varying(200)")
 10716                        .HasColumnName("name");
 10717
 10718                    b.Property<Guid>("PublicId")
 10719                        .HasColumnType("uuid")
 10720                        .HasColumnName("public_id");
 10721
 10722                    b.HasKey("Id")
 10723                        .HasName("pk_role");
 10724
 10725                    b.HasIndex("Name")
 10726                        .IsUnique()
 10727                        .HasDatabaseName("ix_role_name");
 10728
 10729                    b.HasIndex("PublicId")
 10730                        .IsUnique()
 10731                        .HasDatabaseName("ix_role_public_id");
 10732
 10733                    b.ToTable("role", "heimdall");
 20734                });
 735
 10736            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 10737                {
 10738                    b.Property<long>("Id")
 10739                        .ValueGeneratedOnAdd()
 10740                        .HasColumnType("bigint")
 10741                        .HasColumnName("id")
 10742                        .HasColumnOrder(1);
 10743
 10744                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10745
 10746                    b.Property<DateTime>("CreatedAt")
 10747                        .ValueGeneratedOnAdd()
 10748                        .HasColumnType("timestamp with time zone")
 10749                        .HasColumnName("created_at")
 10750                        .HasDefaultValueSql("now()");
 10751
 10752                    b.Property<int?>("DefaultLegalBasis")
 10753                        .HasColumnType("integer")
 10754                        .HasColumnName("default_legal_basis");
 10755
 10756                    b.Property<string>("Description")
 10757                        .HasMaxLength(500)
 10758                        .HasColumnType("character varying(500)")
 10759                        .HasColumnName("description");
 10760
 10761                    b.Property<string>("EmailVerificationUrl")
 10762                        .HasMaxLength(2048)
 10763                        .HasColumnType("character varying(2048)")
 10764                        .HasColumnName("email_verification_url");
 10765
 10766                    b.Property<bool>("GoogleSignInEnabled")
 10767                        .ValueGeneratedOnAdd()
 10768                        .HasColumnType("boolean")
 10769                        .HasDefaultValue(false)
 10770                        .HasColumnName("google_sign_in_enabled");
 10771
 10772                    b.Property<bool>("IsDeleted")
 10773                        .ValueGeneratedOnAdd()
 10774                        .HasColumnType("boolean")
 10775                        .HasDefaultValue(false)
 10776                        .HasColumnName("is_deleted");
 10777
 10778                    b.Property<string>("Name")
 10779                        .IsRequired()
 10780                        .HasMaxLength(200)
 10781                        .HasColumnType("character varying(200)")
 10782                        .HasColumnName("name");
 10783
 10784                    b.Property<string>("PasswordResetUrl")
 10785                        .HasMaxLength(2048)
 10786                        .HasColumnType("character varying(2048)")
 10787                        .HasColumnName("password_reset_url");
 10788
 10789                    b.Property<string>("PrivacyNoticeUri")
 10790                        .HasMaxLength(2048)
 10791                        .HasColumnType("character varying(2048)")
 10792                        .HasColumnName("privacy_notice_uri");
 10793
 10794                    b.Property<Guid>("PublicId")
 10795                        .HasColumnType("uuid")
 10796                        .HasColumnName("public_id");
 10797
 10798                    b.Property<bool>("SelfRegistrationEnabled")
 10799                        .ValueGeneratedOnAdd()
 10800                        .HasColumnType("boolean")
 10801                        .HasDefaultValue(false)
 10802                        .HasColumnName("self_registration_enabled");
 10803
 10804                    b.Property<DateTime>("UpdatedAt")
 10805                        .ValueGeneratedOnAdd()
 10806                        .HasColumnType("timestamp with time zone")
 10807                        .HasColumnName("updated_at")
 10808                        .HasDefaultValueSql("now()");
 10809
 10810                    b.HasKey("Id")
 10811                        .HasName("pk_scope");
 10812
 10813                    b.HasIndex("Name")
 10814                        .IsUnique()
 10815                        .HasDatabaseName("ix_scope_name");
 10816
 10817                    b.HasIndex("PublicId")
 10818                        .IsUnique()
 10819                        .HasDatabaseName("ix_scope_public_id");
 10820
 10821                    b.ToTable("scope", "heimdall");
 20822                });
 823
 10824            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 10825                {
 10826                    b.Property<long>("ScopeId")
 10827                        .HasColumnType("bigint")
 10828                        .HasColumnName("scope_id");
 10829
 10830                    b.Property<long>("PersonId")
 10831                        .HasColumnType("bigint")
 10832                        .HasColumnName("person_id");
 10833
 10834                    b.HasKey("ScopeId", "PersonId")
 10835                        .HasName("pk_scope_owner");
 10836
 10837                    b.HasIndex("PersonId")
 10838                        .HasDatabaseName("ix_scope_owner_person_id");
 10839
 10840                    b.ToTable("scope_owner", "heimdall");
 20841                });
 842
 10843            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 10844                {
 10845                    b.Property<long>("Id")
 10846                        .ValueGeneratedOnAdd()
 10847                        .HasColumnType("bigint")
 10848                        .HasColumnName("id")
 10849                        .HasColumnOrder(1);
 10850
 10851                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10852
 10853                    b.Property<DateTime>("CreatedAt")
 10854                        .ValueGeneratedOnAdd()
 10855                        .HasColumnType("timestamp with time zone")
 10856                        .HasColumnName("created_at")
 10857                        .HasDefaultValueSql("now()");
 10858
 10859                    b.Property<string>("Description")
 10860                        .HasMaxLength(500)
 10861                        .HasColumnType("character varying(500)")
 10862                        .HasColumnName("description");
 10863
 10864                    b.Property<bool>("IncludeAsJwtClaim")
 10865                        .ValueGeneratedOnAdd()
 10866                        .HasColumnType("boolean")
 10867                        .HasDefaultValue(false)
 10868                        .HasColumnName("include_as_jwt_claim");
 10869
 10870                    b.Property<bool>("IsDeleted")
 10871                        .ValueGeneratedOnAdd()
 10872                        .HasColumnType("boolean")
 10873                        .HasDefaultValue(false)
 10874                        .HasColumnName("is_deleted");
 10875
 10876                    b.Property<string>("Name")
 10877                        .IsRequired()
 10878                        .HasMaxLength(200)
 10879                        .HasColumnType("character varying(200)")
 10880                        .HasColumnName("name");
 10881
 10882                    b.Property<Guid>("PublicId")
 10883                        .HasColumnType("uuid")
 10884                        .HasColumnName("public_id");
 10885
 10886                    b.Property<long>("ScopeId")
 10887                        .HasColumnType("bigint")
 10888                        .HasColumnName("scope_id");
 10889
 10890                    b.Property<DateTime>("UpdatedAt")
 10891                        .ValueGeneratedOnAdd()
 10892                        .HasColumnType("timestamp with time zone")
 10893                        .HasColumnName("updated_at")
 10894                        .HasDefaultValueSql("now()");
 10895
 10896                    b.HasKey("Id")
 10897                        .HasName("pk_scope_permission");
 10898
 10899                    b.HasIndex("PublicId")
 10900                        .IsUnique()
 10901                        .HasDatabaseName("ix_scope_permission_public_id");
 10902
 10903                    b.HasIndex("ScopeId")
 10904                        .HasDatabaseName("ix_scope_permission_scope_id");
 10905
 10906                    b.ToTable("scope_permission", "heimdall");
 20907                });
 908
 10909            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 10910                {
 10911                    b.Property<long>("ScopeId")
 10912                        .HasColumnType("bigint")
 10913                        .HasColumnName("scope_id");
 10914
 10915                    b.Property<long>("PersonId")
 10916                        .HasColumnType("bigint")
 10917                        .HasColumnName("person_id");
 10918
 10919                    b.HasKey("ScopeId", "PersonId")
 10920                        .HasName("pk_scope_user");
 10921
 10922                    b.HasIndex("PersonId")
 10923                        .IsUnique()
 10924                        .HasDatabaseName("ix_scope_user_person_id");
 10925
 10926                    b.ToTable("scope_user", "heimdall");
 20927                });
 928
 10929            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 10930                {
 10931                    b.Property<long>("Id")
 10932                        .ValueGeneratedOnAdd()
 10933                        .HasColumnType("bigint")
 10934                        .HasColumnName("id")
 10935                        .HasColumnOrder(1);
 10936
 10937                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10938
 10939                    b.Property<bool>("AppEnabled")
 10940                        .ValueGeneratedOnAdd()
 10941                        .HasColumnType("boolean")
 10942                        .HasDefaultValue(false)
 10943                        .HasColumnName("app_enabled");
 10944
 10945                    b.Property<int>("ChallengeAttempts")
 10946                        .ValueGeneratedOnAdd()
 10947                        .HasColumnType("integer")
 10948                        .HasDefaultValue(0)
 10949                        .HasColumnName("challenge_attempts");
 10950
 10951                    b.Property<Guid?>("ChallengeId")
 10952                        .HasColumnType("uuid")
 10953                        .HasColumnName("challenge_id");
 10954
 10955                    b.Property<DateTime>("CreatedAt")
 10956                        .ValueGeneratedOnAdd()
 10957                        .HasColumnType("timestamp with time zone")
 10958                        .HasColumnName("created_at")
 10959                        .HasDefaultValueSql("now()");
 10960
 10961                    b.Property<int>("EmailCodeReissueCount")
 10962                        .ValueGeneratedOnAdd()
 10963                        .HasColumnType("integer")
 10964                        .HasDefaultValue(0)
 10965                        .HasColumnName("email_code_reissue_count");
 10966
 10967                    b.Property<bool>("EmailEnabled")
 10968                        .ValueGeneratedOnAdd()
 10969                        .HasColumnType("boolean")
 10970                        .HasDefaultValue(false)
 10971                        .HasColumnName("email_enabled");
 10972
 10973                    b.Property<bool>("IsActive")
 10974                        .ValueGeneratedOnAdd()
 10975                        .HasColumnType("boolean")
 10976                        .HasDefaultValue(false)
 10977                        .HasColumnName("is_active");
 10978
 10979                    b.Property<long?>("LastTotpTimeStepUsed")
 10980                        .HasColumnType("bigint")
 10981                        .HasColumnName("last_totp_time_step_used");
 10982
 10983                    b.Property<long>("PersonId")
 10984                        .HasColumnType("bigint")
 10985                        .HasColumnName("person_id");
 10986
 10987                    b.Property<byte[]>("TotpSecretEncrypted")
 10988                        .HasColumnType("bytea")
 10989                        .HasColumnName("totp_secret_encrypted");
 10990
 10991                    b.Property<DateTime>("UpdatedAt")
 10992                        .ValueGeneratedOnAdd()
 10993                        .HasColumnType("timestamp with time zone")
 10994                        .HasColumnName("updated_at")
 10995                        .HasDefaultValueSql("now()");
 10996
 10997                    b.HasKey("Id")
 10998                        .HasName("pk_two_factor_auth");
 10999
 101000                    b.HasIndex("PersonId")
 101001                        .IsUnique()
 101002                        .HasDatabaseName("ix_two_factor_auth_person_id");
 101003
 101004                    b.ToTable("two_factor_auth", "heimdall");
 201005                });
 1006
 101007            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 101008                {
 101009                    b.Property<long>("Id")
 101010                        .ValueGeneratedOnAdd()
 101011                        .HasColumnType("bigint")
 101012                        .HasColumnName("id")
 101013                        .HasColumnOrder(1);
 101014
 101015                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 101016
 101017                    b.Property<byte[]>("CodeHash")
 101018                        .IsRequired()
 101019                        .HasColumnType("bytea")
 101020                        .HasColumnName("code_hash");
 101021
 101022                    b.Property<DateTime>("CreatedAt")
 101023                        .ValueGeneratedOnAdd()
 101024                        .HasColumnType("timestamp with time zone")
 101025                        .HasColumnName("created_at")
 101026                        .HasDefaultValueSql("now()");
 101027
 101028                    b.Property<DateTime>("ExpiresAt")
 101029                        .HasColumnType("timestamp with time zone")
 101030                        .HasColumnName("expires_at");
 101031
 101032                    b.Property<int>("FailedAttempts")
 101033                        .HasColumnType("integer")
 101034                        .HasColumnName("failed_attempts");
 101035
 101036                    b.Property<byte[]>("Salt")
 101037                        .IsRequired()
 101038                        .HasColumnType("bytea")
 101039                        .HasColumnName("salt");
 101040
 101041                    b.Property<long>("TwoFactorAuthId")
 101042                        .HasColumnType("bigint")
 101043                        .HasColumnName("two_factor_auth_id");
 101044
 101045                    b.Property<bool>("Used")
 101046                        .ValueGeneratedOnAdd()
 101047                        .HasColumnType("boolean")
 101048                        .HasDefaultValue(false)
 101049                        .HasColumnName("used");
 101050
 101051                    b.HasKey("Id")
 101052                        .HasName("pk_two_factor_email_code");
 101053
 101054                    b.HasIndex("TwoFactorAuthId")
 101055                        .HasDatabaseName("ix_two_factor_email_code_two_factor_auth_id");
 101056
 101057                    b.ToTable("two_factor_email_code", "heimdall");
 201058                });
 1059
 101060            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 101061                {
 101062                    b.Property<long>("Id")
 101063                        .ValueGeneratedOnAdd()
 101064                        .HasColumnType("bigint")
 101065                        .HasColumnName("id")
 101066                        .HasColumnOrder(1);
 101067
 101068                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 101069
 101070                    b.Property<byte[]>("CodeHash")
 101071                        .IsRequired()
 101072                        .HasColumnType("bytea")
 101073                        .HasColumnName("code_hash");
 101074
 101075                    b.Property<DateTime>("CreatedAt")
 101076                        .ValueGeneratedOnAdd()
 101077                        .HasColumnType("timestamp with time zone")
 101078                        .HasColumnName("created_at")
 101079                        .HasDefaultValueSql("now()");
 101080
 101081                    b.Property<long>("TwoFactorAuthId")
 101082                        .HasColumnType("bigint")
 101083                        .HasColumnName("two_factor_auth_id");
 101084
 101085                    b.Property<bool>("Used")
 101086                        .ValueGeneratedOnAdd()
 101087                        .HasColumnType("boolean")
 101088                        .HasDefaultValue(false)
 101089                        .HasColumnName("used");
 101090
 101091                    b.Property<DateTime?>("UsedAt")
 101092                        .HasColumnType("timestamp with time zone")
 101093                        .HasColumnName("used_at");
 101094
 101095                    b.HasKey("Id")
 101096                        .HasName("pk_two_factor_recovery_code");
 101097
 101098                    b.HasIndex("TwoFactorAuthId")
 101099                        .HasDatabaseName("ix_two_factor_recovery_code_two_factor_auth_id");
 101100
 101101                    b.ToTable("two_factor_recovery_code", "heimdall");
 201102                });
 1103
 101104            modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b =>
 101105                {
 101106                    b.Property<int>("Id")
 101107                        .ValueGeneratedOnAdd()
 101108                        .HasColumnType("integer")
 101109                        .HasColumnName("id");
 101110
 101111                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 101112
 101113                    b.Property<string>("FriendlyName")
 101114                        .HasColumnType("text")
 101115                        .HasColumnName("friendly_name");
 101116
 101117                    b.Property<string>("Xml")
 101118                        .HasColumnType("text")
 101119                        .HasColumnName("xml");
 101120
 101121                    b.HasKey("Id")
 101122                        .HasName("pk_data_protection_keys");
 101123
 101124                    b.ToTable("data_protection_keys", "heimdall");
 201125                });
 1126
 101127            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 101128                {
 101129                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Owner")
 101130                        .WithMany("OwnedApplications")
 101131                        .HasForeignKey("OwnerId")
 101132                        .OnDelete(DeleteBehavior.Cascade)
 101133                        .IsRequired()
 101134                        .HasConstraintName("fk_application_person_owner_id");
 101135
 101136                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101137                        .WithMany("Applications")
 101138                        .HasForeignKey("ScopeId")
 101139                        .OnDelete(DeleteBehavior.Cascade)
 101140                        .IsRequired()
 101141                        .HasConstraintName("fk_application_scope_scope_id");
 101142
 101143                    b.Navigation("Owner");
 101144
 101145                    b.Navigation("Scope");
 201146                });
 1147
 101148            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ApplicationCredential", b =>
 101149                {
 101150                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Application", "Application")
 101151                        .WithMany("Credentials")
 101152                        .HasForeignKey("ApplicationId")
 101153                        .OnDelete(DeleteBehavior.Cascade)
 101154                        .IsRequired()
 101155                        .HasConstraintName("fk_application_credential_application_application_id");
 101156
 101157                    b.Navigation("Application");
 201158                });
 1159
 101160            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 101161                {
 101162                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101163                        .WithMany("EmailVerificationTokens")
 101164                        .HasForeignKey("PersonId")
 101165                        .OnDelete(DeleteBehavior.Cascade)
 101166                        .IsRequired()
 101167                        .HasConstraintName("fk_email_verification_token_person_person_id");
 101168
 101169                    b.Navigation("Person");
 201170                });
 1171
 101172            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 101173                {
 101174                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101175                        .WithMany("GoogleUsers")
 101176                        .HasForeignKey("ScopeId")
 101177                        .OnDelete(DeleteBehavior.Cascade)
 101178                        .IsRequired()
 101179                        .HasConstraintName("fk_google_user_scope_scope_id");
 101180
 101181                    b.Navigation("Scope");
 201182                });
 1183
 101184            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 101185                {
 101186                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101187                        .WithMany("PasswordResetTokens")
 101188                        .HasForeignKey("PersonId")
 101189                        .OnDelete(DeleteBehavior.Cascade)
 101190                        .IsRequired()
 101191                        .HasConstraintName("fk_password_reset_token_person_person_id");
 101192
 101193                    b.Navigation("Person");
 201194                });
 1195
 101196            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PendingRegistration", b =>
 101197                {
 101198                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101199                        .WithMany()
 101200                        .HasForeignKey("ScopeId")
 101201                        .OnDelete(DeleteBehavior.Cascade)
 101202                        .IsRequired()
 101203                        .HasConstraintName("fk_pending_registration_scope_scope_id");
 101204
 101205                    b.Navigation("Scope");
 201206                });
 1207
 101208            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 101209                {
 101210                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Role", "Role")
 101211                        .WithMany("Persons")
 101212                        .HasForeignKey("RoleId")
 101213                        .OnDelete(DeleteBehavior.Restrict)
 101214                        .IsRequired()
 101215                        .HasConstraintName("fk_person_roles_role_id");
 101216
 101217                    b.Navigation("Role");
 201218                });
 1219
 101220            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 101221                {
 101222                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101223                        .WithMany("ScopeOwnerships")
 101224                        .HasForeignKey("PersonId")
 101225                        .OnDelete(DeleteBehavior.Cascade)
 101226                        .IsRequired()
 101227                        .HasConstraintName("fk_scope_owner_person_person_id");
 101228
 101229                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101230                        .WithMany("Owners")
 101231                        .HasForeignKey("ScopeId")
 101232                        .OnDelete(DeleteBehavior.Cascade)
 101233                        .IsRequired()
 101234                        .HasConstraintName("fk_scope_owner_scope_scope_id");
 101235
 101236                    b.Navigation("Person");
 101237
 101238                    b.Navigation("Scope");
 201239                });
 1240
 101241            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 101242                {
 101243                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101244                        .WithMany("ScopePermissions")
 101245                        .HasForeignKey("ScopeId")
 101246                        .OnDelete(DeleteBehavior.Cascade)
 101247                        .IsRequired()
 101248                        .HasConstraintName("fk_scope_permission_scope_scope_id");
 101249
 101250                    b.Navigation("Scope");
 201251                });
 1252
 101253            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 101254                {
 101255                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101256                        .WithOne("ScopeMembership")
 101257                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.ScopeUser", "PersonId")
 101258                        .OnDelete(DeleteBehavior.Cascade)
 101259                        .IsRequired()
 101260                        .HasConstraintName("fk_scope_user_person_person_id");
 101261
 101262                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101263                        .WithMany("Users")
 101264                        .HasForeignKey("ScopeId")
 101265                        .OnDelete(DeleteBehavior.Cascade)
 101266                        .IsRequired()
 101267                        .HasConstraintName("fk_scope_user_scope_scope_id");
 101268
 101269                    b.Navigation("Person");
 101270
 101271                    b.Navigation("Scope");
 201272                });
 1273
 101274            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 101275                {
 101276                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101277                        .WithOne("TwoFactorAuth")
 101278                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "PersonId")
 101279                        .OnDelete(DeleteBehavior.Cascade)
 101280                        .IsRequired()
 101281                        .HasConstraintName("fk_two_factor_auth_person_person_id");
 101282
 101283                    b.Navigation("Person");
 201284                });
 1285
 101286            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 101287                {
 101288                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 101289                        .WithMany("EmailCodes")
 101290                        .HasForeignKey("TwoFactorAuthId")
 101291                        .OnDelete(DeleteBehavior.Cascade)
 101292                        .IsRequired()
 101293                        .HasConstraintName("fk_two_factor_email_code_two_factor_auth_two_factor_auth_id");
 101294
 101295                    b.Navigation("TwoFactorAuth");
 201296                });
 1297
 101298            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 101299                {
 101300                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 101301                        .WithMany("RecoveryCodes")
 101302                        .HasForeignKey("TwoFactorAuthId")
 101303                        .OnDelete(DeleteBehavior.Cascade)
 101304                        .IsRequired()
 101305                        .HasConstraintName("fk_two_factor_recovery_code_two_factor_auth_two_factor_auth_id");
 101306
 101307                    b.Navigation("TwoFactorAuth");
 201308                });
 1309
 101310            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 101311                {
 101312                    b.Navigation("Credentials");
 201313                });
 1314
 101315            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 101316                {
 101317                    b.Navigation("EmailVerificationTokens");
 101318
 101319                    b.Navigation("OwnedApplications");
 101320
 101321                    b.Navigation("PasswordResetTokens");
 101322
 101323                    b.Navigation("ScopeMembership");
 101324
 101325                    b.Navigation("ScopeOwnerships");
 101326
 101327                    b.Navigation("TwoFactorAuth");
 201328                });
 1329
 101330            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 101331                {
 101332                    b.Navigation("Persons");
 201333                });
 1334
 101335            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 101336                {
 101337                    b.Navigation("Applications");
 101338
 101339                    b.Navigation("GoogleUsers");
 101340
 101341                    b.Navigation("Owners");
 101342
 101343                    b.Navigation("ScopePermissions");
 101344
 101345                    b.Navigation("Users");
 201346                });
 1347
 101348            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 101349                {
 101350                    b.Navigation("EmailCodes");
 101351
 101352                    b.Navigation("RecoveryCodes");
 201353                });
 1354#pragma warning restore 612, 618
 101355        }
 1356    }
 1357}