From a88307c5ff9d33dbaa31c60582a3d0cb92211f59 Mon Sep 17 00:00:00 2001 From: Blomios Date: Sat, 1 Aug 2026 19:12:16 +0200 Subject: [PATCH] refactor(frontend,plugins): normalise les DTOs review backend et corrige le mock (#120) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - plugin.ts: normalizeReview() garantit issues/installable définis même si backend omet ces champs - mock/index.ts: MockPluginGateway.uninstall() retourne removalOutcome pour cohérence avec le domaine - domain/index.ts: PluginUninstallResult ajoute removalOutcome optionnel - Co-Authored-By: Claude Opus 4.8 --- frontend/src/adapters/mock/index.ts | 2 +- frontend/src/adapters/plugin.test.ts | 24 ++++++++++++++++++++++++ frontend/src/adapters/plugin.ts | 18 ++++++++++++++++-- frontend/src/domain/index.ts | 1 + 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/frontend/src/adapters/mock/index.ts b/frontend/src/adapters/mock/index.ts index fe6bbc1..0df1c28 100644 --- a/frontend/src/adapters/mock/index.ts +++ b/frontend/src/adapters/mock/index.ts @@ -3523,7 +3523,7 @@ export class MockPluginGateway implements PluginGateway { throw err; } this.plugins.splice(idx, 1); - return { pluginId, restartRequired: true }; + return { pluginId, removalOutcome: "removed", restartRequired: true }; } async listRuntimeContributions(): Promise { diff --git a/frontend/src/adapters/plugin.test.ts b/frontend/src/adapters/plugin.test.ts index c0fc0a4..f215873 100644 --- a/frontend/src/adapters/plugin.test.ts +++ b/frontend/src/adapters/plugin.test.ts @@ -23,4 +23,28 @@ describe("TauriPluginGateway invoke payloads", () => { }, }); }); + + it("normalizes backend review DTOs for the Plugins panel view-model", async () => { + invoke.mockResolvedValueOnce({ + id: "dev.acme.gitgraph", + displayName: "Git Graph", + publisher: "Acme", + version: "1.2.3", + description: "Graph", + sourceKind: "archive", + sourceLabel: "/tmp/gitgraph.ideaplug", + contentHash: "abc", + trustLevel: "full", + contributionSummary: { topLevelMenus: 1, menuItems: 2, layouts: 3, mcpServers: 4 }, + contributes: { menus: [], menuItems: [], layouts: [], mcpServers: [] }, + }); + + const review = await new TauriPluginGateway().reviewPackage({ + sourceKind: "archive", + path: "/tmp/gitgraph.ideaplug", + }); + + expect(review.issues).toEqual([]); + expect(review.installable).toBe(true); + }); }); diff --git a/frontend/src/adapters/plugin.ts b/frontend/src/adapters/plugin.ts index 1e85e13..af577f2 100644 --- a/frontend/src/adapters/plugin.ts +++ b/frontend/src/adapters/plugin.ts @@ -21,15 +21,29 @@ import type { } from "@/domain"; import type { PluginGateway, ReviewPluginPackageInput } from "@/ports"; +type TauriPluginReviewDto = Omit & { + issues?: PluginReview["issues"]; + installable?: boolean; +}; + +function normalizeReview(review: TauriPluginReviewDto): PluginReview { + return { + ...review, + issues: review.issues ?? [], + installable: review.installable ?? true, + }; +} + export class TauriPluginGateway implements PluginGateway { listPlugins(): Promise { return invoke("plugin_list_plugins"); } - reviewPackage(input: ReviewPluginPackageInput): Promise { - return invoke("plugin_review_package", { + async reviewPackage(input: ReviewPluginPackageInput): Promise { + const review = await invoke("plugin_review_package", { input: { sourceKind: input.sourceKind, path: input.path }, }); + return normalizeReview(review); } installFromArchive(path: string): Promise { diff --git a/frontend/src/domain/index.ts b/frontend/src/domain/index.ts index e5a20dc..6c2dc71 100644 --- a/frontend/src/domain/index.ts +++ b/frontend/src/domain/index.ts @@ -1730,6 +1730,7 @@ export interface PluginInstallResult { /** Outcome of `uninstall`. */ export interface PluginUninstallResult { pluginId: string; + removalOutcome?: "removed" | "tombstoned" | "notFound"; restartRequired: boolean; }