فهرست منبع

refactor: Use virtual jobs for data module model jobs

Owen Diffey 1 سال پیش
والد
کامیت
0c4a57f08e
3فایلهای تغییر یافته به همراه58 افزوده شده و 67 حذف شده
  1. 0 41
      backend/src/modules/APIModule.ts
  2. 45 0
      backend/src/modules/DataModule.ts
  3. 13 26
      backend/src/modules/WebSocketModule.ts

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

@@ -88,47 +88,6 @@ export default class APIModule extends BaseModule {
 		});
 	}
 
-	/**
-	 * Experimental: for APIModule<->DataModule
-	 */
-	public async runDataJob(
-		context: JobContext,
-		{
-			jobName,
-			payload,
-			sessionId,
-			socketId
-		}: {
-			jobName: string;
-			payload: any;
-			sessionId?: string;
-			socketId?: string;
-		}
-	) {
-		let session;
-		if (sessionId) {
-			const Session = await context.getModel("session");
-
-			session = await Session.findByIdAndUpdate(sessionId, {
-				updatedAt: Date.now()
-			});
-		}
-
-		const Model = await context.getModel(payload.model);
-
-		if (jobName === "find") {
-			const response = await Model.find(payload.query).setOptions({
-				userContext: {
-					session
-				}
-			});
-
-			return response;
-		}
-
-		return null;
-	}
-
 	/**
 	 * getCookieValueFromHeader - Get value of a cookie from cookie header string
 	 */

+ 45 - 0
backend/src/modules/DataModule.ts

@@ -136,6 +136,8 @@ export default class DataModule extends BaseModule {
 
 		await this.syncModelIndexes();
 
+		await this.defineModelJobs();
+
 		// @ts-ignore
 		//        this.redisClient = createClient({ ...config.get("redis") });
 		//
@@ -429,6 +431,49 @@ export default class DataModule extends BaseModule {
 			await migration.up();
 		}
 	}
+
+	private async defineModelJobs() {
+		if (!this.models) throw new Error("Models not loaded");
+
+		await Promise.all(
+			Object.entries(this.models).map(async ([modelName, model]) => {
+				await Promise.all(
+					["findById"].map(async method => {
+						this.jobConfig[`${modelName}.${method}`] = {
+							method: async (context, payload) =>
+								Object.getPrototypeOf(this)[method](context, {
+									...payload,
+									model: modelName
+								})
+						};
+					})
+				);
+
+				await Promise.all(
+					Object.keys(model.schema.statics).map(async name => {
+						this.jobConfig[`${modelName}.${name}`] = {
+							method: async (...args) => model[name](...args)
+						};
+					})
+				);
+			})
+		);
+	}
+
+	private async findById(
+		context: JobContext,
+		payload: { model: keyof Models; _id: Types.ObjectId }
+	) {
+		// await context.assertPermission(
+		// 	`data.${payload.model}.findById.${payload._id}`
+		// );
+
+		const model = await context.getModel(payload.model);
+
+		const query = model.findById(payload._id);
+
+		return query.exec();
+	}
 }
 
 export type DataModuleJobs = {

+ 13 - 26
backend/src/modules/WebSocketModule.ts

@@ -138,7 +138,8 @@ export default class WebSocketModule extends BaseModule {
 				throw new Error("Invalid request");
 
 			const [moduleJob, payload, options] = data;
-			const [moduleName, jobName] = moduleJob.split(".");
+			const [moduleName, ...jobNameParts] = moduleJob.split(".");
+			const jobName = jobNameParts.join(".");
 
 			callbackRef = (options ?? payload ?? {}).CB_REF;
 
@@ -147,32 +148,18 @@ export default class WebSocketModule extends BaseModule {
 					`No callback reference provided for job ${moduleJob}`
 				);
 
-			if (moduleName === "data") {
-				const res = await this.jobQueue.runJob("api", "runDataJob", {
-					jobName,
-					payload,
-					sessionId: socket.getSessionId(),
-					socketId: socket.getSocketId()
-				});
-
-				socket.dispatch("CB_REF", callbackRef, {
-					status: "success",
-					data: res
-				});
-			} else {
-				const res = await this.jobQueue.runJob("api", "runJob", {
-					moduleName,
-					jobName,
-					payload,
-					sessionId: socket.getSessionId(),
-					socketId: socket.getSocketId()
-				});
+			const res = await this.jobQueue.runJob("api", "runJob", {
+				moduleName,
+				jobName,
+				payload,
+				sessionId: socket.getSessionId(),
+				socketId: socket.getSocketId()
+			});
 
-				socket.dispatch("CB_REF", callbackRef, {
-					status: "success",
-					data: res
-				});
-			}
+			socket.dispatch("CB_REF", callbackRef, {
+				status: "success",
+				data: res
+			});
 		} catch (error) {
 			const message = error?.message ?? error;