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/lib/common.ts b/apps/api/src/lib/common.ts index 5435e976e..6f819433e 100644 --- a/apps/api/src/lib/common.ts +++ b/apps/api/src/lib/common.ts @@ -21,7 +21,7 @@ import { scheduler } from './scheduler'; import { supportedServiceTypesAndVersions } from './services/supportedVersions'; import { includeServices } from './services/common'; -export const version = '3.10.9'; +export const version = '3.10.10'; export const isDev = process.env.NODE_ENV === 'development'; const algorithm = 'aes-256-ctr'; 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/Beta.svelte b/apps/ui/src/lib/components/Beta.svelte new file mode 100644 index 000000000..279401fcf --- /dev/null +++ b/apps/ui/src/lib/components/Beta.svelte @@ -0,0 +1 @@ + BETA \ No newline at end of file diff --git a/apps/ui/src/lib/components/Setting.svelte b/apps/ui/src/lib/components/Setting.svelte index d4db07e91..ef5bab024 100644 --- a/apps/ui/src/lib/components/Setting.svelte +++ b/apps/ui/src/lib/components/Setting.svelte @@ -1,10 +1,13 @@
-
+
+
+ diff --git a/apps/ui/src/routes/sources/[id]/_Github.svelte b/apps/ui/src/routes/sources/[id]/_Github.svelte index c104b5b84..88821d393 100644 --- a/apps/ui/src/routes/sources/[id]/_Github.svelte +++ b/apps/ui/src/routes/sources/[id]/_Github.svelte @@ -8,6 +8,7 @@ import { addToast, appSession } from '$lib/store'; import { dev } from '$app/env'; import Explainer from '$lib/components/Explainer.svelte'; + import Setting from '$lib/components/Setting.svelte'; const { id } = $page.params; @@ -21,7 +22,8 @@ await post(`/sources/${id}`, { name: source.name, htmlUrl: source.htmlUrl.replace(/\/$/, ''), - apiUrl: source.apiUrl.replace(/\/$/, '') + apiUrl: source.apiUrl.replace(/\/$/, ''), + isSystemWide: source.isSystemWide }); return addToast({ message: 'Configuration saved.', @@ -43,7 +45,8 @@ htmlUrl: source.htmlUrl.replace(/\/$/, ''), apiUrl: source.apiUrl.replace(/\/$/, ''), organization: source.organization, - customPort: source.customPort + customPort: source.customPort, + isSystemWide: source.isSystemWide }); const { organization, htmlUrl } = source; const { fqdn, ipv4, ipv6 } = settings; @@ -88,6 +91,16 @@ return errorNotification(error); } } + async function changeSettings(name: any, save: boolean) { + if ($appSession.teamId === '0') { + if (name === 'isSystemWide') { + source.isSystemWide = !source.isSystemWide; + } + if (save) { + await handleSubmit(); + } + } + }
@@ -104,13 +117,13 @@ {/if}
- + - + - + - -
{:else if source.githubApp?.installationId}

{$t('general')}

- {#if $appSession.isAdmin} -
+ {#if $appSession.isAdmin && $appSession.teamId === '0'} +
@@ -159,9 +184,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'}