Files
workavia-drive/twake/backend/node/src/services/global-resolver.ts
T
2023-04-10 13:10:07 +01:00

193 lines
8.3 KiB
TypeScript

import { FastifyInstance } from "fastify";
import { IncomingMessage, Server, ServerResponse } from "http";
import { TwakePlatform } from "../core/platform/platform";
import { RealtimeServiceAPI } from "../core/platform/services/realtime/api";
import WebServerAPI from "../core/platform/services/webserver/provider";
import { SearchServiceAPI } from "../core/platform/services/search/api";
import StorageAPI from "../core/platform/services/storage/provider";
import { MessageQueueServiceAPI } from "../core/platform/services/message-queue/api";
import { CounterAPI } from "../core/platform/services/counter/types";
import { DatabaseServiceAPI } from "../core/platform/services/database/api";
import AuthServiceAPI from "../core/platform/services/auth/provider";
import { PushServiceAPI } from "../core/platform/services/push/api";
import { CronAPI } from "../core/platform/services/cron/api";
import WebSocketAPI from "../core/platform/services/websocket/provider";
import TrackerAPI from "../core/platform/services/tracker/provider";
import KnowledgeGraphService from "../core/platform/services/knowledge-graph";
import EmailPusherAPI from "../core/platform/services/email-pusher/provider";
import { logger } from "../core/platform/framework";
import assert from "assert";
import { CompanyServiceImpl } from "./user/services/companies";
import { WorkspaceServiceImpl } from "./workspaces/services/workspace";
import { UserExternalLinksServiceImpl } from "./user/services/external_links";
import { UserNotificationBadgeService } from "./notifications/services/bages";
import { NotificationPreferencesService } from "./notifications/services/preferences";
import { UserServiceImpl } from "./user/services/users/service";
import { CompanyApplicationServiceImpl } from "./applications/services/company-applications";
import { ApplicationServiceImpl } from "./applications/services/applications";
import { FileServiceImpl } from "./files/services";
import { ChannelServiceImpl } from "./channels/services/channel/service";
import { MemberServiceImpl } from "./channels/services/member/service";
import ChannelPendingEmailServiceImpl from "./channels/services/channel/pending-emails/service";
import { TabServiceImpl } from "./channels/services/tab";
import { ConsoleServiceImpl } from "./console/service";
import { StatisticsServiceImpl } from "./statistics/service";
import { NotificationEngine } from "./notifications/services/engine";
import { MobilePushService } from "./notifications/services/mobile-push";
import { ChannelMemberPreferencesServiceImpl } from "./notifications/services/channel-preferences";
import { ChannelThreadUsersServiceImpl } from "./notifications/services/channel-thread-users";
import { ApplicationHooksService } from "./applications/services/hooks";
import OnlineServiceImpl from "./online/service";
import { ChannelsMessageQueueListener } from "./channels/services/pubsub";
import { UserNotificationDigestService } from "./notifications/services/digest";
import { DocumentsService } from "./documents/services";
import { DocumentsEngine } from "./documents/services/engine";
import { TagsService } from "./tags/services/tags";
type PlatformServices = {
auth: AuthServiceAPI;
counter: CounterAPI;
cron: CronAPI;
messageQueue: MessageQueueServiceAPI;
push: PushServiceAPI;
realtime: RealtimeServiceAPI;
search: SearchServiceAPI;
storage: StorageAPI;
tracker: TrackerAPI;
webserver: WebServerAPI;
websocket: WebSocketAPI;
knowledgeGraph: KnowledgeGraphService;
emailPusher: EmailPusherAPI;
};
type TwakeServices = {
workspaces: WorkspaceServiceImpl;
companies: CompanyServiceImpl;
users: UserServiceImpl;
console: ConsoleServiceImpl;
statistics: StatisticsServiceImpl;
externalUser: UserExternalLinksServiceImpl;
notifications: {
badges: UserNotificationBadgeService;
channelPreferences: ChannelMemberPreferencesServiceImpl;
channelThreads: ChannelThreadUsersServiceImpl;
engine: NotificationEngine;
preferences: NotificationPreferencesService;
mobilePush: MobilePushService;
digest: UserNotificationDigestService;
};
applications: {
marketplaceApps: ApplicationServiceImpl;
companyApps: CompanyApplicationServiceImpl;
hooks: ApplicationHooksService;
};
files: FileServiceImpl;
channels: {
channels: ChannelServiceImpl;
members: MemberServiceImpl;
pubsub: ChannelsMessageQueueListener;
};
channelPendingEmail: ChannelPendingEmailServiceImpl;
tab: TabServiceImpl;
online: OnlineServiceImpl;
documents: {
documents: DocumentsService;
engine: DocumentsEngine;
};
tags: TagsService;
};
class GlobalResolver {
public services: TwakeServices;
public platformServices: PlatformServices;
public database: DatabaseServiceAPI;
public fastify: FastifyInstance<Server, IncomingMessage, ServerResponse>;
private alreadyInitialized = false;
async doInit(platform: TwakePlatform) {
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"),
realtime: platform.getProvider<RealtimeServiceAPI>("realtime"),
search: platform.getProvider<SearchServiceAPI>("search"),
storage: platform.getProvider<StorageAPI>("storage"),
tracker: platform.getProvider<TrackerAPI>("tracker"),
webserver: platform.getProvider<WebServerAPI>("webserver"),
websocket: platform.getProvider<WebSocketAPI>("websocket"),
knowledgeGraph: await new KnowledgeGraphService().init(),
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`);
});
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(),
notifications: {
badges: await new UserNotificationBadgeService().init(platform),
channelPreferences: await new ChannelMemberPreferencesServiceImpl().init(),
channelThreads: await new ChannelThreadUsersServiceImpl().init(),
engine: await new NotificationEngine().init(),
preferences: await new NotificationPreferencesService().init(),
mobilePush: await new MobilePushService().init(),
digest: await new UserNotificationDigestService().init(),
},
applications: {
marketplaceApps: await new ApplicationServiceImpl().init(),
companyApps: await new CompanyApplicationServiceImpl().init(),
hooks: await new ApplicationHooksService().init(),
},
files: await new FileServiceImpl().init(),
channels: {
channels: await new ChannelServiceImpl().init(),
members: await new MemberServiceImpl().init(),
pubsub: await new ChannelsMessageQueueListener().init(),
},
channelPendingEmail: await new ChannelPendingEmailServiceImpl().init(),
tab: await new TabServiceImpl().init(),
online: await new OnlineServiceImpl().init(),
documents: {
documents: await new DocumentsService().init(),
engine: await new DocumentsEngine().init(),
},
tags: await new TagsService().init(),
};
Object.keys(this.services).forEach((key: keyof TwakeServices) => {
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();