Procházet zdrojové kódy

feat: Add basic API module

Owen Diffey před 1 rokem
rodič
revize
b3bef5c7be

+ 2 - 0
backend/src/ModuleManager.ts

@@ -36,6 +36,7 @@ export default class ModuleManager {
 	 */
 	private async loadModule<T extends keyof Modules>(moduleName: T) {
 		const mapper = {
+			api: "APIModule",
 			data: "DataModule",
 			events: "EventsModule",
 			stations: "StationModule",
@@ -53,6 +54,7 @@ export default class ModuleManager {
 	 */
 	private async loadModules() {
 		this.modules = {
+			api: await this.loadModule("api"),
 			data: await this.loadModule("data"),
 			events: await this.loadModule("events"),
 			stations: await this.loadModule("stations"),

+ 84 - 0
backend/src/modules/APIModule.ts

@@ -0,0 +1,84 @@
+import JobContext from "../JobContext";
+import BaseModule from "../BaseModule";
+import { Jobs, Modules, UniqueMethods } from "../types/Modules";
+
+export default class APIModule extends BaseModule {
+	/**
+	 * API Module
+	 */
+	public constructor() {
+		super("api");
+
+		this.dependentModules = ["data", "events", "websocket"];
+	}
+
+	/**
+	 * startup - Startup api module
+	 */
+	public override async startup() {
+		await super.startup();
+
+		await super.started();
+	}
+
+	/**
+	 * shutdown - Shutdown api module
+	 */
+	public override async shutdown() {
+		await super.shutdown();
+	}
+
+	/**
+	 * runJob - Run a job
+	 */
+	public async runJob<
+		ModuleNameType extends keyof Jobs & keyof Modules,
+		JobNameType extends keyof Jobs[ModuleNameType] &
+			keyof Omit<Modules[ModuleNameType], keyof BaseModule>,
+		PayloadType extends "payload" extends keyof Jobs[ModuleNameType][JobNameType]
+			? Jobs[ModuleNameType][JobNameType]["payload"] extends undefined
+				? Record<string, never>
+				: Jobs[ModuleNameType][JobNameType]["payload"]
+			: Record<string, never>,
+		ReturnType = "returns" extends keyof Jobs[ModuleNameType][JobNameType]
+			? Jobs[ModuleNameType][JobNameType]["returns"]
+			: never
+	>(
+		context: JobContext,
+		{
+			moduleName,
+			jobName,
+			payload,
+			socketId,
+			sessionId
+		}: {
+			moduleName: ModuleNameType;
+			jobName: JobNameType;
+			payload: PayloadType;
+			socketId?: string;
+			sessionId?: string;
+		}
+	): Promise<ReturnType> {
+		let session;
+		if (sessionId) {
+			const Session = await context.executeJob(
+				"data",
+				"getModel",
+				"session"
+			);
+			session = await Session.findOneAndUpdate(
+				{ _id: sessionId },
+				{ $addToSet: { socketIds: socketId } }
+			);
+		}
+
+		return context.executeJob(moduleName, jobName, payload, { session });
+	}
+}
+
+export type APIModuleJobs = {
+	[Property in keyof UniqueMethods<APIModule>]: {
+		payload: Parameters<UniqueMethods<APIModule>[Property]>[1];
+		returns: Awaited<ReturnType<UniqueMethods<APIModule>[Property]>>;
+	};
+};

+ 5 - 0
backend/src/types/Modules.ts

@@ -1,3 +1,4 @@
+import APIModule, { APIModuleJobs } from "../modules/APIModule";
 import DataModule, { DataModuleJobs } from "../modules/DataModule";
 import EventsModule, { EventsModuleJobs } from "../modules/EventsModule";
 import StationModule, { StationModuleJobs } from "../modules/StationModule";
@@ -13,6 +14,9 @@ export type ModuleClass<Module extends typeof BaseModule> = {
 };
 
 export type Jobs = {
+	api: {
+		[Property in keyof APIModuleJobs]: APIModuleJobs[Property];
+	};
 	data: {
 		[Property in keyof DataModuleJobs]: DataModuleJobs[Property];
 	};
@@ -28,6 +32,7 @@ export type Jobs = {
 };
 
 export type Modules = {
+	api: APIModule & typeof BaseModule;
 	data: DataModule & typeof BaseModule;
 	events: EventsModule & typeof BaseModule;
 	stations: StationModule & typeof BaseModule;