diff --git a/backend/src/db/migrations/20250429203304_certificates-ca-relation-optional.ts b/backend/src/db/migrations/20250429203304_certificates-ca-relation-optional.ts deleted file mode 100644 index 38f106731..000000000 --- a/backend/src/db/migrations/20250429203304_certificates-ca-relation-optional.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Knex } from "knex"; - -import { TableName } from "../schemas"; - -export async function up(knex: Knex): Promise { - if (await knex.schema.hasTable(TableName.Certificate)) { - await knex.schema.alterTable(TableName.Certificate, (t) => { - t.uuid("caId").nullable().alter(); - t.uuid("caCertId").nullable().alter(); - }); - } -} - -export async function down(): Promise { - // Altering back to nullable will fail -} diff --git a/backend/src/db/migrations/20250429203304_certificates-ca-relation-removal.ts b/backend/src/db/migrations/20250429203304_certificates-ca-relation-removal.ts new file mode 100644 index 000000000..1413f5096 --- /dev/null +++ b/backend/src/db/migrations/20250429203304_certificates-ca-relation-removal.ts @@ -0,0 +1,46 @@ +import { Knex } from "knex"; + +import { TableName } from "../schemas"; + +export async function up(knex: Knex): Promise { + if (await knex.schema.hasTable(TableName.Certificate)) { + await knex.schema.alterTable(TableName.Certificate, (t) => { + t.uuid("caId").nullable().alter(); + t.uuid("caCertId").nullable().alter(); + }); + + const hasProjectIdColumn = await knex.schema.hasColumn(TableName.Certificate, "projectId"); + if (!hasProjectIdColumn) { + await knex.transaction(async (trx) => { + await trx.schema.alterTable(TableName.Certificate, (t) => { + t.string("projectId", 36).nullable(); + t.foreign("projectId").references("id").inTable(TableName.Project).onDelete("CASCADE"); + }); + + await trx.raw(` + UPDATE "${TableName.Certificate}" cert + SET "projectId" = ca."projectId" + FROM "${TableName.CertificateAuthority}" ca + WHERE cert."caId" = ca.id + `); + + await trx.schema.alterTable(TableName.Certificate, (t) => { + t.string("projectId").notNullable().alter(); + }); + }); + } + } +} + +export async function down(knex: Knex): Promise { + if (await knex.schema.hasTable(TableName.Certificate)) { + if (await knex.schema.hasColumn(TableName.Certificate, "projectId")) { + await knex.schema.alterTable(TableName.Certificate, (t) => { + t.dropForeign("projectId"); + t.dropColumn("projectId"); + }); + } + } + + // Altering back to notNullable for caId and caCertId will fail +} diff --git a/backend/src/db/migrations/20250429210424_certificates-update-body-and-add-secret.ts b/backend/src/db/migrations/20250429210424_certificates-update-body-and-add-secret.ts deleted file mode 100644 index cb5e44a03..000000000 --- a/backend/src/db/migrations/20250429210424_certificates-update-body-and-add-secret.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Knex } from "knex"; - -import { TableName } from "../schemas"; - -export async function up(knex: Knex): Promise { - if (await knex.schema.hasTable(TableName.CertificateBody)) { - await knex.schema.alterTable(TableName.CertificateBody, (t) => { - t.binary("encryptedCertificateChain").nullable(); - }); - } - - if (!(await knex.schema.hasTable(TableName.CertificateSecret))) { - await knex.schema.createTable(TableName.CertificateSecret, (t) => { - t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid()); - t.timestamps(true, true, true); - t.uuid("certId").notNullable().unique(); - t.foreign("certId").references("id").inTable(TableName.Certificate).onDelete("CASCADE"); - t.binary("encryptedPrivateKey").notNullable(); - }); - } -} - -export async function down(knex: Knex): Promise { - if (await knex.schema.hasTable(TableName.CertificateSecret)) { - await knex.schema.dropTable(TableName.CertificateSecret); - } - - if (await knex.schema.hasTable(TableName.CertificateBody)) { - await knex.schema.alterTable(TableName.CertificateBody, (t) => { - t.dropColumn("encryptedCertificateChain"); - }); - } -} diff --git a/backend/src/db/migrations/20250429223815_certificates-project-id.ts b/backend/src/db/migrations/20250429223815_certificates-project-id.ts deleted file mode 100644 index 556913a6b..000000000 --- a/backend/src/db/migrations/20250429223815_certificates-project-id.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Knex } from "knex"; - -import { TableName } from "../schemas"; - -export async function up(knex: Knex): Promise { - if (await knex.schema.hasTable(TableName.Certificate)) { - await knex.schema.alterTable(TableName.Certificate, (t) => { - t.uuid("projectId").notNullable(); - t.foreign("projectId").references("id").inTable(TableName.Certificate).onDelete("CASCADE"); - }); - } -} - -export async function down(knex: Knex): Promise { - // .. tbd -} diff --git a/backend/src/db/schemas/certificate-bodies.ts b/backend/src/db/schemas/certificate-bodies.ts index 10171e383..75afbddbd 100644 --- a/backend/src/db/schemas/certificate-bodies.ts +++ b/backend/src/db/schemas/certificate-bodies.ts @@ -14,8 +14,7 @@ export const CertificateBodiesSchema = z.object({ createdAt: z.date(), updatedAt: z.date(), certId: z.string().uuid(), - encryptedCertificate: zodBuffer, - encryptedCertificateChain: zodBuffer.nullable().optional() + encryptedCertificate: zodBuffer }); export type TCertificateBodies = z.infer; diff --git a/backend/src/db/schemas/certificates.ts b/backend/src/db/schemas/certificates.ts index f46a86e0a..32fb89aed 100644 --- a/backend/src/db/schemas/certificates.ts +++ b/backend/src/db/schemas/certificates.ts @@ -24,7 +24,8 @@ export const CertificatesSchema = z.object({ caCertId: z.string().uuid().nullable().optional(), certificateTemplateId: z.string().uuid().nullable().optional(), keyUsages: z.string().array().nullable().optional(), - extendedKeyUsages: z.string().array().nullable().optional() + extendedKeyUsages: z.string().array().nullable().optional(), + projectId: z.string() }); export type TCertificates = z.infer;