From ee67e163b1cebb440905f6472cc3cd6107a9a539 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 28 Sep 2022 10:34:27 +0200 Subject: [PATCH] feat: system-wide github apps --- .../migration.sql | 26 +++++++ apps/api/prisma/schema.prisma | 1 + apps/api/src/routes/api/v1/handlers.ts | 2 +- .../api/src/routes/api/v1/sources/handlers.ts | 11 +-- apps/api/src/routes/api/v1/sources/types.ts | 1 + apps/ui/src/lib/components/Setting.svelte | 3 +- .../routes/applications/[id]/__layout.svelte | 2 +- .../[id]/configuration/source.svelte | 62 +++++++++++++++- apps/ui/src/routes/index.svelte | 67 +++++++++++------ .../ui/src/routes/sources/[id]/_Github.svelte | 73 ++++++++++++++----- .../src/routes/sources/[id]/__layout.svelte | 2 +- 11 files changed, 200 insertions(+), 50 deletions(-) create mode 100644 apps/api/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql diff --git a/apps/api/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql b/apps/api/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql new file mode 100644 index 000000000..a3657504d --- /dev/null +++ b/apps/api/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql @@ -0,0 +1,26 @@ +-- RedefineTables +PRAGMA foreign_keys=OFF; +CREATE TABLE "new_GitSource" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT NOT NULL, + "forPublic" BOOLEAN NOT NULL DEFAULT false, + "type" TEXT, + "apiUrl" TEXT, + "htmlUrl" TEXT, + "customPort" INTEGER NOT NULL DEFAULT 22, + "organization" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + "githubAppId" TEXT, + "gitlabAppId" TEXT, + "isSystemWide" BOOLEAN NOT NULL DEFAULT false, + CONSTRAINT "GitSource_gitlabAppId_fkey" FOREIGN KEY ("gitlabAppId") REFERENCES "GitlabApp" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT "GitSource_githubAppId_fkey" FOREIGN KEY ("githubAppId") REFERENCES "GithubApp" ("id") ON DELETE SET NULL ON UPDATE CASCADE +); +INSERT INTO "new_GitSource" ("apiUrl", "createdAt", "customPort", "forPublic", "githubAppId", "gitlabAppId", "htmlUrl", "id", "name", "organization", "type", "updatedAt") SELECT "apiUrl", "createdAt", "customPort", "forPublic", "githubAppId", "gitlabAppId", "htmlUrl", "id", "name", "organization", "type", "updatedAt" FROM "GitSource"; +DROP TABLE "GitSource"; +ALTER TABLE "new_GitSource" RENAME TO "GitSource"; +CREATE UNIQUE INDEX "GitSource_githubAppId_key" ON "GitSource"("githubAppId"); +CREATE UNIQUE INDEX "GitSource_gitlabAppId_key" ON "GitSource"("gitlabAppId"); +PRAGMA foreign_key_check; +PRAGMA foreign_keys=ON; diff --git a/apps/api/prisma/schema.prisma b/apps/api/prisma/schema.prisma index d064f707a..4640a4350 100644 --- a/apps/api/prisma/schema.prisma +++ b/apps/api/prisma/schema.prisma @@ -299,6 +299,7 @@ model GitSource { updatedAt DateTime @updatedAt githubAppId String? @unique gitlabAppId String? @unique + isSystemWide Boolean @default(false) gitlabApp GitlabApp? @relation(fields: [gitlabAppId], references: [id]) githubApp GithubApp? @relation(fields: [githubAppId], references: [id]) application Application[] diff --git a/apps/api/src/routes/api/v1/handlers.ts b/apps/api/src/routes/api/v1/handlers.ts index 7b0e9959b..117bb9d13 100644 --- a/apps/api/src/routes/api/v1/handlers.ts +++ b/apps/api/src/routes/api/v1/handlers.ts @@ -135,7 +135,7 @@ export async function showDashboard(request: FastifyRequest) { include: { destinationDocker: true, teams: true }, }); const gitSources = await prisma.gitSource.findMany({ - where: { teams: { some: { id: teamId === "0" ? undefined : teamId } } }, + where: { OR: [{ teams: { some: { id: teamId === "0" ? undefined : teamId } } }, { isSystemWide: true }] }, include: { teams: true }, }); const destinations = await prisma.destinationDocker.findMany({ diff --git a/apps/api/src/routes/api/v1/sources/handlers.ts b/apps/api/src/routes/api/v1/sources/handlers.ts index 8a1c19987..b67ab7eb4 100644 --- a/apps/api/src/routes/api/v1/sources/handlers.ts +++ b/apps/api/src/routes/api/v1/sources/handlers.ts @@ -9,7 +9,7 @@ export async function listSources(request: FastifyRequest) { try { const teamId = request.user?.teamId; const sources = await prisma.gitSource.findMany({ - where: { teams: { some: { id: teamId === '0' ? undefined : teamId } } }, + where: { OR: [{ teams: { some: { id: teamId === "0" ? undefined : teamId } } }, { isSystemWide: true }] }, include: { teams: true, githubApp: true, gitlabApp: true } }); return { @@ -22,11 +22,11 @@ export async function listSources(request: FastifyRequest) { export async function saveSource(request, reply) { try { const { id } = request.params - let { name, htmlUrl, apiUrl, customPort } = request.body + let { name, htmlUrl, apiUrl, customPort, isSystemWide } = request.body if (customPort) customPort = Number(customPort) await prisma.gitSource.update({ where: { id }, - data: { name, htmlUrl, apiUrl, customPort } + data: { name, htmlUrl, apiUrl, customPort, isSystemWide } }); return reply.code(201).send() } catch ({ status, message }) { @@ -56,7 +56,7 @@ export async function getSource(request: FastifyRequest) { } const source = await prisma.gitSource.findFirst({ - where: { id, teams: { some: { id: teamId === '0' ? undefined : teamId } } }, + where: { id, OR: [{ teams: { some: { id: teamId === "0" ? undefined : teamId } } }, { isSystemWide: true }] }, include: { githubApp: true, gitlabApp: true } }); if (!source) { @@ -104,7 +104,7 @@ export async function saveGitHubSource(request: FastifyRequest const { teamId } = request.user const { id } = request.params - let { name, htmlUrl, apiUrl, organization, customPort } = request.body + let { name, htmlUrl, apiUrl, organization, customPort, isSystemWide } = request.body if (customPort) customPort = Number(customPort) if (id === 'new') { @@ -117,6 +117,7 @@ export async function saveGitHubSource(request: FastifyRequest apiUrl, organization, customPort, + isSystemWide, type: 'github', teams: { connect: { id: teamId } } } diff --git a/apps/api/src/routes/api/v1/sources/types.ts b/apps/api/src/routes/api/v1/sources/types.ts index a748b3943..bb65c7d85 100644 --- a/apps/api/src/routes/api/v1/sources/types.ts +++ b/apps/api/src/routes/api/v1/sources/types.ts @@ -7,6 +7,7 @@ export interface SaveGitHubSource extends OnlyId { apiUrl: string, organization: string, customPort: number, + isSystemWide: boolean } } export interface SaveGitLabSource extends OnlyId { diff --git a/apps/ui/src/lib/components/Setting.svelte b/apps/ui/src/lib/components/Setting.svelte index d4db07e91..18404684d 100644 --- a/apps/ui/src/lib/components/Setting.svelte +++ b/apps/ui/src/lib/components/Setting.svelte @@ -3,6 +3,7 @@ import Tooltip from './Tooltip.svelte'; export let id: any; + export let customClass: any = null; export let setting: any; export let title: any; export let description: any; @@ -24,7 +25,7 @@ -
+
Force Redeploy (without cache) - {:else if $isDeploymentEnabled} + {:else if $isDeploymentEnabled && !$page.url.pathname.startsWith(`/applications/${id}/configuration/`)} @@ -159,9 +183,16 @@ {/if}
- - - + + + - + - - + + changeSettings('isSystemWide', true)} + title="System Wide Git Source" + description="System Wide Git Sources are available to all the users in your Coolify instance.

Use with caution, as it can be a security risk." + />
{:else} diff --git a/apps/ui/src/routes/sources/[id]/__layout.svelte b/apps/ui/src/routes/sources/[id]/__layout.svelte index 47cc8df1f..c4f00a331 100644 --- a/apps/ui/src/routes/sources/[id]/__layout.svelte +++ b/apps/ui/src/routes/sources/[id]/__layout.svelte @@ -53,7 +53,7 @@ } -{#if id !== 'new'} +{#if id !== 'new' && $appSession.teamId === '0'}