//
using System;
using DodoSSH.Infrastructure;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace DodoSSH.Infrastructure.Migrations
{
[DbContext(typeof(DodoDbContext))]
[Migration("20260731132935_AddHostGroupAndSnippetItems")]
partial class AddHostGroupAndSnippetItems
{
///
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasDefaultSchema("dodo")
.HasAnnotation("ProductVersion", "10.0.10")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "citext");
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("DodoSSH.Domain.Device", b =>
{
b.Property("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property("EnrolledAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("enrolled_at_utc");
b.Property("LastSeenAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("last_seen_at_utc");
b.Property("Name")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("character varying(256)")
.HasColumnName("name");
b.Property("Platform")
.HasColumnType("integer")
.HasColumnName("platform");
b.Property("PublicKey")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("bytea")
.HasColumnName("public_key");
b.Property("RevokedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("revoked_at_utc");
b.Property("UserId")
.HasColumnType("uuid")
.HasColumnName("user_id");
b.HasKey("Id")
.HasName("pk_device");
b.HasIndex("UserId")
.HasDatabaseName("ix_device_user_id");
b.ToTable("device", "dodo");
});
modelBuilder.Entity("DodoSSH.Domain.KeyLogEntry", b =>
{
b.Property("Sequence")
.ValueGeneratedOnAdd()
.HasColumnType("bigint")
.HasColumnName("sequence");
NpgsqlPropertyBuilderExtensions.UseIdentityAlwaysColumn(b.Property("Sequence"));
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("EncryptionPublicKey")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("bytea")
.HasColumnName("encryption_public_key");
b.Property("Generation")
.HasColumnType("integer")
.HasColumnName("generation");
b.Property("Hash")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("bytea")
.HasColumnName("hash");
b.Property("PreviousHash")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("bytea")
.HasColumnName("previous_hash");
b.Property("SigningPublicKey")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("bytea")
.HasColumnName("signing_public_key");
b.Property("StatementSignature")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("bytea")
.HasColumnName("statement_signature");
b.Property("UserId")
.HasColumnType("uuid")
.HasColumnName("user_id");
b.HasKey("Sequence")
.HasName("pk_key_log");
b.HasIndex("Hash")
.IsUnique()
.HasDatabaseName("ix_key_log_hash");
b.HasIndex("UserId")
.HasDatabaseName("ix_key_log_user_id");
b.ToTable("key_log", "dodo");
});
modelBuilder.Entity("DodoSSH.Domain.SshHost", b =>
{
b.Property("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property("ChangeSequence")
.HasColumnType("bigint")
.HasColumnName("change_sequence");
b.Property("ContentKeyId")
.HasColumnType("uuid")
.HasColumnName("content_key_id");
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("CreatedByUserId")
.HasColumnType("uuid")
.HasColumnName("created_by_user_id");
b.Property("DataKeyWrap")
.HasColumnType("bytea")
.HasColumnName("data_key_wrap");
b.Property("DeletedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("deleted_at_utc");
b.Property("Hostname")
.HasMaxLength(255)
.HasColumnType("character varying(255)")
.HasColumnName("hostname");
b.Property("KeyGeneration")
.HasColumnType("integer")
.HasColumnName("key_generation");
b.Property("Payload")
.IsRequired()
.HasColumnType("bytea")
.HasColumnName("payload");
b.Property("PayloadAadVersion")
.HasColumnType("smallint")
.HasColumnName("payload_aad_version");
b.Property("Port")
.HasColumnType("integer")
.HasColumnName("port");
b.Property("RelayEnabled")
.HasColumnType("boolean")
.HasColumnName("relay_enabled");
b.Property("UpdatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at_utc");
b.Property("UpdatedByUserId")
.HasColumnType("uuid")
.HasColumnName("updated_by_user_id");
b.Property("VaultId")
.HasColumnType("uuid")
.HasColumnName("vault_id");
b.Property("Version")
.HasColumnType("integer")
.HasColumnName("version");
b.Property("xmin")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("xid")
.HasColumnName("xmin");
b.HasKey("Id")
.HasName("pk_host");
b.HasIndex("VaultId")
.HasDatabaseName("ix_host_vault_live")
.HasFilter("deleted_at_utc IS NULL");
b.HasIndex("VaultId", "ChangeSequence")
.HasDatabaseName("ix_host_vault_id_change_sequence");
b.ToTable("host", "dodo", t =>
{
t.HasCheckConstraint("ck_host_port_range", "port IS NULL OR (port BETWEEN 1 AND 65535)");
t.HasCheckConstraint("ck_host_relay_target", "(relay_enabled AND hostname IS NOT NULL AND port IS NOT NULL)\nOR (NOT relay_enabled AND hostname IS NULL AND port IS NULL)");
t.HasCheckConstraint("ck_host_version", "version >= 1");
});
});
modelBuilder.Entity("DodoSSH.Domain.SyncOperationReceipt", b =>
{
b.Property("OperationId")
.HasColumnType("uuid")
.HasColumnName("operation_id");
b.Property("AppliedChangeSequence")
.HasColumnType("bigint")
.HasColumnName("applied_change_sequence");
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("ResultVersion")
.HasColumnType("integer")
.HasColumnName("result_version");
b.Property("VaultId")
.HasColumnType("uuid")
.HasColumnName("vault_id");
b.HasKey("OperationId")
.HasName("pk_sync_operation_receipt");
b.HasIndex("VaultId", "CreatedAtUtc")
.HasDatabaseName("ix_sync_operation_receipt_vault_id_created_at_utc");
b.ToTable("sync_operation_receipt", "dodo");
});
modelBuilder.Entity("DodoSSH.Domain.Team", b =>
{
b.Property("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("CreatedByUserId")
.HasColumnType("uuid")
.HasColumnName("created_by_user_id");
b.Property("DeletedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("deleted_at_utc");
b.Property("Description")
.HasMaxLength(2048)
.HasColumnType("character varying(2048)")
.HasColumnName("description");
b.Property("Name")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("character varying(256)")
.HasColumnName("name");
b.Property("Slug")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("citext")
.HasColumnName("slug");
b.Property("xmin")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("xid")
.HasColumnName("xmin");
b.HasKey("Id")
.HasName("pk_team");
b.HasIndex("Slug")
.IsUnique()
.HasDatabaseName("ix_team_slug")
.HasFilter("deleted_at_utc IS NULL");
b.ToTable("team", "dodo");
});
modelBuilder.Entity("DodoSSH.Domain.TeamMembership", b =>
{
b.Property("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("DeletedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("deleted_at_utc");
b.Property("InvitedByUserId")
.HasColumnType("uuid")
.HasColumnName("invited_by_user_id");
b.Property("JoinedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("joined_at_utc");
b.Property("Role")
.HasColumnType("integer")
.HasColumnName("role");
b.Property("Status")
.HasColumnType("integer")
.HasColumnName("status");
b.Property("TeamId")
.HasColumnType("uuid")
.HasColumnName("team_id");
b.Property("UserId")
.HasColumnType("uuid")
.HasColumnName("user_id");
b.Property("xmin")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("xid")
.HasColumnName("xmin");
b.HasKey("Id")
.HasName("pk_team_membership");
b.HasIndex("UserId")
.HasDatabaseName("ix_team_membership_user_id");
b.HasIndex("TeamId", "UserId")
.IsUnique()
.HasDatabaseName("ix_team_membership_team_id_user_id")
.HasFilter("deleted_at_utc IS NULL");
b.ToTable("team_membership", "dodo");
});
modelBuilder.Entity("DodoSSH.Domain.UserAccount", b =>
{
b.Property("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("DeletedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("deleted_at_utc");
b.Property("DisplayName")
.HasMaxLength(256)
.HasColumnType("character varying(256)")
.HasColumnName("display_name");
b.Property("Email")
.HasMaxLength(320)
.HasColumnType("citext")
.HasColumnName("email");
b.Property("EnrolledAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("enrolled_at_utc");
b.Property("Issuer")
.IsRequired()
.HasMaxLength(512)
.HasColumnType("character varying(512)")
.HasColumnName("issuer");
b.Property("LastSeenAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("last_seen_at_utc");
b.Property("Status")
.HasColumnType("integer")
.HasColumnName("status");
b.Property("Subject")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("character varying(256)")
.HasColumnName("subject");
b.Property("UpdatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at_utc");
b.Property("xmin")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("xid")
.HasColumnName("xmin");
b.HasKey("Id")
.HasName("pk_user_account");
b.HasIndex("Email")
.IsUnique()
.HasDatabaseName("ix_user_account_email")
.HasFilter("email IS NOT NULL AND deleted_at_utc IS NULL");
b.HasIndex("Issuer", "Subject")
.IsUnique()
.HasDatabaseName("ix_user_account_issuer_subject");
b.ToTable("user_account", "dodo");
});
modelBuilder.Entity("DodoSSH.Domain.UserKey", b =>
{
b.Property("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("EncryptionPublicKey")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("bytea")
.HasColumnName("encryption_public_key");
b.Property("FingerprintSha256")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("bytea")
.HasColumnName("fingerprint_sha256");
b.Property("Generation")
.HasColumnType("integer")
.HasColumnName("generation");
b.Property("IdentityProviderBinding")
.HasColumnType("jsonb")
.HasColumnName("identity_provider_binding");
b.Property("IsCurrent")
.HasColumnType("boolean")
.HasColumnName("is_current");
b.Property("RevokedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("revoked_at_utc");
b.Property("SigningPublicKey")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("bytea")
.HasColumnName("signing_public_key");
b.Property("Statement")
.IsRequired()
.HasColumnType("jsonb")
.HasColumnName("statement");
b.Property("StatementSignature")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("bytea")
.HasColumnName("statement_signature");
b.Property("UserId")
.HasColumnType("uuid")
.HasColumnName("user_id");
b.HasKey("Id")
.HasName("pk_user_key");
b.HasIndex("FingerprintSha256")
.IsUnique()
.HasDatabaseName("ix_user_key_fingerprint_sha256");
b.HasIndex("UserId")
.IsUnique()
.HasDatabaseName("ix_user_key_current")
.HasFilter("is_current");
b.HasIndex("UserId", "Generation")
.IsUnique()
.HasDatabaseName("ix_user_key_user_id_generation");
b.ToTable("user_key", "dodo");
});
modelBuilder.Entity("DodoSSH.Domain.UserKeyWrap", b =>
{
b.Property("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("DeviceId")
.HasColumnType("uuid")
.HasColumnName("device_id");
b.Property("KdfAlgorithm")
.HasMaxLength(64)
.HasColumnType("character varying(64)")
.HasColumnName("kdf_algorithm");
b.Property("KdfMemoryKibibytes")
.HasColumnType("integer")
.HasColumnName("kdf_memory_kibibytes");
b.Property("KdfParallelism")
.HasColumnType("integer")
.HasColumnName("kdf_parallelism");
b.Property("KdfPasses")
.HasColumnType("integer")
.HasColumnName("kdf_passes");
b.Property("KdfSalt")
.HasMaxLength(64)
.HasColumnType("bytea")
.HasColumnName("kdf_salt");
b.Property("Kind")
.HasColumnType("integer")
.HasColumnName("kind");
b.Property("LastUsedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("last_used_at_utc");
b.Property("UserId")
.HasColumnType("uuid")
.HasColumnName("user_id");
b.Property("Wrap")
.IsRequired()
.HasColumnType("bytea")
.HasColumnName("wrap");
b.Property("WrapVersion")
.HasColumnType("integer")
.HasColumnName("wrap_version");
b.Property("xmin")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("xid")
.HasColumnName("xmin");
b.HasKey("Id")
.HasName("pk_user_key_wrap");
b.HasIndex("DeviceId")
.HasDatabaseName("ix_user_key_wrap_device_id");
b.HasIndex("UserId", "DeviceId")
.IsUnique()
.HasDatabaseName("ix_user_key_wrap_user_device")
.HasFilter("device_id IS NOT NULL");
b.HasIndex("UserId", "Kind")
.IsUnique()
.HasDatabaseName("ix_user_key_wrap_user_kind")
.HasFilter("device_id IS NULL");
b.ToTable("user_key_wrap", "dodo", t =>
{
t.HasCheckConstraint("ck_user_key_wrap_device", "(kind = 2 AND device_id IS NOT NULL) OR (kind <> 2 AND device_id IS NULL)");
t.HasCheckConstraint("ck_user_key_wrap_kdf", "(kind IN (1, 3) AND kdf_algorithm IS NOT NULL AND kdf_salt IS NOT NULL\n AND kdf_memory_kibibytes IS NOT NULL AND kdf_passes IS NOT NULL\n AND kdf_parallelism IS NOT NULL)\nOR (kind IN (2, 4) AND kdf_algorithm IS NULL AND kdf_salt IS NULL)");
});
});
modelBuilder.Entity("DodoSSH.Domain.Vault", b =>
{
b.Property("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("DeletedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("deleted_at_utc");
b.Property("KeyGeneration")
.HasColumnType("integer")
.HasColumnName("key_generation");
b.Property("Name")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("character varying(256)")
.HasColumnName("name");
b.Property("OwnerKind")
.HasColumnType("integer")
.HasColumnName("owner_kind");
b.Property("OwnerUserId")
.HasColumnType("uuid")
.HasColumnName("owner_user_id");
b.Property("RekeyReason")
.HasColumnType("integer")
.HasColumnName("rekey_reason");
b.Property("RekeyRequired")
.HasColumnType("boolean")
.HasColumnName("rekey_required");
b.Property("TeamId")
.HasColumnType("uuid")
.HasColumnName("team_id");
b.Property("UpdatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at_utc");
b.Property("xmin")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("xid")
.HasColumnName("xmin");
b.HasKey("Id")
.HasName("pk_vault");
b.HasIndex("OwnerUserId")
.HasDatabaseName("ix_vault_owner_user_id");
b.HasIndex("TeamId")
.HasDatabaseName("ix_vault_team_id");
b.ToTable("vault", "dodo", t =>
{
t.HasCheckConstraint("ck_vault_key_generation", "key_generation >= 1");
t.HasCheckConstraint("ck_vault_owner", "(owner_kind = 1 AND owner_user_id IS NOT NULL AND team_id IS NULL)\nOR (owner_kind = 2 AND team_id IS NOT NULL AND owner_user_id IS NULL)");
});
});
modelBuilder.Entity("DodoSSH.Domain.VaultChange", b =>
{
b.Property("Sequence")
.ValueGeneratedOnAdd()
.HasColumnType("bigint")
.HasColumnName("sequence");
NpgsqlPropertyBuilderExtensions.UseIdentityAlwaysColumn(b.Property("Sequence"));
b.Property("ActorUserId")
.HasColumnType("uuid")
.HasColumnName("actor_user_id");
b.Property("EntityId")
.HasColumnType("uuid")
.HasColumnName("entity_id");
b.Property("EntityType")
.HasColumnType("integer")
.HasColumnName("entity_type");
b.Property("OccurredAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("occurred_at_utc");
b.Property("Operation")
.HasColumnType("integer")
.HasColumnName("operation");
b.Property("Revision")
.HasColumnType("integer")
.HasColumnName("revision");
b.Property("VaultId")
.HasColumnType("uuid")
.HasColumnName("vault_id");
b.HasKey("Sequence")
.HasName("pk_sync_change");
b.HasIndex("VaultId", "Sequence")
.HasDatabaseName("ix_sync_change_vault_id_sequence");
b.HasIndex("VaultId", "EntityId", "Sequence")
.IsDescending(false, false, true)
.HasDatabaseName("ix_sync_change_vault_id_entity_id_sequence");
b.ToTable("sync_change", "dodo");
});
modelBuilder.Entity("DodoSSH.Domain.VaultCredential", b =>
{
b.Property("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property("ChangeSequence")
.HasColumnType("bigint")
.HasColumnName("change_sequence");
b.Property("ContentKeyId")
.HasColumnType("uuid")
.HasColumnName("content_key_id");
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("CreatedByUserId")
.HasColumnType("uuid")
.HasColumnName("created_by_user_id");
b.Property("DataKeyWrap")
.HasColumnType("bytea")
.HasColumnName("data_key_wrap");
b.Property("DeletedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("deleted_at_utc");
b.Property("KeyGeneration")
.HasColumnType("integer")
.HasColumnName("key_generation");
b.Property("Payload")
.IsRequired()
.HasColumnType("bytea")
.HasColumnName("payload");
b.Property("PayloadAadVersion")
.HasColumnType("smallint")
.HasColumnName("payload_aad_version");
b.Property("UpdatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at_utc");
b.Property("UpdatedByUserId")
.HasColumnType("uuid")
.HasColumnName("updated_by_user_id");
b.Property("VaultId")
.HasColumnType("uuid")
.HasColumnName("vault_id");
b.Property("Version")
.HasColumnType("integer")
.HasColumnName("version");
b.Property("xmin")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("xid")
.HasColumnName("xmin");
b.HasKey("Id")
.HasName("pk_credential");
b.HasIndex("VaultId")
.HasDatabaseName("ix_credential_vault_live")
.HasFilter("deleted_at_utc IS NULL");
b.HasIndex("VaultId", "ChangeSequence")
.HasDatabaseName("ix_credential_vault_id_change_sequence");
b.ToTable("credential", "dodo", t =>
{
t.HasCheckConstraint("ck_credential_version", "version >= 1");
});
});
modelBuilder.Entity("DodoSSH.Domain.VaultHostGroup", b =>
{
b.Property("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property("ChangeSequence")
.HasColumnType("bigint")
.HasColumnName("change_sequence");
b.Property("ContentKeyId")
.HasColumnType("uuid")
.HasColumnName("content_key_id");
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("CreatedByUserId")
.HasColumnType("uuid")
.HasColumnName("created_by_user_id");
b.Property("DataKeyWrap")
.HasColumnType("bytea")
.HasColumnName("data_key_wrap");
b.Property("DeletedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("deleted_at_utc");
b.Property("KeyGeneration")
.HasColumnType("integer")
.HasColumnName("key_generation");
b.Property("Payload")
.IsRequired()
.HasColumnType("bytea")
.HasColumnName("payload");
b.Property("PayloadAadVersion")
.HasColumnType("smallint")
.HasColumnName("payload_aad_version");
b.Property("UpdatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at_utc");
b.Property("UpdatedByUserId")
.HasColumnType("uuid")
.HasColumnName("updated_by_user_id");
b.Property("VaultId")
.HasColumnType("uuid")
.HasColumnName("vault_id");
b.Property("Version")
.HasColumnType("integer")
.HasColumnName("version");
b.Property("xmin")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("xid")
.HasColumnName("xmin");
b.HasKey("Id")
.HasName("pk_host_group");
b.HasIndex("VaultId")
.HasDatabaseName("ix_host_group_vault_live")
.HasFilter("deleted_at_utc IS NULL");
b.HasIndex("VaultId", "ChangeSequence")
.HasDatabaseName("ix_host_group_vault_id_change_sequence");
b.ToTable("host_group", "dodo", t =>
{
t.HasCheckConstraint("ck_host_group_version", "version >= 1");
});
});
modelBuilder.Entity("DodoSSH.Domain.VaultKeyGrant", b =>
{
b.Property("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("GranterKeyFingerprint")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("bytea")
.HasColumnName("granter_key_fingerprint");
b.Property("GranterUserId")
.HasColumnType("uuid")
.HasColumnName("granter_user_id");
b.Property("KeyGeneration")
.HasColumnType("integer")
.HasColumnName("key_generation");
b.Property("KeyLogHead")
.HasMaxLength(32)
.HasColumnType("bytea")
.HasColumnName("key_log_head");
b.Property("Kind")
.HasColumnType("integer")
.HasColumnName("kind");
b.Property("RecipientKeyFingerprint")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("bytea")
.HasColumnName("recipient_key_fingerprint");
b.Property("RecipientUserId")
.HasColumnType("uuid")
.HasColumnName("recipient_user_id");
b.Property("RevokedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("revoked_at_utc");
b.Property("Signature")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("bytea")
.HasColumnName("signature");
b.Property("State")
.HasColumnType("integer")
.HasColumnName("state");
b.Property("VaultId")
.HasColumnType("uuid")
.HasColumnName("vault_id");
b.Property("WrappedKey")
.IsRequired()
.HasColumnType("bytea")
.HasColumnName("wrapped_key");
b.Property("xmin")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("xid")
.HasColumnName("xmin");
b.HasKey("Id")
.HasName("pk_vault_key_grant");
b.HasIndex("RecipientUserId")
.HasDatabaseName("ix_vault_key_grant_recipient_user_id");
b.HasIndex("VaultId", "KeyGeneration", "RecipientUserId")
.IsUnique()
.HasDatabaseName("ix_vault_key_grant_vault_id_key_generation_recipient_user_id")
.HasFilter("revoked_at_utc IS NULL AND recipient_user_id IS NOT NULL");
b.ToTable("vault_key_grant", "dodo", t =>
{
t.HasCheckConstraint("ck_vault_key_grant_recipient", "(kind = 1 AND recipient_user_id IS NOT NULL) OR (kind <> 1 AND recipient_user_id IS NULL)");
});
});
modelBuilder.Entity("DodoSSH.Domain.VaultKnownHostKey", b =>
{
b.Property("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property("ChangeSequence")
.HasColumnType("bigint")
.HasColumnName("change_sequence");
b.Property("ContentKeyId")
.HasColumnType("uuid")
.HasColumnName("content_key_id");
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("CreatedByUserId")
.HasColumnType("uuid")
.HasColumnName("created_by_user_id");
b.Property("DataKeyWrap")
.HasColumnType("bytea")
.HasColumnName("data_key_wrap");
b.Property("DeletedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("deleted_at_utc");
b.Property("KeyGeneration")
.HasColumnType("integer")
.HasColumnName("key_generation");
b.Property("Payload")
.IsRequired()
.HasColumnType("bytea")
.HasColumnName("payload");
b.Property("PayloadAadVersion")
.HasColumnType("smallint")
.HasColumnName("payload_aad_version");
b.Property("UpdatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at_utc");
b.Property("UpdatedByUserId")
.HasColumnType("uuid")
.HasColumnName("updated_by_user_id");
b.Property("VaultId")
.HasColumnType("uuid")
.HasColumnName("vault_id");
b.Property("Version")
.HasColumnType("integer")
.HasColumnName("version");
b.Property("xmin")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("xid")
.HasColumnName("xmin");
b.HasKey("Id")
.HasName("pk_known_host_key");
b.HasIndex("VaultId")
.HasDatabaseName("ix_known_host_key_vault_live")
.HasFilter("deleted_at_utc IS NULL");
b.HasIndex("VaultId", "ChangeSequence")
.HasDatabaseName("ix_known_host_key_vault_id_change_sequence");
b.ToTable("known_host_key", "dodo", t =>
{
t.HasCheckConstraint("ck_known_host_key_version", "version >= 1");
});
});
modelBuilder.Entity("DodoSSH.Domain.VaultSnippet", b =>
{
b.Property("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property("ChangeSequence")
.HasColumnType("bigint")
.HasColumnName("change_sequence");
b.Property("ContentKeyId")
.HasColumnType("uuid")
.HasColumnName("content_key_id");
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("CreatedByUserId")
.HasColumnType("uuid")
.HasColumnName("created_by_user_id");
b.Property("DataKeyWrap")
.HasColumnType("bytea")
.HasColumnName("data_key_wrap");
b.Property("DeletedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("deleted_at_utc");
b.Property("KeyGeneration")
.HasColumnType("integer")
.HasColumnName("key_generation");
b.Property("Payload")
.IsRequired()
.HasColumnType("bytea")
.HasColumnName("payload");
b.Property("PayloadAadVersion")
.HasColumnType("smallint")
.HasColumnName("payload_aad_version");
b.Property("UpdatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at_utc");
b.Property("UpdatedByUserId")
.HasColumnType("uuid")
.HasColumnName("updated_by_user_id");
b.Property("VaultId")
.HasColumnType("uuid")
.HasColumnName("vault_id");
b.Property("Version")
.HasColumnType("integer")
.HasColumnName("version");
b.Property("xmin")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("xid")
.HasColumnName("xmin");
b.HasKey("Id")
.HasName("pk_snippet");
b.HasIndex("VaultId")
.HasDatabaseName("ix_snippet_vault_live")
.HasFilter("deleted_at_utc IS NULL");
b.HasIndex("VaultId", "ChangeSequence")
.HasDatabaseName("ix_snippet_vault_id_change_sequence");
b.ToTable("snippet", "dodo", t =>
{
t.HasCheckConstraint("ck_snippet_version", "version >= 1");
});
});
modelBuilder.Entity("DodoSSH.Domain.VaultSshKey", b =>
{
b.Property("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property("ChangeSequence")
.HasColumnType("bigint")
.HasColumnName("change_sequence");
b.Property("ContentKeyId")
.HasColumnType("uuid")
.HasColumnName("content_key_id");
b.Property("CreatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at_utc");
b.Property("CreatedByUserId")
.HasColumnType("uuid")
.HasColumnName("created_by_user_id");
b.Property("DataKeyWrap")
.HasColumnType("bytea")
.HasColumnName("data_key_wrap");
b.Property("DeletedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("deleted_at_utc");
b.Property("KeyGeneration")
.HasColumnType("integer")
.HasColumnName("key_generation");
b.Property("Payload")
.IsRequired()
.HasColumnType("bytea")
.HasColumnName("payload");
b.Property("PayloadAadVersion")
.HasColumnType("smallint")
.HasColumnName("payload_aad_version");
b.Property("PublicKeyFingerprint")
.HasMaxLength(128)
.HasColumnType("character varying(128)")
.HasColumnName("public_key_fingerprint");
b.Property("UpdatedAtUtc")
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at_utc");
b.Property("UpdatedByUserId")
.HasColumnType("uuid")
.HasColumnName("updated_by_user_id");
b.Property("VaultId")
.HasColumnType("uuid")
.HasColumnName("vault_id");
b.Property("Version")
.HasColumnType("integer")
.HasColumnName("version");
b.Property("xmin")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("xid")
.HasColumnName("xmin");
b.HasKey("Id")
.HasName("pk_ssh_key");
b.HasIndex("VaultId")
.HasDatabaseName("ix_ssh_key_vault_live")
.HasFilter("deleted_at_utc IS NULL");
b.HasIndex("VaultId", "ChangeSequence")
.HasDatabaseName("ix_ssh_key_vault_id_change_sequence");
b.ToTable("ssh_key", "dodo", t =>
{
t.HasCheckConstraint("ck_ssh_key_version", "version >= 1");
});
});
modelBuilder.Entity("DodoSSH.Domain.Device", b =>
{
b.HasOne("DodoSSH.Domain.UserAccount", "User")
.WithMany("Devices")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_device_users_user_id");
b.Navigation("User");
});
modelBuilder.Entity("DodoSSH.Domain.SshHost", b =>
{
b.HasOne("DodoSSH.Domain.Vault", "Vault")
.WithMany("Hosts")
.HasForeignKey("VaultId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_host_vaults_vault_id");
b.Navigation("Vault");
});
modelBuilder.Entity("DodoSSH.Domain.TeamMembership", b =>
{
b.HasOne("DodoSSH.Domain.Team", "Team")
.WithMany("Memberships")
.HasForeignKey("TeamId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_team_membership_team_team_id");
b.HasOne("DodoSSH.Domain.UserAccount", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_team_membership_users_user_id");
b.Navigation("Team");
b.Navigation("User");
});
modelBuilder.Entity("DodoSSH.Domain.UserKey", b =>
{
b.HasOne("DodoSSH.Domain.UserAccount", "User")
.WithMany("Keys")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_user_key_user_account_user_id");
b.Navigation("User");
});
modelBuilder.Entity("DodoSSH.Domain.UserKeyWrap", b =>
{
b.HasOne("DodoSSH.Domain.Device", "Device")
.WithMany()
.HasForeignKey("DeviceId")
.OnDelete(DeleteBehavior.Cascade)
.HasConstraintName("fk_user_key_wrap_device_device_id");
b.HasOne("DodoSSH.Domain.UserAccount", "User")
.WithMany("KeyWraps")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_user_key_wrap_user_account_user_id");
b.Navigation("Device");
b.Navigation("User");
});
modelBuilder.Entity("DodoSSH.Domain.Vault", b =>
{
b.HasOne("DodoSSH.Domain.UserAccount", "OwnerUser")
.WithMany()
.HasForeignKey("OwnerUserId")
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("fk_vault_user_account_owner_user_id");
b.HasOne("DodoSSH.Domain.Team", "Team")
.WithMany()
.HasForeignKey("TeamId")
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("fk_vault_team_team_id");
b.Navigation("OwnerUser");
b.Navigation("Team");
});
modelBuilder.Entity("DodoSSH.Domain.VaultCredential", b =>
{
b.HasOne("DodoSSH.Domain.Vault", "Vault")
.WithMany()
.HasForeignKey("VaultId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_credential_vaults_vault_id");
b.Navigation("Vault");
});
modelBuilder.Entity("DodoSSH.Domain.VaultHostGroup", b =>
{
b.HasOne("DodoSSH.Domain.Vault", "Vault")
.WithMany()
.HasForeignKey("VaultId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_host_group_vaults_vault_id");
b.Navigation("Vault");
});
modelBuilder.Entity("DodoSSH.Domain.VaultKeyGrant", b =>
{
b.HasOne("DodoSSH.Domain.UserAccount", "RecipientUser")
.WithMany()
.HasForeignKey("RecipientUserId")
.OnDelete(DeleteBehavior.Cascade)
.HasConstraintName("fk_vault_key_grant_user_account_recipient_user_id");
b.HasOne("DodoSSH.Domain.Vault", "Vault")
.WithMany("KeyGrants")
.HasForeignKey("VaultId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_vault_key_grant_vault_vault_id");
b.Navigation("RecipientUser");
b.Navigation("Vault");
});
modelBuilder.Entity("DodoSSH.Domain.VaultKnownHostKey", b =>
{
b.HasOne("DodoSSH.Domain.Vault", "Vault")
.WithMany()
.HasForeignKey("VaultId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_known_host_key_vaults_vault_id");
b.Navigation("Vault");
});
modelBuilder.Entity("DodoSSH.Domain.VaultSnippet", b =>
{
b.HasOne("DodoSSH.Domain.Vault", "Vault")
.WithMany()
.HasForeignKey("VaultId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_snippet_vaults_vault_id");
b.Navigation("Vault");
});
modelBuilder.Entity("DodoSSH.Domain.VaultSshKey", b =>
{
b.HasOne("DodoSSH.Domain.Vault", "Vault")
.WithMany()
.HasForeignKey("VaultId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_ssh_key_vaults_vault_id");
b.Navigation("Vault");
});
modelBuilder.Entity("DodoSSH.Domain.Team", b =>
{
b.Navigation("Memberships");
});
modelBuilder.Entity("DodoSSH.Domain.UserAccount", b =>
{
b.Navigation("Devices");
b.Navigation("KeyWraps");
b.Navigation("Keys");
});
modelBuilder.Entity("DodoSSH.Domain.Vault", b =>
{
b.Navigation("Hosts");
b.Navigation("KeyGrants");
});
#pragma warning restore 612, 618
}
}
}