using System.IO.Compression; namespace AIStudio.Tools.PluginSystem; public static partial class PluginFactory { public static async Task TryDownloadingConfigPluginAsync(Guid configPlugId, string configServerUrl, CancellationToken cancellationToken = default) { if (!IS_INITIALIZED) return false; LOG.LogInformation($"Downloading configuration plugin with ID: {configPlugId} from server: {configServerUrl}"); var tempDownloadFile = Path.GetTempFileName(); try { using var httpClient = new HttpClient(); var response = await httpClient.GetAsync($"{configServerUrl}/{configPlugId}.zip", cancellationToken); if (response.IsSuccessStatusCode) { await using var tempFileStream = File.Create(tempDownloadFile); await response.Content.CopyToAsync(tempFileStream, cancellationToken); var pluginDirectory = Path.Join(CONFIGURATION_PLUGINS_ROOT, configPlugId.ToString()); if(Directory.Exists(pluginDirectory)) Directory.Delete(pluginDirectory, true); Directory.CreateDirectory(pluginDirectory); ZipFile.ExtractToDirectory(tempDownloadFile, pluginDirectory); LOG.LogInformation($"Configuration plugin with ID='{configPlugId}' downloaded and extracted successfully to '{pluginDirectory}'."); } else LOG.LogError($"Failed to download the enterprise configuration plugin. HTTP Status: {response.StatusCode}"); } catch (Exception e) { LOG.LogError(e, "An error occurred while downloading or extracting the enterprise configuration plugin."); } finally { if (File.Exists(tempDownloadFile)) { try { File.Delete(tempDownloadFile); } catch (Exception e) { LOG.LogError(e, "Failed to delete the temporary download file."); } } } return true; } }