diff --git a/package.json b/package.json index e9b1721a..46c65076 100644 --- a/package.json +++ b/package.json @@ -761,6 +761,11 @@ "command": "vscode-objectscript.ccs.createItem", "group": "6_create@1", "when": "editorTextFocus && editorLangId =~ /^objectscript/" + }, + { + "command": "vscode-objectscript.ccs.atualizarConfiguracoes", + "group": "7_config@1", + "when": "vscode-objectscript.connectActive" } ] }, @@ -1360,6 +1365,11 @@ "command": "vscode-objectscript.ccs.analizarVersaoItem", "title": "Versões do Item - Analizar" }, + { + "category": "Consistem", + "command": "vscode-objectscript.ccs.atualizarConfiguracoes", + "title": "Atualizar Configurações" + }, { "category": "ObjectScript", "command": "vscode-objectscript.compileWithFlags", diff --git a/src/ccs/commands/atualizarConfiguracoes.ts b/src/ccs/commands/atualizarConfiguracoes.ts new file mode 100644 index 00000000..97ebcd14 --- /dev/null +++ b/src/ccs/commands/atualizarConfiguracoes.ts @@ -0,0 +1,33 @@ +import * as vscode from "vscode"; + +import { handleError, outputChannel } from "../../utils"; +import { AtualizarConfigClient } from "../sourcecontrol/clients/atualizarConfigClient"; + +const sharedClient = new AtualizarConfigClient(); + +export async function atualizarConfiguracoes(): Promise { + await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: "Atualizando configurações...", + cancellable: false, + }, + async () => { + try { + const responseText = await sharedClient.atualizarConfig(); + renderOutput(responseText); + } catch (error) { + handleError(error, "Falha ao atualizar configurações."); + } + } + ); +} + +function renderOutput(responseText: string): void { + responseText + .split(/\r?\n/) + .filter((line) => line.length > 0) + .forEach((line) => outputChannel.appendLine(line)); + + outputChannel.show(true); +} diff --git a/src/ccs/index.ts b/src/ccs/index.ts index b4d560d9..8a2ae60d 100644 --- a/src/ccs/index.ts +++ b/src/ccs/index.ts @@ -32,3 +32,4 @@ export { createItem } from "./commands/createItem"; export { convertCurrentItem, convertCurrentItemCustom, convertCurrentItemOnSave } from "./commands/converterItem"; export { analizarVersaoItem } from "./commands/analizarVersaoItem"; +export { atualizarConfiguracoes } from "./commands/atualizarConfiguracoes"; diff --git a/src/ccs/sourcecontrol/clients/atualizarConfigClient.ts b/src/ccs/sourcecontrol/clients/atualizarConfigClient.ts new file mode 100644 index 00000000..caaae887 --- /dev/null +++ b/src/ccs/sourcecontrol/clients/atualizarConfigClient.ts @@ -0,0 +1,63 @@ +import * as vscode from "vscode"; + +import { AtelierAPI } from "../../../api"; +import { createAbortSignal } from "../../core/http"; +import { logDebug } from "../../core/logging"; +import { SourceControlApi } from "../client"; +import { ROUTES } from "../routes"; + +const DESENV_NS_PATTERN = /^DESENV\d+$/i; + +export class AtualizarConfigClient { + private readonly apiFactory: (api: AtelierAPI) => SourceControlApi; + + public constructor(apiFactory: (api: AtelierAPI) => SourceControlApi = SourceControlApi.fromAtelierApi) { + this.apiFactory = apiFactory; + } + + public async atualizarConfig(): Promise { + const api = this.resolveDesenvApi(); + + let sourceControlApi: SourceControlApi; + try { + sourceControlApi = this.apiFactory(api); + } catch (error) { + logDebug("Failed to create SourceControl API client para atualizarConfig", error); + throw error; + } + + const { signal, dispose } = createAbortSignal(); + + try { + const response = await sourceControlApi.post( + ROUTES.atualizarConfig(api.ns), + {}, + { + timeout: 0, + signal, + responseType: "text", + transformResponse: (data) => data, + validateStatus: (status) => status >= 200 && status < 300, + } + ); + + return typeof response.data === "string" ? response.data : ""; + } catch (error) { + logDebug("atualizarConfig request failed", error); + throw error; + } finally { + dispose(); + } + } + + private resolveDesenvApi(): AtelierAPI { + for (const wsFolder of vscode.workspace.workspaceFolders ?? []) { + if (!DESENV_NS_PATTERN.test(wsFolder.name)) continue; + const api = new AtelierAPI(wsFolder.uri); + if (!api.active) continue; + return api; + } + + throw new Error("Namespace DESENVXX não encontrado. Verifique as configurações do workspace."); + } +} diff --git a/src/ccs/sourcecontrol/routes.ts b/src/ccs/sourcecontrol/routes.ts index 768f3a1d..98af8deb 100644 --- a/src/ccs/sourcecontrol/routes.ts +++ b/src/ccs/sourcecontrol/routes.ts @@ -12,6 +12,7 @@ export const ROUTES = { converterArquivoCustomizado: (namespace: string) => `/namespaces/${encodeURIComponent(namespace)}/converterArquivoCustomizado`, analizarVersaoItem: (namespace: string) => `/namespaces/${encodeURIComponent(namespace)}/analizarVersaoItem`, + atualizarConfig: (namespace: string) => `/namespaces/${encodeURIComponent(namespace)}/atualizarConfig`, } as const; export type RouteKey = keyof typeof ROUTES; diff --git a/src/extension.ts b/src/extension.ts index df851a4a..aa74bc95 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -171,6 +171,7 @@ import { convertCurrentItemCustom, convertCurrentItemOnSave, analizarVersaoItem, + atualizarConfiguracoes, } from "./ccs"; const packageJson = vscode.extensions.getExtension(extensionId).packageJSON; @@ -1441,6 +1442,10 @@ export async function activate(context: vscode.ExtensionContext): Promise { sendCommandTelemetryEvent("analizarVersaoItem"); void analizarVersaoItem(); }), + vscode.commands.registerCommand("vscode-objectscript.ccs.atualizarConfiguracoes", () => { + sendCommandTelemetryEvent("atualizarConfiguracoes"); + void atualizarConfiguracoes(); + }), vscode.commands.registerCommand("vscode-objectscript.serverCommands.sourceControl", (uri?: vscode.Uri) => { sendCommandTelemetryEvent("serverCommands.sourceControl"); mainSourceControlMenu(uri);