< Summary - Heimdall API

Line coverage
100%
Covered lines: 1682
Uncovered lines: 0
Coverable lines: 1682
Total lines: 1794
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/20261017172209_AddScopeOwnerInvitation.cs

#LineLine coverage
 1using System;
 2using Microsoft.EntityFrameworkCore.Migrations;
 3using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
 4
 5#nullable disable
 6
 7namespace ArturRios.Heimdall.Data.Migrations
 8{
 9    /// <summary>
 10    ///     Adds <c>heimdall.scope_owner_invitation</c> (UC-21, FR-SC-14): an invitation to co-own a scope,
 11    ///     answered by the invitee, and puts its <c>public_id</c> in the trigger family that guards the
 12    ///     other trusted tables (#199).
 13    /// </summary>
 14    /// <remarks>
 15    ///     <para>
 16    ///         Starts empty. The partial unique index on <c>(scope_id, invitee_person_id)</c> where
 17    ///         <c>ended_at</c> is null holds one unended invitation per pair; the two check constraints
 18    ///         keep <c>outcome</c> to 1–4 and to ended rows. Deleting the scope or the invitee deletes the
 19    ///         invitation; deleting the inviter sets <c>invited_by_person_id</c> to null.
 20    ///     </para>
 21    ///     <para>
 22    ///         <c>public_id_is_unused()</c> is replaced by the same function with one more branch, so a new
 23    ///         row of any guarded table may not take an invitation's id and an invitation may not take
 24    ///         theirs; the two row-level triggers bind it and <c>public_id_is_immutable()</c> to the new
 25    ///         table. Down drops the triggers, restores the function as <c>ProtectIdentityPublicIds</c>
 26    ///         left it, and drops the table.
 27    ///     </para>
 28    /// </remarks>
 29    public partial class AddScopeOwnerInvitation : Migration
 30    {
 31        /// <inheritdoc />
 32        protected override void Up(MigrationBuilder migrationBuilder)
 33        {
 1934            migrationBuilder.CreateTable(
 1935                name: "scope_owner_invitation",
 1936                schema: "heimdall",
 1937                columns: table => new
 1938                {
 1939                    id = table.Column<long>(type: "bigint", nullable: false)
 1940                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultCol
 1941                    public_id = table.Column<Guid>(type: "uuid", nullable: false),
 1942                    scope_id = table.Column<long>(type: "bigint", nullable: false),
 1943                    invitee_person_id = table.Column<long>(type: "bigint", nullable: false),
 1944                    invited_by_person_id = table.Column<long>(type: "bigint", nullable: true),
 1945                    created_at = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, defaultValueS
 1946                    expires_at = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
 1947                    ended_at = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
 1948                    outcome = table.Column<short>(type: "smallint", nullable: true)
 1949                },
 1950                constraints: table =>
 1951                {
 1952                    table.PrimaryKey("pk_scope_owner_invitation", x => x.id);
 1953                    table.CheckConstraint("ck_scope_owner_invitation_outcome_ends_it", "outcome IS NULL OR ended_at IS N
 1954                    table.CheckConstraint("ck_scope_owner_invitation_outcome_known", "outcome IS NULL OR outcome BETWEEN
 1955                    table.ForeignKey(
 1956                        name: "fk_scope_owner_invitation_person_invited_by_person_id",
 1957                        column: x => x.invited_by_person_id,
 1958                        principalSchema: "heimdall",
 1959                        principalTable: "person",
 1960                        principalColumn: "id",
 1961                        onDelete: ReferentialAction.SetNull);
 1962                    table.ForeignKey(
 1963                        name: "fk_scope_owner_invitation_person_invitee_person_id",
 1964                        column: x => x.invitee_person_id,
 1965                        principalSchema: "heimdall",
 1966                        principalTable: "person",
 1967                        principalColumn: "id",
 1968                        onDelete: ReferentialAction.Cascade);
 1969                    table.ForeignKey(
 1970                        name: "fk_scope_owner_invitation_scope_scope_id",
 1971                        column: x => x.scope_id,
 1972                        principalSchema: "heimdall",
 1973                        principalTable: "scope",
 1974                        principalColumn: "id",
 1975                        onDelete: ReferentialAction.Cascade);
 3876                });
 77
 1978            migrationBuilder.CreateIndex(
 1979                name: "ix_scope_owner_invitation_invited_by_person_id",
 1980                schema: "heimdall",
 1981                table: "scope_owner_invitation",
 1982                column: "invited_by_person_id");
 83
 1984            migrationBuilder.CreateIndex(
 1985                name: "ix_scope_owner_invitation_invitee_person_id",
 1986                schema: "heimdall",
 1987                table: "scope_owner_invitation",
 1988                column: "invitee_person_id");
 89
 1990            migrationBuilder.CreateIndex(
 1991                name: "ix_scope_owner_invitation_public_id",
 1992                schema: "heimdall",
 1993                table: "scope_owner_invitation",
 1994                column: "public_id",
 1995                unique: true);
 96
 1997            migrationBuilder.CreateIndex(
 1998                name: "ix_scope_owner_invitation_scope_id_invitee_person_id",
 1999                schema: "heimdall",
 19100                table: "scope_owner_invitation",
 19101                columns: new[] { "scope_id", "invitee_person_id" },
 19102                unique: true,
 19103                filter: "ended_at IS NULL");
 104
 19105            migrationBuilder.Sql(
 19106                """
 19107                CREATE OR REPLACE FUNCTION heimdall.public_id_is_unused()
 19108                RETURNS TRIGGER AS $$
 19109                BEGIN
 19110                    -- A new row may not take an id a row of another guarded table holds, soft-deleted
 19111                    -- or not, nor one a hard delete tombstoned: the target rule clears a tombstoned id
 19112                    -- that no identity holds, so any row on it would have its entries cleared. Its own
 19113                    -- table is covered by its unique index on public_id.
 19114                    IF EXISTS (
 19115                        SELECT 1 FROM heimdall.person x
 19116                        WHERE TG_TABLE_NAME <> 'person' AND x.public_id = NEW.public_id
 19117                        UNION ALL
 19118                        SELECT 1 FROM heimdall.google_user x
 19119                        WHERE TG_TABLE_NAME <> 'google_user' AND x.public_id = NEW.public_id
 19120                        UNION ALL
 19121                        SELECT 1 FROM heimdall.scope x
 19122                        WHERE TG_TABLE_NAME <> 'scope' AND x.public_id = NEW.public_id
 19123                        UNION ALL
 19124                        SELECT 1 FROM heimdall.application x
 19125                        WHERE TG_TABLE_NAME <> 'application' AND x.public_id = NEW.public_id
 19126                        UNION ALL
 19127                        SELECT 1 FROM heimdall.application_credential x
 19128                        WHERE TG_TABLE_NAME <> 'application_credential' AND x.public_id = NEW.public_id
 19129                        UNION ALL
 19130                        SELECT 1 FROM heimdall.scope_permission x
 19131                        WHERE TG_TABLE_NAME <> 'scope_permission' AND x.public_id = NEW.public_id
 19132                        UNION ALL
 19133                        SELECT 1 FROM heimdall.role x
 19134                        WHERE TG_TABLE_NAME <> 'role' AND x.public_id = NEW.public_id
 19135                        UNION ALL
 19136                        SELECT 1 FROM heimdall.pending_registration x
 19137                        WHERE TG_TABLE_NAME <> 'pending_registration' AND x.public_id = NEW.public_id
 19138                        UNION ALL
 19139                        SELECT 1 FROM heimdall.scope_owner_invitation x
 19140                        WHERE TG_TABLE_NAME <> 'scope_owner_invitation' AND x.public_id = NEW.public_id
 19141                        UNION ALL
 19142                        SELECT 1 FROM heimdall.erased_subject e WHERE e.public_id = NEW.public_id
 19143                    ) THEN
 19144                        RAISE EXCEPTION 'heimdall.% public_id is already used by another entity', TG_TABLE_NAME
 19145                            USING ERRCODE = 'restrict_violation';
 19146                    END IF;
 19147
 19148                    -- A person or Google User may not take an id the audit trail names either, or a
 19149                    -- hard-deleted entity's entries would become clearable through it. Only these two
 19150                    -- tables: the target rule reads only them, and the tombstones, to tell a person's
 19151                    -- id. A genuine new identity's own entries are written after its row.
 19152                    IF TG_TABLE_NAME IN ('person', 'google_user') AND EXISTS (
 19153                        SELECT 1 FROM heimdall.audit_log a WHERE a.target_id = NEW.public_id
 19154                    ) THEN
 19155                        RAISE EXCEPTION 'heimdall.% public_id is named by an audit entry', TG_TABLE_NAME
 19156                            USING ERRCODE = 'restrict_violation';
 19157                    END IF;
 19158
 19159                    RETURN NEW;
 19160                END;
 19161                $$ LANGUAGE plpgsql;
 19162                """);
 163
 19164            migrationBuilder.Sql(
 19165                """
 19166                CREATE TRIGGER scope_owner_invitation_public_id_is_immutable
 19167                BEFORE UPDATE ON heimdall.scope_owner_invitation
 19168                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_immutable();
 19169
 19170                CREATE TRIGGER scope_owner_invitation_public_id_is_unused
 19171                BEFORE INSERT ON heimdall.scope_owner_invitation
 19172                FOR EACH ROW EXECUTE FUNCTION heimdall.public_id_is_unused();
 19173                """);
 19174        }
 175
 176        /// <inheritdoc />
 177        protected override void Down(MigrationBuilder migrationBuilder)
 178        {
 1179            migrationBuilder.Sql(
 1180                """
 1181                DROP TRIGGER IF EXISTS scope_owner_invitation_public_id_is_unused ON heimdall.scope_owner_invitation;
 1182                DROP TRIGGER IF EXISTS scope_owner_invitation_public_id_is_immutable ON heimdall.scope_owner_invitation;
 1183                """);
 184
 1185            migrationBuilder.Sql(
 1186                """
 1187                CREATE OR REPLACE FUNCTION heimdall.public_id_is_unused()
 1188                RETURNS TRIGGER AS $$
 1189                BEGIN
 1190                    IF EXISTS (
 1191                        SELECT 1 FROM heimdall.person x
 1192                        WHERE TG_TABLE_NAME <> 'person' AND x.public_id = NEW.public_id
 1193                        UNION ALL
 1194                        SELECT 1 FROM heimdall.google_user x
 1195                        WHERE TG_TABLE_NAME <> 'google_user' AND x.public_id = NEW.public_id
 1196                        UNION ALL
 1197                        SELECT 1 FROM heimdall.scope x
 1198                        WHERE TG_TABLE_NAME <> 'scope' AND x.public_id = NEW.public_id
 1199                        UNION ALL
 1200                        SELECT 1 FROM heimdall.application x
 1201                        WHERE TG_TABLE_NAME <> 'application' AND x.public_id = NEW.public_id
 1202                        UNION ALL
 1203                        SELECT 1 FROM heimdall.application_credential x
 1204                        WHERE TG_TABLE_NAME <> 'application_credential' AND x.public_id = NEW.public_id
 1205                        UNION ALL
 1206                        SELECT 1 FROM heimdall.scope_permission x
 1207                        WHERE TG_TABLE_NAME <> 'scope_permission' AND x.public_id = NEW.public_id
 1208                        UNION ALL
 1209                        SELECT 1 FROM heimdall.role x
 1210                        WHERE TG_TABLE_NAME <> 'role' AND x.public_id = NEW.public_id
 1211                        UNION ALL
 1212                        SELECT 1 FROM heimdall.pending_registration x
 1213                        WHERE TG_TABLE_NAME <> 'pending_registration' AND x.public_id = NEW.public_id
 1214                        UNION ALL
 1215                        SELECT 1 FROM heimdall.erased_subject e WHERE e.public_id = NEW.public_id
 1216                    ) THEN
 1217                        RAISE EXCEPTION 'heimdall.% public_id is already used by another entity', TG_TABLE_NAME
 1218                            USING ERRCODE = 'restrict_violation';
 1219                    END IF;
 1220
 1221                    IF TG_TABLE_NAME IN ('person', 'google_user') AND EXISTS (
 1222                        SELECT 1 FROM heimdall.audit_log a WHERE a.target_id = NEW.public_id
 1223                    ) THEN
 1224                        RAISE EXCEPTION 'heimdall.% public_id is named by an audit entry', TG_TABLE_NAME
 1225                            USING ERRCODE = 'restrict_violation';
 1226                    END IF;
 1227
 1228                    RETURN NEW;
 1229                END;
 1230                $$ LANGUAGE plpgsql;
 1231                """);
 232
 1233            migrationBuilder.DropTable(
 1234                name: "scope_owner_invitation",
 1235                schema: "heimdall");
 1236        }
 237    }
 238}

/home/ci/agent/workspace/heimdall-api-docs_main/app/src/Infrastructure/ArturRios.Heimdall.Data/Migrations/20261017172209_AddScopeOwnerInvitation.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("20261017172209_AddScopeOwnerInvitation")]
 16    partial class AddScopeOwnerInvitation
 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.AttemptNoticeBudget", 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>("AddressHash")
 10159                        .IsRequired()
 10160                        .HasMaxLength(64)
 10161                        .HasColumnType("character varying(64)")
 10162                        .HasColumnName("address_hash");
 10163
 10164                    b.Property<int>("NoticesSent")
 10165                        .HasColumnType("integer")
 10166                        .HasColumnName("notices_sent");
 10167
 10168                    b.Property<DateTime>("WindowEndsAt")
 10169                        .HasColumnType("timestamp with time zone")
 10170                        .HasColumnName("window_ends_at");
 10171
 10172                    b.HasKey("Id")
 10173                        .HasName("pk_attempt_notice_budget");
 10174
 10175                    b.HasIndex("AddressHash")
 10176                        .IsUnique()
 10177                        .HasDatabaseName("ix_attempt_notice_budget_address_hash");
 10178
 10179                    b.HasIndex("WindowEndsAt")
 10180                        .HasDatabaseName("ix_attempt_notice_budget_window_ends_at");
 10181
 10182                    b.ToTable("attempt_notice_budget", "heimdall");
 20183                });
 184
 10185            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.AuditLog", b =>
 10186                {
 10187                    b.Property<long>("Id")
 10188                        .ValueGeneratedOnAdd()
 10189                        .HasColumnType("bigint")
 10190                        .HasColumnName("id")
 10191                        .HasColumnOrder(1);
 10192
 10193                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10194
 10195                    b.Property<string>("Action")
 10196                        .IsRequired()
 10197                        .HasMaxLength(200)
 10198                        .HasColumnType("character varying(200)")
 10199                        .HasColumnName("action");
 10200
 10201                    b.Property<Guid?>("ActorPersonId")
 10202                        .HasColumnType("uuid")
 10203                        .HasColumnName("actor_person_id");
 10204
 10205                    b.Property<int?>("ActorRole")
 10206                        .HasColumnType("integer")
 10207                        .HasColumnName("actor_role");
 10208
 10209                    b.Property<DateTime>("CreatedAt")
 10210                        .ValueGeneratedOnAdd()
 10211                        .HasColumnType("timestamp with time zone")
 10212                        .HasColumnName("created_at")
 10213                        .HasDefaultValueSql("now()");
 10214
 10215                    b.Property<string>("FailureReason")
 10216                        .HasMaxLength(500)
 10217                        .HasColumnType("character varying(500)")
 10218                        .HasColumnName("failure_reason");
 10219
 10220                    b.Property<Guid>("PublicId")
 10221                        .HasColumnType("uuid")
 10222                        .HasColumnName("public_id");
 10223
 10224                    b.Property<bool>("Succeeded")
 10225                        .HasColumnType("boolean")
 10226                        .HasColumnName("succeeded");
 10227
 10228                    b.Property<Guid?>("TargetId")
 10229                        .HasColumnType("uuid")
 10230                        .HasColumnName("target_id");
 10231
 10232                    b.HasKey("Id")
 10233                        .HasName("pk_audit_log");
 10234
 10235                    b.HasIndex("ActorPersonId")
 10236                        .HasDatabaseName("ix_audit_log_actor_person_id");
 10237
 10238                    b.HasIndex("CreatedAt")
 10239                        .HasDatabaseName("ix_audit_log_created_at");
 10240
 10241                    b.HasIndex("PublicId")
 10242                        .IsUnique()
 10243                        .HasDatabaseName("ix_audit_log_public_id");
 10244
 10245                    b.HasIndex("TargetId")
 10246                        .HasDatabaseName("ix_audit_log_target_id");
 10247
 10248                    b.ToTable("audit_log", "heimdall");
 20249                });
 250
 10251            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 10252                {
 10253                    b.Property<long>("Id")
 10254                        .ValueGeneratedOnAdd()
 10255                        .HasColumnType("bigint")
 10256                        .HasColumnName("id")
 10257                        .HasColumnOrder(1);
 10258
 10259                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10260
 10261                    b.Property<DateTime>("ExpiresAt")
 10262                        .HasColumnType("timestamp with time zone")
 10263                        .HasColumnName("expires_at");
 10264
 10265                    b.Property<long>("PersonId")
 10266                        .HasColumnType("bigint")
 10267                        .HasColumnName("person_id");
 10268
 10269                    b.Property<string>("TokenHash")
 10270                        .IsRequired()
 10271                        .HasMaxLength(64)
 10272                        .HasColumnType("character varying(64)")
 10273                        .HasColumnName("token_hash");
 10274
 10275                    b.Property<bool>("Used")
 10276                        .ValueGeneratedOnAdd()
 10277                        .HasColumnType("boolean")
 10278                        .HasDefaultValue(false)
 10279                        .HasColumnName("used");
 10280
 10281                    b.HasKey("Id")
 10282                        .HasName("pk_email_verification_token");
 10283
 10284                    b.HasIndex("PersonId")
 10285                        .HasDatabaseName("ix_email_verification_token_person_id");
 10286
 10287                    b.HasIndex("TokenHash")
 10288                        .IsUnique()
 10289                        .HasDatabaseName("ix_email_verification_token_token_hash");
 10290
 10291                    b.ToTable("email_verification_token", "heimdall");
 20292                });
 293
 10294            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ErasedSubject", b =>
 10295                {
 10296                    b.Property<Guid>("Id")
 10297                        .HasColumnType("uuid")
 10298                        .HasColumnName("public_id")
 10299                        .HasColumnOrder(1);
 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<int>("Kind")
 10308                        .HasColumnType("integer")
 10309                        .HasColumnName("kind");
 10310
 10311                    b.HasKey("Id")
 10312                        .HasName("pk_erased_subject");
 10313
 10314                    b.HasIndex("CreatedAt")
 10315                        .HasDatabaseName("ix_erased_subject_created_at");
 10316
 10317                    b.ToTable("erased_subject", "heimdall");
 20318                });
 319
 10320            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleIdTokenUse", b =>
 10321                {
 10322                    b.Property<string>("Id")
 10323                        .HasMaxLength(64)
 10324                        .HasColumnType("character varying(64)")
 10325                        .HasColumnName("token_hash")
 10326                        .HasColumnOrder(1);
 10327
 10328                    b.Property<DateTime>("ExpiresAt")
 10329                        .HasColumnType("timestamp with time zone")
 10330                        .HasColumnName("expires_at");
 10331
 10332                    b.HasKey("Id")
 10333                        .HasName("pk_google_id_token_use");
 10334
 10335                    b.HasIndex("ExpiresAt")
 10336                        .HasDatabaseName("ix_google_id_token_use_expires_at");
 10337
 10338                    b.ToTable("google_id_token_use", "heimdall");
 20339                });
 340
 10341            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 10342                {
 10343                    b.Property<long>("Id")
 10344                        .ValueGeneratedOnAdd()
 10345                        .HasColumnType("bigint")
 10346                        .HasColumnName("id")
 10347                        .HasColumnOrder(1);
 10348
 10349                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10350
 10351                    b.Property<DateTime?>("AnonymisedAt")
 10352                        .HasColumnType("timestamp with time zone")
 10353                        .HasColumnName("anonymised_at");
 10354
 10355                    b.Property<DateTime?>("BasisRecordedAt")
 10356                        .HasColumnType("timestamp with time zone")
 10357                        .HasColumnName("basis_recorded_at");
 10358
 10359                    b.Property<DateTime>("CreatedAt")
 10360                        .ValueGeneratedOnAdd()
 10361                        .HasColumnType("timestamp with time zone")
 10362                        .HasColumnName("created_at")
 10363                        .HasDefaultValueSql("now()");
 10364
 10365                    b.Property<DateTime?>("DeletedAt")
 10366                        .HasColumnType("timestamp with time zone")
 10367                        .HasColumnName("deleted_at");
 10368
 10369                    b.Property<int?>("DeletionKind")
 10370                        .HasColumnType("integer")
 10371                        .HasColumnName("deletion_kind");
 10372
 10373                    b.Property<string>("Email")
 10374                        .IsRequired()
 10375                        .HasMaxLength(256)
 10376                        .HasColumnType("character varying(256)")
 10377                        .HasColumnName("email");
 10378
 10379                    b.Property<bool>("EmailVerified")
 10380                        .ValueGeneratedOnAdd()
 10381                        .HasColumnType("boolean")
 10382                        .HasDefaultValue(false)
 10383                        .HasColumnName("email_verified");
 10384
 10385                    b.Property<string>("ErasureBlockedReason")
 10386                        .HasMaxLength(500)
 10387                        .HasColumnType("character varying(500)")
 10388                        .HasColumnName("erasure_blocked_reason");
 10389
 10390                    b.Property<DateTime?>("ErasureDueAt")
 10391                        .HasColumnType("timestamp with time zone")
 10392                        .HasColumnName("erasure_due_at");
 10393
 10394                    b.Property<DateTime?>("ErasureRequestedAt")
 10395                        .HasColumnType("timestamp with time zone")
 10396                        .HasColumnName("erasure_requested_at");
 10397
 10398                    b.Property<string>("GoogleId")
 10399                        .IsRequired()
 10400                        .HasMaxLength(255)
 10401                        .HasColumnType("character varying(255)")
 10402                        .HasColumnName("google_id");
 10403
 10404                    b.Property<bool>("IsDeleted")
 10405                        .ValueGeneratedOnAdd()
 10406                        .HasColumnType("boolean")
 10407                        .HasDefaultValue(false)
 10408                        .HasColumnName("is_deleted");
 10409
 10410                    b.Property<int>("LegalBasis")
 10411                        .ValueGeneratedOnAdd()
 10412                        .HasColumnType("integer")
 10413                        .HasDefaultValue(0)
 10414                        .HasColumnName("legal_basis");
 10415
 10416                    b.Property<string>("Name")
 10417                        .IsRequired()
 10418                        .HasMaxLength(200)
 10419                        .HasColumnType("character varying(200)")
 10420                        .HasColumnName("name");
 10421
 10422                    b.Property<string>("PrivacyNoticeVersion")
 10423                        .HasMaxLength(50)
 10424                        .HasColumnType("character varying(50)")
 10425                        .HasColumnName("privacy_notice_version");
 10426
 10427                    b.Property<DateTime?>("ProcessingRestrictedAt")
 10428                        .HasColumnType("timestamp with time zone")
 10429                        .HasColumnName("processing_restricted_at");
 10430
 10431                    b.Property<string>("ProfilePictureUrl")
 10432                        .HasMaxLength(2048)
 10433                        .HasColumnType("character varying(2048)")
 10434                        .HasColumnName("profile_picture_url");
 10435
 10436                    b.Property<Guid>("PublicId")
 10437                        .HasColumnType("uuid")
 10438                        .HasColumnName("public_id");
 10439
 10440                    b.Property<int?>("RestrictionGround")
 10441                        .HasColumnType("integer")
 10442                        .HasColumnName("restriction_ground");
 10443
 10444                    b.Property<DateTime?>("RestrictionLiftNotifiedAt")
 10445                        .HasColumnType("timestamp with time zone")
 10446                        .HasColumnName("restriction_lift_notified_at");
 10447
 10448                    b.Property<long>("ScopeId")
 10449                        .HasColumnType("bigint")
 10450                        .HasColumnName("scope_id");
 10451
 10452                    b.Property<DateTime>("UpdatedAt")
 10453                        .ValueGeneratedOnAdd()
 10454                        .HasColumnType("timestamp with time zone")
 10455                        .HasColumnName("updated_at")
 10456                        .HasDefaultValueSql("now()");
 10457
 10458                    b.HasKey("Id")
 10459                        .HasName("pk_google_user");
 10460
 10461                    b.HasIndex("DeletedAt")
 10462                        .HasDatabaseName("ix_google_user_deleted_at")
 10463                        .HasFilter("is_deleted = true AND anonymised_at IS NULL");
 10464
 10465                    b.HasIndex("ProcessingRestrictedAt")
 10466                        .HasDatabaseName("ix_google_user_processing_restricted_at")
 10467                        .HasFilter("processing_restricted_at IS NOT NULL");
 10468
 10469                    b.HasIndex("PublicId")
 10470                        .IsUnique()
 10471                        .HasDatabaseName("ix_google_user_public_id");
 10472
 10473                    b.HasIndex("ScopeId", "Email")
 10474                        .IsUnique()
 10475                        .HasDatabaseName("ix_google_user_scope_id_email");
 10476
 10477                    b.HasIndex("ScopeId", "GoogleId")
 10478                        .IsUnique()
 10479                        .HasDatabaseName("ix_google_user_scope_id_google_id");
 10480
 10481                    b.ToTable("google_user", "heimdall");
 20482                });
 483
 10484            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 10485                {
 10486                    b.Property<long>("Id")
 10487                        .ValueGeneratedOnAdd()
 10488                        .HasColumnType("bigint")
 10489                        .HasColumnName("id")
 10490                        .HasColumnOrder(1);
 10491
 10492                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10493
 10494                    b.Property<DateTime>("ExpiresAt")
 10495                        .HasColumnType("timestamp with time zone")
 10496                        .HasColumnName("expires_at");
 10497
 10498                    b.Property<long>("PersonId")
 10499                        .HasColumnType("bigint")
 10500                        .HasColumnName("person_id");
 10501
 10502                    b.Property<string>("TokenHash")
 10503                        .IsRequired()
 10504                        .HasMaxLength(64)
 10505                        .HasColumnType("character varying(64)")
 10506                        .HasColumnName("token_hash");
 10507
 10508                    b.Property<bool>("Used")
 10509                        .ValueGeneratedOnAdd()
 10510                        .HasColumnType("boolean")
 10511                        .HasDefaultValue(false)
 10512                        .HasColumnName("used");
 10513
 10514                    b.HasKey("Id")
 10515                        .HasName("pk_password_reset_token");
 10516
 10517                    b.HasIndex("PersonId")
 10518                        .HasDatabaseName("ix_password_reset_token_person_id");
 10519
 10520                    b.HasIndex("TokenHash")
 10521                        .IsUnique()
 10522                        .HasDatabaseName("ix_password_reset_token_token_hash");
 10523
 10524                    b.ToTable("password_reset_token", "heimdall");
 20525                });
 526
 10527            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PendingRegistration", b =>
 10528                {
 10529                    b.Property<long>("Id")
 10530                        .ValueGeneratedOnAdd()
 10531                        .HasColumnType("bigint")
 10532                        .HasColumnName("id")
 10533                        .HasColumnOrder(1);
 10534
 10535                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10536
 10537                    b.Property<DateTime>("CreatedAt")
 10538                        .ValueGeneratedOnAdd()
 10539                        .HasColumnType("timestamp with time zone")
 10540                        .HasColumnName("created_at")
 10541                        .HasDefaultValueSql("now()");
 10542
 10543                    b.Property<string>("Email")
 10544                        .IsRequired()
 10545                        .HasMaxLength(256)
 10546                        .HasColumnType("character varying(256)")
 10547                        .HasColumnName("email");
 10548
 10549                    b.Property<DateTime>("ExpiresAt")
 10550                        .HasColumnType("timestamp with time zone")
 10551                        .HasColumnName("expires_at");
 10552
 10553                    b.Property<int>("FailedAttempts")
 10554                        .ValueGeneratedOnAdd()
 10555                        .HasColumnType("integer")
 10556                        .HasDefaultValue(0)
 10557                        .HasColumnName("failed_attempts");
 10558
 10559                    b.Property<string>("Name")
 10560                        .IsRequired()
 10561                        .HasMaxLength(200)
 10562                        .HasColumnType("character varying(200)")
 10563                        .HasColumnName("name");
 10564
 10565                    b.Property<byte[]>("PasswordHash")
 10566                        .IsRequired()
 10567                        .HasColumnType("bytea")
 10568                        .HasColumnName("password_hash");
 10569
 10570                    b.Property<Guid>("PublicId")
 10571                        .HasColumnType("uuid")
 10572                        .HasColumnName("public_id");
 10573
 10574                    b.Property<byte[]>("Salt")
 10575                        .IsRequired()
 10576                        .HasColumnType("bytea")
 10577                        .HasColumnName("salt");
 10578
 10579                    b.Property<long>("ScopeId")
 10580                        .HasColumnType("bigint")
 10581                        .HasColumnName("scope_id");
 10582
 10583                    b.Property<string>("TokenHash")
 10584                        .IsRequired()
 10585                        .HasMaxLength(64)
 10586                        .HasColumnType("character varying(64)")
 10587                        .HasColumnName("token_hash");
 10588
 10589                    b.HasKey("Id")
 10590                        .HasName("pk_pending_registration");
 10591
 10592                    b.HasIndex("PublicId")
 10593                        .IsUnique()
 10594                        .HasDatabaseName("ix_pending_registration_public_id");
 10595
 10596                    b.HasIndex("ScopeId")
 10597                        .HasDatabaseName("ix_pending_registration_scope_id");
 10598
 10599                    b.HasIndex("TokenHash")
 10600                        .IsUnique()
 10601                        .HasDatabaseName("ix_pending_registration_token_hash");
 10602
 10603                    b.ToTable("pending_registration", "heimdall");
 20604                });
 605
 10606            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 10607                {
 10608                    b.Property<long>("Id")
 10609                        .ValueGeneratedOnAdd()
 10610                        .HasColumnType("bigint")
 10611                        .HasColumnName("id")
 10612                        .HasColumnOrder(1);
 10613
 10614                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10615
 10616                    b.Property<DateTime?>("AccountEmailLastSentAt")
 10617                        .HasColumnType("timestamp with time zone")
 10618                        .HasColumnName("account_email_last_sent_at");
 10619
 10620                    b.Property<DateTime?>("AccountEmailWindowEndsAt")
 10621                        .HasColumnType("timestamp with time zone")
 10622                        .HasColumnName("account_email_window_ends_at");
 10623
 10624                    b.Property<int>("AccountEmailsSent")
 10625                        .HasColumnType("integer")
 10626                        .HasColumnName("account_emails_sent");
 10627
 10628                    b.Property<DateTime?>("AnonymisedAt")
 10629                        .HasColumnType("timestamp with time zone")
 10630                        .HasColumnName("anonymised_at");
 10631
 10632                    b.Property<DateTime?>("BasisRecordedAt")
 10633                        .HasColumnType("timestamp with time zone")
 10634                        .HasColumnName("basis_recorded_at");
 10635
 10636                    b.Property<DateTime>("CreatedAt")
 10637                        .ValueGeneratedOnAdd()
 10638                        .HasColumnType("timestamp with time zone")
 10639                        .HasColumnName("created_at")
 10640                        .HasDefaultValueSql("now()");
 10641
 10642                    b.Property<DateTime?>("DeletedAt")
 10643                        .HasColumnType("timestamp with time zone")
 10644                        .HasColumnName("deleted_at");
 10645
 10646                    b.Property<int?>("DeletionKind")
 10647                        .HasColumnType("integer")
 10648                        .HasColumnName("deletion_kind");
 10649
 10650                    b.Property<string>("Email")
 10651                        .IsRequired()
 10652                        .HasMaxLength(256)
 10653                        .HasColumnType("character varying(256)")
 10654                        .HasColumnName("email");
 10655
 10656                    b.Property<bool>("EmailVerified")
 10657                        .ValueGeneratedOnAdd()
 10658                        .HasColumnType("boolean")
 10659                        .HasDefaultValue(false)
 10660                        .HasColumnName("email_verified");
 10661
 10662                    b.Property<string>("ErasureBlockedReason")
 10663                        .HasMaxLength(500)
 10664                        .HasColumnType("character varying(500)")
 10665                        .HasColumnName("erasure_blocked_reason");
 10666
 10667                    b.Property<DateTime?>("ErasureDueAt")
 10668                        .HasColumnType("timestamp with time zone")
 10669                        .HasColumnName("erasure_due_at");
 10670
 10671                    b.Property<DateTime?>("ErasureRequestedAt")
 10672                        .HasColumnType("timestamp with time zone")
 10673                        .HasColumnName("erasure_requested_at");
 10674
 10675                    b.Property<int>("FailedLoginAttempts")
 10676                        .HasColumnType("integer")
 10677                        .HasColumnName("failed_login_attempts");
 10678
 10679                    b.Property<int>("FailedReauthenticationAttempts")
 10680                        .HasColumnType("integer")
 10681                        .HasColumnName("failed_reauthentication_attempts");
 10682
 10683                    b.Property<int>("FailedSecondFactorAttempts")
 10684                        .HasColumnType("integer")
 10685                        .HasColumnName("failed_second_factor_attempts");
 10686
 10687                    b.Property<bool>("IsDeleted")
 10688                        .ValueGeneratedOnAdd()
 10689                        .HasColumnType("boolean")
 10690                        .HasDefaultValue(false)
 10691                        .HasColumnName("is_deleted");
 10692
 10693                    b.Property<int>("LegalBasis")
 10694                        .ValueGeneratedOnAdd()
 10695                        .HasColumnType("integer")
 10696                        .HasDefaultValue(0)
 10697                        .HasColumnName("legal_basis");
 10698
 10699                    b.Property<DateTime?>("LockedOutUntil")
 10700                        .HasColumnType("timestamp with time zone")
 10701                        .HasColumnName("locked_out_until");
 10702
 10703                    b.Property<string>("Name")
 10704                        .IsRequired()
 10705                        .HasMaxLength(200)
 10706                        .HasColumnType("character varying(200)")
 10707                        .HasColumnName("name");
 10708
 10709                    b.Property<byte[]>("PasswordHash")
 10710                        .IsRequired()
 10711                        .HasColumnType("bytea")
 10712                        .HasColumnName("password_hash");
 10713
 10714                    b.Property<string>("PrivacyNoticeVersion")
 10715                        .HasMaxLength(50)
 10716                        .HasColumnType("character varying(50)")
 10717                        .HasColumnName("privacy_notice_version");
 10718
 10719                    b.Property<DateTime?>("ProcessingRestrictedAt")
 10720                        .HasColumnType("timestamp with time zone")
 10721                        .HasColumnName("processing_restricted_at");
 10722
 10723                    b.Property<Guid>("PublicId")
 10724                        .HasColumnType("uuid")
 10725                        .HasColumnName("public_id");
 10726
 10727                    b.Property<DateTime?>("ReauthenticationPausedUntil")
 10728                        .HasColumnType("timestamp with time zone")
 10729                        .HasColumnName("reauthentication_paused_until");
 10730
 10731                    b.Property<DateTime?>("ReauthenticationWindowStartedAt")
 10732                        .HasColumnType("timestamp with time zone")
 10733                        .HasColumnName("reauthentication_window_started_at");
 10734
 10735                    b.Property<int?>("RestrictionGround")
 10736                        .HasColumnType("integer")
 10737                        .HasColumnName("restriction_ground");
 10738
 10739                    b.Property<DateTime?>("RestrictionLiftNotifiedAt")
 10740                        .HasColumnType("timestamp with time zone")
 10741                        .HasColumnName("restriction_lift_notified_at");
 10742
 10743                    b.Property<long>("RoleId")
 10744                        .HasColumnType("bigint")
 10745                        .HasColumnName("role_id");
 10746
 10747                    b.Property<byte[]>("Salt")
 10748                        .IsRequired()
 10749                        .HasColumnType("bytea")
 10750                        .HasColumnName("salt");
 10751
 10752                    b.Property<long?>("ScopeId")
 10753                        .HasColumnType("bigint")
 10754                        .HasColumnName("scope_id");
 10755
 10756                    b.Property<DateTime?>("SecondFactorLockedOutUntil")
 10757                        .HasColumnType("timestamp with time zone")
 10758                        .HasColumnName("second_factor_locked_out_until");
 10759
 10760                    b.Property<int>("SecondFactorLockouts")
 10761                        .HasColumnType("integer")
 10762                        .HasColumnName("second_factor_lockouts");
 10763
 10764                    b.Property<Guid>("SecurityStamp")
 10765                        .ValueGeneratedOnAdd()
 10766                        .HasColumnType("uuid")
 10767                        .HasColumnName("security_stamp")
 10768                        .HasDefaultValueSql("gen_random_uuid()");
 10769
 10770                    b.Property<DateTime>("UpdatedAt")
 10771                        .ValueGeneratedOnAdd()
 10772                        .HasColumnType("timestamp with time zone")
 10773                        .HasColumnName("updated_at")
 10774                        .HasDefaultValueSql("now()");
 10775
 10776                    b.HasKey("Id")
 10777                        .HasName("pk_person");
 10778
 10779                    b.HasIndex("DeletedAt")
 10780                        .HasDatabaseName("ix_person_deleted_at")
 10781                        .HasFilter("is_deleted = true AND anonymised_at IS NULL");
 10782
 10783                    b.HasIndex("Email")
 10784                        .HasDatabaseName("ix_person_email");
 10785
 10786                    b.HasIndex("ProcessingRestrictedAt")
 10787                        .HasDatabaseName("ix_person_processing_restricted_at")
 10788                        .HasFilter("processing_restricted_at IS NOT NULL");
 10789
 10790                    b.HasIndex("PublicId")
 10791                        .IsUnique()
 10792                        .HasDatabaseName("ix_person_public_id");
 10793
 10794                    b.HasIndex("RoleId")
 10795                        .HasDatabaseName("ix_person_role_id");
 10796
 10797                    b.ToTable("person", "heimdall");
 20798                });
 799
 10800            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 10801                {
 10802                    b.Property<long>("Id")
 10803                        .HasColumnType("bigint")
 10804                        .HasColumnName("id")
 10805                        .HasColumnOrder(1);
 10806
 10807                    b.Property<string>("Description")
 10808                        .HasMaxLength(500)
 10809                        .HasColumnType("character varying(500)")
 10810                        .HasColumnName("description");
 10811
 10812                    b.Property<string>("Name")
 10813                        .IsRequired()
 10814                        .HasMaxLength(200)
 10815                        .HasColumnType("character varying(200)")
 10816                        .HasColumnName("name");
 10817
 10818                    b.Property<Guid>("PublicId")
 10819                        .HasColumnType("uuid")
 10820                        .HasColumnName("public_id");
 10821
 10822                    b.HasKey("Id")
 10823                        .HasName("pk_role");
 10824
 10825                    b.HasIndex("Name")
 10826                        .IsUnique()
 10827                        .HasDatabaseName("ix_role_name");
 10828
 10829                    b.HasIndex("PublicId")
 10830                        .IsUnique()
 10831                        .HasDatabaseName("ix_role_public_id");
 10832
 10833                    b.ToTable("role", "heimdall");
 20834                });
 835
 10836            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 10837                {
 10838                    b.Property<long>("Id")
 10839                        .ValueGeneratedOnAdd()
 10840                        .HasColumnType("bigint")
 10841                        .HasColumnName("id")
 10842                        .HasColumnOrder(1);
 10843
 10844                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10845
 10846                    b.Property<DateTime>("CreatedAt")
 10847                        .ValueGeneratedOnAdd()
 10848                        .HasColumnType("timestamp with time zone")
 10849                        .HasColumnName("created_at")
 10850                        .HasDefaultValueSql("now()");
 10851
 10852                    b.Property<int?>("DefaultLegalBasis")
 10853                        .HasColumnType("integer")
 10854                        .HasColumnName("default_legal_basis");
 10855
 10856                    b.Property<string>("Description")
 10857                        .HasMaxLength(500)
 10858                        .HasColumnType("character varying(500)")
 10859                        .HasColumnName("description");
 10860
 10861                    b.Property<string>("EmailVerificationUrl")
 10862                        .HasMaxLength(2048)
 10863                        .HasColumnType("character varying(2048)")
 10864                        .HasColumnName("email_verification_url");
 10865
 10866                    b.Property<bool>("GoogleSignInEnabled")
 10867                        .ValueGeneratedOnAdd()
 10868                        .HasColumnType("boolean")
 10869                        .HasDefaultValue(false)
 10870                        .HasColumnName("google_sign_in_enabled");
 10871
 10872                    b.Property<bool>("IsDeleted")
 10873                        .ValueGeneratedOnAdd()
 10874                        .HasColumnType("boolean")
 10875                        .HasDefaultValue(false)
 10876                        .HasColumnName("is_deleted");
 10877
 10878                    b.Property<string>("Name")
 10879                        .IsRequired()
 10880                        .HasMaxLength(200)
 10881                        .HasColumnType("character varying(200)")
 10882                        .HasColumnName("name");
 10883
 10884                    b.Property<string>("PasswordResetUrl")
 10885                        .HasMaxLength(2048)
 10886                        .HasColumnType("character varying(2048)")
 10887                        .HasColumnName("password_reset_url");
 10888
 10889                    b.Property<string>("PrivacyNoticeUri")
 10890                        .HasMaxLength(2048)
 10891                        .HasColumnType("character varying(2048)")
 10892                        .HasColumnName("privacy_notice_uri");
 10893
 10894                    b.Property<Guid>("PublicId")
 10895                        .HasColumnType("uuid")
 10896                        .HasColumnName("public_id");
 10897
 10898                    b.Property<bool>("SelfRegistrationEnabled")
 10899                        .ValueGeneratedOnAdd()
 10900                        .HasColumnType("boolean")
 10901                        .HasDefaultValue(false)
 10902                        .HasColumnName("self_registration_enabled");
 10903
 10904                    b.Property<DateTime>("UpdatedAt")
 10905                        .ValueGeneratedOnAdd()
 10906                        .HasColumnType("timestamp with time zone")
 10907                        .HasColumnName("updated_at")
 10908                        .HasDefaultValueSql("now()");
 10909
 10910                    b.HasKey("Id")
 10911                        .HasName("pk_scope");
 10912
 10913                    b.HasIndex("Name")
 10914                        .IsUnique()
 10915                        .HasDatabaseName("ix_scope_name");
 10916
 10917                    b.HasIndex("PublicId")
 10918                        .IsUnique()
 10919                        .HasDatabaseName("ix_scope_public_id");
 10920
 10921                    b.ToTable("scope", "heimdall");
 20922                });
 923
 10924            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 10925                {
 10926                    b.Property<long>("ScopeId")
 10927                        .HasColumnType("bigint")
 10928                        .HasColumnName("scope_id");
 10929
 10930                    b.Property<long>("PersonId")
 10931                        .HasColumnType("bigint")
 10932                        .HasColumnName("person_id");
 10933
 10934                    b.HasKey("ScopeId", "PersonId")
 10935                        .HasName("pk_scope_owner");
 10936
 10937                    b.HasIndex("PersonId")
 10938                        .HasDatabaseName("ix_scope_owner_person_id");
 10939
 10940                    b.ToTable("scope_owner", "heimdall");
 20941                });
 942
 10943            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwnerInvitation", b =>
 10944                {
 10945                    b.Property<long>("Id")
 10946                        .ValueGeneratedOnAdd()
 10947                        .HasColumnType("bigint")
 10948                        .HasColumnName("id")
 10949                        .HasColumnOrder(1);
 10950
 10951                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 10952
 10953                    b.Property<DateTime>("CreatedAt")
 10954                        .ValueGeneratedOnAdd()
 10955                        .HasColumnType("timestamp with time zone")
 10956                        .HasColumnName("created_at")
 10957                        .HasDefaultValueSql("now()");
 10958
 10959                    b.Property<DateTime?>("EndedAt")
 10960                        .HasColumnType("timestamp with time zone")
 10961                        .HasColumnName("ended_at");
 10962
 10963                    b.Property<DateTime>("ExpiresAt")
 10964                        .HasColumnType("timestamp with time zone")
 10965                        .HasColumnName("expires_at");
 10966
 10967                    b.Property<long?>("InvitedByPersonId")
 10968                        .HasColumnType("bigint")
 10969                        .HasColumnName("invited_by_person_id");
 10970
 10971                    b.Property<long>("InviteePersonId")
 10972                        .HasColumnType("bigint")
 10973                        .HasColumnName("invitee_person_id");
 10974
 10975                    b.Property<short?>("Outcome")
 10976                        .HasColumnType("smallint")
 10977                        .HasColumnName("outcome");
 10978
 10979                    b.Property<Guid>("PublicId")
 10980                        .HasColumnType("uuid")
 10981                        .HasColumnName("public_id");
 10982
 10983                    b.Property<long>("ScopeId")
 10984                        .HasColumnType("bigint")
 10985                        .HasColumnName("scope_id");
 10986
 10987                    b.HasKey("Id")
 10988                        .HasName("pk_scope_owner_invitation");
 10989
 10990                    b.HasIndex("InvitedByPersonId")
 10991                        .HasDatabaseName("ix_scope_owner_invitation_invited_by_person_id");
 10992
 10993                    b.HasIndex("InviteePersonId")
 10994                        .HasDatabaseName("ix_scope_owner_invitation_invitee_person_id");
 10995
 10996                    b.HasIndex("PublicId")
 10997                        .IsUnique()
 10998                        .HasDatabaseName("ix_scope_owner_invitation_public_id");
 10999
 101000                    b.HasIndex("ScopeId", "InviteePersonId")
 101001                        .IsUnique()
 101002                        .HasDatabaseName("ix_scope_owner_invitation_scope_id_invitee_person_id")
 101003                        .HasFilter("ended_at IS NULL");
 101004
 101005                    b.ToTable("scope_owner_invitation", "heimdall", t =>
 101006                        {
 101007                            t.HasCheckConstraint("ck_scope_owner_invitation_outcome_ends_it", "outcome IS NULL OR ended_
 101008
 101009                            t.HasCheckConstraint("ck_scope_owner_invitation_outcome_known", "outcome IS NULL OR outcome 
 201010                        });
 201011                });
 1012
 101013            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 101014                {
 101015                    b.Property<long>("Id")
 101016                        .ValueGeneratedOnAdd()
 101017                        .HasColumnType("bigint")
 101018                        .HasColumnName("id")
 101019                        .HasColumnOrder(1);
 101020
 101021                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 101022
 101023                    b.Property<DateTime>("CreatedAt")
 101024                        .ValueGeneratedOnAdd()
 101025                        .HasColumnType("timestamp with time zone")
 101026                        .HasColumnName("created_at")
 101027                        .HasDefaultValueSql("now()");
 101028
 101029                    b.Property<string>("Description")
 101030                        .HasMaxLength(500)
 101031                        .HasColumnType("character varying(500)")
 101032                        .HasColumnName("description");
 101033
 101034                    b.Property<bool>("IncludeAsJwtClaim")
 101035                        .ValueGeneratedOnAdd()
 101036                        .HasColumnType("boolean")
 101037                        .HasDefaultValue(false)
 101038                        .HasColumnName("include_as_jwt_claim");
 101039
 101040                    b.Property<bool>("IsDeleted")
 101041                        .ValueGeneratedOnAdd()
 101042                        .HasColumnType("boolean")
 101043                        .HasDefaultValue(false)
 101044                        .HasColumnName("is_deleted");
 101045
 101046                    b.Property<string>("Name")
 101047                        .IsRequired()
 101048                        .HasMaxLength(200)
 101049                        .HasColumnType("character varying(200)")
 101050                        .HasColumnName("name");
 101051
 101052                    b.Property<Guid>("PublicId")
 101053                        .HasColumnType("uuid")
 101054                        .HasColumnName("public_id");
 101055
 101056                    b.Property<long>("ScopeId")
 101057                        .HasColumnType("bigint")
 101058                        .HasColumnName("scope_id");
 101059
 101060                    b.Property<DateTime>("UpdatedAt")
 101061                        .ValueGeneratedOnAdd()
 101062                        .HasColumnType("timestamp with time zone")
 101063                        .HasColumnName("updated_at")
 101064                        .HasDefaultValueSql("now()");
 101065
 101066                    b.HasKey("Id")
 101067                        .HasName("pk_scope_permission");
 101068
 101069                    b.HasIndex("PublicId")
 101070                        .IsUnique()
 101071                        .HasDatabaseName("ix_scope_permission_public_id");
 101072
 101073                    b.HasIndex("ScopeId")
 101074                        .HasDatabaseName("ix_scope_permission_scope_id");
 101075
 101076                    b.ToTable("scope_permission", "heimdall");
 201077                });
 1078
 101079            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 101080                {
 101081                    b.Property<long>("ScopeId")
 101082                        .HasColumnType("bigint")
 101083                        .HasColumnName("scope_id");
 101084
 101085                    b.Property<long>("PersonId")
 101086                        .HasColumnType("bigint")
 101087                        .HasColumnName("person_id");
 101088
 101089                    b.HasKey("ScopeId", "PersonId")
 101090                        .HasName("pk_scope_user");
 101091
 101092                    b.HasIndex("PersonId")
 101093                        .IsUnique()
 101094                        .HasDatabaseName("ix_scope_user_person_id");
 101095
 101096                    b.ToTable("scope_user", "heimdall");
 201097                });
 1098
 101099            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 101100                {
 101101                    b.Property<long>("Id")
 101102                        .ValueGeneratedOnAdd()
 101103                        .HasColumnType("bigint")
 101104                        .HasColumnName("id")
 101105                        .HasColumnOrder(1);
 101106
 101107                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 101108
 101109                    b.Property<bool>("AppEnabled")
 101110                        .ValueGeneratedOnAdd()
 101111                        .HasColumnType("boolean")
 101112                        .HasDefaultValue(false)
 101113                        .HasColumnName("app_enabled");
 101114
 101115                    b.Property<int>("ChallengeAttempts")
 101116                        .ValueGeneratedOnAdd()
 101117                        .HasColumnType("integer")
 101118                        .HasDefaultValue(0)
 101119                        .HasColumnName("challenge_attempts");
 101120
 101121                    b.Property<Guid?>("ChallengeId")
 101122                        .HasColumnType("uuid")
 101123                        .HasColumnName("challenge_id");
 101124
 101125                    b.Property<DateTime>("CreatedAt")
 101126                        .ValueGeneratedOnAdd()
 101127                        .HasColumnType("timestamp with time zone")
 101128                        .HasColumnName("created_at")
 101129                        .HasDefaultValueSql("now()");
 101130
 101131                    b.Property<int>("EmailCodeReissueCount")
 101132                        .ValueGeneratedOnAdd()
 101133                        .HasColumnType("integer")
 101134                        .HasDefaultValue(0)
 101135                        .HasColumnName("email_code_reissue_count");
 101136
 101137                    b.Property<bool>("EmailEnabled")
 101138                        .ValueGeneratedOnAdd()
 101139                        .HasColumnType("boolean")
 101140                        .HasDefaultValue(false)
 101141                        .HasColumnName("email_enabled");
 101142
 101143                    b.Property<bool>("IsActive")
 101144                        .ValueGeneratedOnAdd()
 101145                        .HasColumnType("boolean")
 101146                        .HasDefaultValue(false)
 101147                        .HasColumnName("is_active");
 101148
 101149                    b.Property<long?>("LastTotpTimeStepUsed")
 101150                        .HasColumnType("bigint")
 101151                        .HasColumnName("last_totp_time_step_used");
 101152
 101153                    b.Property<long>("PersonId")
 101154                        .HasColumnType("bigint")
 101155                        .HasColumnName("person_id");
 101156
 101157                    b.Property<byte[]>("TotpSecretEncrypted")
 101158                        .HasColumnType("bytea")
 101159                        .HasColumnName("totp_secret_encrypted");
 101160
 101161                    b.Property<DateTime>("UpdatedAt")
 101162                        .ValueGeneratedOnAdd()
 101163                        .HasColumnType("timestamp with time zone")
 101164                        .HasColumnName("updated_at")
 101165                        .HasDefaultValueSql("now()");
 101166
 101167                    b.HasKey("Id")
 101168                        .HasName("pk_two_factor_auth");
 101169
 101170                    b.HasIndex("PersonId")
 101171                        .IsUnique()
 101172                        .HasDatabaseName("ix_two_factor_auth_person_id");
 101173
 101174                    b.ToTable("two_factor_auth", "heimdall");
 201175                });
 1176
 101177            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 101178                {
 101179                    b.Property<long>("Id")
 101180                        .ValueGeneratedOnAdd()
 101181                        .HasColumnType("bigint")
 101182                        .HasColumnName("id")
 101183                        .HasColumnOrder(1);
 101184
 101185                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 101186
 101187                    b.Property<byte[]>("CodeHash")
 101188                        .IsRequired()
 101189                        .HasColumnType("bytea")
 101190                        .HasColumnName("code_hash");
 101191
 101192                    b.Property<DateTime>("CreatedAt")
 101193                        .ValueGeneratedOnAdd()
 101194                        .HasColumnType("timestamp with time zone")
 101195                        .HasColumnName("created_at")
 101196                        .HasDefaultValueSql("now()");
 101197
 101198                    b.Property<DateTime>("ExpiresAt")
 101199                        .HasColumnType("timestamp with time zone")
 101200                        .HasColumnName("expires_at");
 101201
 101202                    b.Property<int>("FailedAttempts")
 101203                        .HasColumnType("integer")
 101204                        .HasColumnName("failed_attempts");
 101205
 101206                    b.Property<byte[]>("Salt")
 101207                        .IsRequired()
 101208                        .HasColumnType("bytea")
 101209                        .HasColumnName("salt");
 101210
 101211                    b.Property<long>("TwoFactorAuthId")
 101212                        .HasColumnType("bigint")
 101213                        .HasColumnName("two_factor_auth_id");
 101214
 101215                    b.Property<bool>("Used")
 101216                        .ValueGeneratedOnAdd()
 101217                        .HasColumnType("boolean")
 101218                        .HasDefaultValue(false)
 101219                        .HasColumnName("used");
 101220
 101221                    b.HasKey("Id")
 101222                        .HasName("pk_two_factor_email_code");
 101223
 101224                    b.HasIndex("TwoFactorAuthId")
 101225                        .HasDatabaseName("ix_two_factor_email_code_two_factor_auth_id");
 101226
 101227                    b.ToTable("two_factor_email_code", "heimdall");
 201228                });
 1229
 101230            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 101231                {
 101232                    b.Property<long>("Id")
 101233                        .ValueGeneratedOnAdd()
 101234                        .HasColumnType("bigint")
 101235                        .HasColumnName("id")
 101236                        .HasColumnOrder(1);
 101237
 101238                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
 101239
 101240                    b.Property<byte[]>("CodeHash")
 101241                        .IsRequired()
 101242                        .HasColumnType("bytea")
 101243                        .HasColumnName("code_hash");
 101244
 101245                    b.Property<DateTime>("CreatedAt")
 101246                        .ValueGeneratedOnAdd()
 101247                        .HasColumnType("timestamp with time zone")
 101248                        .HasColumnName("created_at")
 101249                        .HasDefaultValueSql("now()");
 101250
 101251                    b.Property<long>("TwoFactorAuthId")
 101252                        .HasColumnType("bigint")
 101253                        .HasColumnName("two_factor_auth_id");
 101254
 101255                    b.Property<bool>("Used")
 101256                        .ValueGeneratedOnAdd()
 101257                        .HasColumnType("boolean")
 101258                        .HasDefaultValue(false)
 101259                        .HasColumnName("used");
 101260
 101261                    b.Property<DateTime?>("UsedAt")
 101262                        .HasColumnType("timestamp with time zone")
 101263                        .HasColumnName("used_at");
 101264
 101265                    b.HasKey("Id")
 101266                        .HasName("pk_two_factor_recovery_code");
 101267
 101268                    b.HasIndex("TwoFactorAuthId")
 101269                        .HasDatabaseName("ix_two_factor_recovery_code_two_factor_auth_id");
 101270
 101271                    b.ToTable("two_factor_recovery_code", "heimdall");
 201272                });
 1273
 101274            modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b =>
 101275                {
 101276                    b.Property<int>("Id")
 101277                        .ValueGeneratedOnAdd()
 101278                        .HasColumnType("integer")
 101279                        .HasColumnName("id");
 101280
 101281                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 101282
 101283                    b.Property<string>("FriendlyName")
 101284                        .HasColumnType("text")
 101285                        .HasColumnName("friendly_name");
 101286
 101287                    b.Property<string>("Xml")
 101288                        .HasColumnType("text")
 101289                        .HasColumnName("xml");
 101290
 101291                    b.HasKey("Id")
 101292                        .HasName("pk_data_protection_keys");
 101293
 101294                    b.ToTable("data_protection_keys", "heimdall");
 201295                });
 1296
 101297            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 101298                {
 101299                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Owner")
 101300                        .WithMany("OwnedApplications")
 101301                        .HasForeignKey("OwnerId")
 101302                        .OnDelete(DeleteBehavior.Cascade)
 101303                        .IsRequired()
 101304                        .HasConstraintName("fk_application_person_owner_id");
 101305
 101306                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101307                        .WithMany("Applications")
 101308                        .HasForeignKey("ScopeId")
 101309                        .OnDelete(DeleteBehavior.Cascade)
 101310                        .IsRequired()
 101311                        .HasConstraintName("fk_application_scope_scope_id");
 101312
 101313                    b.Navigation("Owner");
 101314
 101315                    b.Navigation("Scope");
 201316                });
 1317
 101318            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ApplicationCredential", b =>
 101319                {
 101320                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Application", "Application")
 101321                        .WithMany("Credentials")
 101322                        .HasForeignKey("ApplicationId")
 101323                        .OnDelete(DeleteBehavior.Cascade)
 101324                        .IsRequired()
 101325                        .HasConstraintName("fk_application_credential_application_application_id");
 101326
 101327                    b.Navigation("Application");
 201328                });
 1329
 101330            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.EmailVerificationToken", b =>
 101331                {
 101332                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101333                        .WithMany("EmailVerificationTokens")
 101334                        .HasForeignKey("PersonId")
 101335                        .OnDelete(DeleteBehavior.Cascade)
 101336                        .IsRequired()
 101337                        .HasConstraintName("fk_email_verification_token_person_person_id");
 101338
 101339                    b.Navigation("Person");
 201340                });
 1341
 101342            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.GoogleUser", b =>
 101343                {
 101344                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101345                        .WithMany("GoogleUsers")
 101346                        .HasForeignKey("ScopeId")
 101347                        .OnDelete(DeleteBehavior.Cascade)
 101348                        .IsRequired()
 101349                        .HasConstraintName("fk_google_user_scope_scope_id");
 101350
 101351                    b.Navigation("Scope");
 201352                });
 1353
 101354            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PasswordResetToken", b =>
 101355                {
 101356                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101357                        .WithMany("PasswordResetTokens")
 101358                        .HasForeignKey("PersonId")
 101359                        .OnDelete(DeleteBehavior.Cascade)
 101360                        .IsRequired()
 101361                        .HasConstraintName("fk_password_reset_token_person_person_id");
 101362
 101363                    b.Navigation("Person");
 201364                });
 1365
 101366            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.PendingRegistration", b =>
 101367                {
 101368                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101369                        .WithMany()
 101370                        .HasForeignKey("ScopeId")
 101371                        .OnDelete(DeleteBehavior.Cascade)
 101372                        .IsRequired()
 101373                        .HasConstraintName("fk_pending_registration_scope_scope_id");
 101374
 101375                    b.Navigation("Scope");
 201376                });
 1377
 101378            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 101379                {
 101380                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Role", "Role")
 101381                        .WithMany("Persons")
 101382                        .HasForeignKey("RoleId")
 101383                        .OnDelete(DeleteBehavior.Restrict)
 101384                        .IsRequired()
 101385                        .HasConstraintName("fk_person_roles_role_id");
 101386
 101387                    b.Navigation("Role");
 201388                });
 1389
 101390            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwner", b =>
 101391                {
 101392                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101393                        .WithMany("ScopeOwnerships")
 101394                        .HasForeignKey("PersonId")
 101395                        .OnDelete(DeleteBehavior.Cascade)
 101396                        .IsRequired()
 101397                        .HasConstraintName("fk_scope_owner_person_person_id");
 101398
 101399                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101400                        .WithMany("Owners")
 101401                        .HasForeignKey("ScopeId")
 101402                        .OnDelete(DeleteBehavior.Cascade)
 101403                        .IsRequired()
 101404                        .HasConstraintName("fk_scope_owner_scope_scope_id");
 101405
 101406                    b.Navigation("Person");
 101407
 101408                    b.Navigation("Scope");
 201409                });
 1410
 101411            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeOwnerInvitation", b =>
 101412                {
 101413                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "InvitedBy")
 101414                        .WithMany()
 101415                        .HasForeignKey("InvitedByPersonId")
 101416                        .OnDelete(DeleteBehavior.SetNull)
 101417                        .HasConstraintName("fk_scope_owner_invitation_person_invited_by_person_id");
 101418
 101419                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Invitee")
 101420                        .WithMany()
 101421                        .HasForeignKey("InviteePersonId")
 101422                        .OnDelete(DeleteBehavior.Cascade)
 101423                        .IsRequired()
 101424                        .HasConstraintName("fk_scope_owner_invitation_person_invitee_person_id");
 101425
 101426                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101427                        .WithMany()
 101428                        .HasForeignKey("ScopeId")
 101429                        .OnDelete(DeleteBehavior.Cascade)
 101430                        .IsRequired()
 101431                        .HasConstraintName("fk_scope_owner_invitation_scope_scope_id");
 101432
 101433                    b.Navigation("InvitedBy");
 101434
 101435                    b.Navigation("Invitee");
 101436
 101437                    b.Navigation("Scope");
 201438                });
 1439
 101440            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopePermission", b =>
 101441                {
 101442                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101443                        .WithMany("ScopePermissions")
 101444                        .HasForeignKey("ScopeId")
 101445                        .OnDelete(DeleteBehavior.Cascade)
 101446                        .IsRequired()
 101447                        .HasConstraintName("fk_scope_permission_scope_scope_id");
 101448
 101449                    b.Navigation("Scope");
 201450                });
 1451
 101452            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.ScopeUser", b =>
 101453                {
 101454                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101455                        .WithOne("ScopeMembership")
 101456                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.ScopeUser", "PersonId")
 101457                        .OnDelete(DeleteBehavior.Cascade)
 101458                        .IsRequired()
 101459                        .HasConstraintName("fk_scope_user_person_person_id");
 101460
 101461                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Scope", "Scope")
 101462                        .WithMany("Users")
 101463                        .HasForeignKey("ScopeId")
 101464                        .OnDelete(DeleteBehavior.Cascade)
 101465                        .IsRequired()
 101466                        .HasConstraintName("fk_scope_user_scope_scope_id");
 101467
 101468                    b.Navigation("Person");
 101469
 101470                    b.Navigation("Scope");
 201471                });
 1472
 101473            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 101474                {
 101475                    b.HasOne("ArturRios.Heimdall.Domain.Entities.Person", "Person")
 101476                        .WithOne("TwoFactorAuth")
 101477                        .HasForeignKey("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "PersonId")
 101478                        .OnDelete(DeleteBehavior.Cascade)
 101479                        .IsRequired()
 101480                        .HasConstraintName("fk_two_factor_auth_person_person_id");
 101481
 101482                    b.Navigation("Person");
 201483                });
 1484
 101485            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorEmailCode", b =>
 101486                {
 101487                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 101488                        .WithMany("EmailCodes")
 101489                        .HasForeignKey("TwoFactorAuthId")
 101490                        .OnDelete(DeleteBehavior.Cascade)
 101491                        .IsRequired()
 101492                        .HasConstraintName("fk_two_factor_email_code_two_factor_auth_two_factor_auth_id");
 101493
 101494                    b.Navigation("TwoFactorAuth");
 201495                });
 1496
 101497            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorRecoveryCode", b =>
 101498                {
 101499                    b.HasOne("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", "TwoFactorAuth")
 101500                        .WithMany("RecoveryCodes")
 101501                        .HasForeignKey("TwoFactorAuthId")
 101502                        .OnDelete(DeleteBehavior.Cascade)
 101503                        .IsRequired()
 101504                        .HasConstraintName("fk_two_factor_recovery_code_two_factor_auth_two_factor_auth_id");
 101505
 101506                    b.Navigation("TwoFactorAuth");
 201507                });
 1508
 101509            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Application", b =>
 101510                {
 101511                    b.Navigation("Credentials");
 201512                });
 1513
 101514            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Person", b =>
 101515                {
 101516                    b.Navigation("EmailVerificationTokens");
 101517
 101518                    b.Navigation("OwnedApplications");
 101519
 101520                    b.Navigation("PasswordResetTokens");
 101521
 101522                    b.Navigation("ScopeMembership");
 101523
 101524                    b.Navigation("ScopeOwnerships");
 101525
 101526                    b.Navigation("TwoFactorAuth");
 201527                });
 1528
 101529            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Role", b =>
 101530                {
 101531                    b.Navigation("Persons");
 201532                });
 1533
 101534            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.Scope", b =>
 101535                {
 101536                    b.Navigation("Applications");
 101537
 101538                    b.Navigation("GoogleUsers");
 101539
 101540                    b.Navigation("Owners");
 101541
 101542                    b.Navigation("ScopePermissions");
 101543
 101544                    b.Navigation("Users");
 201545                });
 1546
 101547            modelBuilder.Entity("ArturRios.Heimdall.Domain.Entities.TwoFactorAuth", b =>
 101548                {
 101549                    b.Navigation("EmailCodes");
 101550
 101551                    b.Navigation("RecoveryCodes");
 201552                });
 1553#pragma warning restore 612, 618
 101554        }
 1555    }
 1556}