test template + tags during dev
This commit is contained in:
		
							parent
							
								
									aecf014f4e
								
							
						
					
					
						commit
						359f4520f5
					
				
							
								
								
									
										2
									
								
								apps/api/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								apps/api/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -9,3 +9,5 @@ package | |||||||
| dist | dist | ||||||
| dev.db | dev.db | ||||||
| client | client | ||||||
|  | testTemplate.yaml | ||||||
|  | testTags.json | ||||||
| @ -225,8 +225,22 @@ async function getTagsTemplates() { | |||||||
| 	const { default: got } = await import('got'); | 	const { default: got } = await import('got'); | ||||||
| 	try { | 	try { | ||||||
| 		if (isDev) { | 		if (isDev) { | ||||||
| 			const templates = await fs.readFile('./devTemplates.yaml', 'utf8'); | 			let templates = await fs.readFile('./devTemplates.yaml', 'utf8'); | ||||||
| 			const tags = await fs.readFile('./devTags.json', 'utf8'); | 			let tags = await fs.readFile('./devTags.json', 'utf8'); | ||||||
|  | 			try { | ||||||
|  | 				if (await fs.stat('./testTemplate.yaml')) { | ||||||
|  | 					templates = templates + (await fs.readFile('./testTemplate.yaml', 'utf8')); | ||||||
|  | 				} | ||||||
|  | 			} catch (error) {} | ||||||
|  | 			try { | ||||||
|  | 				if (await fs.stat('./testTags.json')) { | ||||||
|  | 					const testTags = await fs.readFile('./testTags.json', 'utf8'); | ||||||
|  | 					if (testTags.length > 0) { | ||||||
|  | 						tags = JSON.stringify(JSON.parse(tags).concat(JSON.parse(testTags))); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} catch (error) {} | ||||||
|  | 
 | ||||||
| 			await fs.writeFile('./templates.json', JSON.stringify(yaml.load(templates))); | 			await fs.writeFile('./templates.json', JSON.stringify(yaml.load(templates))); | ||||||
| 			await fs.writeFile('./tags.json', tags); | 			await fs.writeFile('./tags.json', tags); | ||||||
| 			console.log('[004] Tags and templates loaded in dev mode...'); | 			console.log('[004] Tags and templates loaded in dev mode...'); | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| import { compareVersions } from "compare-versions"; | import { compareVersions } from 'compare-versions'; | ||||||
| import cuid from "cuid"; | import cuid from 'cuid'; | ||||||
| import bcrypt from "bcryptjs"; | import bcrypt from 'bcryptjs'; | ||||||
| import fs from 'fs/promises'; | import fs from 'fs/promises'; | ||||||
| import yaml from 'js-yaml'; | import yaml from 'js-yaml'; | ||||||
| import { | import { | ||||||
| @ -13,12 +13,12 @@ import { | |||||||
| 	uniqueName, | 	uniqueName, | ||||||
| 	version, | 	version, | ||||||
| 	sentryDSN, | 	sentryDSN, | ||||||
| 	executeCommand, | 	executeCommand | ||||||
| } from "../../../lib/common"; | } from '../../../lib/common'; | ||||||
| import { scheduler } from "../../../lib/scheduler"; | import { scheduler } from '../../../lib/scheduler'; | ||||||
| import type { FastifyReply, FastifyRequest } from "fastify"; | import type { FastifyReply, FastifyRequest } from 'fastify'; | ||||||
| import type { Login, Update } from "."; | import type { Login, Update } from '.'; | ||||||
| import type { GetCurrentUser } from "./types"; | import type { GetCurrentUser } from './types'; | ||||||
| 
 | 
 | ||||||
| export async function hashPassword(password: string): Promise<string> { | export async function hashPassword(password: string): Promise<string> { | ||||||
| 	const saltRounds = 15; | 	const saltRounds = 15; | ||||||
| @ -29,9 +29,9 @@ export async function backup(request: FastifyRequest) { | |||||||
| 	try { | 	try { | ||||||
| 		const { backupData } = request.params; | 		const { backupData } = request.params; | ||||||
| 		let std = null; | 		let std = null; | ||||||
| 		const [id, backupType, type, zipped, storage] = backupData.split(':') | 		const [id, backupType, type, zipped, storage] = backupData.split(':'); | ||||||
| 		console.log(id, backupType, type, zipped, storage) | 		console.log(id, backupType, type, zipped, storage); | ||||||
| 		const database = await prisma.database.findUnique({ where: { id } }) | 		const database = await prisma.database.findUnique({ where: { id } }); | ||||||
| 		if (database) { | 		if (database) { | ||||||
| 			// await executeDockerCmd({
 | 			// await executeDockerCmd({
 | ||||||
| 			// 	dockerId: database.destinationDockerId,
 | 			// 	dockerId: database.destinationDockerId,
 | ||||||
| @ -40,8 +40,7 @@ export async function backup(request: FastifyRequest) { | |||||||
| 			std = await executeCommand({ | 			std = await executeCommand({ | ||||||
| 				dockerId: database.destinationDockerId, | 				dockerId: database.destinationDockerId, | ||||||
| 				command: `docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v coolify-local-backup:/app/backups -e CONTAINERS_TO_BACKUP="${backupData}" coollabsio/backup` | 				command: `docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v coolify-local-backup:/app/backups -e CONTAINERS_TO_BACKUP="${backupData}" coollabsio/backup` | ||||||
| 			}) | 			}); | ||||||
| 
 |  | ||||||
| 		} | 		} | ||||||
| 		if (std.stdout) { | 		if (std.stdout) { | ||||||
| 			return std.stdout; | 			return std.stdout; | ||||||
| @ -58,7 +57,7 @@ export async function cleanupManually(request: FastifyRequest) { | |||||||
| 	try { | 	try { | ||||||
| 		const { serverId } = request.body; | 		const { serverId } = request.body; | ||||||
| 		const destination = await prisma.destinationDocker.findUnique({ | 		const destination = await prisma.destinationDocker.findUnique({ | ||||||
| 			where: { id: serverId }, | 			where: { id: serverId } | ||||||
| 		}); | 		}); | ||||||
| 		await cleanupDockerStorage(destination.id, true, true); | 		await cleanupDockerStorage(destination.id, true, true); | ||||||
| 		return {}; | 		return {}; | ||||||
| @ -68,17 +67,25 @@ export async function cleanupManually(request: FastifyRequest) { | |||||||
| } | } | ||||||
| export async function refreshTags() { | export async function refreshTags() { | ||||||
| 	try { | 	try { | ||||||
| 		const { default: got } = await import('got') | 		const { default: got } = await import('got'); | ||||||
| 		try { | 		try { | ||||||
| 			if (isDev) { | 			if (isDev) { | ||||||
| 				const tags = await fs.readFile('./devTags.json', 'utf8') | 				let tags = await fs.readFile('./devTags.json', 'utf8'); | ||||||
| 				await fs.writeFile('./tags.json', tags) | 				try { | ||||||
|  | 					if (await fs.stat('./testTags.json')) { | ||||||
|  | 						const testTags = await fs.readFile('./testTags.json', 'utf8'); | ||||||
|  | 						if (testTags.length > 0) { | ||||||
|  | 							tags = JSON.parse(tags).concat(JSON.parse(testTags)); | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} catch (error) {} | ||||||
|  | 				await fs.writeFile('./tags.json', tags); | ||||||
| 			} else { | 			} else { | ||||||
| 				const tags = await got.get('https://get.coollabs.io/coolify/service-tags.json').text() | 				const tags = await got.get('https://get.coollabs.io/coolify/service-tags.json').text(); | ||||||
| 				await fs.writeFile('/app/tags.json', tags) | 				await fs.writeFile('/app/tags.json', tags); | ||||||
| 			} | 			} | ||||||
| 		} catch (error) { | 		} catch (error) { | ||||||
| 			console.log(error) | 			console.log(error); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		return {}; | 		return {}; | ||||||
| @ -88,17 +95,25 @@ export async function refreshTags() { | |||||||
| } | } | ||||||
| export async function refreshTemplates() { | export async function refreshTemplates() { | ||||||
| 	try { | 	try { | ||||||
| 		const { default: got } = await import('got') | 		const { default: got } = await import('got'); | ||||||
| 		try { | 		try { | ||||||
| 			if (isDev) { | 			if (isDev) { | ||||||
| 				const response = await fs.readFile('./devTemplates.yaml', 'utf8') | 				let templates = await fs.readFile('./devTemplates.yaml', 'utf8'); | ||||||
| 				await fs.writeFile('./templates.json', JSON.stringify(yaml.load(response))) | 				try { | ||||||
|  | 					if (await fs.stat('./testTemplate.yaml')) { | ||||||
|  | 						templates = templates + (await fs.readFile('./testTemplate.yaml', 'utf8')); | ||||||
|  | 					} | ||||||
|  | 				} catch (error) {} | ||||||
|  | 				const response = await fs.readFile('./devTemplates.yaml', 'utf8'); | ||||||
|  | 				await fs.writeFile('./templates.json', JSON.stringify(yaml.load(response))); | ||||||
| 			} else { | 			} else { | ||||||
| 				const response = await got.get('https://get.coollabs.io/coolify/service-templates.yaml').text() | 				const response = await got | ||||||
| 				await fs.writeFile('/app/templates.json', JSON.stringify(yaml.load(response))) | 					.get('https://get.coollabs.io/coolify/service-templates.yaml') | ||||||
|  | 					.text(); | ||||||
|  | 				await fs.writeFile('/app/templates.json', JSON.stringify(yaml.load(response))); | ||||||
| 			} | 			} | ||||||
| 		} catch (error) { | 		} catch (error) { | ||||||
| 			console.log(error) | 			console.log(error); | ||||||
| 		} | 		} | ||||||
| 		return {}; | 		return {}; | ||||||
| 	} catch ({ status, message }) { | 	} catch ({ status, message }) { | ||||||
| @ -107,28 +122,29 @@ export async function refreshTemplates() { | |||||||
| } | } | ||||||
| export async function checkUpdate(request: FastifyRequest) { | export async function checkUpdate(request: FastifyRequest) { | ||||||
| 	try { | 	try { | ||||||
| 		const { default: got } = await import('got') | 		const { default: got } = await import('got'); | ||||||
| 		const isStaging = | 		const isStaging = | ||||||
| 			request.hostname === "staging.coolify.io" || | 			request.hostname === 'staging.coolify.io' || request.hostname === 'arm.coolify.io'; | ||||||
| 			request.hostname === "arm.coolify.io"; |  | ||||||
| 		const currentVersion = version; | 		const currentVersion = version; | ||||||
| 		const { coolify } = await got.get('https://get.coollabs.io/versions.json', { | 		const { coolify } = await got | ||||||
|  | 			.get('https://get.coollabs.io/versions.json', { | ||||||
| 				searchParams: { | 				searchParams: { | ||||||
| 					appId: process.env['COOLIFY_APP_ID'] || undefined, | 					appId: process.env['COOLIFY_APP_ID'] || undefined, | ||||||
| 					version: currentVersion | 					version: currentVersion | ||||||
| 				} | 				} | ||||||
| 		}).json() | 			}) | ||||||
|  | 			.json(); | ||||||
| 		const latestVersion = coolify.main.version; | 		const latestVersion = coolify.main.version; | ||||||
| 		const isUpdateAvailable = compareVersions(latestVersion, currentVersion); | 		const isUpdateAvailable = compareVersions(latestVersion, currentVersion); | ||||||
| 		if (isStaging) { | 		if (isStaging) { | ||||||
| 			return { | 			return { | ||||||
| 				isUpdateAvailable: true, | 				isUpdateAvailable: true, | ||||||
| 				latestVersion: "next", | 				latestVersion: 'next' | ||||||
| 			}; | 			}; | ||||||
| 		} | 		} | ||||||
| 		return { | 		return { | ||||||
| 			isUpdateAvailable: isStaging ? true : isUpdateAvailable === 1, | 			isUpdateAvailable: isStaging ? true : isUpdateAvailable === 1, | ||||||
| 			latestVersion, | 			latestVersion | ||||||
| 		}; | 		}; | ||||||
| 	} catch ({ status, message }) { | 	} catch ({ status, message }) { | ||||||
| 		return errorHandler({ status, message }); | 		return errorHandler({ status, message }); | ||||||
| @ -142,8 +158,13 @@ export async function update(request: FastifyRequest<Update>) { | |||||||
| 			const { isAutoUpdateEnabled } = await prisma.setting.findFirst(); | 			const { isAutoUpdateEnabled } = await prisma.setting.findFirst(); | ||||||
| 			await executeCommand({ command: `docker pull coollabsio/coolify:${latestVersion}` }); | 			await executeCommand({ command: `docker pull coollabsio/coolify:${latestVersion}` }); | ||||||
| 			await executeCommand({ shell: true, command: `env | grep COOLIFY > .env` }); | 			await executeCommand({ shell: true, command: `env | grep COOLIFY > .env` }); | ||||||
| 			await executeCommand({ command: `sed -i '/COOLIFY_AUTO_UPDATE=/cCOOLIFY_AUTO_UPDATE=${isAutoUpdateEnabled}' .env` }); | 			await executeCommand({ | ||||||
| 			await executeCommand({ shell: true, command: `docker run --rm -tid --env-file .env -v /var/run/docker.sock:/var/run/docker.sock -v coolify-db coollabsio/coolify:${latestVersion} /bin/sh -c "env | grep COOLIFY > .env && echo 'TAG=${latestVersion}' >> .env && docker stop -t 0 coolify coolify-fluentbit && docker rm coolify coolify-fluentbit && docker compose pull && docker compose up -d --force-recreate"` }); | 				command: `sed -i '/COOLIFY_AUTO_UPDATE=/cCOOLIFY_AUTO_UPDATE=${isAutoUpdateEnabled}' .env` | ||||||
|  | 			}); | ||||||
|  | 			await executeCommand({ | ||||||
|  | 				shell: true, | ||||||
|  | 				command: `docker run --rm -tid --env-file .env -v /var/run/docker.sock:/var/run/docker.sock -v coolify-db coollabsio/coolify:${latestVersion} /bin/sh -c "env | grep COOLIFY > .env && echo 'TAG=${latestVersion}' >> .env && docker stop -t 0 coolify coolify-fluentbit && docker rm coolify coolify-fluentbit && docker compose pull && docker compose up -d --force-recreate"` | ||||||
|  | 			}); | ||||||
| 			return {}; | 			return {}; | ||||||
| 		} else { | 		} else { | ||||||
| 			await asyncSleep(2000); | 			await asyncSleep(2000); | ||||||
| @ -156,12 +177,12 @@ export async function update(request: FastifyRequest<Update>) { | |||||||
| export async function resetQueue(request: FastifyRequest<any>) { | export async function resetQueue(request: FastifyRequest<any>) { | ||||||
| 	try { | 	try { | ||||||
| 		const teamId = request.user.teamId; | 		const teamId = request.user.teamId; | ||||||
| 		if (teamId === "0") { | 		if (teamId === '0') { | ||||||
| 			await prisma.build.updateMany({ | 			await prisma.build.updateMany({ | ||||||
| 				where: { status: { in: ["queued", "running"] } }, | 				where: { status: { in: ['queued', 'running'] } }, | ||||||
| 				data: { status: "canceled" }, | 				data: { status: 'canceled' } | ||||||
| 			}); | 			}); | ||||||
| 			scheduler.workers.get("deployApplication").postMessage("cancel"); | 			scheduler.workers.get('deployApplication').postMessage('cancel'); | ||||||
| 		} | 		} | ||||||
| 	} catch ({ status, message }) { | 	} catch ({ status, message }) { | ||||||
| 		return errorHandler({ status, message }); | 		return errorHandler({ status, message }); | ||||||
| @ -170,7 +191,7 @@ export async function resetQueue(request: FastifyRequest<any>) { | |||||||
| export async function restartCoolify(request: FastifyRequest<any>) { | export async function restartCoolify(request: FastifyRequest<any>) { | ||||||
| 	try { | 	try { | ||||||
| 		const teamId = request.user.teamId; | 		const teamId = request.user.teamId; | ||||||
| 		if (teamId === "0") { | 		if (teamId === '0') { | ||||||
| 			if (!isDev) { | 			if (!isDev) { | ||||||
| 				await executeCommand({ command: `docker restart coolify` }); | 				await executeCommand({ command: `docker restart coolify` }); | ||||||
| 				return {}; | 				return {}; | ||||||
| @ -180,7 +201,7 @@ export async function restartCoolify(request: FastifyRequest<any>) { | |||||||
| 		} | 		} | ||||||
| 		throw { | 		throw { | ||||||
| 			status: 500, | 			status: 500, | ||||||
| 			message: "You are not authorized to restart Coolify.", | 			message: 'You are not authorized to restart Coolify.' | ||||||
| 		}; | 		}; | ||||||
| 	} catch ({ status, message }) { | 	} catch ({ status, message }) { | ||||||
| 		return errorHandler({ status, message }); | 		return errorHandler({ status, message }); | ||||||
| @ -192,43 +213,52 @@ export async function showDashboard(request: FastifyRequest) { | |||||||
| 		const userId = request.user.userId; | 		const userId = request.user.userId; | ||||||
| 		const teamId = request.user.teamId; | 		const teamId = request.user.teamId; | ||||||
| 		let applications = await prisma.application.findMany({ | 		let applications = await prisma.application.findMany({ | ||||||
| 			where: { teams: { some: { id: teamId === "0" ? undefined : teamId } } }, | 			where: { teams: { some: { id: teamId === '0' ? undefined : teamId } } }, | ||||||
| 			include: { settings: true, destinationDocker: true, teams: true }, | 			include: { settings: true, destinationDocker: true, teams: true } | ||||||
| 		}); | 		}); | ||||||
| 		const databases = await prisma.database.findMany({ | 		const databases = await prisma.database.findMany({ | ||||||
| 			where: { teams: { some: { id: teamId === "0" ? undefined : teamId } } }, | 			where: { teams: { some: { id: teamId === '0' ? undefined : teamId } } }, | ||||||
| 			include: { settings: true, destinationDocker: true, teams: true }, | 			include: { settings: true, destinationDocker: true, teams: true } | ||||||
| 		}); | 		}); | ||||||
| 		const services = await prisma.service.findMany({ | 		const services = await prisma.service.findMany({ | ||||||
| 			where: { teams: { some: { id: teamId === "0" ? undefined : teamId } } }, | 			where: { teams: { some: { id: teamId === '0' ? undefined : teamId } } }, | ||||||
| 			include: { destinationDocker: true, teams: true }, | 			include: { destinationDocker: true, teams: true } | ||||||
| 		}); | 		}); | ||||||
| 		const gitSources = await prisma.gitSource.findMany({ | 		const gitSources = await prisma.gitSource.findMany({ | ||||||
| 			where: { OR: [{ teams: { some: { id: teamId === "0" ? undefined : teamId } } }, { isSystemWide: true }] }, | 			where: { | ||||||
| 			include: { teams: true }, | 				OR: [ | ||||||
|  | 					{ teams: { some: { id: teamId === '0' ? undefined : teamId } } }, | ||||||
|  | 					{ isSystemWide: true } | ||||||
|  | 				] | ||||||
|  | 			}, | ||||||
|  | 			include: { teams: true } | ||||||
| 		}); | 		}); | ||||||
| 		const destinations = await prisma.destinationDocker.findMany({ | 		const destinations = await prisma.destinationDocker.findMany({ | ||||||
| 			where: { teams: { some: { id: teamId === "0" ? undefined : teamId } } }, | 			where: { teams: { some: { id: teamId === '0' ? undefined : teamId } } }, | ||||||
| 			include: { teams: true }, | 			include: { teams: true } | ||||||
| 		}); | 		}); | ||||||
| 		const settings = await listSettings(); | 		const settings = await listSettings(); | ||||||
| 
 | 
 | ||||||
| 		let foundUnconfiguredApplication = false; | 		let foundUnconfiguredApplication = false; | ||||||
| 		for (const application of applications) { | 		for (const application of applications) { | ||||||
| 			if (((!application.buildPack || !application.branch) && !application.simpleDockerfile) || !application.destinationDockerId || (!application.settings?.isBot && !application?.fqdn) && application.buildPack !== "compose") { | 			if ( | ||||||
| 				foundUnconfiguredApplication = true | 				((!application.buildPack || !application.branch) && !application.simpleDockerfile) || | ||||||
|  | 				!application.destinationDockerId || | ||||||
|  | 				(!application.settings?.isBot && !application?.fqdn && application.buildPack !== 'compose') | ||||||
|  | 			) { | ||||||
|  | 				foundUnconfiguredApplication = true; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		let foundUnconfiguredService = false; | 		let foundUnconfiguredService = false; | ||||||
| 		for (const service of services) { | 		for (const service of services) { | ||||||
| 			if (!service.fqdn) { | 			if (!service.fqdn) { | ||||||
| 				foundUnconfiguredService = true | 				foundUnconfiguredService = true; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		let foundUnconfiguredDatabase = false; | 		let foundUnconfiguredDatabase = false; | ||||||
| 		for (const database of databases) { | 		for (const database of databases) { | ||||||
| 			if (!database.version) { | 			if (!database.version) { | ||||||
| 				foundUnconfiguredDatabase = true | 				foundUnconfiguredDatabase = true; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		return { | 		return { | ||||||
| @ -240,101 +270,94 @@ export async function showDashboard(request: FastifyRequest) { | |||||||
| 			services, | 			services, | ||||||
| 			gitSources, | 			gitSources, | ||||||
| 			destinations, | 			destinations, | ||||||
| 			settings, | 			settings | ||||||
| 		}; | 		}; | ||||||
| 	} catch ({ status, message }) { | 	} catch ({ status, message }) { | ||||||
| 		return errorHandler({ status, message }); | 		return errorHandler({ status, message }); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function login( | export async function login(request: FastifyRequest<Login>, reply: FastifyReply) { | ||||||
| 	request: FastifyRequest<Login>, |  | ||||||
| 	reply: FastifyReply |  | ||||||
| ) { |  | ||||||
| 	if (request.user) { | 	if (request.user) { | ||||||
| 		return reply.redirect("/dashboard"); | 		return reply.redirect('/dashboard'); | ||||||
| 	} else { | 	} else { | ||||||
| 		const { email, password, isLogin } = request.body || {}; | 		const { email, password, isLogin } = request.body || {}; | ||||||
| 		if (!email || !password) { | 		if (!email || !password) { | ||||||
| 			throw { status: 500, message: "Email and password are required." }; | 			throw { status: 500, message: 'Email and password are required.' }; | ||||||
| 		} | 		} | ||||||
| 		const users = await prisma.user.count(); | 		const users = await prisma.user.count(); | ||||||
| 		const userFound = await prisma.user.findUnique({ | 		const userFound = await prisma.user.findUnique({ | ||||||
| 			where: { email }, | 			where: { email }, | ||||||
| 			include: { teams: true, permission: true }, | 			include: { teams: true, permission: true }, | ||||||
| 			rejectOnNotFound: false, | 			rejectOnNotFound: false | ||||||
| 		}); | 		}); | ||||||
| 		if (!userFound && isLogin) { | 		if (!userFound && isLogin) { | ||||||
| 			throw { status: 500, message: "User not found." }; | 			throw { status: 500, message: 'User not found.' }; | ||||||
| 		} | 		} | ||||||
| 		const { isRegistrationEnabled, id } = await prisma.setting.findFirst(); | 		const { isRegistrationEnabled, id } = await prisma.setting.findFirst(); | ||||||
| 		let uid = cuid(); | 		let uid = cuid(); | ||||||
| 		let permission = "read"; | 		let permission = 'read'; | ||||||
| 		let isAdmin = false; | 		let isAdmin = false; | ||||||
| 
 | 
 | ||||||
| 		if (users === 0) { | 		if (users === 0) { | ||||||
| 			await prisma.setting.update({ | 			await prisma.setting.update({ | ||||||
| 				where: { id }, | 				where: { id }, | ||||||
| 				data: { isRegistrationEnabled: false }, | 				data: { isRegistrationEnabled: false } | ||||||
| 			}); | 			}); | ||||||
| 			uid = "0"; | 			uid = '0'; | ||||||
| 		} | 		} | ||||||
| 		if (userFound) { | 		if (userFound) { | ||||||
| 			if (userFound.type === "email") { | 			if (userFound.type === 'email') { | ||||||
| 				if (userFound.password === "RESETME") { | 				if (userFound.password === 'RESETME') { | ||||||
| 					const hashedPassword = await hashPassword(password); | 					const hashedPassword = await hashPassword(password); | ||||||
| 					if (userFound.updatedAt < new Date(Date.now() - 1000 * 60 * 10)) { | 					if (userFound.updatedAt < new Date(Date.now() - 1000 * 60 * 10)) { | ||||||
| 						if (userFound.id === "0") { | 						if (userFound.id === '0') { | ||||||
| 							await prisma.user.update({ | 							await prisma.user.update({ | ||||||
| 								where: { email: userFound.email }, | 								where: { email: userFound.email }, | ||||||
| 								data: { password: "RESETME" }, | 								data: { password: 'RESETME' } | ||||||
| 							}); | 							}); | ||||||
| 						} else { | 						} else { | ||||||
| 							await prisma.user.update({ | 							await prisma.user.update({ | ||||||
| 								where: { email: userFound.email }, | 								where: { email: userFound.email }, | ||||||
| 								data: { password: "RESETTIMEOUT" }, | 								data: { password: 'RESETTIMEOUT' } | ||||||
| 							}); | 							}); | ||||||
| 						} | 						} | ||||||
| 
 | 
 | ||||||
| 						throw { | 						throw { | ||||||
| 							status: 500, | 							status: 500, | ||||||
| 							message: | 							message: 'Password reset link has expired. Please request a new one.' | ||||||
| 								"Password reset link has expired. Please request a new one.", |  | ||||||
| 						}; | 						}; | ||||||
| 					} else { | 					} else { | ||||||
| 						await prisma.user.update({ | 						await prisma.user.update({ | ||||||
| 							where: { email: userFound.email }, | 							where: { email: userFound.email }, | ||||||
| 							data: { password: hashedPassword }, | 							data: { password: hashedPassword } | ||||||
| 						}); | 						}); | ||||||
| 						return { | 						return { | ||||||
| 							userId: userFound.id, | 							userId: userFound.id, | ||||||
| 							teamId: userFound.id, | 							teamId: userFound.id, | ||||||
| 							permission: userFound.permission, | 							permission: userFound.permission, | ||||||
| 							isAdmin: true, | 							isAdmin: true | ||||||
| 						}; | 						}; | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				const passwordMatch = await bcrypt.compare( | 				const passwordMatch = await bcrypt.compare(password, userFound.password); | ||||||
| 					password, |  | ||||||
| 					userFound.password |  | ||||||
| 				); |  | ||||||
| 				if (!passwordMatch) { | 				if (!passwordMatch) { | ||||||
| 					throw { | 					throw { | ||||||
| 						status: 500, | 						status: 500, | ||||||
| 						message: "Wrong password or email address.", | 						message: 'Wrong password or email address.' | ||||||
| 					}; | 					}; | ||||||
| 				} | 				} | ||||||
| 				uid = userFound.id; | 				uid = userFound.id; | ||||||
| 				isAdmin = true; | 				isAdmin = true; | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} else { | ||||||
| 			permission = "owner"; | 			permission = 'owner'; | ||||||
| 			isAdmin = true; | 			isAdmin = true; | ||||||
| 			if (!isRegistrationEnabled) { | 			if (!isRegistrationEnabled) { | ||||||
| 				throw { | 				throw { | ||||||
| 					status: 404, | 					status: 404, | ||||||
| 					message: "Registration disabled by administrator.", | 					message: 'Registration disabled by administrator.' | ||||||
| 				}; | 				}; | ||||||
| 			} | 			} | ||||||
| 			const hashedPassword = await hashPassword(password); | 			const hashedPassword = await hashPassword(password); | ||||||
| @ -344,17 +367,17 @@ export async function login( | |||||||
| 						id: uid, | 						id: uid, | ||||||
| 						email, | 						email, | ||||||
| 						password: hashedPassword, | 						password: hashedPassword, | ||||||
| 						type: "email", | 						type: 'email', | ||||||
| 						teams: { | 						teams: { | ||||||
| 							create: { | 							create: { | ||||||
| 								id: uid, | 								id: uid, | ||||||
| 								name: uniqueName(), | 								name: uniqueName(), | ||||||
| 								destinationDocker: { connect: { network: "coolify" } }, | 								destinationDocker: { connect: { network: 'coolify' } } | ||||||
|  | 							} | ||||||
| 						}, | 						}, | ||||||
|  | 						permission: { create: { teamId: uid, permission: 'owner' } } | ||||||
| 					}, | 					}, | ||||||
| 						permission: { create: { teamId: uid, permission: "owner" } }, | 					include: { teams: true } | ||||||
| 					}, |  | ||||||
| 					include: { teams: true }, |  | ||||||
| 				}); | 				}); | ||||||
| 			} else { | 			} else { | ||||||
| 				await prisma.user.create({ | 				await prisma.user.create({ | ||||||
| @ -362,16 +385,16 @@ export async function login( | |||||||
| 						id: uid, | 						id: uid, | ||||||
| 						email, | 						email, | ||||||
| 						password: hashedPassword, | 						password: hashedPassword, | ||||||
| 						type: "email", | 						type: 'email', | ||||||
| 						teams: { | 						teams: { | ||||||
| 							create: { | 							create: { | ||||||
| 								id: uid, | 								id: uid, | ||||||
| 								name: uniqueName(), | 								name: uniqueName() | ||||||
|  | 							} | ||||||
| 						}, | 						}, | ||||||
|  | 						permission: { create: { teamId: uid, permission: 'owner' } } | ||||||
| 					}, | 					}, | ||||||
| 						permission: { create: { teamId: uid, permission: "owner" } }, | 					include: { teams: true } | ||||||
| 					}, |  | ||||||
| 					include: { teams: true }, |  | ||||||
| 				}); | 				}); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| @ -379,23 +402,20 @@ export async function login( | |||||||
| 			userId: uid, | 			userId: uid, | ||||||
| 			teamId: uid, | 			teamId: uid, | ||||||
| 			permission, | 			permission, | ||||||
| 			isAdmin, | 			isAdmin | ||||||
| 		}; | 		}; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function getCurrentUser( | export async function getCurrentUser(request: FastifyRequest<GetCurrentUser>, fastify) { | ||||||
| 	request: FastifyRequest<GetCurrentUser>, |  | ||||||
| 	fastify |  | ||||||
| ) { |  | ||||||
| 	let token = null; | 	let token = null; | ||||||
| 	const { teamId } = request.query; | 	const { teamId } = request.query; | ||||||
| 	try { | 	try { | ||||||
| 		const user = await prisma.user.findUnique({ | 		const user = await prisma.user.findUnique({ | ||||||
| 			where: { id: request.user.userId }, | 			where: { id: request.user.userId } | ||||||
| 		}); | 		}); | ||||||
| 		if (!user) { | 		if (!user) { | ||||||
| 			throw "User not found"; | 			throw 'User not found'; | ||||||
| 		} | 		} | ||||||
| 	} catch (error) { | 	} catch (error) { | ||||||
| 		throw { status: 401, message: error }; | 		throw { status: 401, message: error }; | ||||||
| @ -404,17 +424,15 @@ export async function getCurrentUser( | |||||||
| 		try { | 		try { | ||||||
| 			const user = await prisma.user.findFirst({ | 			const user = await prisma.user.findFirst({ | ||||||
| 				where: { id: request.user.userId, teams: { some: { id: teamId } } }, | 				where: { id: request.user.userId, teams: { some: { id: teamId } } }, | ||||||
| 				include: { teams: true, permission: true }, | 				include: { teams: true, permission: true } | ||||||
| 			}); | 			}); | ||||||
| 			if (user) { | 			if (user) { | ||||||
| 				const permission = user.permission.find( | 				const permission = user.permission.find((p) => p.teamId === teamId).permission; | ||||||
| 					(p) => p.teamId === teamId |  | ||||||
| 				).permission; |  | ||||||
| 				const payload = { | 				const payload = { | ||||||
| 					...request.user, | 					...request.user, | ||||||
| 					teamId, | 					teamId, | ||||||
| 					permission: permission || null, | 					permission: permission || null, | ||||||
| 					isAdmin: permission === "owner" || permission === "admin", | 					isAdmin: permission === 'owner' || permission === 'admin' | ||||||
| 				}; | 				}; | ||||||
| 				token = fastify.jwt.sign(payload); | 				token = fastify.jwt.sign(payload); | ||||||
| 			} | 			} | ||||||
| @ -422,12 +440,14 @@ export async function getCurrentUser( | |||||||
| 			// No new token -> not switching teams
 | 			// No new token -> not switching teams
 | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	const pendingInvitations = await prisma.teamInvitation.findMany({ where: { uid: request.user.userId } }) | 	const pendingInvitations = await prisma.teamInvitation.findMany({ | ||||||
|  | 		where: { uid: request.user.userId } | ||||||
|  | 	}); | ||||||
| 	return { | 	return { | ||||||
| 		settings: await prisma.setting.findUnique({ where: { id: "0" } }), | 		settings: await prisma.setting.findUnique({ where: { id: '0' } }), | ||||||
| 		sentryDSN, | 		sentryDSN, | ||||||
| 		pendingInvitations, | 		pendingInvitations, | ||||||
| 		token, | 		token, | ||||||
| 		...request.user, | 		...request.user | ||||||
| 	}; | 	}; | ||||||
| } | } | ||||||
|  | |||||||
| @ -5,6 +5,8 @@ | |||||||
| 	const handleError = (ev: { target: { src: string } }) => (ev.target.src = fallback); | 	const handleError = (ev: { target: { src: string } }) => (ev.target.src = fallback); | ||||||
| 	let extension = 'png'; | 	let extension = 'png'; | ||||||
| 	let svgs = [ | 	let svgs = [ | ||||||
|  | 		'mattermost', | ||||||
|  | 		'repman', | ||||||
| 		'directus', | 		'directus', | ||||||
| 		'pocketbase', | 		'pocketbase', | ||||||
| 		'gitea', | 		'gitea', | ||||||
|  | |||||||
| @ -5,6 +5,8 @@ | |||||||
| 	const handleError = (ev: { target: { src: string } }) => (ev.target.src = fallback); | 	const handleError = (ev: { target: { src: string } }) => (ev.target.src = fallback); | ||||||
| 	let extension = 'png'; | 	let extension = 'png'; | ||||||
| 	let svgs = [ | 	let svgs = [ | ||||||
|  | 		'mattermost', | ||||||
|  | 		'repman', | ||||||
| 		'directus', | 		'directus', | ||||||
| 		'pocketbase', | 		'pocketbase', | ||||||
| 		'gitea', | 		'gitea', | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user