diff --git a/apps/api/prisma/migrations/20220912142654_preview_applications/migration.sql b/apps/api/prisma/migrations/20220912142654_preview_applications/migration.sql new file mode 100644 index 000000000..e3b4e7bc7 --- /dev/null +++ b/apps/api/prisma/migrations/20220912142654_preview_applications/migration.sql @@ -0,0 +1,17 @@ +-- AlterTable +ALTER TABLE "Build" ADD COLUMN "previewApplicationId" TEXT; + +-- CreateTable +CREATE TABLE "PreviewApplication" ( + "id" TEXT NOT NULL PRIMARY KEY, + "prMrId" TEXT NOT NULL, + "isRandomDomain" BOOLEAN NOT NULL DEFAULT false, + "customDomain" TEXT, + "applicationId" TEXT NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + CONSTRAINT "PreviewApplication_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); + +-- CreateIndex +CREATE UNIQUE INDEX "PreviewApplication_applicationId_key" ON "PreviewApplication"("applicationId"); diff --git a/apps/api/prisma/schema.prisma b/apps/api/prisma/schema.prisma index df7516e01..c900d901b 100644 --- a/apps/api/prisma/schema.prisma +++ b/apps/api/prisma/schema.prisma @@ -119,6 +119,18 @@ model Application { secrets Secret[] teams Team[] connectedDatabase ApplicationConnectedDatabase? + previewApplication PreviewApplication[] +} + +model PreviewApplication { + id String @id @default(cuid()) + prMrId String + isRandomDomain Boolean @default(false) + customDomain String? + applicationId String @unique + application Application @relation(fields: [applicationId], references: [id]) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } model ApplicationConnectedDatabase { @@ -219,6 +231,7 @@ model Build { gitlabAppId String? commit String? pullmergeRequestId String? + previewApplicationId String? forceRebuild Boolean @default(false) sourceBranch String? branch String? diff --git a/apps/api/src/jobs/deployApplication.ts b/apps/api/src/jobs/deployApplication.ts index 23adbf608..5909d895b 100644 --- a/apps/api/src/jobs/deployApplication.ts +++ b/apps/api/src/jobs/deployApplication.ts @@ -38,8 +38,16 @@ import * as buildpacks from '../lib/buildPacks'; for (const queueBuild of queuedBuilds) { actions.push(async () => { let application = await prisma.application.findUnique({ where: { id: queueBuild.applicationId }, include: { destinationDocker: true, gitSource: { include: { githubApp: true, gitlabApp: true } }, persistentStorage: true, secrets: true, settings: true, teams: true } }) - let { id: buildId, type, sourceBranch = null, pullmergeRequestId = null, forceRebuild } = queueBuild + let { id: buildId, type, sourceBranch = null, pullmergeRequestId = null, previewApplicationId = null, forceRebuild } = queueBuild application = decryptApplication(application) + const originalApplicationId = application.id + if (pullmergeRequestId) { + const previewApplications = await prisma.previewApplication.findMany({where: {applicationId: originalApplicationId, prMrId: pullmergeRequestId}}) + if (previewApplications.length > 0) { + previewApplicationId = previewApplications[0].id + } + } + const usableApplicationId = previewApplicationId || originalApplicationId try { if (queueBuild.status === 'running') { await saveBuildLog({ line: 'Building halted, restarting...', buildId, applicationId: application.id }); diff --git a/apps/api/src/routes/webhooks/github/handlers.ts b/apps/api/src/routes/webhooks/github/handlers.ts index 4bfea692c..56d9b92a0 100644 --- a/apps/api/src/routes/webhooks/github/handlers.ts +++ b/apps/api/src/routes/webhooks/github/handlers.ts @@ -169,10 +169,21 @@ export async function gitHubEvents(request: FastifyRequest): Promi pullmergeRequestAction === 'reopened' || pullmergeRequestAction === 'synchronize' ) { + await prisma.application.update({ where: { id: application.id }, data: { updatedAt: new Date() } }); + let previewApplicationId = undefined + if (pullmergeRequestId) { + const foundPreviewApplications = await prisma.previewApplication.findMany({ where: { applicationId: application.id, prMrId: pullmergeRequestId } }) + if (foundPreviewApplications.length > 0) { + previewApplicationId = foundPreviewApplications[0].id + } else { + const previewApplication = await prisma.previewApplication.create({ data: { prMrId: pullmergeRequestId, application: { connect: { id: application.id } } } }) + previewApplicationId = previewApplication.id + } + } // if (application.connectedDatabase && pullmergeRequestAction === 'opened' || pullmergeRequestAction === 'reopened') { // // Coolify hosted database // if (application.connectedDatabase.databaseId) { @@ -187,6 +198,7 @@ export async function gitHubEvents(request: FastifyRequest): Promi data: { id: buildId, pullmergeRequestId, + previewApplicationId, sourceBranch, applicationId: application.id, destinationDockerId: application.destinationDocker.id, @@ -206,13 +218,19 @@ export async function gitHubEvents(request: FastifyRequest): Promi await removeContainer({ id, dockerId: application.destinationDocker.id }); } catch (error) { } } - if (application.connectedDatabase.databaseId) { - const databaseId = application.connectedDatabase.databaseId; - const database = await prisma.database.findUnique({ where: { id: databaseId } }); - if (database) { - await removeBranchDatabase(database, pullmergeRequestId); + const foundPreviewApplications = await prisma.previewApplication.findMany({ where: {applicationId: application.id, prMrId: pullmergeRequestId}}) + if (foundPreviewApplications.length > 0) { + for (const preview of foundPreviewApplications) { + await prisma.previewApplication.delete({where: {id: preview.id}}) } } + // if (application?.connectedDatabase?.databaseId) { + // const databaseId = application.connectedDatabase.databaseId; + // const database = await prisma.database.findUnique({ where: { id: databaseId } }); + // if (database) { + // await removeBranchDatabase(database, pullmergeRequestId); + // } + // } } } }