Files
workavia-drive/tdrive/backend/node/src/services/global-resolver.ts
T
Anton SHEPILOV 6f0bfbcd09 ♻️Removed unused websockets
2024-05-24 00:19:31 +02:00

151 lines
5.8 KiB
TypeScript

import { FastifyInstance } from "fastify";
import { IncomingMessage, Server, ServerResponse } from "http";
import { TdrivePlatform } from "../core/platform/platform";
import AuthServiceAPI from "../core/platform/services/auth/provider";
import { CounterAPI } from "../core/platform/services/counter/types";
import { CronAPI } from "../core/platform/services/cron/api";
import { DatabaseServiceAPI } from "../core/platform/services/database/api";
import EmailPusherAPI from "../core/platform/services/email-pusher/provider";
import { MessageQueueServiceAPI } from "../core/platform/services/message-queue/api";
import { PushServiceAPI } from "../core/platform/services/push/api";
import { SearchServiceAPI } from "../core/platform/services/search/api";
import StorageAPI from "../core/platform/services/storage/provider";
import TrackerAPI from "../core/platform/services/tracker/provider";
import WebServerAPI from "../core/platform/services/webserver/provider";
import assert from "assert";
import { logger } from "../core/platform/framework";
import { ApplicationServiceImpl } from "./applications/services/applications";
import { CompanyApplicationServiceImpl } from "./applications/services/company-applications";
import { ApplicationHooksService } from "./applications/services/hooks";
import { ConsoleServiceImpl } from "./console/service";
import { DocumentsService } from "./documents/services";
import { DocumentsEngine } from "./documents/services/engine";
import { FileServiceImpl } from "./files/services";
import { PreviewProcessService } from "./previews/services/files/processing/service";
import { StatisticsServiceImpl } from "./statistics/service";
import { TagsService } from "./tags/services/tags";
import { CompanyServiceImpl } from "./user/services/companies";
import { UserExternalLinksServiceImpl } from "./user/services/external_links";
import { UserServiceImpl } from "./user/services/users/service";
import { WorkspaceServiceImpl } from "./workspaces/services/workspace";
import { PreviewEngine } from "./previews/services/files/engine";
import { I18nService } from "./i18n";
type PlatformServices = {
auth: AuthServiceAPI;
counter: CounterAPI;
cron: CronAPI;
messageQueue: MessageQueueServiceAPI;
push: PushServiceAPI;
search: SearchServiceAPI;
storage: StorageAPI;
tracker: TrackerAPI;
webserver: WebServerAPI;
emailPusher: EmailPusherAPI;
};
type TdriveServices = {
workspaces: WorkspaceServiceImpl;
companies: CompanyServiceImpl;
users: UserServiceImpl;
console: ConsoleServiceImpl;
statistics: StatisticsServiceImpl;
externalUser: UserExternalLinksServiceImpl;
preview: {
files: PreviewProcessService;
};
applications: {
marketplaceApps: ApplicationServiceImpl;
companyApps: CompanyApplicationServiceImpl;
hooks: ApplicationHooksService;
};
files: FileServiceImpl;
documents: {
documents: DocumentsService;
engine: DocumentsEngine;
};
tags: TagsService;
i18n: I18nService;
};
class GlobalResolver {
public services: TdriveServices;
public platformServices: PlatformServices;
public database: DatabaseServiceAPI;
public fastify: FastifyInstance<Server, IncomingMessage, ServerResponse>;
private alreadyInitialized = false;
async doInit(platform: TdrivePlatform) {
if (this.alreadyInitialized) {
return;
}
this.database = platform.getProvider<DatabaseServiceAPI>("database");
this.platformServices = {
auth: platform.getProvider<AuthServiceAPI>("auth"),
counter: platform.getProvider<CounterAPI>("counter"),
cron: platform.getProvider<CronAPI>("cron"),
messageQueue: platform.getProvider<MessageQueueServiceAPI>("message-queue"),
push: platform.getProvider<PushServiceAPI>("push"),
search: platform.getProvider<SearchServiceAPI>("search"),
storage: platform.getProvider<StorageAPI>("storage"),
tracker: platform.getProvider<TrackerAPI>("tracker"),
webserver: platform.getProvider<WebServerAPI>("webserver"),
emailPusher: platform.getProvider<EmailPusherAPI>("email-pusher"),
};
this.fastify = this.platformServices.webserver.getServer();
Object.keys(this.platformServices).forEach((key: keyof PlatformServices) => {
const service = this.platformServices[key];
assert(service, `Platform service ${key} was not initialized`);
});
await new PreviewEngine().init();
this.services = {
workspaces: await new WorkspaceServiceImpl().init(),
companies: await new CompanyServiceImpl().init(),
users: await new UserServiceImpl().init(),
console: await new ConsoleServiceImpl().init(),
statistics: await new StatisticsServiceImpl().init(),
externalUser: await new UserExternalLinksServiceImpl().init(),
preview: {
files: await new PreviewProcessService().init(),
},
applications: {
marketplaceApps: await new ApplicationServiceImpl().init(),
companyApps: await new CompanyApplicationServiceImpl().init(),
hooks: await new ApplicationHooksService().init(),
},
files: await new FileServiceImpl().init(),
documents: {
documents: await new DocumentsService().init(),
engine: await new DocumentsEngine().init(),
},
tags: await new TagsService().init(),
i18n: await new I18nService().init(),
};
Object.keys(this.services).forEach((key: keyof TdriveServices) => {
assert(this.services[key], `Service ${key} was not initialized`);
if (this.services[key].constructor.name == "Object") {
const subs = this.services[key] as any;
Object.keys(subs).forEach(sk => {
assert(subs[sk], `Service ${key}.${sk} was not initialized`);
});
}
});
logger.info("Global resolver finished initializing services");
this.alreadyInitialized = true;
}
}
export default new GlobalResolver();