import type { Cloudly } from '../classes.cloudly.js'; import * as plugins from '../plugins.js'; import { Service } from './classes.service.js'; export class ServiceManager { public typedrouter = new plugins.typedrequest.TypedRouter(); public cloudlyRef: Cloudly; get db() { return this.cloudlyRef.mongodbConnector.smartdataDb; } public CService = plugins.smartdata.setDefaultManagerForDoc(this, Service); constructor(cloudlyRef: Cloudly) { this.cloudlyRef = cloudlyRef; this.cloudlyRef.typedrouter.addTypedRouter(this.typedrouter); this.typedrouter.addTypedHandler( new plugins.typedrequest.TypedHandler( 'getServices', async (reqArg) => { await plugins.smartguard.passGuardsOrReject(reqArg, [ this.cloudlyRef.authManager.validIdentityGuard, ]); const services = await this.CService.getInstances({}); return { services: await Promise.all( services.map((service) => { return service.createSavableObject(); }) ), }; } ) ); this.typedrouter.addTypedHandler( new plugins.typedrequest.TypedHandler( 'getServiceSecretBundlesAsFlatObject', async (dataArg) => { const service = await Service.getInstance({ id: dataArg.serviceId, }); const flatKeyValueObject = await service.getSecretBundlesAsFlatObject(dataArg.environment); return { flatKeyValueObject: flatKeyValueObject, }; } ) ); this.typedrouter.addTypedHandler( new plugins.typedrequest.TypedHandler( 'createService', async (dataArg) => { const service = await Service.createService(dataArg.serviceData); return { service: await service.createSavableObject(), }; } ) ); this.typedrouter.addTypedHandler( new plugins.typedrequest.TypedHandler( 'updateService', async (dataArg) => { const service = await Service.getInstance({ id: dataArg.serviceId, }); service.data = { ...service.data, ...dataArg.serviceData, }; await service.save(); return { service: await service.createSavableObject(), }; } ) ); this.typedrouter.addTypedHandler( new plugins.typedrequest.TypedHandler( 'deleteServiceById', async (dataArg) => { const service = await Service.getInstance({ id: dataArg.serviceId, }); // Remove DNS entries before deleting the service await service.removeDnsEntries(); await service.delete(); return { success: true, }; } ) ); } public async start() { // ServiceManager is ready - handlers are already registered in constructor console.log('ServiceManager started'); } public async stop() { // Cleanup if needed console.log('ServiceManager stopped'); } }