mirror of
https://github.com/aliasvault/aliasvault.git
synced 2026-05-19 13:57:18 -04:00
Add FK repair script to migration to fix older vaults (#520)
This commit is contained in:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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;`
|
||||
};
|
||||
|
||||
@@ -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;`
|
||||
};
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
360
apps/mobile-app/utils/dist/shared/vault-sql/index.js
vendored
360
apps/mobile-app/utils/dist/shared/vault-sql/index.js
vendored
@@ -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;`
|
||||
};
|
||||
|
||||
@@ -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;`
|
||||
};
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
<button @onclick="MigrateDatabase" type="button" class="px-4 py-2 text-white bg-primary-600 rounded-lg hover:bg-primary-700 focus:ring-4 focus:ring-primary-300 dark:bg-primary-500 dark:hover:bg-primary-600 dark:focus:ring-primary-800">
|
||||
<button @onclick="MigrateDatabase" type="button" class="px-4 mt-4 py-2 text-white bg-primary-600 rounded-lg hover:bg-primary-700 focus:ring-4 focus:ring-primary-300 dark:bg-primary-500 dark:hover:bg-primary-600 dark:focus:ring-primary-800">
|
||||
@Localizer["StartUpgradeButton"]
|
||||
</button>
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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;`
|
||||
};
|
||||
|
||||
@@ -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;`
|
||||
};
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
// <auto-generated />
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace AliasClientDb.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class _160AddPasskeys : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Passkeys",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<Guid>(type: "TEXT", nullable: false),
|
||||
CredentialId = table.Column<Guid>(type: "TEXT", nullable: false),
|
||||
RpId = table.Column<string>(type: "TEXT", maxLength: 255, nullable: false, collation: "NOCASE"),
|
||||
UserId = table.Column<string>(type: "TEXT", maxLength: 255, nullable: true),
|
||||
PublicKey = table.Column<string>(type: "TEXT", nullable: false),
|
||||
PrivateKey = table.Column<string>(type: "TEXT", nullable: false),
|
||||
PrfKey = table.Column<byte[]>(type: "BLOB", maxLength: 64, nullable: true),
|
||||
DisplayName = table.Column<string>(type: "TEXT", maxLength: 255, nullable: false),
|
||||
AdditionalData = table.Column<byte[]>(type: "BLOB", nullable: true),
|
||||
CreatedAt = table.Column<DateTime>(type: "TEXT", nullable: false),
|
||||
UpdatedAt = table.Column<DateTime>(type: "TEXT", nullable: false),
|
||||
IsDeleted = table.Column<bool>(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");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "Passkeys");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
{
|
||||
/// <inheritdoc />
|
||||
@@ -0,0 +1,240 @@
|
||||
// <auto-generated />
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace AliasClientDb.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class _160AddPasskeys : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
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<Guid>(type: "TEXT", nullable: false),
|
||||
RpId = table.Column<string>(type: "TEXT", maxLength: 255, nullable: false, collation: "NOCASE"),
|
||||
UserId = table.Column<string>(type: "TEXT", maxLength: 255, nullable: true),
|
||||
PublicKey = table.Column<string>(type: "TEXT", nullable: false),
|
||||
PrivateKey = table.Column<string>(type: "TEXT", nullable: false),
|
||||
PrfKey = table.Column<byte[]>(type: "BLOB", maxLength: 64, nullable: true),
|
||||
DisplayName = table.Column<string>(type: "TEXT", maxLength: 255, nullable: false),
|
||||
AdditionalData = table.Column<byte[]>(type: "BLOB", nullable: true),
|
||||
CredentialId = table.Column<Guid>(type: "TEXT", nullable: false),
|
||||
CreatedAt = table.Column<DateTime>(type: "TEXT", nullable: false),
|
||||
UpdatedAt = table.Column<DateTime>(type: "TEXT", nullable: false),
|
||||
IsDeleted = table.Column<bool>(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");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "Passkeys");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,18 +22,6 @@ public class Passkey : SyncableEntity
|
||||
[Key]
|
||||
public Guid Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the credential ID foreign key.
|
||||
/// </summary>
|
||||
[Required]
|
||||
public Guid CredentialId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the credential object.
|
||||
/// </summary>
|
||||
[ForeignKey("CredentialId")]
|
||||
public virtual Credential Credential { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the relying party identifier.
|
||||
/// </summary>
|
||||
@@ -73,4 +61,15 @@ public class Passkey : SyncableEntity
|
||||
/// Gets or sets the additional data as JSON blob.
|
||||
/// </summary>
|
||||
public byte[]? AdditionalData { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the credential ID.
|
||||
/// </summary>
|
||||
public Guid CredentialId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the credential object.
|
||||
/// </summary>
|
||||
[ForeignKey("CredentialId")]
|
||||
public virtual Credential Credential { get; set; } = null!;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;`,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user