diff --git a/src/lib/database/checks.ts b/src/lib/database/checks.ts index 534d81966..bbe773ae5 100644 --- a/src/lib/database/checks.ts +++ b/src/lib/database/checks.ts @@ -1,7 +1,16 @@ import { getDomain } from '$lib/common'; import { prisma } from './common'; +import type { Application, ServiceSecret, DestinationDocker, Secret } from '@prisma/client'; -export async function isBranchAlreadyUsed({ repository, branch, id }) { +export async function isBranchAlreadyUsed({ + repository, + branch, + id +}: { + id: string; + repository: string; + branch: string; +}): Promise { const application = await prisma.application.findUnique({ where: { id }, include: { gitSource: true } @@ -11,18 +20,42 @@ export async function isBranchAlreadyUsed({ repository, branch, id }) { }); } -export async function isDockerNetworkExists({ network }) { +export async function isDockerNetworkExists({ + network +}: { + network: string; +}): Promise { return await prisma.destinationDocker.findFirst({ where: { network } }); } -export async function isServiceSecretExists({ id, name }) { +export async function isServiceSecretExists({ + id, + name +}: { + id: string; + name: string; +}): Promise { return await prisma.serviceSecret.findFirst({ where: { name, serviceId: id } }); } -export async function isSecretExists({ id, name, isPRMRSecret }) { +export async function isSecretExists({ + id, + name, + isPRMRSecret +}: { + id: string; + name: string; + isPRMRSecret: boolean; +}): Promise { return await prisma.secret.findFirst({ where: { name, applicationId: id, isPRMRSecret } }); } -export async function isDomainConfigured({ id, fqdn }) { +export async function isDomainConfigured({ + id, + fqdn +}: { + id: string; + fqdn: string; +}): Promise { const domain = getDomain(fqdn); const nakedDomain = domain.replace('www.', ''); const foundApp = await prisma.application.findFirst({ @@ -55,6 +88,5 @@ export async function isDomainConfigured({ id, fqdn }) { }, select: { fqdn: true } }); - if (foundApp || foundService || coolifyFqdn) return true; - return false; + return !!(foundApp || foundService || coolifyFqdn); } diff --git a/src/lib/database/common.ts b/src/lib/database/common.ts index 3e473f094..7c34aa235 100644 --- a/src/lib/database/common.ts +++ b/src/lib/database/common.ts @@ -2,11 +2,11 @@ import { dev } from '$app/env'; import { sentry } from '$lib/common'; import * as Prisma from '@prisma/client'; import { default as ProdPrisma } from '@prisma/client'; -import type { PrismaClientOptions } from '@prisma/client/runtime'; +import type { Database, DatabaseSettings } from '@prisma/client'; import generator from 'generate-password'; import forge from 'node-forge'; -export function generatePassword(length = 24) { +export function generatePassword(length = 24): string { return generator.generate({ length, numbers: true, @@ -26,8 +26,14 @@ export const prisma = new PrismaClient({ rejectOnNotFound: false }); -export function ErrorHandler(e) { - if (e! instanceof Error) { +export function ErrorHandler(e: { + stdout?; + message?: string; + status?: number; + name?: string; + error?: string; +}): { status: number; body: { message: string; error: string } } { + if (e && e instanceof Error) { e = new Error(e.toString()); } let truncatedError = e; @@ -35,8 +41,7 @@ export function ErrorHandler(e) { truncatedError = e.stdout; } if (e.message?.includes('docker run')) { - let truncatedArray = []; - truncatedArray = truncatedError.message.split('-').filter((line) => { + const truncatedArray: string[] = truncatedError.message.split('-').filter((line) => { if (!line.startsWith('e ')) { return line; } @@ -64,11 +69,11 @@ export function ErrorHandler(e) { payload.body.message = 'Already exists. Choose another name.'; } } - // console.error(e) return payload; } + export async function generateSshKeyPair(): Promise<{ publicKey: string; privateKey: string }> { - return await new Promise(async (resolve, reject) => { + return await new Promise((resolve, reject) => { forge.pki.rsa.generateKeyPair({ bits: 4096, workers: -1 }, function (err, keys) { if (keys) { resolve({ @@ -210,35 +215,93 @@ export const supportedServiceTypesAndVersions = [ } ]; -export function getVersions(type) { +export function getVersions(type: string): string[] { const found = supportedDatabaseTypesAndVersions.find((t) => t.name === type); if (found) { return found.versions; } return []; } -export function getDatabaseImage(type) { + +export function getDatabaseImage(type: string): string { const found = supportedDatabaseTypesAndVersions.find((t) => t.name === type); if (found) { return found.baseImage; } return ''; } -export function getServiceImage(type) { + +export function getServiceImage(type: string): string { const found = supportedServiceTypesAndVersions.find((t) => t.name === type); if (found) { return found.baseImage; } return ''; } -export function getServiceImages(type) { + +export function getServiceImages(type: string): string[] { const found = supportedServiceTypesAndVersions.find((t) => t.name === type); if (found) { return found.images; } return []; } -export function generateDatabaseConfiguration(database) { + +export function generateDatabaseConfiguration(database: Database & { settings: DatabaseSettings }): + | { + volume: string; + image: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + MYSQL_DATABASE: string; + MYSQL_PASSWORD: string; + MYSQL_ROOT_USER: string; + MYSQL_USER: string; + MYSQL_ROOT_PASSWORD: string; + }; + } + | { + volume: string; + image: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + MONGODB_ROOT_USER: string; + MONGODB_ROOT_PASSWORD: string; + }; + } + | { + volume: string; + image: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + POSTGRESQL_USERNAME: string; + POSTGRESQL_PASSWORD: string; + POSTGRESQL_DATABASE: string; + }; + } + | { + volume: string; + image: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + REDIS_AOF_ENABLED: string; + REDIS_PASSWORD: string; + }; + } + | { + volume: string; + image: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + COUCHDB_PASSWORD: string; + COUCHDB_USER: string; + }; + } { const { id, dbUser, @@ -253,7 +316,6 @@ export function generateDatabaseConfiguration(database) { const baseImage = getDatabaseImage(type); if (type === 'mysql') { return { - // url: `mysql://${dbUser}:${dbUserPassword}@${id}:${isPublic ? port : 3306}/${defaultDatabase}`, privatePort: 3306, environmentVariables: { MYSQL_USER: dbUser, @@ -268,7 +330,6 @@ export function generateDatabaseConfiguration(database) { }; } else if (type === 'mongodb') { return { - // url: `mongodb://${dbUser}:${dbUserPassword}@${id}:${isPublic ? port : 27017}/${defaultDatabase}`, privatePort: 27017, environmentVariables: { MONGODB_ROOT_USER: rootUser, @@ -280,7 +341,6 @@ export function generateDatabaseConfiguration(database) { }; } else if (type === 'postgresql') { return { - // url: `psql://${dbUser}:${dbUserPassword}@${id}:${isPublic ? port : 5432}/${defaultDatabase}`, privatePort: 5432, environmentVariables: { POSTGRESQL_PASSWORD: dbUserPassword, @@ -293,7 +353,6 @@ export function generateDatabaseConfiguration(database) { }; } else if (type === 'redis') { return { - // url: `redis://${dbUser}:${dbUserPassword}@${id}:${isPublic ? port : 6379}/${defaultDatabase}`, privatePort: 6379, environmentVariables: { REDIS_PASSWORD: dbUserPassword, @@ -305,7 +364,6 @@ export function generateDatabaseConfiguration(database) { }; } else if (type === 'couchdb') { return { - // url: `couchdb://${dbUser}:${dbUserPassword}@${id}:${isPublic ? port : 5984}/${defaultDatabase}`, privatePort: 5984, environmentVariables: { COUCHDB_PASSWORD: dbUserPassword, @@ -316,18 +374,4 @@ export function generateDatabaseConfiguration(database) { ulimits: {} }; } - // } else if (type === 'clickhouse') { - // return { - // url: `clickhouse://${dbUser}:${dbUserPassword}@${id}:${port}/${defaultDatabase}`, - // privatePort: 9000, - // image: `bitnami/clickhouse-server:${version}`, - // volume: `${id}-${type}-data:/var/lib/clickhouse`, - // ulimits: { - // nofile: { - // soft: 262144, - // hard: 262144 - // } - // } - // } - // } }