Forráskód Böngészése

refactor: Add forEachIn error handling

Owen Diffey 1 éve
szülő
commit
d76859ccc3

+ 15 - 8
backend/src/modules/DataModule.ts

@@ -298,13 +298,18 @@ export class DataModule extends BaseModule {
 			throw error;
 		}
 
-		return forEachIn(migrations, async migrationFile => {
-			const { default: Migrate }: { default: typeof Migration } =
-				await import(
-					`./DataModule/models/${modelName}/migrations/${migrationFile}`
-				);
-			return new Migrate(this._mongoConnection as Connection);
-		});
+		const { completed } = await forEachIn(
+			migrations,
+			async migrationFile => {
+				const { default: Migrate }: { default: typeof Migration } =
+					await import(
+						`./DataModule/models/${modelName}/migrations/${migrationFile}`
+					);
+				return new Migrate(this._mongoConnection as Connection);
+			}
+		);
+
+		return completed;
 	}
 
 	private async _loadMigrations() {
@@ -312,9 +317,11 @@ export class DataModule extends BaseModule {
 			path.resolve(__dirname, "./DataModule/models/")
 		);
 
-		return forEachIn(models, async modelName =>
+		const { completed } = await forEachIn(models, async modelName =>
 			this._loadModelMigrations(modelName)
 		);
+
+		return completed;
 	}
 
 	private async _runMigrations() {

+ 1 - 1
backend/src/modules/DataModule/models/users/jobs/GetModelPermissions.ts

@@ -53,7 +53,7 @@ export default class GetModelPermissions extends DataModuleJob {
 
 		if (modelId && !model) throw new Error("Model not found");
 
-		const jobs = await forEachIn(
+		const { completed: jobs } = await forEachIn(
 			Object.entries(
 				ModuleManager.getModule("data")?.getJobs() ?? {}
 			).filter(

+ 8 - 4
backend/src/utils/forEachIn.ts

@@ -8,10 +8,12 @@ export const forEachIn = async <
 >(
 	items: ItemsType,
 	callback: CallbackType,
-	concurrency = 10
-): Promise<CallbackReturnType[]> => {
+	options: { abortOnError?: boolean; concurrency?: number } = {}
+): Promise<{ completed: CallbackReturnType[]; failed: any[] }> => {
+	const { abortOnError = true, concurrency = 10 } = options;
+
 	const queued = items.slice();
-	const failed: any[] = []; // TODO: Report these errors and abortOnError option
+	const failed: any[] = [];
 	const completed: CallbackReturnType[] = [];
 
 	const next = async () => {
@@ -24,6 +26,8 @@ export const forEachIn = async <
 		try {
 			completed[index] = await callback(item, index);
 		} catch (error) {
+			if (abortOnError) throw error;
+
 			failed[index] = error;
 		}
 
@@ -34,5 +38,5 @@ export const forEachIn = async <
 		Array.from(Array(Math.min(items.length, concurrency)).keys()).map(next)
 	);
 
-	return completed;
+	return { completed, failed };
 };