2022-02-10 15:47:44 +01:00
|
|
|
import { decrypt, encrypt } from '$lib/crypto';
|
2022-04-06 20:30:29 +02:00
|
|
|
import type { Minio, Service } from '@prisma/client';
|
2022-02-10 15:47:44 +01:00
|
|
|
import cuid from 'cuid';
|
|
|
|
import { generatePassword } from '.';
|
2022-02-11 21:14:47 +01:00
|
|
|
import { prisma } from './common';
|
2022-02-10 15:47:44 +01:00
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function listServices(teamId: string): Promise<Service[]> {
|
2022-04-06 15:55:17 +02:00
|
|
|
if (teamId === '0') {
|
|
|
|
return await prisma.service.findMany({ include: { teams: true } });
|
|
|
|
} else {
|
|
|
|
return await prisma.service.findMany({
|
|
|
|
where: { teams: { some: { id: teamId } } },
|
|
|
|
include: { teams: true }
|
|
|
|
});
|
|
|
|
}
|
2022-02-10 15:47:44 +01:00
|
|
|
}
|
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function newService({
|
|
|
|
name,
|
|
|
|
teamId
|
|
|
|
}: {
|
|
|
|
name: string;
|
|
|
|
teamId: string;
|
|
|
|
}): Promise<Service> {
|
2022-02-10 15:47:44 +01:00
|
|
|
return await prisma.service.create({ data: { name, teams: { connect: { id: teamId } } } });
|
|
|
|
}
|
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function getService({ id, teamId }: { id: string; teamId: string }): Promise<Service> {
|
2022-04-07 01:03:13 +02:00
|
|
|
let body;
|
2022-04-06 15:55:17 +02:00
|
|
|
const include = {
|
|
|
|
destinationDocker: true,
|
|
|
|
plausibleAnalytics: true,
|
|
|
|
minio: true,
|
|
|
|
vscodeserver: true,
|
|
|
|
wordpress: true,
|
|
|
|
ghost: true,
|
|
|
|
serviceSecret: true,
|
|
|
|
meiliSearch: true
|
|
|
|
};
|
|
|
|
if (teamId === '0') {
|
|
|
|
body = await prisma.service.findFirst({
|
|
|
|
where: { id },
|
|
|
|
include
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
body = await prisma.service.findFirst({
|
|
|
|
where: { id, teams: { some: { id: teamId } } },
|
|
|
|
include
|
|
|
|
});
|
|
|
|
}
|
2022-02-10 15:47:44 +01:00
|
|
|
|
|
|
|
if (body.plausibleAnalytics?.postgresqlPassword)
|
|
|
|
body.plausibleAnalytics.postgresqlPassword = decrypt(
|
|
|
|
body.plausibleAnalytics.postgresqlPassword
|
|
|
|
);
|
|
|
|
if (body.plausibleAnalytics?.password)
|
|
|
|
body.plausibleAnalytics.password = decrypt(body.plausibleAnalytics.password);
|
|
|
|
if (body.plausibleAnalytics?.secretKeyBase)
|
|
|
|
body.plausibleAnalytics.secretKeyBase = decrypt(body.plausibleAnalytics.secretKeyBase);
|
|
|
|
|
|
|
|
if (body.minio?.rootUserPassword)
|
|
|
|
body.minio.rootUserPassword = decrypt(body.minio.rootUserPassword);
|
|
|
|
|
|
|
|
if (body.vscodeserver?.password) body.vscodeserver.password = decrypt(body.vscodeserver.password);
|
|
|
|
|
|
|
|
if (body.wordpress?.mysqlPassword)
|
|
|
|
body.wordpress.mysqlPassword = decrypt(body.wordpress.mysqlPassword);
|
|
|
|
if (body.wordpress?.mysqlRootUserPassword)
|
|
|
|
body.wordpress.mysqlRootUserPassword = decrypt(body.wordpress.mysqlRootUserPassword);
|
|
|
|
|
2022-03-27 22:03:21 +02:00
|
|
|
if (body.ghost?.mariadbPassword) body.ghost.mariadbPassword = decrypt(body.ghost.mariadbPassword);
|
|
|
|
if (body.ghost?.mariadbRootUserPassword)
|
|
|
|
body.ghost.mariadbRootUserPassword = decrypt(body.ghost.mariadbRootUserPassword);
|
|
|
|
if (body.ghost?.defaultPassword) body.ghost.defaultPassword = decrypt(body.ghost.defaultPassword);
|
|
|
|
|
2022-04-02 23:08:27 +02:00
|
|
|
if (body.meiliSearch?.masterKey) body.meiliSearch.masterKey = decrypt(body.meiliSearch.masterKey);
|
|
|
|
|
2022-03-04 15:14:25 +01:00
|
|
|
if (body?.serviceSecret.length > 0) {
|
|
|
|
body.serviceSecret = body.serviceSecret.map((s) => {
|
|
|
|
s.value = decrypt(s.value);
|
|
|
|
return s;
|
|
|
|
});
|
|
|
|
}
|
2022-04-05 15:56:25 +02:00
|
|
|
if (body.wordpress?.ftpPassword) {
|
|
|
|
body.wordpress.ftpPassword = decrypt(body.wordpress.ftpPassword);
|
|
|
|
}
|
|
|
|
const settings = await prisma.setting.findFirst();
|
2022-03-27 22:03:21 +02:00
|
|
|
|
2022-04-05 15:56:25 +02:00
|
|
|
return { ...body, settings };
|
2022-02-10 15:47:44 +01:00
|
|
|
}
|
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function configureServiceType({
|
|
|
|
id,
|
|
|
|
type
|
|
|
|
}: {
|
|
|
|
id: string;
|
|
|
|
type: string;
|
|
|
|
}): Promise<void> {
|
2022-02-10 15:47:44 +01:00
|
|
|
if (type === 'plausibleanalytics') {
|
|
|
|
const password = encrypt(generatePassword());
|
|
|
|
const postgresqlUser = cuid();
|
|
|
|
const postgresqlPassword = encrypt(generatePassword());
|
|
|
|
const postgresqlDatabase = 'plausibleanalytics';
|
|
|
|
const secretKeyBase = encrypt(generatePassword(64));
|
|
|
|
|
|
|
|
await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: {
|
|
|
|
type,
|
|
|
|
plausibleAnalytics: {
|
|
|
|
create: {
|
|
|
|
postgresqlDatabase,
|
|
|
|
postgresqlUser,
|
|
|
|
postgresqlPassword,
|
|
|
|
password,
|
|
|
|
secretKeyBase
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} else if (type === 'nocodb') {
|
|
|
|
await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: { type }
|
|
|
|
});
|
|
|
|
} else if (type === 'minio') {
|
|
|
|
const rootUser = cuid();
|
|
|
|
const rootUserPassword = encrypt(generatePassword());
|
|
|
|
await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: { type, minio: { create: { rootUser, rootUserPassword } } }
|
|
|
|
});
|
|
|
|
} else if (type === 'vscodeserver') {
|
|
|
|
const password = encrypt(generatePassword());
|
|
|
|
await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: { type, vscodeserver: { create: { password } } }
|
|
|
|
});
|
|
|
|
} else if (type === 'wordpress') {
|
|
|
|
const mysqlUser = cuid();
|
|
|
|
const mysqlPassword = encrypt(generatePassword());
|
|
|
|
const mysqlRootUser = cuid();
|
|
|
|
const mysqlRootUserPassword = encrypt(generatePassword());
|
|
|
|
await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: {
|
|
|
|
type,
|
|
|
|
wordpress: { create: { mysqlPassword, mysqlRootUserPassword, mysqlRootUser, mysqlUser } }
|
|
|
|
}
|
|
|
|
});
|
2022-02-11 15:31:25 +01:00
|
|
|
} else if (type === 'vaultwarden') {
|
|
|
|
await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: {
|
|
|
|
type
|
|
|
|
}
|
|
|
|
});
|
2022-03-02 11:57:03 +01:00
|
|
|
} else if (type === 'languagetool') {
|
|
|
|
await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: {
|
|
|
|
type
|
|
|
|
}
|
|
|
|
});
|
2022-03-27 13:49:04 +02:00
|
|
|
} else if (type === 'n8n') {
|
|
|
|
await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: {
|
|
|
|
type
|
|
|
|
}
|
|
|
|
});
|
2022-03-27 14:05:36 +02:00
|
|
|
} else if (type === 'uptimekuma') {
|
|
|
|
await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: {
|
|
|
|
type
|
|
|
|
}
|
|
|
|
});
|
2022-03-27 22:03:21 +02:00
|
|
|
} else if (type === 'ghost') {
|
2022-04-09 13:25:46 +02:00
|
|
|
const defaultEmail = `${cuid()}@example.com`;
|
2022-03-27 22:03:21 +02:00
|
|
|
const defaultPassword = encrypt(generatePassword());
|
|
|
|
const mariadbUser = cuid();
|
|
|
|
const mariadbPassword = encrypt(generatePassword());
|
|
|
|
const mariadbRootUser = cuid();
|
|
|
|
const mariadbRootUserPassword = encrypt(generatePassword());
|
|
|
|
|
|
|
|
await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: {
|
|
|
|
type,
|
|
|
|
ghost: {
|
|
|
|
create: {
|
|
|
|
defaultEmail,
|
|
|
|
defaultPassword,
|
|
|
|
mariadbUser,
|
|
|
|
mariadbPassword,
|
|
|
|
mariadbRootUser,
|
|
|
|
mariadbRootUserPassword
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2022-04-02 23:08:27 +02:00
|
|
|
} else if (type === 'meilisearch') {
|
|
|
|
const masterKey = encrypt(generatePassword(32));
|
|
|
|
await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: {
|
|
|
|
type,
|
|
|
|
meiliSearch: { create: { masterKey } }
|
|
|
|
}
|
|
|
|
});
|
2022-02-10 15:47:44 +01:00
|
|
|
}
|
|
|
|
}
|
2022-04-07 01:03:13 +02:00
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function setServiceVersion({
|
|
|
|
id,
|
|
|
|
version
|
|
|
|
}: {
|
|
|
|
id: string;
|
|
|
|
version: string;
|
|
|
|
}): Promise<Service> {
|
2022-02-10 15:47:44 +01:00
|
|
|
return await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: { version }
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function setServiceSettings({
|
|
|
|
id,
|
|
|
|
dualCerts
|
|
|
|
}: {
|
|
|
|
id: string;
|
|
|
|
dualCerts: boolean;
|
|
|
|
}): Promise<Service> {
|
2022-02-17 22:14:06 +01:00
|
|
|
return await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: { dualCerts }
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function updatePlausibleAnalyticsService({
|
|
|
|
id,
|
|
|
|
fqdn,
|
|
|
|
email,
|
|
|
|
username,
|
|
|
|
name
|
|
|
|
}: {
|
|
|
|
id: string;
|
|
|
|
fqdn: string;
|
|
|
|
name: string;
|
|
|
|
email: string;
|
|
|
|
username: string;
|
|
|
|
}): Promise<void> {
|
2022-02-10 15:47:44 +01:00
|
|
|
await prisma.plausibleAnalytics.update({ where: { serviceId: id }, data: { email, username } });
|
|
|
|
await prisma.service.update({ where: { id }, data: { name, fqdn } });
|
|
|
|
}
|
2022-04-07 01:03:13 +02:00
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function updateService({
|
|
|
|
id,
|
|
|
|
fqdn,
|
|
|
|
name
|
|
|
|
}: {
|
|
|
|
id: string;
|
|
|
|
fqdn: string;
|
|
|
|
name: string;
|
|
|
|
}): Promise<Service> {
|
2022-02-10 15:47:44 +01:00
|
|
|
return await prisma.service.update({ where: { id }, data: { fqdn, name } });
|
|
|
|
}
|
2022-04-07 01:03:13 +02:00
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function updateLanguageToolService({
|
|
|
|
id,
|
|
|
|
fqdn,
|
|
|
|
name
|
|
|
|
}: {
|
|
|
|
id: string;
|
|
|
|
fqdn: string;
|
|
|
|
name: string;
|
|
|
|
}): Promise<Service> {
|
2022-03-02 11:57:03 +01:00
|
|
|
return await prisma.service.update({ where: { id }, data: { fqdn, name } });
|
|
|
|
}
|
2022-04-07 01:03:13 +02:00
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function updateMeiliSearchService({
|
|
|
|
id,
|
|
|
|
fqdn,
|
|
|
|
name
|
|
|
|
}: {
|
|
|
|
id: string;
|
|
|
|
fqdn: string;
|
|
|
|
name: string;
|
|
|
|
}): Promise<Service> {
|
2022-04-02 23:08:27 +02:00
|
|
|
return await prisma.service.update({ where: { id }, data: { fqdn, name } });
|
|
|
|
}
|
2022-04-07 01:03:13 +02:00
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function updateVaultWardenService({
|
|
|
|
id,
|
|
|
|
fqdn,
|
|
|
|
name
|
|
|
|
}: {
|
|
|
|
id: string;
|
|
|
|
fqdn: string;
|
|
|
|
name: string;
|
|
|
|
}): Promise<Service> {
|
2022-02-11 15:31:25 +01:00
|
|
|
return await prisma.service.update({ where: { id }, data: { fqdn, name } });
|
|
|
|
}
|
2022-04-07 01:03:13 +02:00
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function updateVsCodeServer({
|
|
|
|
id,
|
|
|
|
fqdn,
|
|
|
|
name
|
|
|
|
}: {
|
|
|
|
id: string;
|
|
|
|
fqdn: string;
|
|
|
|
name: string;
|
|
|
|
}): Promise<Service> {
|
2022-02-10 15:47:44 +01:00
|
|
|
return await prisma.service.update({ where: { id }, data: { fqdn, name } });
|
|
|
|
}
|
2022-04-07 01:03:13 +02:00
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function updateWordpress({
|
|
|
|
id,
|
|
|
|
fqdn,
|
|
|
|
name,
|
|
|
|
mysqlDatabase,
|
|
|
|
extraConfig
|
|
|
|
}: {
|
|
|
|
id: string;
|
|
|
|
fqdn: string;
|
|
|
|
name: string;
|
|
|
|
mysqlDatabase: string;
|
|
|
|
extraConfig: string;
|
|
|
|
}): Promise<Service> {
|
2022-02-10 15:47:44 +01:00
|
|
|
return await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: { fqdn, name, wordpress: { update: { mysqlDatabase, extraConfig } } }
|
|
|
|
});
|
|
|
|
}
|
2022-04-07 01:03:13 +02:00
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function updateMinioService({
|
|
|
|
id,
|
|
|
|
publicPort
|
|
|
|
}: {
|
|
|
|
id: string;
|
|
|
|
publicPort: number;
|
|
|
|
}): Promise<Minio> {
|
2022-02-10 15:47:44 +01:00
|
|
|
return await prisma.minio.update({ where: { serviceId: id }, data: { publicPort } });
|
|
|
|
}
|
2022-04-07 01:03:13 +02:00
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function updateGhostService({
|
|
|
|
id,
|
|
|
|
fqdn,
|
|
|
|
name,
|
|
|
|
mariadbDatabase
|
|
|
|
}: {
|
|
|
|
id: string;
|
|
|
|
fqdn: string;
|
|
|
|
name: string;
|
|
|
|
mariadbDatabase: string;
|
|
|
|
}): Promise<Service> {
|
2022-03-27 22:03:21 +02:00
|
|
|
return await prisma.service.update({
|
|
|
|
where: { id },
|
|
|
|
data: { fqdn, name, ghost: { update: { mariadbDatabase } } }
|
|
|
|
});
|
|
|
|
}
|
2022-02-10 15:47:44 +01:00
|
|
|
|
2022-04-06 20:30:29 +02:00
|
|
|
export async function removeService({ id }: { id: string }): Promise<void> {
|
2022-04-02 23:08:27 +02:00
|
|
|
await prisma.meiliSearch.deleteMany({ where: { serviceId: id } });
|
2022-03-27 22:03:21 +02:00
|
|
|
await prisma.ghost.deleteMany({ where: { serviceId: id } });
|
2022-02-10 15:47:44 +01:00
|
|
|
await prisma.plausibleAnalytics.deleteMany({ where: { serviceId: id } });
|
|
|
|
await prisma.minio.deleteMany({ where: { serviceId: id } });
|
|
|
|
await prisma.vscodeserver.deleteMany({ where: { serviceId: id } });
|
|
|
|
await prisma.wordpress.deleteMany({ where: { serviceId: id } });
|
2022-03-04 15:14:25 +01:00
|
|
|
await prisma.serviceSecret.deleteMany({ where: { serviceId: id } });
|
|
|
|
|
2022-02-10 15:47:44 +01:00
|
|
|
await prisma.service.delete({ where: { id } });
|
|
|
|
}
|