From 1a9e1967ede8a9eb5be52b07569793c76897c3ff Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Tue, 7 Oct 2025 13:16:16 +0200 Subject: [PATCH] Add FK repair script to migration to fix older vaults (#520) --- .../utils/dist/shared/vault-sql/index.d.mts | 2 +- .../utils/dist/shared/vault-sql/index.d.ts | 2 +- .../src/utils/dist/shared/vault-sql/index.js | 360 +++++++++++++++++- .../src/utils/dist/shared/vault-sql/index.mjs | 360 +++++++++++++++++- .../utils/dist/shared/vault-sql/index.d.mts | 2 +- .../utils/dist/shared/vault-sql/index.d.ts | 2 +- .../utils/dist/shared/vault-sql/index.js | 360 +++++++++++++++++- .../utils/dist/shared/vault-sql/index.mjs | 360 +++++++++++++++++- .../StatusMessages/PendingMigrations.razor | 2 +- .../js/dist/shared/vault-sql/index.d.mts | 2 +- .../js/dist/shared/vault-sql/index.d.ts | 2 +- .../wwwroot/js/dist/shared/vault-sql/index.js | 360 +++++++++++++++++- .../js/dist/shared/vault-sql/index.mjs | 360 +++++++++++++++++- .../20251007084230_1.6.0-AddPasskeys.cs | 61 --- ...51007085746_1.6.0-AddPasskeys.Designer.cs} | 2 +- .../20251007085746_1.6.0-AddPasskeys.cs | 240 ++++++++++++ .../server/Databases/AliasClientDb/Passkey.cs | 23 +- .../Scripts/MigrationSql/000_FullSchema.sql | 180 ++++++++- ...es_to_20251007084230_1.6.0-AddPasskeys.sql | 26 -- ...es_to_20251007085746_1.6.0-AddPasskeys.sql | 202 ++++++++++ shared/vault-sql/src/sql/SqlConstants.ts | 360 +++++++++++++++++- 21 files changed, 3131 insertions(+), 137 deletions(-) delete mode 100644 apps/server/Databases/AliasClientDb/Migrations/20251007084230_1.6.0-AddPasskeys.cs rename apps/server/Databases/AliasClientDb/Migrations/{20251007084230_1.6.0-AddPasskeys.Designer.cs => 20251007085746_1.6.0-AddPasskeys.Designer.cs} (99%) create mode 100644 apps/server/Databases/AliasClientDb/Migrations/20251007085746_1.6.0-AddPasskeys.cs delete mode 100644 apps/server/Databases/AliasClientDb/Scripts/MigrationSql/010_20250310131554_1.5.0-AddTotpCodes_to_20251007084230_1.6.0-AddPasskeys.sql create mode 100644 apps/server/Databases/AliasClientDb/Scripts/MigrationSql/010_20250310131554_1.5.0-AddTotpCodes_to_20251007085746_1.6.0-AddPasskeys.sql diff --git a/apps/browser-extension/src/utils/dist/shared/vault-sql/index.d.mts b/apps/browser-extension/src/utils/dist/shared/vault-sql/index.d.mts index b341024b4..ea25cb473 100644 --- a/apps/browser-extension/src/utils/dist/shared/vault-sql/index.d.mts +++ b/apps/browser-extension/src/utils/dist/shared/vault-sql/index.d.mts @@ -122,7 +122,7 @@ declare const VAULT_VERSIONS: VaultVersion[]; * Complete database schema SQL (latest version) * Auto-generated from EF Core migrations */ -declare const COMPLETE_SCHEMA_SQL = "\n\uFEFFCREATE TABLE IF NOT EXISTS \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nBEGIN TRANSACTION;\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"Gender\" VARCHAR NULL,\n \"FirstName\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"BirthDate\" TEXT NOT NULL,\n \"AddressStreet\" VARCHAR NULL,\n \"AddressCity\" VARCHAR NULL,\n \"AddressState\" VARCHAR NULL,\n \"AddressZipCode\" VARCHAR NULL,\n \"AddressCountry\" VARCHAR NULL,\n \"Hobbies\" TEXT NULL,\n \"EmailPrefix\" TEXT NULL,\n \"PhoneMobile\" TEXT NULL,\n \"BankAccountIBAN\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"Username\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"ServiceId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachment\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachment\" PRIMARY KEY,\n \"Filename\" TEXT NOT NULL,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachment_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Attachment_CredentialId\" ON \"Attachment\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708094944_1.0.0-InitialMigration', '9.0.4');\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708224522_1.0.1-EmptyTestMigration', '9.0.4');\n\nALTER TABLE \"Aliases\" RENAME COLUMN \"EmailPrefix\" TO \"Email\";\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240711204207_1.0.2-ChangeEmailColumn', '9.0.4');\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240729105618_1.1.0-AddPkiTables', '9.0.4');\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805073413_1.2.0-AddSettingsTable', '9.0.4');\n\nCREATE TABLE \"ef_temp_Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"ef_temp_Aliases\" (\"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\")\nSELECT \"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\"\nFROM \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Aliases\";\n\nALTER TABLE \"ef_temp_Aliases\" RENAME TO \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805122422_1.3.0-UpdateIdentityStructure', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"ef_temp_Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Credentials\" (\"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\")\nSELECT \"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\"\nFROM \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Credentials\";\n\nALTER TABLE \"ef_temp_Credentials\" RENAME TO \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240812141727_1.3.1-MakeUsernameOptional', '9.0.4');\n\nBEGIN TRANSACTION;\nALTER TABLE \"Settings\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Services\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Passwords\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"EncryptionKeys\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Credentials\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Attachment\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Aliases\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240916105320_1.4.0-AddSyncSupport', '9.0.4');\n\nALTER TABLE \"Attachment\" RENAME TO \"Attachments\";\n\nCREATE TABLE \"ef_temp_Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Attachments\" (\"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\")\nSELECT \"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\"\nFROM \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Attachments\";\n\nALTER TABLE \"ef_temp_Attachments\" RENAME TO \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240917191243_1.4.1-RenameAttachmentsPlural', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4');\n\nCREATE TABLE \"Passkeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passkeys\" PRIMARY KEY,\n \"CredentialId\" TEXT NOT NULL,\n \"RpId\" TEXT COLLATE NOCASE NOT NULL,\n \"UserId\" TEXT NULL,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"PrfKey\" BLOB NULL,\n \"DisplayName\" TEXT NOT NULL,\n \"AdditionalData\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_Passkeys_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Passkeys_CredentialId\" ON \"Passkeys\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Passkeys_RpId\" ON \"Passkeys\" (\"RpId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4');\n\nCOMMIT;\n"; +declare const COMPLETE_SCHEMA_SQL = "\n\uFEFFCREATE TABLE IF NOT EXISTS \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nBEGIN TRANSACTION;\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"Gender\" VARCHAR NULL,\n \"FirstName\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"BirthDate\" TEXT NOT NULL,\n \"AddressStreet\" VARCHAR NULL,\n \"AddressCity\" VARCHAR NULL,\n \"AddressState\" VARCHAR NULL,\n \"AddressZipCode\" VARCHAR NULL,\n \"AddressCountry\" VARCHAR NULL,\n \"Hobbies\" TEXT NULL,\n \"EmailPrefix\" TEXT NULL,\n \"PhoneMobile\" TEXT NULL,\n \"BankAccountIBAN\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"Username\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"ServiceId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachment\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachment\" PRIMARY KEY,\n \"Filename\" TEXT NOT NULL,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachment_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Attachment_CredentialId\" ON \"Attachment\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708094944_1.0.0-InitialMigration', '9.0.4');\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708224522_1.0.1-EmptyTestMigration', '9.0.4');\n\nALTER TABLE \"Aliases\" RENAME COLUMN \"EmailPrefix\" TO \"Email\";\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240711204207_1.0.2-ChangeEmailColumn', '9.0.4');\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240729105618_1.1.0-AddPkiTables', '9.0.4');\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805073413_1.2.0-AddSettingsTable', '9.0.4');\n\nCREATE TABLE \"ef_temp_Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"ef_temp_Aliases\" (\"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\")\nSELECT \"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\"\nFROM \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Aliases\";\n\nALTER TABLE \"ef_temp_Aliases\" RENAME TO \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805122422_1.3.0-UpdateIdentityStructure', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"ef_temp_Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Credentials\" (\"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\")\nSELECT \"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\"\nFROM \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Credentials\";\n\nALTER TABLE \"ef_temp_Credentials\" RENAME TO \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240812141727_1.3.1-MakeUsernameOptional', '9.0.4');\n\nBEGIN TRANSACTION;\nALTER TABLE \"Settings\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Services\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Passwords\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"EncryptionKeys\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Credentials\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Attachment\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Aliases\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240916105320_1.4.0-AddSyncSupport', '9.0.4');\n\nALTER TABLE \"Attachment\" RENAME TO \"Attachments\";\n\nCREATE TABLE \"ef_temp_Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Attachments\" (\"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\")\nSELECT \"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\"\nFROM \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Attachments\";\n\nALTER TABLE \"ef_temp_Attachments\" RENAME TO \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240917191243_1.4.1-RenameAttachmentsPlural', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4');\n\n\nPRAGMA foreign_keys = OFF;\n\n-- Clean up any existing temp tables first\nDROP TABLE IF EXISTS \"__EFMigrationsHistory_temp\";\nDROP TABLE IF EXISTS \"Aliases_temp\";\nDROP TABLE IF EXISTS \"Services_temp\";\nDROP TABLE IF EXISTS \"EncryptionKeys_temp\";\nDROP TABLE IF EXISTS \"Settings_temp\";\nDROP TABLE IF EXISTS \"Credentials_temp\";\nDROP TABLE IF EXISTS \"Attachments_temp\";\nDROP TABLE IF EXISTS \"Passwords_temp\";\nDROP TABLE IF EXISTS \"TotpCodes_temp\";\n\n-- Create backup tables for all data\nCREATE TABLE \"__EFMigrationsHistory_temp\" AS SELECT * FROM \"__EFMigrationsHistory\";\nCREATE TABLE \"Aliases_temp\" AS SELECT * FROM \"Aliases\";\nCREATE TABLE \"Services_temp\" AS SELECT * FROM \"Services\";\nCREATE TABLE \"EncryptionKeys_temp\" AS SELECT * FROM \"EncryptionKeys\";\nCREATE TABLE \"Settings_temp\" AS SELECT * FROM \"Settings\";\nCREATE TABLE \"Credentials_temp\" AS SELECT * FROM \"Credentials\";\nCREATE TABLE \"Attachments_temp\" AS SELECT * FROM \"Attachments\";\nCREATE TABLE \"Passwords_temp\" AS SELECT * FROM \"Passwords\";\nCREATE TABLE \"TotpCodes_temp\" AS SELECT * FROM \"TotpCodes\";\n\n-- Delete orphaned records that do not have a valid FK to the credential object\nDELETE FROM \"Attachments_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"Passwords_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"TotpCodes_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\n\n-- Delete orphaned credentials that do not have valid FKs to alias or service objects\nDELETE FROM \"Credentials_temp\" WHERE \"AliasId\" NOT IN (SELECT \"Id\" FROM \"Aliases_temp\");\nDELETE FROM \"Credentials_temp\" WHERE \"ServiceId\" NOT IN (SELECT \"Id\" FROM \"Services_temp\");\n\n-- After cleaning credentials, clean dependent tables again in case we removed credentials\nDELETE FROM \"Attachments_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"Passwords_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"TotpCodes_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\n\n-- Drop all existing tables\nDROP TABLE \"TotpCodes\";\nDROP TABLE \"Passwords\";\nDROP TABLE \"Attachments\";\nDROP TABLE \"Credentials\";\nDROP TABLE \"Settings\";\nDROP TABLE \"EncryptionKeys\";\nDROP TABLE \"Services\";\nDROP TABLE \"Aliases\";\nDROP TABLE \"__EFMigrationsHistory\";\n\n-- Recreate tables with proper constraints (no dependencies first)\nCREATE TABLE \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\n-- Tables with foreign keys\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\n\n-- Restore data from temp tables\nINSERT INTO \"__EFMigrationsHistory\" SELECT * FROM \"__EFMigrationsHistory_temp\";\nINSERT INTO \"Aliases\" SELECT * FROM \"Aliases_temp\";\nINSERT INTO \"Services\" SELECT * FROM \"Services_temp\";\nINSERT INTO \"EncryptionKeys\" SELECT * FROM \"EncryptionKeys_temp\";\nINSERT INTO \"Settings\" SELECT * FROM \"Settings_temp\";\nINSERT INTO \"Credentials\" SELECT * FROM \"Credentials_temp\";\nINSERT INTO \"Attachments\" SELECT * FROM \"Attachments_temp\";\nINSERT INTO \"Passwords\" SELECT * FROM \"Passwords_temp\";\nINSERT INTO \"TotpCodes\" SELECT * FROM \"TotpCodes_temp\";\n\n-- Recreate indexes\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\n-- Clean up temp tables\nDROP TABLE \"__EFMigrationsHistory_temp\";\nDROP TABLE \"Aliases_temp\";\nDROP TABLE \"Services_temp\";\nDROP TABLE \"EncryptionKeys_temp\";\nDROP TABLE \"Settings_temp\";\nDROP TABLE \"Credentials_temp\";\nDROP TABLE \"Attachments_temp\";\nDROP TABLE \"Passwords_temp\";\nDROP TABLE \"TotpCodes_temp\";\n\nPRAGMA foreign_keys = ON;\n\n\nCREATE TABLE \"Passkeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passkeys\" PRIMARY KEY,\n \"RpId\" TEXT COLLATE NOCASE NOT NULL,\n \"UserId\" TEXT NULL,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"PrfKey\" BLOB NULL,\n \"DisplayName\" TEXT NOT NULL,\n \"AdditionalData\" BLOB NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_Passkeys_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Passkeys_CredentialId\" ON \"Passkeys\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Passkeys_RpId\" ON \"Passkeys\" (\"RpId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4');\n\nCOMMIT;\n"; /** * Individual migration SQL scripts * Auto-generated from EF Core migrations diff --git a/apps/browser-extension/src/utils/dist/shared/vault-sql/index.d.ts b/apps/browser-extension/src/utils/dist/shared/vault-sql/index.d.ts index b341024b4..ea25cb473 100644 --- a/apps/browser-extension/src/utils/dist/shared/vault-sql/index.d.ts +++ b/apps/browser-extension/src/utils/dist/shared/vault-sql/index.d.ts @@ -122,7 +122,7 @@ declare const VAULT_VERSIONS: VaultVersion[]; * Complete database schema SQL (latest version) * Auto-generated from EF Core migrations */ -declare const COMPLETE_SCHEMA_SQL = "\n\uFEFFCREATE TABLE IF NOT EXISTS \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nBEGIN TRANSACTION;\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"Gender\" VARCHAR NULL,\n \"FirstName\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"BirthDate\" TEXT NOT NULL,\n \"AddressStreet\" VARCHAR NULL,\n \"AddressCity\" VARCHAR NULL,\n \"AddressState\" VARCHAR NULL,\n \"AddressZipCode\" VARCHAR NULL,\n \"AddressCountry\" VARCHAR NULL,\n \"Hobbies\" TEXT NULL,\n \"EmailPrefix\" TEXT NULL,\n \"PhoneMobile\" TEXT NULL,\n \"BankAccountIBAN\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"Username\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"ServiceId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachment\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachment\" PRIMARY KEY,\n \"Filename\" TEXT NOT NULL,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachment_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Attachment_CredentialId\" ON \"Attachment\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708094944_1.0.0-InitialMigration', '9.0.4');\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708224522_1.0.1-EmptyTestMigration', '9.0.4');\n\nALTER TABLE \"Aliases\" RENAME COLUMN \"EmailPrefix\" TO \"Email\";\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240711204207_1.0.2-ChangeEmailColumn', '9.0.4');\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240729105618_1.1.0-AddPkiTables', '9.0.4');\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805073413_1.2.0-AddSettingsTable', '9.0.4');\n\nCREATE TABLE \"ef_temp_Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"ef_temp_Aliases\" (\"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\")\nSELECT \"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\"\nFROM \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Aliases\";\n\nALTER TABLE \"ef_temp_Aliases\" RENAME TO \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805122422_1.3.0-UpdateIdentityStructure', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"ef_temp_Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Credentials\" (\"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\")\nSELECT \"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\"\nFROM \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Credentials\";\n\nALTER TABLE \"ef_temp_Credentials\" RENAME TO \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240812141727_1.3.1-MakeUsernameOptional', '9.0.4');\n\nBEGIN TRANSACTION;\nALTER TABLE \"Settings\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Services\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Passwords\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"EncryptionKeys\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Credentials\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Attachment\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Aliases\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240916105320_1.4.0-AddSyncSupport', '9.0.4');\n\nALTER TABLE \"Attachment\" RENAME TO \"Attachments\";\n\nCREATE TABLE \"ef_temp_Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Attachments\" (\"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\")\nSELECT \"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\"\nFROM \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Attachments\";\n\nALTER TABLE \"ef_temp_Attachments\" RENAME TO \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240917191243_1.4.1-RenameAttachmentsPlural', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4');\n\nCREATE TABLE \"Passkeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passkeys\" PRIMARY KEY,\n \"CredentialId\" TEXT NOT NULL,\n \"RpId\" TEXT COLLATE NOCASE NOT NULL,\n \"UserId\" TEXT NULL,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"PrfKey\" BLOB NULL,\n \"DisplayName\" TEXT NOT NULL,\n \"AdditionalData\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_Passkeys_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Passkeys_CredentialId\" ON \"Passkeys\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Passkeys_RpId\" ON \"Passkeys\" (\"RpId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4');\n\nCOMMIT;\n"; +declare const COMPLETE_SCHEMA_SQL = "\n\uFEFFCREATE TABLE IF NOT EXISTS \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nBEGIN TRANSACTION;\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"Gender\" VARCHAR NULL,\n \"FirstName\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"BirthDate\" TEXT NOT NULL,\n \"AddressStreet\" VARCHAR NULL,\n \"AddressCity\" VARCHAR NULL,\n \"AddressState\" VARCHAR NULL,\n \"AddressZipCode\" VARCHAR NULL,\n \"AddressCountry\" VARCHAR NULL,\n \"Hobbies\" TEXT NULL,\n \"EmailPrefix\" TEXT NULL,\n \"PhoneMobile\" TEXT NULL,\n \"BankAccountIBAN\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"Username\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"ServiceId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachment\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachment\" PRIMARY KEY,\n \"Filename\" TEXT NOT NULL,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachment_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Attachment_CredentialId\" ON \"Attachment\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708094944_1.0.0-InitialMigration', '9.0.4');\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708224522_1.0.1-EmptyTestMigration', '9.0.4');\n\nALTER TABLE \"Aliases\" RENAME COLUMN \"EmailPrefix\" TO \"Email\";\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240711204207_1.0.2-ChangeEmailColumn', '9.0.4');\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240729105618_1.1.0-AddPkiTables', '9.0.4');\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805073413_1.2.0-AddSettingsTable', '9.0.4');\n\nCREATE TABLE \"ef_temp_Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"ef_temp_Aliases\" (\"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\")\nSELECT \"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\"\nFROM \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Aliases\";\n\nALTER TABLE \"ef_temp_Aliases\" RENAME TO \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805122422_1.3.0-UpdateIdentityStructure', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"ef_temp_Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Credentials\" (\"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\")\nSELECT \"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\"\nFROM \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Credentials\";\n\nALTER TABLE \"ef_temp_Credentials\" RENAME TO \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240812141727_1.3.1-MakeUsernameOptional', '9.0.4');\n\nBEGIN TRANSACTION;\nALTER TABLE \"Settings\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Services\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Passwords\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"EncryptionKeys\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Credentials\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Attachment\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Aliases\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240916105320_1.4.0-AddSyncSupport', '9.0.4');\n\nALTER TABLE \"Attachment\" RENAME TO \"Attachments\";\n\nCREATE TABLE \"ef_temp_Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Attachments\" (\"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\")\nSELECT \"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\"\nFROM \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Attachments\";\n\nALTER TABLE \"ef_temp_Attachments\" RENAME TO \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240917191243_1.4.1-RenameAttachmentsPlural', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4');\n\n\nPRAGMA foreign_keys = OFF;\n\n-- Clean up any existing temp tables first\nDROP TABLE IF EXISTS \"__EFMigrationsHistory_temp\";\nDROP TABLE IF EXISTS \"Aliases_temp\";\nDROP TABLE IF EXISTS \"Services_temp\";\nDROP TABLE IF EXISTS \"EncryptionKeys_temp\";\nDROP TABLE IF EXISTS \"Settings_temp\";\nDROP TABLE IF EXISTS \"Credentials_temp\";\nDROP TABLE IF EXISTS \"Attachments_temp\";\nDROP TABLE IF EXISTS \"Passwords_temp\";\nDROP TABLE IF EXISTS \"TotpCodes_temp\";\n\n-- Create backup tables for all data\nCREATE TABLE \"__EFMigrationsHistory_temp\" AS SELECT * FROM \"__EFMigrationsHistory\";\nCREATE TABLE \"Aliases_temp\" AS SELECT * FROM \"Aliases\";\nCREATE TABLE \"Services_temp\" AS SELECT * FROM \"Services\";\nCREATE TABLE \"EncryptionKeys_temp\" AS SELECT * FROM \"EncryptionKeys\";\nCREATE TABLE \"Settings_temp\" AS SELECT * FROM \"Settings\";\nCREATE TABLE \"Credentials_temp\" AS SELECT * FROM \"Credentials\";\nCREATE TABLE \"Attachments_temp\" AS SELECT * FROM \"Attachments\";\nCREATE TABLE \"Passwords_temp\" AS SELECT * FROM \"Passwords\";\nCREATE TABLE \"TotpCodes_temp\" AS SELECT * FROM \"TotpCodes\";\n\n-- Delete orphaned records that do not have a valid FK to the credential object\nDELETE FROM \"Attachments_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"Passwords_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"TotpCodes_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\n\n-- Delete orphaned credentials that do not have valid FKs to alias or service objects\nDELETE FROM \"Credentials_temp\" WHERE \"AliasId\" NOT IN (SELECT \"Id\" FROM \"Aliases_temp\");\nDELETE FROM \"Credentials_temp\" WHERE \"ServiceId\" NOT IN (SELECT \"Id\" FROM \"Services_temp\");\n\n-- After cleaning credentials, clean dependent tables again in case we removed credentials\nDELETE FROM \"Attachments_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"Passwords_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"TotpCodes_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\n\n-- Drop all existing tables\nDROP TABLE \"TotpCodes\";\nDROP TABLE \"Passwords\";\nDROP TABLE \"Attachments\";\nDROP TABLE \"Credentials\";\nDROP TABLE \"Settings\";\nDROP TABLE \"EncryptionKeys\";\nDROP TABLE \"Services\";\nDROP TABLE \"Aliases\";\nDROP TABLE \"__EFMigrationsHistory\";\n\n-- Recreate tables with proper constraints (no dependencies first)\nCREATE TABLE \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\n-- Tables with foreign keys\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\n\n-- Restore data from temp tables\nINSERT INTO \"__EFMigrationsHistory\" SELECT * FROM \"__EFMigrationsHistory_temp\";\nINSERT INTO \"Aliases\" SELECT * FROM \"Aliases_temp\";\nINSERT INTO \"Services\" SELECT * FROM \"Services_temp\";\nINSERT INTO \"EncryptionKeys\" SELECT * FROM \"EncryptionKeys_temp\";\nINSERT INTO \"Settings\" SELECT * FROM \"Settings_temp\";\nINSERT INTO \"Credentials\" SELECT * FROM \"Credentials_temp\";\nINSERT INTO \"Attachments\" SELECT * FROM \"Attachments_temp\";\nINSERT INTO \"Passwords\" SELECT * FROM \"Passwords_temp\";\nINSERT INTO \"TotpCodes\" SELECT * FROM \"TotpCodes_temp\";\n\n-- Recreate indexes\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\n-- Clean up temp tables\nDROP TABLE \"__EFMigrationsHistory_temp\";\nDROP TABLE \"Aliases_temp\";\nDROP TABLE \"Services_temp\";\nDROP TABLE \"EncryptionKeys_temp\";\nDROP TABLE \"Settings_temp\";\nDROP TABLE \"Credentials_temp\";\nDROP TABLE \"Attachments_temp\";\nDROP TABLE \"Passwords_temp\";\nDROP TABLE \"TotpCodes_temp\";\n\nPRAGMA foreign_keys = ON;\n\n\nCREATE TABLE \"Passkeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passkeys\" PRIMARY KEY,\n \"RpId\" TEXT COLLATE NOCASE NOT NULL,\n \"UserId\" TEXT NULL,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"PrfKey\" BLOB NULL,\n \"DisplayName\" TEXT NOT NULL,\n \"AdditionalData\" BLOB NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_Passkeys_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Passkeys_CredentialId\" ON \"Passkeys\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Passkeys_RpId\" ON \"Passkeys\" (\"RpId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4');\n\nCOMMIT;\n"; /** * Individual migration SQL scripts * Auto-generated from EF Core migrations diff --git a/apps/browser-extension/src/utils/dist/shared/vault-sql/index.js b/apps/browser-extension/src/utils/dist/shared/vault-sql/index.js index fc2009e4a..23deaf64d 100644 --- a/apps/browser-extension/src/utils/dist/shared/vault-sql/index.js +++ b/apps/browser-extension/src/utils/dist/shared/vault-sql/index.js @@ -285,9 +285,184 @@ CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -295,6 +470,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -306,7 +482,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT; `; @@ -496,9 +672,184 @@ VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); COMMIT;`, 10: `\uFEFFBEGIN TRANSACTION; + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -506,6 +857,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -517,7 +869,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT;` }; diff --git a/apps/browser-extension/src/utils/dist/shared/vault-sql/index.mjs b/apps/browser-extension/src/utils/dist/shared/vault-sql/index.mjs index cc4ac4245..0899a348b 100644 --- a/apps/browser-extension/src/utils/dist/shared/vault-sql/index.mjs +++ b/apps/browser-extension/src/utils/dist/shared/vault-sql/index.mjs @@ -256,9 +256,184 @@ CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -266,6 +441,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -277,7 +453,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT; `; @@ -467,9 +643,184 @@ VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); COMMIT;`, 10: `\uFEFFBEGIN TRANSACTION; + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -477,6 +828,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -488,7 +840,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT;` }; diff --git a/apps/mobile-app/utils/dist/shared/vault-sql/index.d.mts b/apps/mobile-app/utils/dist/shared/vault-sql/index.d.mts index b341024b4..ea25cb473 100644 --- a/apps/mobile-app/utils/dist/shared/vault-sql/index.d.mts +++ b/apps/mobile-app/utils/dist/shared/vault-sql/index.d.mts @@ -122,7 +122,7 @@ declare const VAULT_VERSIONS: VaultVersion[]; * Complete database schema SQL (latest version) * Auto-generated from EF Core migrations */ -declare const COMPLETE_SCHEMA_SQL = "\n\uFEFFCREATE TABLE IF NOT EXISTS \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nBEGIN TRANSACTION;\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"Gender\" VARCHAR NULL,\n \"FirstName\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"BirthDate\" TEXT NOT NULL,\n \"AddressStreet\" VARCHAR NULL,\n \"AddressCity\" VARCHAR NULL,\n \"AddressState\" VARCHAR NULL,\n \"AddressZipCode\" VARCHAR NULL,\n \"AddressCountry\" VARCHAR NULL,\n \"Hobbies\" TEXT NULL,\n \"EmailPrefix\" TEXT NULL,\n \"PhoneMobile\" TEXT NULL,\n \"BankAccountIBAN\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"Username\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"ServiceId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachment\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachment\" PRIMARY KEY,\n \"Filename\" TEXT NOT NULL,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachment_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Attachment_CredentialId\" ON \"Attachment\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708094944_1.0.0-InitialMigration', '9.0.4');\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708224522_1.0.1-EmptyTestMigration', '9.0.4');\n\nALTER TABLE \"Aliases\" RENAME COLUMN \"EmailPrefix\" TO \"Email\";\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240711204207_1.0.2-ChangeEmailColumn', '9.0.4');\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240729105618_1.1.0-AddPkiTables', '9.0.4');\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805073413_1.2.0-AddSettingsTable', '9.0.4');\n\nCREATE TABLE \"ef_temp_Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"ef_temp_Aliases\" (\"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\")\nSELECT \"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\"\nFROM \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Aliases\";\n\nALTER TABLE \"ef_temp_Aliases\" RENAME TO \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805122422_1.3.0-UpdateIdentityStructure', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"ef_temp_Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Credentials\" (\"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\")\nSELECT \"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\"\nFROM \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Credentials\";\n\nALTER TABLE \"ef_temp_Credentials\" RENAME TO \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240812141727_1.3.1-MakeUsernameOptional', '9.0.4');\n\nBEGIN TRANSACTION;\nALTER TABLE \"Settings\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Services\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Passwords\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"EncryptionKeys\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Credentials\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Attachment\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Aliases\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240916105320_1.4.0-AddSyncSupport', '9.0.4');\n\nALTER TABLE \"Attachment\" RENAME TO \"Attachments\";\n\nCREATE TABLE \"ef_temp_Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Attachments\" (\"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\")\nSELECT \"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\"\nFROM \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Attachments\";\n\nALTER TABLE \"ef_temp_Attachments\" RENAME TO \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240917191243_1.4.1-RenameAttachmentsPlural', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4');\n\nCREATE TABLE \"Passkeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passkeys\" PRIMARY KEY,\n \"CredentialId\" TEXT NOT NULL,\n \"RpId\" TEXT COLLATE NOCASE NOT NULL,\n \"UserId\" TEXT NULL,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"PrfKey\" BLOB NULL,\n \"DisplayName\" TEXT NOT NULL,\n \"AdditionalData\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_Passkeys_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Passkeys_CredentialId\" ON \"Passkeys\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Passkeys_RpId\" ON \"Passkeys\" (\"RpId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4');\n\nCOMMIT;\n"; +declare const COMPLETE_SCHEMA_SQL = "\n\uFEFFCREATE TABLE IF NOT EXISTS \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nBEGIN TRANSACTION;\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"Gender\" VARCHAR NULL,\n \"FirstName\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"BirthDate\" TEXT NOT NULL,\n \"AddressStreet\" VARCHAR NULL,\n \"AddressCity\" VARCHAR NULL,\n \"AddressState\" VARCHAR NULL,\n \"AddressZipCode\" VARCHAR NULL,\n \"AddressCountry\" VARCHAR NULL,\n \"Hobbies\" TEXT NULL,\n \"EmailPrefix\" TEXT NULL,\n \"PhoneMobile\" TEXT NULL,\n \"BankAccountIBAN\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"Username\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"ServiceId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachment\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachment\" PRIMARY KEY,\n \"Filename\" TEXT NOT NULL,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachment_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Attachment_CredentialId\" ON \"Attachment\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708094944_1.0.0-InitialMigration', '9.0.4');\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708224522_1.0.1-EmptyTestMigration', '9.0.4');\n\nALTER TABLE \"Aliases\" RENAME COLUMN \"EmailPrefix\" TO \"Email\";\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240711204207_1.0.2-ChangeEmailColumn', '9.0.4');\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240729105618_1.1.0-AddPkiTables', '9.0.4');\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805073413_1.2.0-AddSettingsTable', '9.0.4');\n\nCREATE TABLE \"ef_temp_Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"ef_temp_Aliases\" (\"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\")\nSELECT \"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\"\nFROM \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Aliases\";\n\nALTER TABLE \"ef_temp_Aliases\" RENAME TO \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805122422_1.3.0-UpdateIdentityStructure', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"ef_temp_Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Credentials\" (\"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\")\nSELECT \"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\"\nFROM \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Credentials\";\n\nALTER TABLE \"ef_temp_Credentials\" RENAME TO \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240812141727_1.3.1-MakeUsernameOptional', '9.0.4');\n\nBEGIN TRANSACTION;\nALTER TABLE \"Settings\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Services\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Passwords\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"EncryptionKeys\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Credentials\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Attachment\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Aliases\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240916105320_1.4.0-AddSyncSupport', '9.0.4');\n\nALTER TABLE \"Attachment\" RENAME TO \"Attachments\";\n\nCREATE TABLE \"ef_temp_Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Attachments\" (\"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\")\nSELECT \"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\"\nFROM \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Attachments\";\n\nALTER TABLE \"ef_temp_Attachments\" RENAME TO \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240917191243_1.4.1-RenameAttachmentsPlural', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4');\n\n\nPRAGMA foreign_keys = OFF;\n\n-- Clean up any existing temp tables first\nDROP TABLE IF EXISTS \"__EFMigrationsHistory_temp\";\nDROP TABLE IF EXISTS \"Aliases_temp\";\nDROP TABLE IF EXISTS \"Services_temp\";\nDROP TABLE IF EXISTS \"EncryptionKeys_temp\";\nDROP TABLE IF EXISTS \"Settings_temp\";\nDROP TABLE IF EXISTS \"Credentials_temp\";\nDROP TABLE IF EXISTS \"Attachments_temp\";\nDROP TABLE IF EXISTS \"Passwords_temp\";\nDROP TABLE IF EXISTS \"TotpCodes_temp\";\n\n-- Create backup tables for all data\nCREATE TABLE \"__EFMigrationsHistory_temp\" AS SELECT * FROM \"__EFMigrationsHistory\";\nCREATE TABLE \"Aliases_temp\" AS SELECT * FROM \"Aliases\";\nCREATE TABLE \"Services_temp\" AS SELECT * FROM \"Services\";\nCREATE TABLE \"EncryptionKeys_temp\" AS SELECT * FROM \"EncryptionKeys\";\nCREATE TABLE \"Settings_temp\" AS SELECT * FROM \"Settings\";\nCREATE TABLE \"Credentials_temp\" AS SELECT * FROM \"Credentials\";\nCREATE TABLE \"Attachments_temp\" AS SELECT * FROM \"Attachments\";\nCREATE TABLE \"Passwords_temp\" AS SELECT * FROM \"Passwords\";\nCREATE TABLE \"TotpCodes_temp\" AS SELECT * FROM \"TotpCodes\";\n\n-- Delete orphaned records that do not have a valid FK to the credential object\nDELETE FROM \"Attachments_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"Passwords_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"TotpCodes_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\n\n-- Delete orphaned credentials that do not have valid FKs to alias or service objects\nDELETE FROM \"Credentials_temp\" WHERE \"AliasId\" NOT IN (SELECT \"Id\" FROM \"Aliases_temp\");\nDELETE FROM \"Credentials_temp\" WHERE \"ServiceId\" NOT IN (SELECT \"Id\" FROM \"Services_temp\");\n\n-- After cleaning credentials, clean dependent tables again in case we removed credentials\nDELETE FROM \"Attachments_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"Passwords_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"TotpCodes_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\n\n-- Drop all existing tables\nDROP TABLE \"TotpCodes\";\nDROP TABLE \"Passwords\";\nDROP TABLE \"Attachments\";\nDROP TABLE \"Credentials\";\nDROP TABLE \"Settings\";\nDROP TABLE \"EncryptionKeys\";\nDROP TABLE \"Services\";\nDROP TABLE \"Aliases\";\nDROP TABLE \"__EFMigrationsHistory\";\n\n-- Recreate tables with proper constraints (no dependencies first)\nCREATE TABLE \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\n-- Tables with foreign keys\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\n\n-- Restore data from temp tables\nINSERT INTO \"__EFMigrationsHistory\" SELECT * FROM \"__EFMigrationsHistory_temp\";\nINSERT INTO \"Aliases\" SELECT * FROM \"Aliases_temp\";\nINSERT INTO \"Services\" SELECT * FROM \"Services_temp\";\nINSERT INTO \"EncryptionKeys\" SELECT * FROM \"EncryptionKeys_temp\";\nINSERT INTO \"Settings\" SELECT * FROM \"Settings_temp\";\nINSERT INTO \"Credentials\" SELECT * FROM \"Credentials_temp\";\nINSERT INTO \"Attachments\" SELECT * FROM \"Attachments_temp\";\nINSERT INTO \"Passwords\" SELECT * FROM \"Passwords_temp\";\nINSERT INTO \"TotpCodes\" SELECT * FROM \"TotpCodes_temp\";\n\n-- Recreate indexes\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\n-- Clean up temp tables\nDROP TABLE \"__EFMigrationsHistory_temp\";\nDROP TABLE \"Aliases_temp\";\nDROP TABLE \"Services_temp\";\nDROP TABLE \"EncryptionKeys_temp\";\nDROP TABLE \"Settings_temp\";\nDROP TABLE \"Credentials_temp\";\nDROP TABLE \"Attachments_temp\";\nDROP TABLE \"Passwords_temp\";\nDROP TABLE \"TotpCodes_temp\";\n\nPRAGMA foreign_keys = ON;\n\n\nCREATE TABLE \"Passkeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passkeys\" PRIMARY KEY,\n \"RpId\" TEXT COLLATE NOCASE NOT NULL,\n \"UserId\" TEXT NULL,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"PrfKey\" BLOB NULL,\n \"DisplayName\" TEXT NOT NULL,\n \"AdditionalData\" BLOB NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_Passkeys_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Passkeys_CredentialId\" ON \"Passkeys\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Passkeys_RpId\" ON \"Passkeys\" (\"RpId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4');\n\nCOMMIT;\n"; /** * Individual migration SQL scripts * Auto-generated from EF Core migrations diff --git a/apps/mobile-app/utils/dist/shared/vault-sql/index.d.ts b/apps/mobile-app/utils/dist/shared/vault-sql/index.d.ts index b341024b4..ea25cb473 100644 --- a/apps/mobile-app/utils/dist/shared/vault-sql/index.d.ts +++ b/apps/mobile-app/utils/dist/shared/vault-sql/index.d.ts @@ -122,7 +122,7 @@ declare const VAULT_VERSIONS: VaultVersion[]; * Complete database schema SQL (latest version) * Auto-generated from EF Core migrations */ -declare const COMPLETE_SCHEMA_SQL = "\n\uFEFFCREATE TABLE IF NOT EXISTS \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nBEGIN TRANSACTION;\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"Gender\" VARCHAR NULL,\n \"FirstName\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"BirthDate\" TEXT NOT NULL,\n \"AddressStreet\" VARCHAR NULL,\n \"AddressCity\" VARCHAR NULL,\n \"AddressState\" VARCHAR NULL,\n \"AddressZipCode\" VARCHAR NULL,\n \"AddressCountry\" VARCHAR NULL,\n \"Hobbies\" TEXT NULL,\n \"EmailPrefix\" TEXT NULL,\n \"PhoneMobile\" TEXT NULL,\n \"BankAccountIBAN\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"Username\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"ServiceId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachment\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachment\" PRIMARY KEY,\n \"Filename\" TEXT NOT NULL,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachment_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Attachment_CredentialId\" ON \"Attachment\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708094944_1.0.0-InitialMigration', '9.0.4');\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708224522_1.0.1-EmptyTestMigration', '9.0.4');\n\nALTER TABLE \"Aliases\" RENAME COLUMN \"EmailPrefix\" TO \"Email\";\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240711204207_1.0.2-ChangeEmailColumn', '9.0.4');\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240729105618_1.1.0-AddPkiTables', '9.0.4');\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805073413_1.2.0-AddSettingsTable', '9.0.4');\n\nCREATE TABLE \"ef_temp_Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"ef_temp_Aliases\" (\"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\")\nSELECT \"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\"\nFROM \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Aliases\";\n\nALTER TABLE \"ef_temp_Aliases\" RENAME TO \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805122422_1.3.0-UpdateIdentityStructure', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"ef_temp_Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Credentials\" (\"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\")\nSELECT \"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\"\nFROM \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Credentials\";\n\nALTER TABLE \"ef_temp_Credentials\" RENAME TO \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240812141727_1.3.1-MakeUsernameOptional', '9.0.4');\n\nBEGIN TRANSACTION;\nALTER TABLE \"Settings\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Services\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Passwords\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"EncryptionKeys\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Credentials\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Attachment\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Aliases\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240916105320_1.4.0-AddSyncSupport', '9.0.4');\n\nALTER TABLE \"Attachment\" RENAME TO \"Attachments\";\n\nCREATE TABLE \"ef_temp_Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Attachments\" (\"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\")\nSELECT \"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\"\nFROM \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Attachments\";\n\nALTER TABLE \"ef_temp_Attachments\" RENAME TO \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240917191243_1.4.1-RenameAttachmentsPlural', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4');\n\nCREATE TABLE \"Passkeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passkeys\" PRIMARY KEY,\n \"CredentialId\" TEXT NOT NULL,\n \"RpId\" TEXT COLLATE NOCASE NOT NULL,\n \"UserId\" TEXT NULL,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"PrfKey\" BLOB NULL,\n \"DisplayName\" TEXT NOT NULL,\n \"AdditionalData\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_Passkeys_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Passkeys_CredentialId\" ON \"Passkeys\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Passkeys_RpId\" ON \"Passkeys\" (\"RpId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4');\n\nCOMMIT;\n"; +declare const COMPLETE_SCHEMA_SQL = "\n\uFEFFCREATE TABLE IF NOT EXISTS \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nBEGIN TRANSACTION;\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"Gender\" VARCHAR NULL,\n \"FirstName\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"BirthDate\" TEXT NOT NULL,\n \"AddressStreet\" VARCHAR NULL,\n \"AddressCity\" VARCHAR NULL,\n \"AddressState\" VARCHAR NULL,\n \"AddressZipCode\" VARCHAR NULL,\n \"AddressCountry\" VARCHAR NULL,\n \"Hobbies\" TEXT NULL,\n \"EmailPrefix\" TEXT NULL,\n \"PhoneMobile\" TEXT NULL,\n \"BankAccountIBAN\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"Username\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"ServiceId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachment\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachment\" PRIMARY KEY,\n \"Filename\" TEXT NOT NULL,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachment_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Attachment_CredentialId\" ON \"Attachment\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708094944_1.0.0-InitialMigration', '9.0.4');\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708224522_1.0.1-EmptyTestMigration', '9.0.4');\n\nALTER TABLE \"Aliases\" RENAME COLUMN \"EmailPrefix\" TO \"Email\";\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240711204207_1.0.2-ChangeEmailColumn', '9.0.4');\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240729105618_1.1.0-AddPkiTables', '9.0.4');\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805073413_1.2.0-AddSettingsTable', '9.0.4');\n\nCREATE TABLE \"ef_temp_Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"ef_temp_Aliases\" (\"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\")\nSELECT \"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\"\nFROM \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Aliases\";\n\nALTER TABLE \"ef_temp_Aliases\" RENAME TO \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805122422_1.3.0-UpdateIdentityStructure', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"ef_temp_Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Credentials\" (\"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\")\nSELECT \"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\"\nFROM \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Credentials\";\n\nALTER TABLE \"ef_temp_Credentials\" RENAME TO \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240812141727_1.3.1-MakeUsernameOptional', '9.0.4');\n\nBEGIN TRANSACTION;\nALTER TABLE \"Settings\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Services\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Passwords\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"EncryptionKeys\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Credentials\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Attachment\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Aliases\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240916105320_1.4.0-AddSyncSupport', '9.0.4');\n\nALTER TABLE \"Attachment\" RENAME TO \"Attachments\";\n\nCREATE TABLE \"ef_temp_Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Attachments\" (\"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\")\nSELECT \"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\"\nFROM \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Attachments\";\n\nALTER TABLE \"ef_temp_Attachments\" RENAME TO \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240917191243_1.4.1-RenameAttachmentsPlural', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4');\n\n\nPRAGMA foreign_keys = OFF;\n\n-- Clean up any existing temp tables first\nDROP TABLE IF EXISTS \"__EFMigrationsHistory_temp\";\nDROP TABLE IF EXISTS \"Aliases_temp\";\nDROP TABLE IF EXISTS \"Services_temp\";\nDROP TABLE IF EXISTS \"EncryptionKeys_temp\";\nDROP TABLE IF EXISTS \"Settings_temp\";\nDROP TABLE IF EXISTS \"Credentials_temp\";\nDROP TABLE IF EXISTS \"Attachments_temp\";\nDROP TABLE IF EXISTS \"Passwords_temp\";\nDROP TABLE IF EXISTS \"TotpCodes_temp\";\n\n-- Create backup tables for all data\nCREATE TABLE \"__EFMigrationsHistory_temp\" AS SELECT * FROM \"__EFMigrationsHistory\";\nCREATE TABLE \"Aliases_temp\" AS SELECT * FROM \"Aliases\";\nCREATE TABLE \"Services_temp\" AS SELECT * FROM \"Services\";\nCREATE TABLE \"EncryptionKeys_temp\" AS SELECT * FROM \"EncryptionKeys\";\nCREATE TABLE \"Settings_temp\" AS SELECT * FROM \"Settings\";\nCREATE TABLE \"Credentials_temp\" AS SELECT * FROM \"Credentials\";\nCREATE TABLE \"Attachments_temp\" AS SELECT * FROM \"Attachments\";\nCREATE TABLE \"Passwords_temp\" AS SELECT * FROM \"Passwords\";\nCREATE TABLE \"TotpCodes_temp\" AS SELECT * FROM \"TotpCodes\";\n\n-- Delete orphaned records that do not have a valid FK to the credential object\nDELETE FROM \"Attachments_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"Passwords_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"TotpCodes_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\n\n-- Delete orphaned credentials that do not have valid FKs to alias or service objects\nDELETE FROM \"Credentials_temp\" WHERE \"AliasId\" NOT IN (SELECT \"Id\" FROM \"Aliases_temp\");\nDELETE FROM \"Credentials_temp\" WHERE \"ServiceId\" NOT IN (SELECT \"Id\" FROM \"Services_temp\");\n\n-- After cleaning credentials, clean dependent tables again in case we removed credentials\nDELETE FROM \"Attachments_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"Passwords_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"TotpCodes_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\n\n-- Drop all existing tables\nDROP TABLE \"TotpCodes\";\nDROP TABLE \"Passwords\";\nDROP TABLE \"Attachments\";\nDROP TABLE \"Credentials\";\nDROP TABLE \"Settings\";\nDROP TABLE \"EncryptionKeys\";\nDROP TABLE \"Services\";\nDROP TABLE \"Aliases\";\nDROP TABLE \"__EFMigrationsHistory\";\n\n-- Recreate tables with proper constraints (no dependencies first)\nCREATE TABLE \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\n-- Tables with foreign keys\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\n\n-- Restore data from temp tables\nINSERT INTO \"__EFMigrationsHistory\" SELECT * FROM \"__EFMigrationsHistory_temp\";\nINSERT INTO \"Aliases\" SELECT * FROM \"Aliases_temp\";\nINSERT INTO \"Services\" SELECT * FROM \"Services_temp\";\nINSERT INTO \"EncryptionKeys\" SELECT * FROM \"EncryptionKeys_temp\";\nINSERT INTO \"Settings\" SELECT * FROM \"Settings_temp\";\nINSERT INTO \"Credentials\" SELECT * FROM \"Credentials_temp\";\nINSERT INTO \"Attachments\" SELECT * FROM \"Attachments_temp\";\nINSERT INTO \"Passwords\" SELECT * FROM \"Passwords_temp\";\nINSERT INTO \"TotpCodes\" SELECT * FROM \"TotpCodes_temp\";\n\n-- Recreate indexes\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\n-- Clean up temp tables\nDROP TABLE \"__EFMigrationsHistory_temp\";\nDROP TABLE \"Aliases_temp\";\nDROP TABLE \"Services_temp\";\nDROP TABLE \"EncryptionKeys_temp\";\nDROP TABLE \"Settings_temp\";\nDROP TABLE \"Credentials_temp\";\nDROP TABLE \"Attachments_temp\";\nDROP TABLE \"Passwords_temp\";\nDROP TABLE \"TotpCodes_temp\";\n\nPRAGMA foreign_keys = ON;\n\n\nCREATE TABLE \"Passkeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passkeys\" PRIMARY KEY,\n \"RpId\" TEXT COLLATE NOCASE NOT NULL,\n \"UserId\" TEXT NULL,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"PrfKey\" BLOB NULL,\n \"DisplayName\" TEXT NOT NULL,\n \"AdditionalData\" BLOB NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_Passkeys_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Passkeys_CredentialId\" ON \"Passkeys\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Passkeys_RpId\" ON \"Passkeys\" (\"RpId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4');\n\nCOMMIT;\n"; /** * Individual migration SQL scripts * Auto-generated from EF Core migrations diff --git a/apps/mobile-app/utils/dist/shared/vault-sql/index.js b/apps/mobile-app/utils/dist/shared/vault-sql/index.js index fc2009e4a..23deaf64d 100644 --- a/apps/mobile-app/utils/dist/shared/vault-sql/index.js +++ b/apps/mobile-app/utils/dist/shared/vault-sql/index.js @@ -285,9 +285,184 @@ CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -295,6 +470,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -306,7 +482,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT; `; @@ -496,9 +672,184 @@ VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); COMMIT;`, 10: `\uFEFFBEGIN TRANSACTION; + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -506,6 +857,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -517,7 +869,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT;` }; diff --git a/apps/mobile-app/utils/dist/shared/vault-sql/index.mjs b/apps/mobile-app/utils/dist/shared/vault-sql/index.mjs index cc4ac4245..0899a348b 100644 --- a/apps/mobile-app/utils/dist/shared/vault-sql/index.mjs +++ b/apps/mobile-app/utils/dist/shared/vault-sql/index.mjs @@ -256,9 +256,184 @@ CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -266,6 +441,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -277,7 +453,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT; `; @@ -467,9 +643,184 @@ VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); COMMIT;`, 10: `\uFEFFBEGIN TRANSACTION; + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -477,6 +828,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -488,7 +840,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT;` }; diff --git a/apps/server/AliasVault.Client/Main/Pages/Sync/StatusMessages/PendingMigrations.razor b/apps/server/AliasVault.Client/Main/Pages/Sync/StatusMessages/PendingMigrations.razor index 515304849..6d7784b8a 100644 --- a/apps/server/AliasVault.Client/Main/Pages/Sync/StatusMessages/PendingMigrations.razor +++ b/apps/server/AliasVault.Client/Main/Pages/Sync/StatusMessages/PendingMigrations.razor @@ -53,7 +53,7 @@ } else { - } diff --git a/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.d.mts b/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.d.mts index b341024b4..ea25cb473 100644 --- a/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.d.mts +++ b/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.d.mts @@ -122,7 +122,7 @@ declare const VAULT_VERSIONS: VaultVersion[]; * Complete database schema SQL (latest version) * Auto-generated from EF Core migrations */ -declare const COMPLETE_SCHEMA_SQL = "\n\uFEFFCREATE TABLE IF NOT EXISTS \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nBEGIN TRANSACTION;\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"Gender\" VARCHAR NULL,\n \"FirstName\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"BirthDate\" TEXT NOT NULL,\n \"AddressStreet\" VARCHAR NULL,\n \"AddressCity\" VARCHAR NULL,\n \"AddressState\" VARCHAR NULL,\n \"AddressZipCode\" VARCHAR NULL,\n \"AddressCountry\" VARCHAR NULL,\n \"Hobbies\" TEXT NULL,\n \"EmailPrefix\" TEXT NULL,\n \"PhoneMobile\" TEXT NULL,\n \"BankAccountIBAN\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"Username\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"ServiceId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachment\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachment\" PRIMARY KEY,\n \"Filename\" TEXT NOT NULL,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachment_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Attachment_CredentialId\" ON \"Attachment\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708094944_1.0.0-InitialMigration', '9.0.4');\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708224522_1.0.1-EmptyTestMigration', '9.0.4');\n\nALTER TABLE \"Aliases\" RENAME COLUMN \"EmailPrefix\" TO \"Email\";\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240711204207_1.0.2-ChangeEmailColumn', '9.0.4');\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240729105618_1.1.0-AddPkiTables', '9.0.4');\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805073413_1.2.0-AddSettingsTable', '9.0.4');\n\nCREATE TABLE \"ef_temp_Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"ef_temp_Aliases\" (\"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\")\nSELECT \"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\"\nFROM \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Aliases\";\n\nALTER TABLE \"ef_temp_Aliases\" RENAME TO \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805122422_1.3.0-UpdateIdentityStructure', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"ef_temp_Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Credentials\" (\"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\")\nSELECT \"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\"\nFROM \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Credentials\";\n\nALTER TABLE \"ef_temp_Credentials\" RENAME TO \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240812141727_1.3.1-MakeUsernameOptional', '9.0.4');\n\nBEGIN TRANSACTION;\nALTER TABLE \"Settings\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Services\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Passwords\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"EncryptionKeys\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Credentials\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Attachment\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Aliases\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240916105320_1.4.0-AddSyncSupport', '9.0.4');\n\nALTER TABLE \"Attachment\" RENAME TO \"Attachments\";\n\nCREATE TABLE \"ef_temp_Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Attachments\" (\"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\")\nSELECT \"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\"\nFROM \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Attachments\";\n\nALTER TABLE \"ef_temp_Attachments\" RENAME TO \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240917191243_1.4.1-RenameAttachmentsPlural', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4');\n\nCREATE TABLE \"Passkeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passkeys\" PRIMARY KEY,\n \"CredentialId\" TEXT NOT NULL,\n \"RpId\" TEXT COLLATE NOCASE NOT NULL,\n \"UserId\" TEXT NULL,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"PrfKey\" BLOB NULL,\n \"DisplayName\" TEXT NOT NULL,\n \"AdditionalData\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_Passkeys_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Passkeys_CredentialId\" ON \"Passkeys\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Passkeys_RpId\" ON \"Passkeys\" (\"RpId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4');\n\nCOMMIT;\n"; +declare const COMPLETE_SCHEMA_SQL = "\n\uFEFFCREATE TABLE IF NOT EXISTS \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nBEGIN TRANSACTION;\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"Gender\" VARCHAR NULL,\n \"FirstName\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"BirthDate\" TEXT NOT NULL,\n \"AddressStreet\" VARCHAR NULL,\n \"AddressCity\" VARCHAR NULL,\n \"AddressState\" VARCHAR NULL,\n \"AddressZipCode\" VARCHAR NULL,\n \"AddressCountry\" VARCHAR NULL,\n \"Hobbies\" TEXT NULL,\n \"EmailPrefix\" TEXT NULL,\n \"PhoneMobile\" TEXT NULL,\n \"BankAccountIBAN\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"Username\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"ServiceId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachment\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachment\" PRIMARY KEY,\n \"Filename\" TEXT NOT NULL,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachment_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Attachment_CredentialId\" ON \"Attachment\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708094944_1.0.0-InitialMigration', '9.0.4');\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708224522_1.0.1-EmptyTestMigration', '9.0.4');\n\nALTER TABLE \"Aliases\" RENAME COLUMN \"EmailPrefix\" TO \"Email\";\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240711204207_1.0.2-ChangeEmailColumn', '9.0.4');\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240729105618_1.1.0-AddPkiTables', '9.0.4');\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805073413_1.2.0-AddSettingsTable', '9.0.4');\n\nCREATE TABLE \"ef_temp_Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"ef_temp_Aliases\" (\"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\")\nSELECT \"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\"\nFROM \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Aliases\";\n\nALTER TABLE \"ef_temp_Aliases\" RENAME TO \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805122422_1.3.0-UpdateIdentityStructure', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"ef_temp_Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Credentials\" (\"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\")\nSELECT \"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\"\nFROM \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Credentials\";\n\nALTER TABLE \"ef_temp_Credentials\" RENAME TO \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240812141727_1.3.1-MakeUsernameOptional', '9.0.4');\n\nBEGIN TRANSACTION;\nALTER TABLE \"Settings\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Services\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Passwords\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"EncryptionKeys\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Credentials\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Attachment\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Aliases\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240916105320_1.4.0-AddSyncSupport', '9.0.4');\n\nALTER TABLE \"Attachment\" RENAME TO \"Attachments\";\n\nCREATE TABLE \"ef_temp_Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Attachments\" (\"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\")\nSELECT \"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\"\nFROM \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Attachments\";\n\nALTER TABLE \"ef_temp_Attachments\" RENAME TO \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240917191243_1.4.1-RenameAttachmentsPlural', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4');\n\n\nPRAGMA foreign_keys = OFF;\n\n-- Clean up any existing temp tables first\nDROP TABLE IF EXISTS \"__EFMigrationsHistory_temp\";\nDROP TABLE IF EXISTS \"Aliases_temp\";\nDROP TABLE IF EXISTS \"Services_temp\";\nDROP TABLE IF EXISTS \"EncryptionKeys_temp\";\nDROP TABLE IF EXISTS \"Settings_temp\";\nDROP TABLE IF EXISTS \"Credentials_temp\";\nDROP TABLE IF EXISTS \"Attachments_temp\";\nDROP TABLE IF EXISTS \"Passwords_temp\";\nDROP TABLE IF EXISTS \"TotpCodes_temp\";\n\n-- Create backup tables for all data\nCREATE TABLE \"__EFMigrationsHistory_temp\" AS SELECT * FROM \"__EFMigrationsHistory\";\nCREATE TABLE \"Aliases_temp\" AS SELECT * FROM \"Aliases\";\nCREATE TABLE \"Services_temp\" AS SELECT * FROM \"Services\";\nCREATE TABLE \"EncryptionKeys_temp\" AS SELECT * FROM \"EncryptionKeys\";\nCREATE TABLE \"Settings_temp\" AS SELECT * FROM \"Settings\";\nCREATE TABLE \"Credentials_temp\" AS SELECT * FROM \"Credentials\";\nCREATE TABLE \"Attachments_temp\" AS SELECT * FROM \"Attachments\";\nCREATE TABLE \"Passwords_temp\" AS SELECT * FROM \"Passwords\";\nCREATE TABLE \"TotpCodes_temp\" AS SELECT * FROM \"TotpCodes\";\n\n-- Delete orphaned records that do not have a valid FK to the credential object\nDELETE FROM \"Attachments_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"Passwords_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"TotpCodes_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\n\n-- Delete orphaned credentials that do not have valid FKs to alias or service objects\nDELETE FROM \"Credentials_temp\" WHERE \"AliasId\" NOT IN (SELECT \"Id\" FROM \"Aliases_temp\");\nDELETE FROM \"Credentials_temp\" WHERE \"ServiceId\" NOT IN (SELECT \"Id\" FROM \"Services_temp\");\n\n-- After cleaning credentials, clean dependent tables again in case we removed credentials\nDELETE FROM \"Attachments_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"Passwords_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"TotpCodes_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\n\n-- Drop all existing tables\nDROP TABLE \"TotpCodes\";\nDROP TABLE \"Passwords\";\nDROP TABLE \"Attachments\";\nDROP TABLE \"Credentials\";\nDROP TABLE \"Settings\";\nDROP TABLE \"EncryptionKeys\";\nDROP TABLE \"Services\";\nDROP TABLE \"Aliases\";\nDROP TABLE \"__EFMigrationsHistory\";\n\n-- Recreate tables with proper constraints (no dependencies first)\nCREATE TABLE \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\n-- Tables with foreign keys\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\n\n-- Restore data from temp tables\nINSERT INTO \"__EFMigrationsHistory\" SELECT * FROM \"__EFMigrationsHistory_temp\";\nINSERT INTO \"Aliases\" SELECT * FROM \"Aliases_temp\";\nINSERT INTO \"Services\" SELECT * FROM \"Services_temp\";\nINSERT INTO \"EncryptionKeys\" SELECT * FROM \"EncryptionKeys_temp\";\nINSERT INTO \"Settings\" SELECT * FROM \"Settings_temp\";\nINSERT INTO \"Credentials\" SELECT * FROM \"Credentials_temp\";\nINSERT INTO \"Attachments\" SELECT * FROM \"Attachments_temp\";\nINSERT INTO \"Passwords\" SELECT * FROM \"Passwords_temp\";\nINSERT INTO \"TotpCodes\" SELECT * FROM \"TotpCodes_temp\";\n\n-- Recreate indexes\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\n-- Clean up temp tables\nDROP TABLE \"__EFMigrationsHistory_temp\";\nDROP TABLE \"Aliases_temp\";\nDROP TABLE \"Services_temp\";\nDROP TABLE \"EncryptionKeys_temp\";\nDROP TABLE \"Settings_temp\";\nDROP TABLE \"Credentials_temp\";\nDROP TABLE \"Attachments_temp\";\nDROP TABLE \"Passwords_temp\";\nDROP TABLE \"TotpCodes_temp\";\n\nPRAGMA foreign_keys = ON;\n\n\nCREATE TABLE \"Passkeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passkeys\" PRIMARY KEY,\n \"RpId\" TEXT COLLATE NOCASE NOT NULL,\n \"UserId\" TEXT NULL,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"PrfKey\" BLOB NULL,\n \"DisplayName\" TEXT NOT NULL,\n \"AdditionalData\" BLOB NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_Passkeys_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Passkeys_CredentialId\" ON \"Passkeys\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Passkeys_RpId\" ON \"Passkeys\" (\"RpId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4');\n\nCOMMIT;\n"; /** * Individual migration SQL scripts * Auto-generated from EF Core migrations diff --git a/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.d.ts b/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.d.ts index b341024b4..ea25cb473 100644 --- a/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.d.ts +++ b/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.d.ts @@ -122,7 +122,7 @@ declare const VAULT_VERSIONS: VaultVersion[]; * Complete database schema SQL (latest version) * Auto-generated from EF Core migrations */ -declare const COMPLETE_SCHEMA_SQL = "\n\uFEFFCREATE TABLE IF NOT EXISTS \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nBEGIN TRANSACTION;\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"Gender\" VARCHAR NULL,\n \"FirstName\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"BirthDate\" TEXT NOT NULL,\n \"AddressStreet\" VARCHAR NULL,\n \"AddressCity\" VARCHAR NULL,\n \"AddressState\" VARCHAR NULL,\n \"AddressZipCode\" VARCHAR NULL,\n \"AddressCountry\" VARCHAR NULL,\n \"Hobbies\" TEXT NULL,\n \"EmailPrefix\" TEXT NULL,\n \"PhoneMobile\" TEXT NULL,\n \"BankAccountIBAN\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"Username\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"ServiceId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachment\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachment\" PRIMARY KEY,\n \"Filename\" TEXT NOT NULL,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachment_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Attachment_CredentialId\" ON \"Attachment\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708094944_1.0.0-InitialMigration', '9.0.4');\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708224522_1.0.1-EmptyTestMigration', '9.0.4');\n\nALTER TABLE \"Aliases\" RENAME COLUMN \"EmailPrefix\" TO \"Email\";\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240711204207_1.0.2-ChangeEmailColumn', '9.0.4');\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240729105618_1.1.0-AddPkiTables', '9.0.4');\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805073413_1.2.0-AddSettingsTable', '9.0.4');\n\nCREATE TABLE \"ef_temp_Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"ef_temp_Aliases\" (\"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\")\nSELECT \"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\"\nFROM \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Aliases\";\n\nALTER TABLE \"ef_temp_Aliases\" RENAME TO \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805122422_1.3.0-UpdateIdentityStructure', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"ef_temp_Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Credentials\" (\"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\")\nSELECT \"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\"\nFROM \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Credentials\";\n\nALTER TABLE \"ef_temp_Credentials\" RENAME TO \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240812141727_1.3.1-MakeUsernameOptional', '9.0.4');\n\nBEGIN TRANSACTION;\nALTER TABLE \"Settings\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Services\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Passwords\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"EncryptionKeys\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Credentials\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Attachment\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Aliases\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240916105320_1.4.0-AddSyncSupport', '9.0.4');\n\nALTER TABLE \"Attachment\" RENAME TO \"Attachments\";\n\nCREATE TABLE \"ef_temp_Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Attachments\" (\"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\")\nSELECT \"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\"\nFROM \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Attachments\";\n\nALTER TABLE \"ef_temp_Attachments\" RENAME TO \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240917191243_1.4.1-RenameAttachmentsPlural', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4');\n\nCREATE TABLE \"Passkeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passkeys\" PRIMARY KEY,\n \"CredentialId\" TEXT NOT NULL,\n \"RpId\" TEXT COLLATE NOCASE NOT NULL,\n \"UserId\" TEXT NULL,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"PrfKey\" BLOB NULL,\n \"DisplayName\" TEXT NOT NULL,\n \"AdditionalData\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_Passkeys_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Passkeys_CredentialId\" ON \"Passkeys\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Passkeys_RpId\" ON \"Passkeys\" (\"RpId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4');\n\nCOMMIT;\n"; +declare const COMPLETE_SCHEMA_SQL = "\n\uFEFFCREATE TABLE IF NOT EXISTS \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nBEGIN TRANSACTION;\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"Gender\" VARCHAR NULL,\n \"FirstName\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"BirthDate\" TEXT NOT NULL,\n \"AddressStreet\" VARCHAR NULL,\n \"AddressCity\" VARCHAR NULL,\n \"AddressState\" VARCHAR NULL,\n \"AddressZipCode\" VARCHAR NULL,\n \"AddressCountry\" VARCHAR NULL,\n \"Hobbies\" TEXT NULL,\n \"EmailPrefix\" TEXT NULL,\n \"PhoneMobile\" TEXT NULL,\n \"BankAccountIBAN\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"Username\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"ServiceId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachment\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachment\" PRIMARY KEY,\n \"Filename\" TEXT NOT NULL,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachment_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Attachment_CredentialId\" ON \"Attachment\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708094944_1.0.0-InitialMigration', '9.0.4');\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240708224522_1.0.1-EmptyTestMigration', '9.0.4');\n\nALTER TABLE \"Aliases\" RENAME COLUMN \"EmailPrefix\" TO \"Email\";\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240711204207_1.0.2-ChangeEmailColumn', '9.0.4');\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240729105618_1.1.0-AddPkiTables', '9.0.4');\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805073413_1.2.0-AddSettingsTable', '9.0.4');\n\nCREATE TABLE \"ef_temp_Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL\n);\n\nINSERT INTO \"ef_temp_Aliases\" (\"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\")\nSELECT \"Id\", \"BirthDate\", \"CreatedAt\", \"Email\", \"FirstName\", \"Gender\", \"LastName\", \"NickName\", \"UpdatedAt\"\nFROM \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Aliases\";\n\nALTER TABLE \"ef_temp_Aliases\" RENAME TO \"Aliases\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240805122422_1.3.0-UpdateIdentityStructure', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"ef_temp_Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Credentials\" (\"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\")\nSELECT \"Id\", \"AliasId\", \"CreatedAt\", \"Notes\", \"ServiceId\", \"UpdatedAt\", \"Username\"\nFROM \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Credentials\";\n\nALTER TABLE \"ef_temp_Credentials\" RENAME TO \"Credentials\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\n\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240812141727_1.3.1-MakeUsernameOptional', '9.0.4');\n\nBEGIN TRANSACTION;\nALTER TABLE \"Settings\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Services\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Passwords\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"EncryptionKeys\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Credentials\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Attachment\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nALTER TABLE \"Aliases\" ADD \"IsDeleted\" INTEGER NOT NULL DEFAULT 0;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240916105320_1.4.0-AddSyncSupport', '9.0.4');\n\nALTER TABLE \"Attachment\" RENAME TO \"Attachments\";\n\nCREATE TABLE \"ef_temp_Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nINSERT INTO \"ef_temp_Attachments\" (\"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\")\nSELECT \"Id\", \"Blob\", \"CreatedAt\", \"CredentialId\", \"Filename\", \"IsDeleted\", \"UpdatedAt\"\nFROM \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 0;\n\nBEGIN TRANSACTION;\nDROP TABLE \"Attachments\";\n\nALTER TABLE \"ef_temp_Attachments\" RENAME TO \"Attachments\";\n\nCOMMIT;\n\nPRAGMA foreign_keys = 1;\n\nBEGIN TRANSACTION;\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\n\nCOMMIT;\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20240917191243_1.4.1-RenameAttachmentsPlural', '9.0.4');\n\nBEGIN TRANSACTION;\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4');\n\n\nPRAGMA foreign_keys = OFF;\n\n-- Clean up any existing temp tables first\nDROP TABLE IF EXISTS \"__EFMigrationsHistory_temp\";\nDROP TABLE IF EXISTS \"Aliases_temp\";\nDROP TABLE IF EXISTS \"Services_temp\";\nDROP TABLE IF EXISTS \"EncryptionKeys_temp\";\nDROP TABLE IF EXISTS \"Settings_temp\";\nDROP TABLE IF EXISTS \"Credentials_temp\";\nDROP TABLE IF EXISTS \"Attachments_temp\";\nDROP TABLE IF EXISTS \"Passwords_temp\";\nDROP TABLE IF EXISTS \"TotpCodes_temp\";\n\n-- Create backup tables for all data\nCREATE TABLE \"__EFMigrationsHistory_temp\" AS SELECT * FROM \"__EFMigrationsHistory\";\nCREATE TABLE \"Aliases_temp\" AS SELECT * FROM \"Aliases\";\nCREATE TABLE \"Services_temp\" AS SELECT * FROM \"Services\";\nCREATE TABLE \"EncryptionKeys_temp\" AS SELECT * FROM \"EncryptionKeys\";\nCREATE TABLE \"Settings_temp\" AS SELECT * FROM \"Settings\";\nCREATE TABLE \"Credentials_temp\" AS SELECT * FROM \"Credentials\";\nCREATE TABLE \"Attachments_temp\" AS SELECT * FROM \"Attachments\";\nCREATE TABLE \"Passwords_temp\" AS SELECT * FROM \"Passwords\";\nCREATE TABLE \"TotpCodes_temp\" AS SELECT * FROM \"TotpCodes\";\n\n-- Delete orphaned records that do not have a valid FK to the credential object\nDELETE FROM \"Attachments_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"Passwords_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"TotpCodes_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\n\n-- Delete orphaned credentials that do not have valid FKs to alias or service objects\nDELETE FROM \"Credentials_temp\" WHERE \"AliasId\" NOT IN (SELECT \"Id\" FROM \"Aliases_temp\");\nDELETE FROM \"Credentials_temp\" WHERE \"ServiceId\" NOT IN (SELECT \"Id\" FROM \"Services_temp\");\n\n-- After cleaning credentials, clean dependent tables again in case we removed credentials\nDELETE FROM \"Attachments_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"Passwords_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\nDELETE FROM \"TotpCodes_temp\" WHERE \"CredentialId\" NOT IN (SELECT \"Id\" FROM \"Credentials_temp\");\n\n-- Drop all existing tables\nDROP TABLE \"TotpCodes\";\nDROP TABLE \"Passwords\";\nDROP TABLE \"Attachments\";\nDROP TABLE \"Credentials\";\nDROP TABLE \"Settings\";\nDROP TABLE \"EncryptionKeys\";\nDROP TABLE \"Services\";\nDROP TABLE \"Aliases\";\nDROP TABLE \"__EFMigrationsHistory\";\n\n-- Recreate tables with proper constraints (no dependencies first)\nCREATE TABLE \"__EFMigrationsHistory\" (\n \"MigrationId\" TEXT NOT NULL CONSTRAINT \"PK___EFMigrationsHistory\" PRIMARY KEY,\n \"ProductVersion\" TEXT NOT NULL\n);\n\nCREATE TABLE \"Aliases\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Aliases\" PRIMARY KEY,\n \"BirthDate\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Email\" TEXT NULL,\n \"FirstName\" VARCHAR NULL,\n \"Gender\" VARCHAR NULL,\n \"LastName\" VARCHAR NULL,\n \"NickName\" VARCHAR NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"Services\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Services\" PRIMARY KEY,\n \"Name\" TEXT NULL,\n \"Url\" TEXT NULL,\n \"Logo\" BLOB NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"EncryptionKeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_EncryptionKeys\" PRIMARY KEY,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"IsPrimary\" INTEGER NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE \"Settings\" (\n \"Key\" TEXT NOT NULL CONSTRAINT \"PK_Settings\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0\n);\n\n-- Tables with foreign keys\nCREATE TABLE \"Credentials\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Credentials\" PRIMARY KEY,\n \"AliasId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"Notes\" TEXT NULL,\n \"ServiceId\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"Username\" TEXT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_Credentials_Aliases_AliasId\" FOREIGN KEY (\"AliasId\") REFERENCES \"Aliases\" (\"Id\") ON DELETE CASCADE,\n CONSTRAINT \"FK_Credentials_Services_ServiceId\" FOREIGN KEY (\"ServiceId\") REFERENCES \"Services\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Attachments\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Attachments\" PRIMARY KEY,\n \"Blob\" BLOB NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"Filename\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n \"UpdatedAt\" TEXT NOT NULL,\n CONSTRAINT \"FK_Attachments_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"Passwords\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passwords\" PRIMARY KEY,\n \"Value\" TEXT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_Passwords_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"TotpCodes\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_TotpCodes\" PRIMARY KEY,\n \"Name\" TEXT NOT NULL,\n \"SecretKey\" TEXT NOT NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL DEFAULT 0,\n CONSTRAINT \"FK_TotpCodes_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\n\n-- Restore data from temp tables\nINSERT INTO \"__EFMigrationsHistory\" SELECT * FROM \"__EFMigrationsHistory_temp\";\nINSERT INTO \"Aliases\" SELECT * FROM \"Aliases_temp\";\nINSERT INTO \"Services\" SELECT * FROM \"Services_temp\";\nINSERT INTO \"EncryptionKeys\" SELECT * FROM \"EncryptionKeys_temp\";\nINSERT INTO \"Settings\" SELECT * FROM \"Settings_temp\";\nINSERT INTO \"Credentials\" SELECT * FROM \"Credentials_temp\";\nINSERT INTO \"Attachments\" SELECT * FROM \"Attachments_temp\";\nINSERT INTO \"Passwords\" SELECT * FROM \"Passwords_temp\";\nINSERT INTO \"TotpCodes\" SELECT * FROM \"TotpCodes_temp\";\n\n-- Recreate indexes\nCREATE INDEX \"IX_Credentials_AliasId\" ON \"Credentials\" (\"AliasId\");\nCREATE INDEX \"IX_Credentials_ServiceId\" ON \"Credentials\" (\"ServiceId\");\nCREATE INDEX \"IX_Attachments_CredentialId\" ON \"Attachments\" (\"CredentialId\");\nCREATE INDEX \"IX_Passwords_CredentialId\" ON \"Passwords\" (\"CredentialId\");\nCREATE INDEX \"IX_TotpCodes_CredentialId\" ON \"TotpCodes\" (\"CredentialId\");\n\n-- Clean up temp tables\nDROP TABLE \"__EFMigrationsHistory_temp\";\nDROP TABLE \"Aliases_temp\";\nDROP TABLE \"Services_temp\";\nDROP TABLE \"EncryptionKeys_temp\";\nDROP TABLE \"Settings_temp\";\nDROP TABLE \"Credentials_temp\";\nDROP TABLE \"Attachments_temp\";\nDROP TABLE \"Passwords_temp\";\nDROP TABLE \"TotpCodes_temp\";\n\nPRAGMA foreign_keys = ON;\n\n\nCREATE TABLE \"Passkeys\" (\n \"Id\" TEXT NOT NULL CONSTRAINT \"PK_Passkeys\" PRIMARY KEY,\n \"RpId\" TEXT COLLATE NOCASE NOT NULL,\n \"UserId\" TEXT NULL,\n \"PublicKey\" TEXT NOT NULL,\n \"PrivateKey\" TEXT NOT NULL,\n \"PrfKey\" BLOB NULL,\n \"DisplayName\" TEXT NOT NULL,\n \"AdditionalData\" BLOB NULL,\n \"CredentialId\" TEXT NOT NULL,\n \"CreatedAt\" TEXT NOT NULL,\n \"UpdatedAt\" TEXT NOT NULL,\n \"IsDeleted\" INTEGER NOT NULL,\n CONSTRAINT \"FK_Passkeys_Credentials_CredentialId\" FOREIGN KEY (\"CredentialId\") REFERENCES \"Credentials\" (\"Id\") ON DELETE CASCADE\n);\n\nCREATE INDEX \"IX_Passkeys_CredentialId\" ON \"Passkeys\" (\"CredentialId\");\n\nCREATE INDEX \"IX_Passkeys_RpId\" ON \"Passkeys\" (\"RpId\");\n\nINSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\")\nVALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4');\n\nCOMMIT;\n"; /** * Individual migration SQL scripts * Auto-generated from EF Core migrations diff --git a/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.js b/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.js index fc2009e4a..23deaf64d 100644 --- a/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.js +++ b/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.js @@ -285,9 +285,184 @@ CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -295,6 +470,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -306,7 +482,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT; `; @@ -496,9 +672,184 @@ VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); COMMIT;`, 10: `\uFEFFBEGIN TRANSACTION; + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -506,6 +857,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -517,7 +869,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT;` }; diff --git a/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.mjs b/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.mjs index cc4ac4245..0899a348b 100644 --- a/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.mjs +++ b/apps/server/AliasVault.Client/wwwroot/js/dist/shared/vault-sql/index.mjs @@ -256,9 +256,184 @@ CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -266,6 +441,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -277,7 +453,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT; `; @@ -467,9 +643,184 @@ VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); COMMIT;`, 10: `\uFEFFBEGIN TRANSACTION; + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -477,6 +828,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -488,7 +840,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT;` }; diff --git a/apps/server/Databases/AliasClientDb/Migrations/20251007084230_1.6.0-AddPasskeys.cs b/apps/server/Databases/AliasClientDb/Migrations/20251007084230_1.6.0-AddPasskeys.cs deleted file mode 100644 index b64193411..000000000 --- a/apps/server/Databases/AliasClientDb/Migrations/20251007084230_1.6.0-AddPasskeys.cs +++ /dev/null @@ -1,61 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace AliasClientDb.Migrations -{ - /// - public partial class _160AddPasskeys : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Passkeys", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - CredentialId = table.Column(type: "TEXT", nullable: false), - RpId = table.Column(type: "TEXT", maxLength: 255, nullable: false, collation: "NOCASE"), - UserId = table.Column(type: "TEXT", maxLength: 255, nullable: true), - PublicKey = table.Column(type: "TEXT", nullable: false), - PrivateKey = table.Column(type: "TEXT", nullable: false), - PrfKey = table.Column(type: "BLOB", maxLength: 64, nullable: true), - DisplayName = table.Column(type: "TEXT", maxLength: 255, nullable: false), - AdditionalData = table.Column(type: "BLOB", nullable: true), - CreatedAt = table.Column(type: "TEXT", nullable: false), - UpdatedAt = table.Column(type: "TEXT", nullable: false), - IsDeleted = table.Column(type: "INTEGER", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Passkeys", x => x.Id); - table.ForeignKey( - name: "FK_Passkeys_Credentials_CredentialId", - column: x => x.CredentialId, - principalTable: "Credentials", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_Passkeys_CredentialId", - table: "Passkeys", - column: "CredentialId"); - - migrationBuilder.CreateIndex( - name: "IX_Passkeys_RpId", - table: "Passkeys", - column: "RpId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Passkeys"); - } - } -} diff --git a/apps/server/Databases/AliasClientDb/Migrations/20251007084230_1.6.0-AddPasskeys.Designer.cs b/apps/server/Databases/AliasClientDb/Migrations/20251007085746_1.6.0-AddPasskeys.Designer.cs similarity index 99% rename from apps/server/Databases/AliasClientDb/Migrations/20251007084230_1.6.0-AddPasskeys.Designer.cs rename to apps/server/Databases/AliasClientDb/Migrations/20251007085746_1.6.0-AddPasskeys.Designer.cs index 5f74a84ad..8eb5f5a4e 100644 --- a/apps/server/Databases/AliasClientDb/Migrations/20251007084230_1.6.0-AddPasskeys.Designer.cs +++ b/apps/server/Databases/AliasClientDb/Migrations/20251007085746_1.6.0-AddPasskeys.Designer.cs @@ -11,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace AliasClientDb.Migrations { [DbContext(typeof(AliasClientDbContext))] - [Migration("20251007084230_1.6.0-AddPasskeys")] + [Migration("20251007085746_1.6.0-AddPasskeys")] partial class _160AddPasskeys { /// diff --git a/apps/server/Databases/AliasClientDb/Migrations/20251007085746_1.6.0-AddPasskeys.cs b/apps/server/Databases/AliasClientDb/Migrations/20251007085746_1.6.0-AddPasskeys.cs new file mode 100644 index 000000000..3134c085a --- /dev/null +++ b/apps/server/Databases/AliasClientDb/Migrations/20251007085746_1.6.0-AddPasskeys.cs @@ -0,0 +1,240 @@ +// +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AliasClientDb.Migrations +{ + /// + public partial class _160AddPasskeys : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + // Simple Database Constraint Repair Script + // Recreates all tables with proper PK/FK constraints while preserving data + migrationBuilder.Sql(@" +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS ""__EFMigrationsHistory_temp""; +DROP TABLE IF EXISTS ""Aliases_temp""; +DROP TABLE IF EXISTS ""Services_temp""; +DROP TABLE IF EXISTS ""EncryptionKeys_temp""; +DROP TABLE IF EXISTS ""Settings_temp""; +DROP TABLE IF EXISTS ""Credentials_temp""; +DROP TABLE IF EXISTS ""Attachments_temp""; +DROP TABLE IF EXISTS ""Passwords_temp""; +DROP TABLE IF EXISTS ""TotpCodes_temp""; + +-- Create backup tables for all data +CREATE TABLE ""__EFMigrationsHistory_temp"" AS SELECT * FROM ""__EFMigrationsHistory""; +CREATE TABLE ""Aliases_temp"" AS SELECT * FROM ""Aliases""; +CREATE TABLE ""Services_temp"" AS SELECT * FROM ""Services""; +CREATE TABLE ""EncryptionKeys_temp"" AS SELECT * FROM ""EncryptionKeys""; +CREATE TABLE ""Settings_temp"" AS SELECT * FROM ""Settings""; +CREATE TABLE ""Credentials_temp"" AS SELECT * FROM ""Credentials""; +CREATE TABLE ""Attachments_temp"" AS SELECT * FROM ""Attachments""; +CREATE TABLE ""Passwords_temp"" AS SELECT * FROM ""Passwords""; +CREATE TABLE ""TotpCodes_temp"" AS SELECT * FROM ""TotpCodes""; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM ""Attachments_temp"" WHERE ""CredentialId"" NOT IN (SELECT ""Id"" FROM ""Credentials_temp""); +DELETE FROM ""Passwords_temp"" WHERE ""CredentialId"" NOT IN (SELECT ""Id"" FROM ""Credentials_temp""); +DELETE FROM ""TotpCodes_temp"" WHERE ""CredentialId"" NOT IN (SELECT ""Id"" FROM ""Credentials_temp""); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM ""Credentials_temp"" WHERE ""AliasId"" NOT IN (SELECT ""Id"" FROM ""Aliases_temp""); +DELETE FROM ""Credentials_temp"" WHERE ""ServiceId"" NOT IN (SELECT ""Id"" FROM ""Services_temp""); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM ""Attachments_temp"" WHERE ""CredentialId"" NOT IN (SELECT ""Id"" FROM ""Credentials_temp""); +DELETE FROM ""Passwords_temp"" WHERE ""CredentialId"" NOT IN (SELECT ""Id"" FROM ""Credentials_temp""); +DELETE FROM ""TotpCodes_temp"" WHERE ""CredentialId"" NOT IN (SELECT ""Id"" FROM ""Credentials_temp""); + +-- Drop all existing tables +DROP TABLE ""TotpCodes""; +DROP TABLE ""Passwords""; +DROP TABLE ""Attachments""; +DROP TABLE ""Credentials""; +DROP TABLE ""Settings""; +DROP TABLE ""EncryptionKeys""; +DROP TABLE ""Services""; +DROP TABLE ""Aliases""; +DROP TABLE ""__EFMigrationsHistory""; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE ""__EFMigrationsHistory"" ( + ""MigrationId"" TEXT NOT NULL CONSTRAINT ""PK___EFMigrationsHistory"" PRIMARY KEY, + ""ProductVersion"" TEXT NOT NULL +); + +CREATE TABLE ""Aliases"" ( + ""Id"" TEXT NOT NULL CONSTRAINT ""PK_Aliases"" PRIMARY KEY, + ""BirthDate"" TEXT NOT NULL, + ""CreatedAt"" TEXT NOT NULL, + ""Email"" TEXT NULL, + ""FirstName"" VARCHAR NULL, + ""Gender"" VARCHAR NULL, + ""LastName"" VARCHAR NULL, + ""NickName"" VARCHAR NULL, + ""UpdatedAt"" TEXT NOT NULL, + ""IsDeleted"" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE ""Services"" ( + ""Id"" TEXT NOT NULL CONSTRAINT ""PK_Services"" PRIMARY KEY, + ""Name"" TEXT NULL, + ""Url"" TEXT NULL, + ""Logo"" BLOB NULL, + ""CreatedAt"" TEXT NOT NULL, + ""UpdatedAt"" TEXT NOT NULL, + ""IsDeleted"" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE ""EncryptionKeys"" ( + ""Id"" TEXT NOT NULL CONSTRAINT ""PK_EncryptionKeys"" PRIMARY KEY, + ""PublicKey"" TEXT NOT NULL, + ""PrivateKey"" TEXT NOT NULL, + ""IsPrimary"" INTEGER NOT NULL, + ""CreatedAt"" TEXT NOT NULL, + ""UpdatedAt"" TEXT NOT NULL, + ""IsDeleted"" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE ""Settings"" ( + ""Key"" TEXT NOT NULL CONSTRAINT ""PK_Settings"" PRIMARY KEY, + ""Value"" TEXT NULL, + ""CreatedAt"" TEXT NOT NULL, + ""UpdatedAt"" TEXT NOT NULL, + ""IsDeleted"" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE ""Credentials"" ( + ""Id"" TEXT NOT NULL CONSTRAINT ""PK_Credentials"" PRIMARY KEY, + ""AliasId"" TEXT NOT NULL, + ""CreatedAt"" TEXT NOT NULL, + ""Notes"" TEXT NULL, + ""ServiceId"" TEXT NOT NULL, + ""UpdatedAt"" TEXT NOT NULL, + ""Username"" TEXT NULL, + ""IsDeleted"" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT ""FK_Credentials_Aliases_AliasId"" FOREIGN KEY (""AliasId"") REFERENCES ""Aliases"" (""Id"") ON DELETE CASCADE, + CONSTRAINT ""FK_Credentials_Services_ServiceId"" FOREIGN KEY (""ServiceId"") REFERENCES ""Services"" (""Id"") ON DELETE CASCADE +); + +CREATE TABLE ""Attachments"" ( + ""Id"" TEXT NOT NULL CONSTRAINT ""PK_Attachments"" PRIMARY KEY, + ""Blob"" BLOB NOT NULL, + ""CreatedAt"" TEXT NOT NULL, + ""CredentialId"" TEXT NOT NULL, + ""Filename"" TEXT NOT NULL, + ""IsDeleted"" INTEGER NOT NULL DEFAULT 0, + ""UpdatedAt"" TEXT NOT NULL, + CONSTRAINT ""FK_Attachments_Credentials_CredentialId"" FOREIGN KEY (""CredentialId"") REFERENCES ""Credentials"" (""Id"") ON DELETE CASCADE +); + +CREATE TABLE ""Passwords"" ( + ""Id"" TEXT NOT NULL CONSTRAINT ""PK_Passwords"" PRIMARY KEY, + ""Value"" TEXT NULL, + ""CreatedAt"" TEXT NOT NULL, + ""UpdatedAt"" TEXT NOT NULL, + ""CredentialId"" TEXT NOT NULL, + ""IsDeleted"" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT ""FK_Passwords_Credentials_CredentialId"" FOREIGN KEY (""CredentialId"") REFERENCES ""Credentials"" (""Id"") ON DELETE CASCADE +); + +CREATE TABLE ""TotpCodes"" ( + ""Id"" TEXT NOT NULL CONSTRAINT ""PK_TotpCodes"" PRIMARY KEY, + ""Name"" TEXT NOT NULL, + ""SecretKey"" TEXT NOT NULL, + ""CredentialId"" TEXT NOT NULL, + ""CreatedAt"" TEXT NOT NULL, + ""UpdatedAt"" TEXT NOT NULL, + ""IsDeleted"" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT ""FK_TotpCodes_Credentials_CredentialId"" FOREIGN KEY (""CredentialId"") REFERENCES ""Credentials"" (""Id"") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO ""__EFMigrationsHistory"" SELECT * FROM ""__EFMigrationsHistory_temp""; +INSERT INTO ""Aliases"" SELECT * FROM ""Aliases_temp""; +INSERT INTO ""Services"" SELECT * FROM ""Services_temp""; +INSERT INTO ""EncryptionKeys"" SELECT * FROM ""EncryptionKeys_temp""; +INSERT INTO ""Settings"" SELECT * FROM ""Settings_temp""; +INSERT INTO ""Credentials"" SELECT * FROM ""Credentials_temp""; +INSERT INTO ""Attachments"" SELECT * FROM ""Attachments_temp""; +INSERT INTO ""Passwords"" SELECT * FROM ""Passwords_temp""; +INSERT INTO ""TotpCodes"" SELECT * FROM ""TotpCodes_temp""; + +-- Recreate indexes +CREATE INDEX ""IX_Credentials_AliasId"" ON ""Credentials"" (""AliasId""); +CREATE INDEX ""IX_Credentials_ServiceId"" ON ""Credentials"" (""ServiceId""); +CREATE INDEX ""IX_Attachments_CredentialId"" ON ""Attachments"" (""CredentialId""); +CREATE INDEX ""IX_Passwords_CredentialId"" ON ""Passwords"" (""CredentialId""); +CREATE INDEX ""IX_TotpCodes_CredentialId"" ON ""TotpCodes"" (""CredentialId""); + +-- Clean up temp tables +DROP TABLE ""__EFMigrationsHistory_temp""; +DROP TABLE ""Aliases_temp""; +DROP TABLE ""Services_temp""; +DROP TABLE ""EncryptionKeys_temp""; +DROP TABLE ""Settings_temp""; +DROP TABLE ""Credentials_temp""; +DROP TABLE ""Attachments_temp""; +DROP TABLE ""Passwords_temp""; +DROP TABLE ""TotpCodes_temp""; + +PRAGMA foreign_keys = ON; +"); + + // Now add the new Passkeys table using Entity Framework migration methods + migrationBuilder.CreateTable( + name: "Passkeys", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + RpId = table.Column(type: "TEXT", maxLength: 255, nullable: false, collation: "NOCASE"), + UserId = table.Column(type: "TEXT", maxLength: 255, nullable: true), + PublicKey = table.Column(type: "TEXT", nullable: false), + PrivateKey = table.Column(type: "TEXT", nullable: false), + PrfKey = table.Column(type: "BLOB", maxLength: 64, nullable: true), + DisplayName = table.Column(type: "TEXT", maxLength: 255, nullable: false), + AdditionalData = table.Column(type: "BLOB", nullable: true), + CredentialId = table.Column(type: "TEXT", nullable: false), + CreatedAt = table.Column(type: "TEXT", nullable: false), + UpdatedAt = table.Column(type: "TEXT", nullable: false), + IsDeleted = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Passkeys", x => x.Id); + table.ForeignKey( + name: "FK_Passkeys_Credentials_CredentialId", + column: x => x.CredentialId, + principalTable: "Credentials", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Passkeys_CredentialId", + table: "Passkeys", + column: "CredentialId"); + + migrationBuilder.CreateIndex( + name: "IX_Passkeys_RpId", + table: "Passkeys", + column: "RpId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Passkeys"); + } + } +} diff --git a/apps/server/Databases/AliasClientDb/Passkey.cs b/apps/server/Databases/AliasClientDb/Passkey.cs index 1a75e7298..dbb275417 100644 --- a/apps/server/Databases/AliasClientDb/Passkey.cs +++ b/apps/server/Databases/AliasClientDb/Passkey.cs @@ -22,18 +22,6 @@ public class Passkey : SyncableEntity [Key] public Guid Id { get; set; } - /// - /// Gets or sets the credential ID foreign key. - /// - [Required] - public Guid CredentialId { get; set; } - - /// - /// Gets or sets the credential object. - /// - [ForeignKey("CredentialId")] - public virtual Credential Credential { get; set; } = null!; - /// /// Gets or sets the relying party identifier. /// @@ -73,4 +61,15 @@ public class Passkey : SyncableEntity /// Gets or sets the additional data as JSON blob. /// public byte[]? AdditionalData { get; set; } + + /// + /// Gets or sets the credential ID. + /// + public Guid CredentialId { get; set; } + + /// + /// Gets or sets the credential object. + /// + [ForeignKey("CredentialId")] + public virtual Credential Credential { get; set; } = null!; } diff --git a/apps/server/Databases/AliasClientDb/Scripts/MigrationSql/000_FullSchema.sql b/apps/server/Databases/AliasClientDb/Scripts/MigrationSql/000_FullSchema.sql index c50367ba1..b64ec6e3b 100644 --- a/apps/server/Databases/AliasClientDb/Scripts/MigrationSql/000_FullSchema.sql +++ b/apps/server/Databases/AliasClientDb/Scripts/MigrationSql/000_FullSchema.sql @@ -250,9 +250,184 @@ CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -260,6 +435,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -271,7 +447,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT; diff --git a/apps/server/Databases/AliasClientDb/Scripts/MigrationSql/010_20250310131554_1.5.0-AddTotpCodes_to_20251007084230_1.6.0-AddPasskeys.sql b/apps/server/Databases/AliasClientDb/Scripts/MigrationSql/010_20250310131554_1.5.0-AddTotpCodes_to_20251007084230_1.6.0-AddPasskeys.sql deleted file mode 100644 index 1feac940d..000000000 --- a/apps/server/Databases/AliasClientDb/Scripts/MigrationSql/010_20250310131554_1.5.0-AddTotpCodes_to_20251007084230_1.6.0-AddPasskeys.sql +++ /dev/null @@ -1,26 +0,0 @@ -BEGIN TRANSACTION; -CREATE TABLE "Passkeys" ( - "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, - "RpId" TEXT COLLATE NOCASE NOT NULL, - "UserId" TEXT NULL, - "PublicKey" TEXT NOT NULL, - "PrivateKey" TEXT NOT NULL, - "PrfKey" BLOB NULL, - "DisplayName" TEXT NOT NULL, - "AdditionalData" BLOB NULL, - "CreatedAt" TEXT NOT NULL, - "UpdatedAt" TEXT NOT NULL, - "IsDeleted" INTEGER NOT NULL, - CONSTRAINT "FK_Passkeys_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE -); - -CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); - -CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); - -INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); - -COMMIT; - diff --git a/apps/server/Databases/AliasClientDb/Scripts/MigrationSql/010_20250310131554_1.5.0-AddTotpCodes_to_20251007085746_1.6.0-AddPasskeys.sql b/apps/server/Databases/AliasClientDb/Scripts/MigrationSql/010_20250310131554_1.5.0-AddTotpCodes_to_20251007085746_1.6.0-AddPasskeys.sql new file mode 100644 index 000000000..7cdabb097 --- /dev/null +++ b/apps/server/Databases/AliasClientDb/Scripts/MigrationSql/010_20250310131554_1.5.0-AddTotpCodes_to_20251007085746_1.6.0-AddPasskeys.sql @@ -0,0 +1,202 @@ +BEGIN TRANSACTION; + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + +CREATE TABLE "Passkeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, + "RpId" TEXT COLLATE NOCASE NOT NULL, + "UserId" TEXT NULL, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "PrfKey" BLOB NULL, + "DisplayName" TEXT NOT NULL, + "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL, + CONSTRAINT "FK_Passkeys_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); + +CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); + +INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); + +COMMIT; + diff --git a/shared/vault-sql/src/sql/SqlConstants.ts b/shared/vault-sql/src/sql/SqlConstants.ts index 422b761fe..fa1f16922 100644 --- a/shared/vault-sql/src/sql/SqlConstants.ts +++ b/shared/vault-sql/src/sql/SqlConstants.ts @@ -257,9 +257,184 @@ CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -267,6 +442,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -278,7 +454,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT; `; @@ -472,9 +648,184 @@ VALUES ('20250310131554_1.5.0-AddTotpCodes', '9.0.4'); COMMIT;`, 10: `BEGIN TRANSACTION; + +PRAGMA foreign_keys = OFF; + +-- Clean up any existing temp tables first +DROP TABLE IF EXISTS "__EFMigrationsHistory_temp"; +DROP TABLE IF EXISTS "Aliases_temp"; +DROP TABLE IF EXISTS "Services_temp"; +DROP TABLE IF EXISTS "EncryptionKeys_temp"; +DROP TABLE IF EXISTS "Settings_temp"; +DROP TABLE IF EXISTS "Credentials_temp"; +DROP TABLE IF EXISTS "Attachments_temp"; +DROP TABLE IF EXISTS "Passwords_temp"; +DROP TABLE IF EXISTS "TotpCodes_temp"; + +-- Create backup tables for all data +CREATE TABLE "__EFMigrationsHistory_temp" AS SELECT * FROM "__EFMigrationsHistory"; +CREATE TABLE "Aliases_temp" AS SELECT * FROM "Aliases"; +CREATE TABLE "Services_temp" AS SELECT * FROM "Services"; +CREATE TABLE "EncryptionKeys_temp" AS SELECT * FROM "EncryptionKeys"; +CREATE TABLE "Settings_temp" AS SELECT * FROM "Settings"; +CREATE TABLE "Credentials_temp" AS SELECT * FROM "Credentials"; +CREATE TABLE "Attachments_temp" AS SELECT * FROM "Attachments"; +CREATE TABLE "Passwords_temp" AS SELECT * FROM "Passwords"; +CREATE TABLE "TotpCodes_temp" AS SELECT * FROM "TotpCodes"; + +-- Delete orphaned records that do not have a valid FK to the credential object +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Delete orphaned credentials that do not have valid FKs to alias or service objects +DELETE FROM "Credentials_temp" WHERE "AliasId" NOT IN (SELECT "Id" FROM "Aliases_temp"); +DELETE FROM "Credentials_temp" WHERE "ServiceId" NOT IN (SELECT "Id" FROM "Services_temp"); + +-- After cleaning credentials, clean dependent tables again in case we removed credentials +DELETE FROM "Attachments_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "Passwords_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); +DELETE FROM "TotpCodes_temp" WHERE "CredentialId" NOT IN (SELECT "Id" FROM "Credentials_temp"); + +-- Drop all existing tables +DROP TABLE "TotpCodes"; +DROP TABLE "Passwords"; +DROP TABLE "Attachments"; +DROP TABLE "Credentials"; +DROP TABLE "Settings"; +DROP TABLE "EncryptionKeys"; +DROP TABLE "Services"; +DROP TABLE "Aliases"; +DROP TABLE "__EFMigrationsHistory"; + +-- Recreate tables with proper constraints (no dependencies first) +CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL +); + +CREATE TABLE "Aliases" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Aliases" PRIMARY KEY, + "BirthDate" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Email" TEXT NULL, + "FirstName" VARCHAR NULL, + "Gender" VARCHAR NULL, + "LastName" VARCHAR NULL, + "NickName" VARCHAR NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Services" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Services" PRIMARY KEY, + "Name" TEXT NULL, + "Url" TEXT NULL, + "Logo" BLOB NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "EncryptionKeys" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_EncryptionKeys" PRIMARY KEY, + "PublicKey" TEXT NOT NULL, + "PrivateKey" TEXT NOT NULL, + "IsPrimary" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE "Settings" ( + "Key" TEXT NOT NULL CONSTRAINT "PK_Settings" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0 +); + +-- Tables with foreign keys +CREATE TABLE "Credentials" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Credentials" PRIMARY KEY, + "AliasId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "Notes" TEXT NULL, + "ServiceId" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "Username" TEXT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Credentials_Aliases_AliasId" FOREIGN KEY ("AliasId") REFERENCES "Aliases" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Credentials_Services_ServiceId" FOREIGN KEY ("ServiceId") REFERENCES "Services" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Attachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Attachments" PRIMARY KEY, + "Blob" BLOB NOT NULL, + "CreatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "Filename" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Attachments_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "Passwords" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Passwords" PRIMARY KEY, + "Value" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_Passwords_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + +CREATE TABLE "TotpCodes" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_TotpCodes" PRIMARY KEY, + "Name" TEXT NOT NULL, + "SecretKey" TEXT NOT NULL, + "CredentialId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + "IsDeleted" INTEGER NOT NULL DEFAULT 0, + CONSTRAINT "FK_TotpCodes_Credentials_CredentialId" FOREIGN KEY ("CredentialId") REFERENCES "Credentials" ("Id") ON DELETE CASCADE +); + + +-- Restore data from temp tables +INSERT INTO "__EFMigrationsHistory" SELECT * FROM "__EFMigrationsHistory_temp"; +INSERT INTO "Aliases" SELECT * FROM "Aliases_temp"; +INSERT INTO "Services" SELECT * FROM "Services_temp"; +INSERT INTO "EncryptionKeys" SELECT * FROM "EncryptionKeys_temp"; +INSERT INTO "Settings" SELECT * FROM "Settings_temp"; +INSERT INTO "Credentials" SELECT * FROM "Credentials_temp"; +INSERT INTO "Attachments" SELECT * FROM "Attachments_temp"; +INSERT INTO "Passwords" SELECT * FROM "Passwords_temp"; +INSERT INTO "TotpCodes" SELECT * FROM "TotpCodes_temp"; + +-- Recreate indexes +CREATE INDEX "IX_Credentials_AliasId" ON "Credentials" ("AliasId"); +CREATE INDEX "IX_Credentials_ServiceId" ON "Credentials" ("ServiceId"); +CREATE INDEX "IX_Attachments_CredentialId" ON "Attachments" ("CredentialId"); +CREATE INDEX "IX_Passwords_CredentialId" ON "Passwords" ("CredentialId"); +CREATE INDEX "IX_TotpCodes_CredentialId" ON "TotpCodes" ("CredentialId"); + +-- Clean up temp tables +DROP TABLE "__EFMigrationsHistory_temp"; +DROP TABLE "Aliases_temp"; +DROP TABLE "Services_temp"; +DROP TABLE "EncryptionKeys_temp"; +DROP TABLE "Settings_temp"; +DROP TABLE "Credentials_temp"; +DROP TABLE "Attachments_temp"; +DROP TABLE "Passwords_temp"; +DROP TABLE "TotpCodes_temp"; + +PRAGMA foreign_keys = ON; + + CREATE TABLE "Passkeys" ( "Id" TEXT NOT NULL CONSTRAINT "PK_Passkeys" PRIMARY KEY, - "CredentialId" TEXT NOT NULL, "RpId" TEXT COLLATE NOCASE NOT NULL, "UserId" TEXT NULL, "PublicKey" TEXT NOT NULL, @@ -482,6 +833,7 @@ CREATE TABLE "Passkeys" ( "PrfKey" BLOB NULL, "DisplayName" TEXT NOT NULL, "AdditionalData" BLOB NULL, + "CredentialId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "IsDeleted" INTEGER NOT NULL, @@ -493,7 +845,7 @@ CREATE INDEX "IX_Passkeys_CredentialId" ON "Passkeys" ("CredentialId"); CREATE INDEX "IX_Passkeys_RpId" ON "Passkeys" ("RpId"); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20251007084230_1.6.0-AddPasskeys', '9.0.4'); +VALUES ('20251007085746_1.6.0-AddPasskeys', '9.0.4'); COMMIT;`, };