Selaa lähdekoodia

refactor: Use unsubscribeMany when unregistering models

Owen Diffey 1 vuosi sitten
vanhempi
commit
663461a1a5
1 muutettua tiedostoa jossa 35 lisäystä ja 25 poistoa
  1. 35 25
      frontend/src/stores/model.ts

+ 35 - 25
frontend/src/stores/model.ts

@@ -6,7 +6,7 @@ import { useWebsocketStore } from "./websocket";
 import Model from "@/Model";
 
 export const useModelStore = defineStore("model", () => {
-	const { runJob, subscribe, subscribeMany, unsubscribe } =
+	const { runJob, subscribe, subscribeMany, unsubscribe, unsubscribeMany } =
 		useWebsocketStore();
 
 	const models = ref([]);
@@ -39,41 +39,51 @@ export const useModelStore = defineStore("model", () => {
 		return !!data[permission];
 	};
 
-	const unregisterModels = async modelIds =>
-		forEachIn(
+	const unregisterModels = async modelIds => {
+		const removeModels = [];
+
+		await forEachIn(
 			Array.isArray(modelIds) ? modelIds : [modelIds],
 			async modelId => {
 				const model = models.value.find(model => model._id === modelId);
 
-				if (!model || model.getUses() > 1) {
-					model?.removeUse();
+				if (!model) return;
+
+				model?.removeUse();
+
+				if (model.getUses() > 1) return;
+
+				removeModels.push(model);
+			}
+		);
 
-					return;
-				}
+		if (removeModels.length === 0) return;
 
-				await model.unregisterRelations();
+		await forEachIn(removeModels, async model =>
+			model.unregisterRelations()
+		);
 
+		const subscriptions = Object.fromEntries(
+			removeModels.flatMap(model => {
 				const { updated, deleted } = model.getSubscriptions() ?? {};
 
-				if (updated)
-					await unsubscribe(
-						`model.${model.getName()}.updated.${modelId}`,
-						updated
-					);
-
-				if (deleted)
-					await unsubscribe(
-						`model.${model.getName()}.deleted.${modelId}`,
-						deleted
-					);
-
-				models.value.splice(
-					models.value.findIndex(model => model._id === modelId),
-					1
-				);
-			}
+				return [
+					[updated, `model.${model.getName()}.updated.${model._id}`],
+					[deleted, `model.${model.getName()}.deleted.${model._id}`]
+				];
+			})
 		);
 
+		await unsubscribeMany(subscriptions);
+
+		await forEachIn(removeModels, async removeModel => {
+			models.value.splice(
+				models.value.findIndex(model => model._id === removeModel._id),
+				1
+			);
+		});
+	};
+
 	const onCreatedCallback = async (modelName: string, data) => {
 		if (!subscriptions.value.created[modelName]) return;