From 6eb35b8a81a7befc80971e0a15ff93346587368f Mon Sep 17 00:00:00 2001 From: Caelan Sayler Date: Tue, 24 Dec 2024 14:36:26 +0000 Subject: [PATCH] Refactor projects & add NSwag codegen --- Velopack.sln | 12 + src/lib-csharp/Properties/AssemblyInfo.cs | 2 + src/vpk/Velopack.Build/MSBuildLogger.cs | 2 +- src/vpk/Velopack.Build/PublishTask.cs | 69 +- src/vpk/Velopack.Build/TaskOptionsMapper.cs | 1 + src/vpk/Velopack.Build/Velopack.Build.csproj | 1 + .../Abstractions/ICommand.cs | 2 +- .../Abstractions/IConsole.cs | 3 +- .../Abstractions/IFancyConsole.cs | 2 +- .../Abstractions/IFancyConsoleProgress.cs | 2 +- .../BuildAssets.cs | 7 +- src/vpk/Velopack.Core/DefaultName.cs | 55 + .../HttpClientExtensions.cs | 10 +- .../SimpleJson.cs | 10 +- .../UserInfoException.cs | 2 +- src/vpk/Velopack.Core/Velopack.Core.csproj | 20 + .../Velopack.Deployment/GitHubRepository.cs | 3 +- .../Velopack.Deployment/GiteaRepository.cs | 4 +- .../Velopack.Deployment.csproj | 1 + .../Velopack.Deployment/_ObjectRepository.cs | 1 + src/vpk/Velopack.Deployment/_Repository.cs | 7 +- .../Commands/ApiCommandRunner.cs | 25 + src/vpk/Velopack.Flow/Commands/ApiOptions.cs | 8 + .../Commands/LoginCommandRunner.cs | 13 + .../Velopack.Flow/Commands/LoginOptions.cs | 3 + .../Commands/LogoutCommandRunner.cs | 13 + .../Velopack.Flow/Commands/LogoutOptions.cs | 3 + .../Commands/PublishCommandRunner.cs | 29 + .../Velopack.Flow/Commands/PublishOptions.cs | 12 + src/vpk/Velopack.Flow/FlowApi.cs | 5486 +++++++++++++++++ src/vpk/Velopack.Flow/FlowApi.gen.bat | 2 + src/vpk/Velopack.Flow/FlowApiExtensions.cs | 98 + .../HmacAuthHttpClientHandler.cs | 2 +- .../Flow => Velopack.Flow}/HmacHelper.cs | 7 +- src/vpk/Velopack.Flow/Velopack.Flow.csproj | 24 + .../VelopackFlowLoginOptions.cs} | 7 +- .../VelopackFlowServiceClient.cs | 219 +- .../VelopackFlowServiceOptions.cs | 10 + .../Commands/LinuxPackCommandRunner.cs | 3 +- .../Commands/OsxBundleCommandRunner.cs | 4 +- .../Commands/OsxPackCommandRunner.cs | 5 +- .../Velopack.Packaging.Unix/OsxBuildTools.cs | 1 + .../Velopack.Packaging.Windows/CodeSign.cs | 2 +- .../Commands/WindowsPackCommandRunner.cs | 8 +- .../Commands/WindowsReleasifyOptions.cs | 4 +- .../Velopack.Packaging.Windows/CompatUtil.cs | 4 +- .../Abstractions/IPlatformOptions.cs | 2 +- .../Commands/DeltaGenCommandRunner.cs | 25 +- .../Commands/DeltaGenOptions.cs | 6 +- .../Commands/DeltaPatchCommandRunner.cs | 36 +- .../Commands/DeltaPatchOptions.cs | 2 +- .../Velopack.Packaging/DeltaPackageBuilder.cs | 62 +- .../Exceptions/ProcessFailedException.cs | 5 +- .../VelopackAppVerificationException.cs | 9 +- src/vpk/Velopack.Packaging/Exe.cs | 8 +- .../Flow/AuthConfiguration.cs | 9 - .../Flow/CreateReleaseGroupRequest.cs | 9 - src/vpk/Velopack.Packaging/Flow/Profile.cs | 14 - .../Velopack.Packaging/Flow/ReleaseGroup.cs | 20 - .../Flow/UpdateReleaseGroupRequest.cs | 20 - .../Velopack.Packaging/Flow/UploadOptions.cs | 10 - .../Flow/VelopackServiceOptions.cs | 10 - src/vpk/Velopack.Packaging/PackageBuilder.cs | 219 +- .../Velopack.Packaging/ReleaseEntryHelper.cs | 63 +- src/vpk/Velopack.Packaging/ReleasePackage.cs | 2 +- .../Velopack.Packaging.csproj | 1 + src/vpk/Velopack.Packaging/Zstd.cs | 14 +- .../Velopack.Vpk/Commands/DeltaGenCommand.cs | 3 +- .../Commands/Flow/ApiCommandRunner.cs | 26 - .../Velopack.Vpk/Commands/Flow/ApiOptions.cs | 11 - .../Commands/Flow/LoginCommandRunner.cs | 17 - .../Commands/Flow/LoginOptions.cs | 5 - .../Commands/Flow/LogoutCommandRunner.cs | 14 - .../Commands/Flow/LogoutOptions.cs | 5 - .../Commands/Flow/PublishCommand.cs | 6 +- .../Commands/Flow/PublishCommandRunner.cs | 25 - .../Commands/Flow/PublishOptions.cs | 15 - .../Commands/Flow/VelopackServiceCommand.cs | 14 +- .../Velopack.Vpk/Commands/_OutputCommand.cs | 5 +- src/vpk/Velopack.Vpk/Logging/BasicConsole.cs | 2 +- .../Velopack.Vpk/Logging/SpectreConsole.cs | 2 +- src/vpk/Velopack.Vpk/OptionMapper.cs | 1 + src/vpk/Velopack.Vpk/Program.cs | 18 +- src/vpk/Velopack.Vpk/Velopack.Vpk.csproj | 1 + .../CompatUtilTests.cs | 1 + .../GithubDeploymentTests.cs | 1 + .../WindowsPackTests.cs | 1 + .../TestHelpers/FakeFixtureRepository.cs | 22 +- test/Velopack.Tests/UpdateManagerTests.cs | 2 +- test/Velopack.Tests/Velopack.Tests.csproj | 18 +- 90 files changed, 6267 insertions(+), 702 deletions(-) rename src/vpk/{Velopack.Packaging => Velopack.Core}/Abstractions/ICommand.cs (66%) rename src/vpk/{Velopack.Packaging => Velopack.Core}/Abstractions/IConsole.cs (60%) rename src/vpk/{Velopack.Packaging => Velopack.Core}/Abstractions/IFancyConsole.cs (88%) rename src/vpk/{Velopack.Packaging => Velopack.Core}/Abstractions/IFancyConsoleProgress.cs (78%) rename src/vpk/{Velopack.Packaging => Velopack.Core}/BuildAssets.cs (93%) create mode 100644 src/vpk/Velopack.Core/DefaultName.cs rename src/vpk/{Velopack.Packaging => Velopack.Core}/HttpClientExtensions.cs (75%) rename src/vpk/{Velopack.Packaging => Velopack.Core}/SimpleJson.cs (76%) rename src/vpk/{Velopack.Packaging/Exceptions => Velopack.Core}/UserInfoException.cs (93%) create mode 100644 src/vpk/Velopack.Core/Velopack.Core.csproj create mode 100644 src/vpk/Velopack.Flow/Commands/ApiCommandRunner.cs create mode 100644 src/vpk/Velopack.Flow/Commands/ApiOptions.cs create mode 100644 src/vpk/Velopack.Flow/Commands/LoginCommandRunner.cs create mode 100644 src/vpk/Velopack.Flow/Commands/LoginOptions.cs create mode 100644 src/vpk/Velopack.Flow/Commands/LogoutCommandRunner.cs create mode 100644 src/vpk/Velopack.Flow/Commands/LogoutOptions.cs create mode 100644 src/vpk/Velopack.Flow/Commands/PublishCommandRunner.cs create mode 100644 src/vpk/Velopack.Flow/Commands/PublishOptions.cs create mode 100644 src/vpk/Velopack.Flow/FlowApi.cs create mode 100644 src/vpk/Velopack.Flow/FlowApi.gen.bat create mode 100644 src/vpk/Velopack.Flow/FlowApiExtensions.cs rename src/vpk/{Velopack.Packaging/Flow => Velopack.Flow}/HmacAuthHttpClientHandler.cs (97%) rename src/vpk/{Velopack.Packaging/Flow => Velopack.Flow}/HmacHelper.cs (93%) create mode 100644 src/vpk/Velopack.Flow/Velopack.Flow.csproj rename src/vpk/{Velopack.Packaging/Flow/VelopackLoginOptions.cs => Velopack.Flow/VelopackFlowLoginOptions.cs} (60%) rename src/vpk/{Velopack.Packaging/Flow => Velopack.Flow}/VelopackFlowServiceClient.cs (66%) create mode 100644 src/vpk/Velopack.Flow/VelopackFlowServiceOptions.cs delete mode 100644 src/vpk/Velopack.Packaging/Flow/AuthConfiguration.cs delete mode 100644 src/vpk/Velopack.Packaging/Flow/CreateReleaseGroupRequest.cs delete mode 100644 src/vpk/Velopack.Packaging/Flow/Profile.cs delete mode 100644 src/vpk/Velopack.Packaging/Flow/ReleaseGroup.cs delete mode 100644 src/vpk/Velopack.Packaging/Flow/UpdateReleaseGroupRequest.cs delete mode 100644 src/vpk/Velopack.Packaging/Flow/UploadOptions.cs delete mode 100644 src/vpk/Velopack.Packaging/Flow/VelopackServiceOptions.cs delete mode 100644 src/vpk/Velopack.Vpk/Commands/Flow/ApiCommandRunner.cs delete mode 100644 src/vpk/Velopack.Vpk/Commands/Flow/ApiOptions.cs delete mode 100644 src/vpk/Velopack.Vpk/Commands/Flow/LoginCommandRunner.cs delete mode 100644 src/vpk/Velopack.Vpk/Commands/Flow/LoginOptions.cs delete mode 100644 src/vpk/Velopack.Vpk/Commands/Flow/LogoutCommandRunner.cs delete mode 100644 src/vpk/Velopack.Vpk/Commands/Flow/LogoutOptions.cs delete mode 100644 src/vpk/Velopack.Vpk/Commands/Flow/PublishCommandRunner.cs delete mode 100644 src/vpk/Velopack.Vpk/Commands/Flow/PublishOptions.cs diff --git a/Velopack.sln b/Velopack.sln index f90ae358..ef980ce5 100644 --- a/Velopack.sln +++ b/Velopack.sln @@ -55,6 +55,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Velopack.Build", "src\vpk\V EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Velopack.IcoLib", "src\vpk\Velopack.IcoLib\Velopack.IcoLib.csproj", "{8A0A980A-D51C-458E-8942-00BC900FD2D0}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Velopack.Flow", "src\vpk\Velopack.Flow\Velopack.Flow.csproj", "{DC836A20-E770-451A-B26E-4CC74633F741}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Velopack.Core", "src\vpk\Velopack.Core\Velopack.Core.csproj", "{2A60F8BE-EAD4-4229-A04E-52A37C8F1D0E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -121,6 +125,14 @@ Global {8A0A980A-D51C-458E-8942-00BC900FD2D0}.Debug|Any CPU.Build.0 = Debug|Any CPU {8A0A980A-D51C-458E-8942-00BC900FD2D0}.Release|Any CPU.ActiveCfg = Release|Any CPU {8A0A980A-D51C-458E-8942-00BC900FD2D0}.Release|Any CPU.Build.0 = Release|Any CPU + {DC836A20-E770-451A-B26E-4CC74633F741}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC836A20-E770-451A-B26E-4CC74633F741}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC836A20-E770-451A-B26E-4CC74633F741}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC836A20-E770-451A-B26E-4CC74633F741}.Release|Any CPU.Build.0 = Release|Any CPU + {2A60F8BE-EAD4-4229-A04E-52A37C8F1D0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2A60F8BE-EAD4-4229-A04E-52A37C8F1D0E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2A60F8BE-EAD4-4229-A04E-52A37C8F1D0E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2A60F8BE-EAD4-4229-A04E-52A37C8F1D0E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/lib-csharp/Properties/AssemblyInfo.cs b/src/lib-csharp/Properties/AssemblyInfo.cs index ea0c3681..5b20a954 100644 --- a/src/lib-csharp/Properties/AssemblyInfo.cs +++ b/src/lib-csharp/Properties/AssemblyInfo.cs @@ -6,6 +6,8 @@ using System.Runtime.InteropServices; [assembly: InternalsVisibleTo("Velopack.Packaging.Tests, PublicKey=" + SNK.SHA1)] [assembly: InternalsVisibleTo("Velopack.CommandLine.Tests, PublicKey=" + SNK.SHA1)] [assembly: InternalsVisibleTo("Velopack, PublicKey=" + SNK.SHA1)] +[assembly: InternalsVisibleTo("Velopack.Core, PublicKey=" + SNK.SHA1)] +[assembly: InternalsVisibleTo("Velopack.Flow, PublicKey=" + SNK.SHA1)] [assembly: InternalsVisibleTo("Velopack.Deployment, PublicKey=" + SNK.SHA1)] [assembly: InternalsVisibleTo("Velopack.Packaging, PublicKey=" + SNK.SHA1)] [assembly: InternalsVisibleTo("Velopack.Packaging.Windows, PublicKey=" + SNK.SHA1)] diff --git a/src/vpk/Velopack.Build/MSBuildLogger.cs b/src/vpk/Velopack.Build/MSBuildLogger.cs index fdda6799..865ae9de 100644 --- a/src/vpk/Velopack.Build/MSBuildLogger.cs +++ b/src/vpk/Velopack.Build/MSBuildLogger.cs @@ -4,7 +4,7 @@ using System.Threading.Tasks; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Microsoft.Extensions.Logging; -using Velopack.Packaging.Abstractions; +using Velopack.Core.Abstractions; using ILogger = Microsoft.Extensions.Logging.ILogger; using Task = System.Threading.Tasks.Task; diff --git a/src/vpk/Velopack.Build/PublishTask.cs b/src/vpk/Velopack.Build/PublishTask.cs index 08d11476..293f5105 100644 --- a/src/vpk/Velopack.Build/PublishTask.cs +++ b/src/vpk/Velopack.Build/PublishTask.cs @@ -1,53 +1,54 @@ -using System; -using System.Net.Http; -using System.Threading; +using System.Threading; using System.Threading.Tasks; using Microsoft.Build.Framework; using Microsoft.Extensions.Logging; -using Velopack.Packaging.Flow; +using Velopack.Flow; namespace Velopack.Build; public class PublishTask : MSBuildAsyncTask { - private static HttpClient HttpClient { get; } = new(new HmacAuthHttpClientHandler { - InnerHandler = new HttpClientHandler() - }) { - Timeout = TimeSpan.FromMinutes(60) - }; - [Required] public string ReleaseDirectory { get; set; } = ""; - public string ServiceUrl { get; set; } = VelopackServiceOptions.DefaultBaseUrl; + public string? ServiceUrl { get; set; } public string? Channel { get; set; } public string? ApiKey { get; set; } - - public bool NoWaitForLive { get; set; } + + public double Timeout { get; set; } = 30d; + + public bool WaitForLive { get; set; } protected override async Task ExecuteAsync(CancellationToken cancellationToken) { - throw new NotImplementedException(); - // //System.Diagnostics.Debugger.Launch(); - // IVelopackFlowServiceClient client = new VelopackFlowServiceClient(HttpClient, Logger, Logger); - // if (!await client.LoginAsync(new() { - // AllowDeviceCodeFlow = false, - // AllowInteractiveLogin = false, - // VelopackBaseUrl = ServiceUrl, - // ApiKey = ApiKey - // }, false, cancellationToken).ConfigureAwait(false)) { - // Logger.LogWarning("Not logged into Velopack Flow service, skipping publish. Please run vpk login."); - // return true; - // } - // - // // todo: currently it's not possible to cross-compile for different OSes using Velopack.Build - // var targetOs = VelopackRuntimeInfo.SystemOs; - // - // await client.UploadLatestReleaseAssetsAsync(Channel, ReleaseDirectory, ServiceUrl, targetOs, NoWaitForLive, cancellationToken) - // .ConfigureAwait(false); - // - // return true; + //System.Diagnostics.Debugger.Launch(); + var options = new VelopackFlowServiceOptions { + VelopackBaseUrl = ServiceUrl, + ApiKey = ApiKey, + Timeout = Timeout, + }; + + var loginOptions = new VelopackFlowLoginOptions() { + AllowCacheCredentials = true, + AllowDeviceCodeFlow = false, + AllowInteractiveLogin = false, + }; + + var client = new VelopackFlowServiceClient(options, Logger, Logger); + CancellationToken token = CancellationToken.None; + if (!await client.LoginAsync(loginOptions, false, token)) { + Logger.LogWarning("Not logged into Velopack Flow service, skipping publish. Please run vpk login."); + return true; + } + + // todo: currently it's not possible to cross-compile for different OSes using Velopack.Build + var targetOs = VelopackRuntimeInfo.SystemOs; + + await client.UploadLatestReleaseAssetsAsync(Channel, ReleaseDirectory, targetOs, WaitForLive, cancellationToken) + .ConfigureAwait(false); + + return true; } -} +} \ No newline at end of file diff --git a/src/vpk/Velopack.Build/TaskOptionsMapper.cs b/src/vpk/Velopack.Build/TaskOptionsMapper.cs index e3164e5a..e4ccb446 100644 --- a/src/vpk/Velopack.Build/TaskOptionsMapper.cs +++ b/src/vpk/Velopack.Build/TaskOptionsMapper.cs @@ -1,6 +1,7 @@ using System; using System.IO; using Riok.Mapperly.Abstractions; +using Velopack.Core; using Velopack.Packaging; using Velopack.Packaging.Unix.Commands; using Velopack.Packaging.Windows.Commands; diff --git a/src/vpk/Velopack.Build/Velopack.Build.csproj b/src/vpk/Velopack.Build/Velopack.Build.csproj index 62afdf2f..7599b9f2 100644 --- a/src/vpk/Velopack.Build/Velopack.Build.csproj +++ b/src/vpk/Velopack.Build/Velopack.Build.csproj @@ -16,6 +16,7 @@ + diff --git a/src/vpk/Velopack.Packaging/Abstractions/ICommand.cs b/src/vpk/Velopack.Core/Abstractions/ICommand.cs similarity index 66% rename from src/vpk/Velopack.Packaging/Abstractions/ICommand.cs rename to src/vpk/Velopack.Core/Abstractions/ICommand.cs index 3ecc7877..d9c63802 100644 --- a/src/vpk/Velopack.Packaging/Abstractions/ICommand.cs +++ b/src/vpk/Velopack.Core/Abstractions/ICommand.cs @@ -1,4 +1,4 @@ -namespace Velopack.Packaging.Abstractions; +namespace Velopack.Core.Abstractions; public interface ICommand where TOpt : class { diff --git a/src/vpk/Velopack.Packaging/Abstractions/IConsole.cs b/src/vpk/Velopack.Core/Abstractions/IConsole.cs similarity index 60% rename from src/vpk/Velopack.Packaging/Abstractions/IConsole.cs rename to src/vpk/Velopack.Core/Abstractions/IConsole.cs index b2749626..9edf10dc 100644 --- a/src/vpk/Velopack.Packaging/Abstractions/IConsole.cs +++ b/src/vpk/Velopack.Core/Abstractions/IConsole.cs @@ -1,4 +1,5 @@ -namespace Velopack.Packaging.Abstractions; +namespace Velopack.Core.Abstractions; + public interface IConsole { void WriteLine(string message = ""); diff --git a/src/vpk/Velopack.Packaging/Abstractions/IFancyConsole.cs b/src/vpk/Velopack.Core/Abstractions/IFancyConsole.cs similarity index 88% rename from src/vpk/Velopack.Packaging/Abstractions/IFancyConsole.cs rename to src/vpk/Velopack.Core/Abstractions/IFancyConsole.cs index 355e14ba..a84fcdd7 100644 --- a/src/vpk/Velopack.Packaging/Abstractions/IFancyConsole.cs +++ b/src/vpk/Velopack.Core/Abstractions/IFancyConsole.cs @@ -1,4 +1,4 @@ -namespace Velopack.Packaging.Abstractions; +namespace Velopack.Core.Abstractions; public interface IFancyConsole : IConsole { diff --git a/src/vpk/Velopack.Packaging/Abstractions/IFancyConsoleProgress.cs b/src/vpk/Velopack.Core/Abstractions/IFancyConsoleProgress.cs similarity index 78% rename from src/vpk/Velopack.Packaging/Abstractions/IFancyConsoleProgress.cs rename to src/vpk/Velopack.Core/Abstractions/IFancyConsoleProgress.cs index b196ffba..6f519937 100644 --- a/src/vpk/Velopack.Packaging/Abstractions/IFancyConsoleProgress.cs +++ b/src/vpk/Velopack.Core/Abstractions/IFancyConsoleProgress.cs @@ -1,4 +1,4 @@ -namespace Velopack.Packaging.Abstractions; +namespace Velopack.Core.Abstractions; public interface IFancyConsoleProgress { diff --git a/src/vpk/Velopack.Packaging/BuildAssets.cs b/src/vpk/Velopack.Core/BuildAssets.cs similarity index 93% rename from src/vpk/Velopack.Packaging/BuildAssets.cs rename to src/vpk/Velopack.Core/BuildAssets.cs index 383e47c5..6c7b058d 100644 --- a/src/vpk/Velopack.Packaging/BuildAssets.cs +++ b/src/vpk/Velopack.Core/BuildAssets.cs @@ -1,8 +1,9 @@ using Newtonsoft.Json; -using Velopack.Packaging.Exceptions; using Velopack.Util; -namespace Velopack.Packaging; +#nullable disable + +namespace Velopack.Core; public class BuildAssets { @@ -14,7 +15,7 @@ public class BuildAssets public List GetReleaseEntries() { return GetFilePaths().Where(x => x.EndsWith(".nupkg", StringComparison.OrdinalIgnoreCase)) - .Select(f => VelopackAsset.FromNupkg(f)) + .Select(VelopackAsset.FromNupkg) .ToList(); } diff --git a/src/vpk/Velopack.Core/DefaultName.cs b/src/vpk/Velopack.Core/DefaultName.cs new file mode 100644 index 00000000..1440a40b --- /dev/null +++ b/src/vpk/Velopack.Core/DefaultName.cs @@ -0,0 +1,55 @@ +using NuGet.Versioning; + +namespace Velopack.Core; + +public static class DefaultName +{ + public static string GetSuggestedReleaseName(string id, string version, string channel, bool delta, RuntimeOs os) + { + var suffix = GetUniqueAssetSuffix(channel); + version = SemanticVersion.Parse(version).ToNormalizedString(); + if (os == RuntimeOs.Windows && channel == GetDefaultChannel(RuntimeOs.Windows)) { + return $"{id}-{version}{(delta ? "-delta" : "-full")}.nupkg"; + } + + return $"{id}-{version}{suffix}{(delta ? "-delta" : "-full")}.nupkg"; + } + + public static string GetSuggestedPortableName(string id, string channel, RuntimeOs os) + { + var suffix = GetUniqueAssetSuffix(channel); + if (os == RuntimeOs.Linux) { + if (channel == GetDefaultChannel(RuntimeOs.Linux)) { + return $"{id}.AppImage"; + } else { + return $"{id}{suffix}.AppImage"; + } + } else { + return $"{id}{suffix}-Portable.zip"; + } + } + + public static string GetSuggestedSetupName(string id, string channel, RuntimeOs os) + { + var suffix = GetUniqueAssetSuffix(channel); + if (os == RuntimeOs.Windows) + return $"{id}{suffix}-Setup.exe"; + else if (os == RuntimeOs.OSX) + return $"{id}{suffix}-Setup.pkg"; + else + throw new PlatformNotSupportedException("Platform not supported."); + } + + private static string GetUniqueAssetSuffix(string channel) + { + return "-" + channel; + } + + public static string GetDefaultChannel(RuntimeOs os) + { + if (os == RuntimeOs.Windows) return "win"; + if (os == RuntimeOs.OSX) return "osx"; + if (os == RuntimeOs.Linux) return "linux"; + throw new NotSupportedException("Unsupported OS: " + os); + } +} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/HttpClientExtensions.cs b/src/vpk/Velopack.Core/HttpClientExtensions.cs similarity index 75% rename from src/vpk/Velopack.Packaging/HttpClientExtensions.cs rename to src/vpk/Velopack.Core/HttpClientExtensions.cs index 0ea5cb79..44f3dd34 100644 --- a/src/vpk/Velopack.Packaging/HttpClientExtensions.cs +++ b/src/vpk/Velopack.Core/HttpClientExtensions.cs @@ -4,7 +4,7 @@ using System.Net.Http; using System.Text; -namespace Velopack.Packaging; +namespace Velopack.Core; public static class HttpClientExtensions { @@ -16,7 +16,7 @@ public static class HttpClientExtensions var response = await client.GetAsync(requestUri, cancellationToken); response.EnsureSuccessStatusCode(); - return Newtonsoft.Json.JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); + return SimpleJson.DeserializeObject(await response.Content.ReadAsStringAsync()); } public static async Task PostAsJsonAsync( @@ -25,7 +25,7 @@ public static class HttpClientExtensions TValue value, CancellationToken cancellationToken = default) { - var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(value), Encoding.UTF8, "application/json"); + var content = new StringContent(SimpleJson.SerializeObject(value), Encoding.UTF8, "application/json"); return await client.PostAsync(requestUri, content, cancellationToken); } @@ -35,7 +35,7 @@ public static class HttpClientExtensions TValue value, CancellationToken cancellationToken = default) { - var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(value), Encoding.UTF8, "application/json"); + var content = new StringContent(SimpleJson.SerializeObject(value), Encoding.UTF8, "application/json"); return await client.PutAsync(requestUri, content, cancellationToken); } @@ -44,7 +44,7 @@ public static class HttpClientExtensions CancellationToken cancellationToken = default) { var json = await content.ReadAsStringAsync(); - return Newtonsoft.Json.JsonConvert.DeserializeObject(json); + return SimpleJson.DeserializeObject(json); } public static async Task ReadAsStringAsync(this HttpContent content, CancellationToken _) diff --git a/src/vpk/Velopack.Packaging/SimpleJson.cs b/src/vpk/Velopack.Core/SimpleJson.cs similarity index 76% rename from src/vpk/Velopack.Packaging/SimpleJson.cs rename to src/vpk/Velopack.Core/SimpleJson.cs index 8d9a22d2..c79eb72c 100644 --- a/src/vpk/Velopack.Packaging/SimpleJson.cs +++ b/src/vpk/Velopack.Core/SimpleJson.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json.Converters; using NuGet.Versioning; -namespace Velopack.Packaging; +namespace Velopack.Core; public class SimpleJson { @@ -11,7 +11,7 @@ public class SimpleJson NullValueHandling = NullValueHandling.Ignore, }; - public static T DeserializeObject(string json) + public static T? DeserializeObject(string json) { return JsonConvert.DeserializeObject(json, Options); } @@ -23,15 +23,15 @@ public class SimpleJson private class SemanticVersionConverter : JsonConverter { - public override SemanticVersion ReadJson(JsonReader reader, Type objectType, SemanticVersion existingValue, bool hasExistingValue, + public override SemanticVersion? ReadJson(JsonReader reader, Type objectType, SemanticVersion? existingValue, bool hasExistingValue, JsonSerializer serializer) { - string s = reader.Value as string; + string? s = reader.Value as string; if (s == null) return null; return SemanticVersion.Parse(s); } - public override void WriteJson(JsonWriter writer, SemanticVersion value, JsonSerializer serializer) + public override void WriteJson(JsonWriter writer, SemanticVersion? value, JsonSerializer serializer) { if (value != null) { writer.WriteValue(value.ToFullString()); diff --git a/src/vpk/Velopack.Packaging/Exceptions/UserInfoException.cs b/src/vpk/Velopack.Core/UserInfoException.cs similarity index 93% rename from src/vpk/Velopack.Packaging/Exceptions/UserInfoException.cs rename to src/vpk/Velopack.Core/UserInfoException.cs index 203bde1e..123a4acb 100644 --- a/src/vpk/Velopack.Packaging/Exceptions/UserInfoException.cs +++ b/src/vpk/Velopack.Core/UserInfoException.cs @@ -1,7 +1,7 @@ using System.Diagnostics.CodeAnalysis; using System.Runtime.Serialization; -namespace Velopack.Packaging.Exceptions; +namespace Velopack.Core; /// /// Denotes that an error has occurred for which a stack trace should not be printed. diff --git a/src/vpk/Velopack.Core/Velopack.Core.csproj b/src/vpk/Velopack.Core/Velopack.Core.csproj new file mode 100644 index 00000000..895ba550 --- /dev/null +++ b/src/vpk/Velopack.Core/Velopack.Core.csproj @@ -0,0 +1,20 @@ + + + + net472;net6.0 + enable + $(NoWarn);CA2007;CS8002 + enable + true + + + + + + + + + + + + diff --git a/src/vpk/Velopack.Deployment/GitHubRepository.cs b/src/vpk/Velopack.Deployment/GitHubRepository.cs index a983da03..70026a4e 100644 --- a/src/vpk/Velopack.Deployment/GitHubRepository.cs +++ b/src/vpk/Velopack.Deployment/GitHubRepository.cs @@ -1,6 +1,7 @@ using System.Text; using Microsoft.Extensions.Logging; using Octokit; +using Velopack.Core; using Velopack.NuGet; using Velopack.Packaging; using Velopack.Packaging.Exceptions; @@ -131,7 +132,7 @@ public class GitHubRepository(ILogger logger) : SourceRepository { diff --git a/src/vpk/Velopack.Deployment/Velopack.Deployment.csproj b/src/vpk/Velopack.Deployment/Velopack.Deployment.csproj index 7812cf21..8d93a678 100644 --- a/src/vpk/Velopack.Deployment/Velopack.Deployment.csproj +++ b/src/vpk/Velopack.Deployment/Velopack.Deployment.csproj @@ -15,6 +15,7 @@ + diff --git a/src/vpk/Velopack.Deployment/_ObjectRepository.cs b/src/vpk/Velopack.Deployment/_ObjectRepository.cs index c55ff0d2..4516159b 100644 --- a/src/vpk/Velopack.Deployment/_ObjectRepository.cs +++ b/src/vpk/Velopack.Deployment/_ObjectRepository.cs @@ -1,5 +1,6 @@ using System.Text; using Microsoft.Extensions.Logging; +using Velopack.Core; using Velopack.Packaging; using Velopack.Util; diff --git a/src/vpk/Velopack.Deployment/_Repository.cs b/src/vpk/Velopack.Deployment/_Repository.cs index 6e8994cf..e242fb79 100644 --- a/src/vpk/Velopack.Deployment/_Repository.cs +++ b/src/vpk/Velopack.Deployment/_Repository.cs @@ -1,6 +1,5 @@ -using System.Security.Cryptography; -using Microsoft.Extensions.Logging; -using Velopack.Packaging; +using Microsoft.Extensions.Logging; +using Velopack.Core; using Velopack.Packaging.Abstractions; using Velopack.Sources; using Velopack.Util; @@ -14,7 +13,7 @@ public class RepositoryOptions : IOutputOptions public RuntimeOs TargetOs { get; set; } public string Channel { - get => _channel ?? ReleaseEntryHelper.GetDefaultChannel(TargetOs); + get => _channel ?? DefaultName.GetDefaultChannel(TargetOs); set => _channel = value; } diff --git a/src/vpk/Velopack.Flow/Commands/ApiCommandRunner.cs b/src/vpk/Velopack.Flow/Commands/ApiCommandRunner.cs new file mode 100644 index 00000000..5fee89fa --- /dev/null +++ b/src/vpk/Velopack.Flow/Commands/ApiCommandRunner.cs @@ -0,0 +1,25 @@ +using Microsoft.Extensions.Logging; +using Velopack.Core.Abstractions; + +namespace Velopack.Flow.Commands; + +public class ApiCommandRunner(ILogger logger, IFancyConsole console) : ICommand +{ + public async Task Run(ApiOptions options) + { + var loginOptions = new VelopackFlowLoginOptions() { + AllowCacheCredentials = true, + AllowDeviceCodeFlow = false, + AllowInteractiveLogin = false, + }; + + var client = new VelopackFlowServiceClient(options, logger, console); + CancellationToken token = CancellationToken.None; + if (!await client.LoginAsync(loginOptions, false, token)) { + return; + } + + string response = await client.InvokeEndpointAsync(options, options.Endpoint, options.Method, options.Body, token); + Console.WriteLine(response); + } +} \ No newline at end of file diff --git a/src/vpk/Velopack.Flow/Commands/ApiOptions.cs b/src/vpk/Velopack.Flow/Commands/ApiOptions.cs new file mode 100644 index 00000000..de2ea0cf --- /dev/null +++ b/src/vpk/Velopack.Flow/Commands/ApiOptions.cs @@ -0,0 +1,8 @@ +namespace Velopack.Flow.Commands; + +public sealed class ApiOptions : VelopackFlowServiceOptions +{ + public string Endpoint { get; set; } = ""; + public string Method { get; set; } = ""; + public string? Body { get; set; } +} \ No newline at end of file diff --git a/src/vpk/Velopack.Flow/Commands/LoginCommandRunner.cs b/src/vpk/Velopack.Flow/Commands/LoginCommandRunner.cs new file mode 100644 index 00000000..f37aea51 --- /dev/null +++ b/src/vpk/Velopack.Flow/Commands/LoginCommandRunner.cs @@ -0,0 +1,13 @@ +using Microsoft.Extensions.Logging; +using Velopack.Core.Abstractions; + +namespace Velopack.Flow.Commands; + +public class LoginCommandRunner(ILogger logger, IFancyConsole console) : ICommand +{ + public async Task Run(LoginOptions options) + { + var client = new VelopackFlowServiceClient(options, logger, console); + await client.LoginAsync(null, false, CancellationToken.None); + } +} \ No newline at end of file diff --git a/src/vpk/Velopack.Flow/Commands/LoginOptions.cs b/src/vpk/Velopack.Flow/Commands/LoginOptions.cs new file mode 100644 index 00000000..677c24c8 --- /dev/null +++ b/src/vpk/Velopack.Flow/Commands/LoginOptions.cs @@ -0,0 +1,3 @@ +namespace Velopack.Flow.Commands; + +public sealed class LoginOptions : VelopackFlowServiceOptions; \ No newline at end of file diff --git a/src/vpk/Velopack.Flow/Commands/LogoutCommandRunner.cs b/src/vpk/Velopack.Flow/Commands/LogoutCommandRunner.cs new file mode 100644 index 00000000..c05d2f30 --- /dev/null +++ b/src/vpk/Velopack.Flow/Commands/LogoutCommandRunner.cs @@ -0,0 +1,13 @@ +using Microsoft.Extensions.Logging; +using Velopack.Core.Abstractions; + +namespace Velopack.Flow.Commands; + +public class LogoutCommandRunner(ILogger logger, IFancyConsole console) : ICommand +{ + public async Task Run(LogoutOptions options) + { + var client = new VelopackFlowServiceClient(options, logger, console); + await client.LogoutAsync(CancellationToken.None); + } +} \ No newline at end of file diff --git a/src/vpk/Velopack.Flow/Commands/LogoutOptions.cs b/src/vpk/Velopack.Flow/Commands/LogoutOptions.cs new file mode 100644 index 00000000..bbc09a20 --- /dev/null +++ b/src/vpk/Velopack.Flow/Commands/LogoutOptions.cs @@ -0,0 +1,3 @@ +namespace Velopack.Flow.Commands; + +public sealed class LogoutOptions : VelopackFlowServiceOptions; \ No newline at end of file diff --git a/src/vpk/Velopack.Flow/Commands/PublishCommandRunner.cs b/src/vpk/Velopack.Flow/Commands/PublishCommandRunner.cs new file mode 100644 index 00000000..8db94b6b --- /dev/null +++ b/src/vpk/Velopack.Flow/Commands/PublishCommandRunner.cs @@ -0,0 +1,29 @@ +using Microsoft.Extensions.Logging; +using Velopack.Core.Abstractions; + +namespace Velopack.Flow.Commands; + +public class PublishCommandRunner(ILogger logger, IFancyConsole console) : ICommand +{ + public async Task Run(PublishOptions options) + { + var loginOptions = new VelopackFlowLoginOptions() { + AllowCacheCredentials = true, + AllowDeviceCodeFlow = false, + AllowInteractiveLogin = false, + }; + + var client = new VelopackFlowServiceClient(options, logger, console); + CancellationToken token = CancellationToken.None; + if (!await client.LoginAsync(loginOptions, false, token)) { + return; + } + + await client.UploadLatestReleaseAssetsAsync( + options.Channel, + options.ReleaseDirectory, + options.TargetOs, + options.WaitForLive, + token); + } +} \ No newline at end of file diff --git a/src/vpk/Velopack.Flow/Commands/PublishOptions.cs b/src/vpk/Velopack.Flow/Commands/PublishOptions.cs new file mode 100644 index 00000000..9a81ab35 --- /dev/null +++ b/src/vpk/Velopack.Flow/Commands/PublishOptions.cs @@ -0,0 +1,12 @@ +namespace Velopack.Flow.Commands; + +public sealed class PublishOptions : VelopackFlowServiceOptions +{ + public RuntimeOs TargetOs { get; set; } + + public string ReleaseDirectory { get; set; } = ""; + + public string? Channel { get; set; } + + public bool WaitForLive { get; set; } +} \ No newline at end of file diff --git a/src/vpk/Velopack.Flow/FlowApi.cs b/src/vpk/Velopack.Flow/FlowApi.cs new file mode 100644 index 00000000..62422249 --- /dev/null +++ b/src/vpk/Velopack.Flow/FlowApi.cs @@ -0,0 +1,5486 @@ +//---------------------- +// +// Generated using the NSwag toolchain v14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org) +// +//---------------------- + +#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended." +#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." +#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?' +#pragma warning disable 612 // Disable "CS0612 '...' is obsolete" +#pragma warning disable 649 // Disable "CS0649 Field is never assigned to, and will always have its default value null" +#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ... +#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..." +#pragma warning disable 8073 // Disable "CS8073 The result of the expression is always 'false' since a value of type 'T' is never equal to 'null' of type 'T?'" +#pragma warning disable 3016 // Disable "CS3016 Arrays as attribute arguments is not CLS-compliant" +#pragma warning disable 8603 // Disable "CS8603 Possible null reference return" +#pragma warning disable 8604 // Disable "CS8604 Possible null reference argument for parameter" +#pragma warning disable 8625 // Disable "CS8625 Cannot convert null literal to non-nullable reference type" +#pragma warning disable 8765 // Disable "CS8765 Nullability of type of parameter doesn't match overridden member (possibly because of nullability attributes)." + +namespace Velopack.Flow +{ + using System = global::System; + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class FlowApi + { + #pragma warning disable 8618 + private string _baseUrl; + #pragma warning restore 8618 + + private System.Net.Http.HttpClient _httpClient; + private static System.Lazy _settings = new System.Lazy(CreateSerializerSettings, true); + private Newtonsoft.Json.JsonSerializerSettings _instanceSettings; + + #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. + public FlowApi(System.Net.Http.HttpClient httpClient) + #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. + { + BaseUrl = "https://api.velopack.io"; + _httpClient = httpClient; + Initialize(); + } + + private static Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + public string BaseUrl + { + get { return _baseUrl; } + set + { + _baseUrl = value; + if (!string.IsNullOrEmpty(_baseUrl) && !_baseUrl.EndsWith("/")) + _baseUrl += '/'; + } + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _instanceSettings ?? _settings.Value; } } + + static partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void Initialize(); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetApiKeyAsync(System.Guid apiKeyId) + { + return GetApiKeyAsync(apiKeyId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetApiKeyAsync(System.Guid apiKeyId, System.Threading.CancellationToken cancellationToken) + { + if (apiKeyId == null) + throw new System.ArgumentNullException("apiKeyId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/apiKey/{apiKeyId}" + urlBuilder_.Append("v1/apiKey/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(apiKeyId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteApiKeyAsync(System.Guid apiKeyId) + { + return DeleteApiKeyAsync(apiKeyId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteApiKeyAsync(System.Guid apiKeyId, System.Threading.CancellationToken cancellationToken) + { + if (apiKeyId == null) + throw new System.ArgumentNullException("apiKeyId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/apiKey/{apiKeyId}" + urlBuilder_.Append("v1/apiKey/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(apiKeyId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 204) + { + return; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ListApiKeysAsync() + { + return ListApiKeysAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ListApiKeysAsync(System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/apiKey/list" + urlBuilder_.Append("v1/apiKey/list"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ListTeamApiKeysAsync(string teamIdentifier) + { + return ListTeamApiKeysAsync(teamIdentifier, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ListTeamApiKeysAsync(string teamIdentifier, System.Threading.CancellationToken cancellationToken) + { + if (teamIdentifier == null) + throw new System.ArgumentNullException("teamIdentifier"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/apiKey/list/{teamIdentifier}" + urlBuilder_.Append("v1/apiKey/list/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(teamIdentifier, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CreateApiKeyAsync(CreateApiKeyRequest apiKeyRequest) + { + return CreateApiKeyAsync(apiKeyRequest, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CreateApiKeyAsync(CreateApiKeyRequest apiKeyRequest, System.Threading.CancellationToken cancellationToken) + { + if (apiKeyRequest == null) + throw new System.ArgumentNullException("apiKeyRequest"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(apiKeyRequest, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/apiKey/create" + urlBuilder_.Append("v1/apiKey/create"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 201) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 400) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetV1AuthConfigAsync() + { + return GetV1AuthConfigAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetV1AuthConfigAsync(System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/auth/config" + urlBuilder_.Append("v1/auth/config"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetPaymentDetailsAsync(string teamIdentifier) + { + return GetPaymentDetailsAsync(teamIdentifier, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetPaymentDetailsAsync(string teamIdentifier, System.Threading.CancellationToken cancellationToken) + { + if (teamIdentifier == null) + throw new System.ArgumentNullException("teamIdentifier"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/payments/{teamIdentifier}" + urlBuilder_.Append("v1/payments/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(teamIdentifier, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetV1PaymentsCreatePortalAsync(string teamIdentifier) + { + return GetV1PaymentsCreatePortalAsync(teamIdentifier, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetV1PaymentsCreatePortalAsync(string teamIdentifier, System.Threading.CancellationToken cancellationToken) + { + if (teamIdentifier == null) + throw new System.ArgumentNullException("teamIdentifier"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/payments/create-portal/{teamIdentifier}" + urlBuilder_.Append("v1/payments/create-portal/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(teamIdentifier, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetV1PaymentsCreateCheckoutAsync(string priceId, string teamIdentifier) + { + return GetV1PaymentsCreateCheckoutAsync(priceId, teamIdentifier, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetV1PaymentsCreateCheckoutAsync(string priceId, string teamIdentifier, System.Threading.CancellationToken cancellationToken) + { + if (teamIdentifier == null) + throw new System.ArgumentNullException("teamIdentifier"); + + if (priceId == null) + throw new System.ArgumentNullException("priceId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/payments/create-checkout/{teamIdentifier}" + urlBuilder_.Append("v1/payments/create-checkout/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(teamIdentifier, System.Globalization.CultureInfo.InvariantCulture))); + urlBuilder_.Append('?'); + urlBuilder_.Append(System.Uri.EscapeDataString("priceId")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(priceId, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + urlBuilder_.Length--; + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ListProjectsAsync() + { + return ListProjectsAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ListProjectsAsync(System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/projects/list" + urlBuilder_.Append("v1/projects/list"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetProjectAsync(System.Guid projectId) + { + return GetProjectAsync(projectId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetProjectAsync(System.Guid projectId, System.Threading.CancellationToken cancellationToken) + { + if (projectId == null) + throw new System.ArgumentNullException("projectId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/projects/{projectId}" + urlBuilder_.Append("v1/projects/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(projectId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpdateProjectAsync(System.Guid projectId, UpdateProjectRequest request) + { + return UpdateProjectAsync(projectId, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpdateProjectAsync(System.Guid projectId, UpdateProjectRequest request, System.Threading.CancellationToken cancellationToken) + { + if (projectId == null) + throw new System.ArgumentNullException("projectId"); + + if (request == null) + throw new System.ArgumentNullException("request"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(request, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/projects/{projectId}" + urlBuilder_.Append("v1/projects/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(projectId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 400) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteProjectAsync(System.Guid projectId) + { + return DeleteProjectAsync(projectId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteProjectAsync(System.Guid projectId, System.Threading.CancellationToken cancellationToken) + { + if (projectId == null) + throw new System.ArgumentNullException("projectId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/projects/{projectId}" + urlBuilder_.Append("v1/projects/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(projectId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 204) + { + return; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CreateProjectAsync(CreateProjectRequest request) + { + return CreateProjectAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CreateProjectAsync(CreateProjectRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(request, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/projects/create" + urlBuilder_.Append("v1/projects/create"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 201) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 400) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DownloadReleaseAsync(System.Guid releaseAssetId) + { + return DownloadReleaseAsync(releaseAssetId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DownloadReleaseAsync(System.Guid releaseAssetId, System.Threading.CancellationToken cancellationToken) + { + if (releaseAssetId == null) + throw new System.ArgumentNullException("releaseAssetId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/download/{releaseAssetId}" + urlBuilder_.Append("v1/download/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(releaseAssetId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + + if (status_ == 200 || status_ == 204) + { + + return; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DownloadInstallerLatestAsync(string packageId, string channel, DownloadAssetType? assetType) + { + return DownloadInstallerLatestAsync(packageId, channel, assetType, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DownloadInstallerLatestAsync(string packageId, string channel, DownloadAssetType? assetType, System.Threading.CancellationToken cancellationToken) + { + if (packageId == null) + throw new System.ArgumentNullException("packageId"); + + if (channel == null) + throw new System.ArgumentNullException("channel"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/download/{packageId}/{channel}" + urlBuilder_.Append("v1/download/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(packageId, System.Globalization.CultureInfo.InvariantCulture))); + urlBuilder_.Append('/'); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(channel, System.Globalization.CultureInfo.InvariantCulture))); + urlBuilder_.Append('?'); + if (assetType != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("assetType")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(assetType, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + } + urlBuilder_.Length--; + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + + if (status_ == 200 || status_ == 204) + { + + return; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DownloadInstallerVersionAsync(string packageId, string channel, string releaseVersion, DownloadAssetType? assetType) + { + return DownloadInstallerVersionAsync(packageId, channel, releaseVersion, assetType, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DownloadInstallerVersionAsync(string packageId, string channel, string releaseVersion, DownloadAssetType? assetType, System.Threading.CancellationToken cancellationToken) + { + if (packageId == null) + throw new System.ArgumentNullException("packageId"); + + if (channel == null) + throw new System.ArgumentNullException("channel"); + + if (releaseVersion == null) + throw new System.ArgumentNullException("releaseVersion"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/download/{packageId}/{channel}/{releaseVersion}" + urlBuilder_.Append("v1/download/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(packageId, System.Globalization.CultureInfo.InvariantCulture))); + urlBuilder_.Append('/'); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(channel, System.Globalization.CultureInfo.InvariantCulture))); + urlBuilder_.Append('/'); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(releaseVersion, System.Globalization.CultureInfo.InvariantCulture))); + urlBuilder_.Append('?'); + if (assetType != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("assetType")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(assetType, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + } + urlBuilder_.Length--; + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 404) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + + if (status_ == 200 || status_ == 204) + { + + return; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetManifestAsync(string packageId, string channel) + { + return GetManifestAsync(packageId, channel, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetManifestAsync(string packageId, string channel, System.Threading.CancellationToken cancellationToken) + { + if (packageId == null) + throw new System.ArgumentNullException("packageId"); + + if (channel == null) + throw new System.ArgumentNullException("channel"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/manifest/{packageId}/{channel}" + urlBuilder_.Append("v1/manifest/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(packageId, System.Globalization.CultureInfo.InvariantCulture))); + urlBuilder_.Append('/'); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(channel, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetChannelManifestAsync(string channel, string id, string arch, string os, string rid, string localVersion) + { + return GetChannelManifestAsync(channel, id, arch, os, rid, localVersion, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetChannelManifestAsync(string channel, string id, string arch, string os, string rid, string localVersion, System.Threading.CancellationToken cancellationToken) + { + if (channel == null) + throw new System.ArgumentNullException("channel"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/manifest/releases.{channel}.json" + urlBuilder_.Append("v1/manifest/releases."); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(channel, System.Globalization.CultureInfo.InvariantCulture))); + urlBuilder_.Append(".json"); + urlBuilder_.Append('?'); + if (id != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("Id")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + } + if (arch != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("Arch")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(arch, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + } + if (os != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("Os")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(os, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + } + if (rid != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("Rid")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(rid, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + } + if (localVersion != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("LocalVersion")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(localVersion, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + } + urlBuilder_.Length--; + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ListReleasesAsync(System.Guid projectId) + { + return ListReleasesAsync(projectId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ListReleasesAsync(System.Guid projectId, System.Threading.CancellationToken cancellationToken) + { + if (projectId == null) + throw new System.ArgumentNullException("projectId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/releases/list" + urlBuilder_.Append("v1/releases/list"); + urlBuilder_.Append('?'); + urlBuilder_.Append(System.Uri.EscapeDataString("projectId")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(projectId, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + urlBuilder_.Length--; + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetReleaseAsync(System.Guid releaseId) + { + return GetReleaseAsync(releaseId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetReleaseAsync(System.Guid releaseId, System.Threading.CancellationToken cancellationToken) + { + if (releaseId == null) + throw new System.ArgumentNullException("releaseId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/releases/{releaseId}" + urlBuilder_.Append("v1/releases/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(releaseId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpdateReleaseAsync(System.Guid releaseId, UpdateReleaseRequest request) + { + return UpdateReleaseAsync(releaseId, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpdateReleaseAsync(System.Guid releaseId, UpdateReleaseRequest request, System.Threading.CancellationToken cancellationToken) + { + if (releaseId == null) + throw new System.ArgumentNullException("releaseId"); + + if (request == null) + throw new System.ArgumentNullException("request"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(request, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/releases/{releaseId}" + urlBuilder_.Append("v1/releases/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(releaseId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteReleaseAsync(System.Guid releaseId) + { + return DeleteReleaseAsync(releaseId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteReleaseAsync(System.Guid releaseId, System.Threading.CancellationToken cancellationToken) + { + if (releaseId == null) + throw new System.ArgumentNullException("releaseId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/releases/{releaseId}" + urlBuilder_.Append("v1/releases/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(releaseId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 204) + { + return; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UploadReleaseAsync(System.Guid releaseGroupId, FileType fileType, FileParameter file) + { + return UploadReleaseAsync(releaseGroupId, fileType, file, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UploadReleaseAsync(System.Guid releaseGroupId, FileType fileType, FileParameter file, System.Threading.CancellationToken cancellationToken) + { + if (releaseGroupId == null) + throw new System.ArgumentNullException("releaseGroupId"); + + if (fileType == null) + throw new System.ArgumentNullException("fileType"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var boundary_ = System.Guid.NewGuid().ToString(); + var content_ = new System.Net.Http.MultipartFormDataContent(boundary_); + content_.Headers.Remove("Content-Type"); + content_.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary_); + + if (file != null) + { + var content_file_ = new System.Net.Http.StreamContent(file.Data); + if (!string.IsNullOrEmpty(file.ContentType)) + content_file_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse(file.ContentType); + content_.Add(content_file_, "File", file.FileName ?? "File"); + } + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/releases/upload" + urlBuilder_.Append("v1/releases/upload"); + urlBuilder_.Append('?'); + urlBuilder_.Append(System.Uri.EscapeDataString("ReleaseGroupId")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(releaseGroupId, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + urlBuilder_.Append(System.Uri.EscapeDataString("FileType")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(fileType, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + urlBuilder_.Length--; + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ListTeamsAsync() + { + return ListTeamsAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ListTeamsAsync(System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/teams/list" + urlBuilder_.Append("v1/teams/list"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetTeamAsync(System.Guid teamId) + { + return GetTeamAsync(teamId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetTeamAsync(System.Guid teamId, System.Threading.CancellationToken cancellationToken) + { + if (teamId == null) + throw new System.ArgumentNullException("teamId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/teams/{teamId}" + urlBuilder_.Append("v1/teams/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(teamId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 400) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpdateTeamAsync(System.Guid teamId, UpdateTeamRequest request) + { + return UpdateTeamAsync(teamId, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpdateTeamAsync(System.Guid teamId, UpdateTeamRequest request, System.Threading.CancellationToken cancellationToken) + { + if (teamId == null) + throw new System.ArgumentNullException("teamId"); + + if (request == null) + throw new System.ArgumentNullException("request"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(request, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/teams/{teamId}" + urlBuilder_.Append("v1/teams/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(teamId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 400) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteTeamAsync(System.Guid teamId) + { + return DeleteTeamAsync(teamId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteTeamAsync(System.Guid teamId, System.Threading.CancellationToken cancellationToken) + { + if (teamId == null) + throw new System.ArgumentNullException("teamId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/teams/{teamId}" + urlBuilder_.Append("v1/teams/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(teamId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 204) + { + return; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 400) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CreateTeamAsync(CreateTeamRequest request) + { + return CreateTeamAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CreateTeamAsync(CreateTeamRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(request, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/teams/create" + urlBuilder_.Append("v1/teams/create"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 201) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task InviteUserAsync(CreateInviteUserRequest request) + { + return InviteUserAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task InviteUserAsync(CreateInviteUserRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(request, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/teams/invite" + urlBuilder_.Append("v1/teams/invite"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 201) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ResendInviteAsync(System.Guid inviteId) + { + return ResendInviteAsync(inviteId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ResendInviteAsync(System.Guid inviteId, System.Threading.CancellationToken cancellationToken) + { + if (inviteId == null) + throw new System.ArgumentNullException("inviteId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/teams/invite/resend/{inviteId}" + urlBuilder_.Append("v1/teams/invite/resend/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(inviteId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 400) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ViewInviteAsync(string inviteCode) + { + return ViewInviteAsync(inviteCode, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ViewInviteAsync(string inviteCode, System.Threading.CancellationToken cancellationToken) + { + if (inviteCode == null) + throw new System.ArgumentNullException("inviteCode"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/teams/invite/{inviteCode}" + urlBuilder_.Append("v1/teams/invite/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(inviteCode, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteInviteAsync(System.Guid inviteId) + { + return DeleteInviteAsync(inviteId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteInviteAsync(System.Guid inviteId, System.Threading.CancellationToken cancellationToken) + { + if (inviteId == null) + throw new System.ArgumentNullException("inviteId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/teams/invite/{inviteId}" + urlBuilder_.Append("v1/teams/invite/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(inviteId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 204) + { + return; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 400) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task RedeemInviteAsync(string inviteCode) + { + return RedeemInviteAsync(inviteCode, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task RedeemInviteAsync(string inviteCode, System.Threading.CancellationToken cancellationToken) + { + if (inviteCode == null) + throw new System.ArgumentNullException("inviteCode"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); + request_.Method = new System.Net.Http.HttpMethod("POST"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/teams/redeem/{inviteCode}" + urlBuilder_.Append("v1/teams/redeem/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(inviteCode, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetUserProfileAsync() + { + return GetUserProfileAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetUserProfileAsync(System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/user/profile" + urlBuilder_.Append("v1/user/profile"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpdateUserAsync(UpdateUserRequest request) + { + return UpdateUserAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpdateUserAsync(UpdateUserRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(request, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/user/update" + urlBuilder_.Append("v1/user/update"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 400) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ListChannelsAsync(System.Guid projectId) + { + return ListChannelsAsync(projectId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ListChannelsAsync(System.Guid projectId, System.Threading.CancellationToken cancellationToken) + { + if (projectId == null) + throw new System.ArgumentNullException("projectId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/channels/list" + urlBuilder_.Append("v1/channels/list"); + urlBuilder_.Append('?'); + urlBuilder_.Append(System.Uri.EscapeDataString("projectId")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(projectId, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + urlBuilder_.Length--; + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetChannelAsync(System.Guid channelId) + { + return GetChannelAsync(channelId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetChannelAsync(System.Guid channelId, System.Threading.CancellationToken cancellationToken) + { + if (channelId == null) + throw new System.ArgumentNullException("channelId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/channels/{channelId}" + urlBuilder_.Append("v1/channels/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(channelId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpdateChannelAsync(System.Guid channelId, UpdateChannelRequest request) + { + return UpdateChannelAsync(channelId, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpdateChannelAsync(System.Guid channelId, UpdateChannelRequest request, System.Threading.CancellationToken cancellationToken) + { + if (channelId == null) + throw new System.ArgumentNullException("channelId"); + + if (request == null) + throw new System.ArgumentNullException("request"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(request, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/channels/{channelId}" + urlBuilder_.Append("v1/channels/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(channelId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteChannelAsync(System.Guid channelId) + { + return DeleteChannelAsync(channelId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteChannelAsync(System.Guid channelId, System.Threading.CancellationToken cancellationToken) + { + if (channelId == null) + throw new System.ArgumentNullException("channelId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/channels/{channelId}" + urlBuilder_.Append("v1/channels/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(channelId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 204) + { + return; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CreateChannelAsync(CreateChannelRequest request) + { + return CreateChannelAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CreateChannelAsync(CreateChannelRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(request, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/channels/create" + urlBuilder_.Append("v1/channels/create"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 201) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 400) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ListReleaseGroupsAsync(System.Guid projectId) + { + return ListReleaseGroupsAsync(projectId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ListReleaseGroupsAsync(System.Guid projectId, System.Threading.CancellationToken cancellationToken) + { + if (projectId == null) + throw new System.ArgumentNullException("projectId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/releaseGroups/list" + urlBuilder_.Append("v1/releaseGroups/list"); + urlBuilder_.Append('?'); + urlBuilder_.Append(System.Uri.EscapeDataString("projectId")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(projectId, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + urlBuilder_.Length--; + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetReleaseGroupAsync(System.Guid releaseGroupId) + { + return GetReleaseGroupAsync(releaseGroupId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetReleaseGroupAsync(System.Guid releaseGroupId, System.Threading.CancellationToken cancellationToken) + { + if (releaseGroupId == null) + throw new System.ArgumentNullException("releaseGroupId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/releaseGroups/{releaseGroupId}" + urlBuilder_.Append("v1/releaseGroups/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(releaseGroupId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpdateReleaseGroupAsync(System.Guid releaseGroupId, UpdateReleaseGroupRequest request) + { + return UpdateReleaseGroupAsync(releaseGroupId, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpdateReleaseGroupAsync(System.Guid releaseGroupId, UpdateReleaseGroupRequest request, System.Threading.CancellationToken cancellationToken) + { + if (releaseGroupId == null) + throw new System.ArgumentNullException("releaseGroupId"); + + if (request == null) + throw new System.ArgumentNullException("request"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(request, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/releaseGroups/{releaseGroupId}" + urlBuilder_.Append("v1/releaseGroups/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(releaseGroupId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteReleaseGroupAsync(System.Guid releaseGroupId) + { + return DeleteReleaseGroupAsync(releaseGroupId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteReleaseGroupAsync(System.Guid releaseGroupId, System.Threading.CancellationToken cancellationToken) + { + if (releaseGroupId == null) + throw new System.ArgumentNullException("releaseGroupId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/releaseGroups/{releaseGroupId}" + urlBuilder_.Append("v1/releaseGroups/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(releaseGroupId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 204) + { + return; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CreateReleaseGroupAsync(CreateReleaseGroupRequest request) + { + return CreateReleaseGroupAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CreateReleaseGroupAsync(CreateReleaseGroupRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(request, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/releaseGroups/create" + urlBuilder_.Append("v1/releaseGroups/create"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 201) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ListFileUploadsAsync() + { + return ListFileUploadsAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ListFileUploadsAsync(System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/fileuploads/list" + urlBuilder_.Append("v1/fileuploads/list"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetFileUploadAsync(System.Guid fileUploadId) + { + return GetFileUploadAsync(fileUploadId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetFileUploadAsync(System.Guid fileUploadId, System.Threading.CancellationToken cancellationToken) + { + if (fileUploadId == null) + throw new System.ArgumentNullException("fileUploadId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/fileuploads/{fileUploadId}" + urlBuilder_.Append("v1/fileuploads/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(fileUploadId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteFileUploadAsync(System.Guid fileUploadId) + { + return DeleteFileUploadAsync(fileUploadId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteFileUploadAsync(System.Guid fileUploadId, System.Threading.CancellationToken cancellationToken) + { + if (fileUploadId == null) + throw new System.ArgumentNullException("fileUploadId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/fileuploads/{fileUploadId}" + urlBuilder_.Append("v1/fileuploads/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(fileUploadId, System.Globalization.CultureInfo.InvariantCulture))); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 204) + { + return; + } + else + if (status_ == 404) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + if (status_ == 401) + { + string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T), string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value is string[]) + { + return string.Join(",", (string[])value); + } + else if (value.GetType().IsArray) + { + var valueArray = (System.Array)value; + var valueTextArray = new string[valueArray.Length]; + for (var i = 0; i < valueArray.Length; i++) + { + valueTextArray[i] = ConvertToString(valueArray.GetValue(i), cultureInfo); + } + return string.Join(",", valueTextArray); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ApiKeyDetails : ApiKey + { + [Newtonsoft.Json.JsonProperty("key", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Key { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ApiKey + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("expiration", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? Expiration { get; set; } + + [Newtonsoft.Json.JsonProperty("teamId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid TeamId { get; set; } + + [Newtonsoft.Json.JsonProperty("createdByUserId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid CreatedByUserId { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ApiKeyListResponse + { + [Newtonsoft.Json.JsonProperty("apiKeys", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection ApiKeys { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateApiKeyRequest + { + [Newtonsoft.Json.JsonProperty("apiKeyName", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string ApiKeyName { get; set; } + + [Newtonsoft.Json.JsonProperty("teamIdentifier", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string TeamIdentifier { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class AuthConfiguration + { + [Newtonsoft.Json.JsonProperty("b2CAuthority", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string B2CAuthority { get; set; } + + [Newtonsoft.Json.JsonProperty("redirectUri", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string RedirectUri { get; set; } + + [Newtonsoft.Json.JsonProperty("clientId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ClientId { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PaymentDetails + { + [Newtonsoft.Json.JsonProperty("nextBillAmount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public CurrencyAmount NextBillAmount { get; set; } + + [Newtonsoft.Json.JsonProperty("paymentCard", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public PaymentCard PaymentCard { get; set; } + + [Newtonsoft.Json.JsonProperty("subscriptionStart", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset SubscriptionStart { get; set; } + + [Newtonsoft.Json.JsonProperty("nextBill", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? NextBill { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CurrencyAmount + { + [Newtonsoft.Json.JsonProperty("code", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Code { get; set; } + + [Newtonsoft.Json.JsonProperty("amount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public decimal Amount { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PaymentCard + { + [Newtonsoft.Json.JsonProperty("type", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Type { get; set; } + + [Newtonsoft.Json.JsonProperty("last4", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Last4 { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ProjectListResponse + { + [Newtonsoft.Json.JsonProperty("projects", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Projects { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Project + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("packageId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string PackageId { get; set; } + + [Newtonsoft.Json.JsonProperty("teamId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid TeamId { get; set; } + + [Newtonsoft.Json.JsonProperty("teamName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string TeamName { get; set; } + + [Newtonsoft.Json.JsonProperty("numberOfChannels", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int NumberOfChannels { get; set; } + + [Newtonsoft.Json.JsonProperty("currentBytes", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long CurrentBytes { get; set; } + + [Newtonsoft.Json.JsonProperty("latestReleaseCreatedAt", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? LatestReleaseCreatedAt { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ProjectDetails : Project + { + [Newtonsoft.Json.JsonProperty("channels", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Channels { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Channel + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("projectId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid ProjectId { get; set; } + + [Newtonsoft.Json.JsonProperty("numberOfReleases", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int NumberOfReleases { get; set; } + + [Newtonsoft.Json.JsonProperty("currentBytes", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long CurrentBytes { get; set; } + + [Newtonsoft.Json.JsonProperty("latestReleaseCreatedAt", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? LatestReleaseCreatedAt { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateProjectRequest + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("teamIdentifier", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string TeamIdentifier { get; set; } + + [Newtonsoft.Json.JsonProperty("packageId", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string PackageId { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpdateProjectRequest + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public enum DownloadAssetType + { + + [System.Runtime.Serialization.EnumMember(Value = @"Setup")] + Setup = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"Full")] + Full = 1, + + [System.Runtime.Serialization.EnumMember(Value = @"Delta")] + Delta = 2, + + [System.Runtime.Serialization.EnumMember(Value = @"Portable")] + Portable = 3, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class VelopackAsset + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid? Id { get; set; } + + [Newtonsoft.Json.JsonProperty("packageId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string PackageId { get; set; } + + [Newtonsoft.Json.JsonProperty("version", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Version { get; set; } + + [Newtonsoft.Json.JsonProperty("type", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public VelopackAssetType Type { get; set; } + + [Newtonsoft.Json.JsonProperty("size", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long Size { get; set; } + + [Newtonsoft.Json.JsonProperty("fileName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string FileName { get; set; } + + [Newtonsoft.Json.JsonProperty("shA1", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ShA1 { get; set; } + + [Newtonsoft.Json.JsonProperty("notesMarkdown", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string NotesMarkdown { get; set; } + + [Newtonsoft.Json.JsonProperty("notesHTML", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string NotesHTML { get; set; } + + [Newtonsoft.Json.JsonProperty("isComplete", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool IsComplete { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public enum VelopackAssetType + { + + Unknown = 0, + + Full = 1, + + Delta = 2, + + Portable = 3, + + Setup = 4, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ReleaseAssetListResponse + { + [Newtonsoft.Json.JsonProperty("releases", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Releases { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ReleaseAssetDetails : ReleaseAsset + { + [Newtonsoft.Json.JsonProperty("shA1", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ShA1 { get; set; } + + [Newtonsoft.Json.JsonProperty("size", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long Size { get; set; } + + [Newtonsoft.Json.JsonProperty("fileName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string FileName { get; set; } + + [Newtonsoft.Json.JsonProperty("notesMarkdown", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string NotesMarkdown { get; set; } + + [Newtonsoft.Json.JsonProperty("notesHTML", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string NotesHTML { get; set; } + + [Newtonsoft.Json.JsonProperty("channelName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ChannelName { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ReleaseAsset + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } + + [Newtonsoft.Json.JsonProperty("version", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Version { get; set; } + + [Newtonsoft.Json.JsonProperty("releaseType", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public ReleaseType ReleaseType { get; set; } + + [Newtonsoft.Json.JsonProperty("createdAt", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset CreatedAt { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public enum ReleaseType + { + + [System.Runtime.Serialization.EnumMember(Value = @"Full")] + Full = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"Delta")] + Delta = 1, + + [System.Runtime.Serialization.EnumMember(Value = @"Portable")] + Portable = 2, + + [System.Runtime.Serialization.EnumMember(Value = @"Setup")] + Setup = 3, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UploadResult + { + [Newtonsoft.Json.JsonProperty("fileUploadId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid FileUploadId { get; set; } + + [Newtonsoft.Json.JsonProperty("fileName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string FileName { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public enum FileType + { + + Unknown = 0, + + Release = 1, + + Installer = 2, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpdateReleaseRequest + { + [Newtonsoft.Json.JsonProperty("notesMarkdown", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string NotesMarkdown { get; set; } + + [Newtonsoft.Json.JsonProperty("notesHTML", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string NotesHTML { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class TeamListResponse + { + [Newtonsoft.Json.JsonProperty("teams", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Teams { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Team + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("subscriptionPlanShortName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string SubscriptionPlanShortName { get; set; } + + [Newtonsoft.Json.JsonProperty("numberOfProjects", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int NumberOfProjects { get; set; } + + [Newtonsoft.Json.JsonProperty("numberOfUsers", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int NumberOfUsers { get; set; } + + [Newtonsoft.Json.JsonProperty("paymentStatus", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public SubscriptionPaymentStatus PaymentStatus { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class SubscriptionPaymentStatus + { + [Newtonsoft.Json.JsonProperty("paymentSubscriptionId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string PaymentSubscriptionId { get; set; } + + [Newtonsoft.Json.JsonProperty("hasBillingIssue", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool HasBillingIssue { get; set; } + + [Newtonsoft.Json.JsonProperty("cancelDate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? CancelDate { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class TeamDetails : Team + { + [Newtonsoft.Json.JsonProperty("users", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Users { get; set; } + + [Newtonsoft.Json.JsonProperty("projects", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Projects { get; set; } + + [Newtonsoft.Json.JsonProperty("invites", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Invites { get; set; } + + [Newtonsoft.Json.JsonProperty("subscriptionPlanName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string SubscriptionPlanName { get; set; } + + [Newtonsoft.Json.JsonProperty("quotas", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public TeamQuotas Quotas { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class User + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } + + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Email { get; set; } + + [Newtonsoft.Json.JsonProperty("displayName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string DisplayName { get; set; } + + [Newtonsoft.Json.JsonProperty("role", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Role { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class TeamInvite + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } + + [Newtonsoft.Json.JsonProperty("recipientEmailAddress", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string RecipientEmailAddress { get; set; } + + [Newtonsoft.Json.JsonProperty("teamName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string TeamName { get; set; } + + [Newtonsoft.Json.JsonProperty("teamId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid TeamId { get; set; } + + [Newtonsoft.Json.JsonProperty("invitedBy", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string InvitedBy { get; set; } + + [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public TeamInviteStatus Status { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public enum TeamInviteStatus + { + + [System.Runtime.Serialization.EnumMember(Value = @"Pending")] + Pending = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"Expired")] + Expired = 1, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class TeamQuotas + { + [Newtonsoft.Json.JsonProperty("maximumBytes", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? MaximumBytes { get; set; } + + [Newtonsoft.Json.JsonProperty("currentBytes", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long CurrentBytes { get; set; } + + [Newtonsoft.Json.JsonProperty("maximumProject", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int? MaximumProject { get; set; } + + [Newtonsoft.Json.JsonProperty("maximumUsersInTeam", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int? MaximumUsersInTeam { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateTeamRequest + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Name { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpdateTeamRequest + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("userIdsToRemove", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection UserIdsToRemove { get; set; } + + [Newtonsoft.Json.JsonProperty("userRolesToChange", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection UserRolesToChange { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UserRole + { + [Newtonsoft.Json.JsonProperty("userId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid UserId { get; set; } + + [Newtonsoft.Json.JsonProperty("role", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Role { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateInviteUserRequest + { + [Newtonsoft.Json.JsonProperty("recipientEmailAddress", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string RecipientEmailAddress { get; set; } + + [Newtonsoft.Json.JsonProperty("teamIdentifier", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string TeamIdentifier { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Profile + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } + + [Newtonsoft.Json.JsonProperty("principalId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string PrincipalId { get; set; } + + [Newtonsoft.Json.JsonProperty("displayName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string DisplayName { get; set; } + + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Email { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpdateUserRequest + { + [Newtonsoft.Json.JsonProperty("displayName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string DisplayName { get; set; } + + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Email { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ChannelListResponse + { + [Newtonsoft.Json.JsonProperty("channels", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Channels { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ChannelDetails : Channel + { + [Newtonsoft.Json.JsonProperty("releaseGroups", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection ReleaseGroups { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ReleaseGroup + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } + + [Newtonsoft.Json.JsonProperty("version", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Version { get; set; } + + [Newtonsoft.Json.JsonProperty("size", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long Size { get; set; } + + [Newtonsoft.Json.JsonProperty("state", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public ReleaseGroupState State { get; set; } + + [Newtonsoft.Json.JsonProperty("channelName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ChannelName { get; set; } + + [Newtonsoft.Json.JsonProperty("createdAt", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset CreatedAt { get; set; } + + [Newtonsoft.Json.JsonProperty("latestSetupLink", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Uri LatestSetupLink { get; set; } + + [Newtonsoft.Json.JsonProperty("releases", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Releases { get; set; } + + [Newtonsoft.Json.JsonProperty("fileUploads", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection FileUploads { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public enum ReleaseGroupState + { + + [System.Runtime.Serialization.EnumMember(Value = @"Draft")] + Draft = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"Published")] + Published = 1, + + [System.Runtime.Serialization.EnumMember(Value = @"Unlisted")] + Unlisted = 2, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class FileUpload + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } + + [Newtonsoft.Json.JsonProperty("fileName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string FileName { get; set; } + + [Newtonsoft.Json.JsonProperty("type", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Type { get; set; } + + [Newtonsoft.Json.JsonProperty("releaseGroupId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid ReleaseGroupId { get; set; } + + [Newtonsoft.Json.JsonProperty("md5Hash", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Md5Hash { get; set; } + + [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Status { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateChannelRequest + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("projectId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid? ProjectId { get; set; } + + [Newtonsoft.Json.JsonProperty("packageId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string PackageId { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpdateChannelRequest + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ReleaseGroupListResponse + { + [Newtonsoft.Json.JsonProperty("releaseGroups", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection ReleaseGroups { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateReleaseGroupRequest + { + [Newtonsoft.Json.JsonProperty("packageId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string PackageId { get; set; } + + [Newtonsoft.Json.JsonProperty("version", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Version { get; set; } + + [Newtonsoft.Json.JsonProperty("channelIdentifier", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ChannelIdentifier { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpdateReleaseGroupRequest + { + [Newtonsoft.Json.JsonProperty("notesHtml", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string NotesHtml { get; set; } + + [Newtonsoft.Json.JsonProperty("notesMarkdown", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string NotesMarkdown { get; set; } + + [Newtonsoft.Json.JsonProperty("state", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public ReleaseGroupState? State { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class FileUploadListResponse + { + [Newtonsoft.Json.JsonProperty("fileUploads", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection FileUploads { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class FileUploadDetails : FileUpload + { + [Newtonsoft.Json.JsonProperty("createdAt", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset CreatedAt { get; set; } + + [Newtonsoft.Json.JsonProperty("lastModified", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset LastModified { get; set; } + + [Newtonsoft.Json.JsonProperty("packageId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string PackageId { get; set; } + + [Newtonsoft.Json.JsonProperty("version", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Version { get; set; } + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class FileParameter + { + public FileParameter(System.IO.Stream data) + : this (data, null, null) + { + } + + public FileParameter(System.IO.Stream data, string fileName) + : this (data, fileName, null) + { + } + + public FileParameter(System.IO.Stream data, string fileName, string contentType) + { + Data = data; + FileName = fileName; + ContentType = contentType; + } + + public System.IO.Stream Data { get; private set; } + + public string FileName { get; private set; } + + public string ContentType { get; private set; } + } + + + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ApiException : System.Exception + { + public int StatusCode { get; private set; } + + public string Response { get; private set; } + + public System.Collections.Generic.IReadOnlyDictionary> Headers { get; private set; } + + public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Exception innerException) + : base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException) + { + StatusCode = statusCode; + Response = response; + Headers = headers; + } + + public override string ToString() + { + return string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString()); + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ApiException : ApiException + { + public TResult Result { get; private set; } + + public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary> headers, TResult result, System.Exception innerException) + : base(message, statusCode, response, headers, innerException) + { + Result = result; + } + } + +} + +#pragma warning restore 108 +#pragma warning restore 114 +#pragma warning restore 472 +#pragma warning restore 612 +#pragma warning restore 1573 +#pragma warning restore 1591 +#pragma warning restore 8073 +#pragma warning restore 3016 +#pragma warning restore 8603 +#pragma warning restore 8604 +#pragma warning restore 8625 \ No newline at end of file diff --git a/src/vpk/Velopack.Flow/FlowApi.gen.bat b/src/vpk/Velopack.Flow/FlowApi.gen.bat new file mode 100644 index 00000000..adb2c528 --- /dev/null +++ b/src/vpk/Velopack.Flow/FlowApi.gen.bat @@ -0,0 +1,2 @@ +dotnet tool update --global NSwag.ConsoleCore +nswag openapi2csclient /input:https://api.velopack.io/swagger/v1/swagger.json /output:FlowApi.cs /namespace:Velopack.Flow /classname:FlowApi \ No newline at end of file diff --git a/src/vpk/Velopack.Flow/FlowApiExtensions.cs b/src/vpk/Velopack.Flow/FlowApiExtensions.cs new file mode 100644 index 00000000..cbc4976a --- /dev/null +++ b/src/vpk/Velopack.Flow/FlowApiExtensions.cs @@ -0,0 +1,98 @@ +using System.Globalization; +using System.Net.Http; +using System.Text; + +namespace Velopack.Flow; + +public partial class Profile +{ + public string GetDisplayName() + { + return DisplayName ?? Email ?? ""; + } +} + +public partial class FlowApi +{ + public virtual async Task DownloadInstallerLatestToFileAsync(string packageId, string channel, DownloadAssetType? assetType, string localFilePath, + CancellationToken cancellationToken) + { + if (packageId == null) + throw new ArgumentNullException("packageId"); + + if (channel == null) + throw new ArgumentNullException("channel"); + + var client_ = _httpClient; + var disposeClient_ = false; + try { + using (var request_ = new HttpRequestMessage()) { + request_.Method = new HttpMethod("GET"); + + var urlBuilder_ = new StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "v1/download/{packageId}/{channel}" + urlBuilder_.Append("v1/download/"); + urlBuilder_.Append(Uri.EscapeDataString(ConvertToString(packageId, CultureInfo.InvariantCulture))); + urlBuilder_.Append('/'); + urlBuilder_.Append(Uri.EscapeDataString(ConvertToString(channel, CultureInfo.InvariantCulture))); + urlBuilder_.Append('?'); + if (assetType != null) { + urlBuilder_.Append(Uri.EscapeDataString("assetType")).Append('=') + .Append(Uri.EscapeDataString(ConvertToString(assetType, CultureInfo.InvariantCulture))).Append('&'); + } + + urlBuilder_.Length--; + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new Uri(url_, UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try { + var headers_ = new Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int) response_.StatusCode; + if (status_ == 404) { + string responseText_ = (response_.Content == null) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("A server side error occurred.", status_, responseText_, headers_, null); + } else if (status_ == 200 || status_ == 204) { + using var fs = File.Create(localFilePath); +#if NET6_0_OR_GREATER + await response_.Content.CopyToAsync(fs, cancellationToken); +#else + await response_.Content.CopyToAsync(fs); +#endif + return; + } else { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException( + "The HTTP status code of the response was not expected (" + status_ + ").", + status_, + responseData_, + headers_, + null); + } + } finally { + if (disposeResponse_) + response_.Dispose(); + } + } + } finally { + if (disposeClient_) + client_.Dispose(); + } + } +} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/Flow/HmacAuthHttpClientHandler.cs b/src/vpk/Velopack.Flow/HmacAuthHttpClientHandler.cs similarity index 97% rename from src/vpk/Velopack.Packaging/Flow/HmacAuthHttpClientHandler.cs rename to src/vpk/Velopack.Flow/HmacAuthHttpClientHandler.cs index 8590c55c..3696ed8a 100644 --- a/src/vpk/Velopack.Packaging/Flow/HmacAuthHttpClientHandler.cs +++ b/src/vpk/Velopack.Flow/HmacAuthHttpClientHandler.cs @@ -1,7 +1,7 @@ using System.Net.Http; using System.Net.Http.Headers; -namespace Velopack.Packaging.Flow; +namespace Velopack.Flow; public class HmacAuthHttpClientHandler : DelegatingHandler { diff --git a/src/vpk/Velopack.Packaging/Flow/HmacHelper.cs b/src/vpk/Velopack.Flow/HmacHelper.cs similarity index 93% rename from src/vpk/Velopack.Packaging/Flow/HmacHelper.cs rename to src/vpk/Velopack.Flow/HmacHelper.cs index 59bd6373..72dfecc3 100644 --- a/src/vpk/Velopack.Packaging/Flow/HmacHelper.cs +++ b/src/vpk/Velopack.Flow/HmacHelper.cs @@ -1,9 +1,7 @@ using System.Security.Cryptography; - using System.Text; -#nullable enable -namespace Velopack.Packaging.Flow; +namespace Velopack.Flow; public static class HmacHelper { @@ -11,7 +9,7 @@ public static class HmacHelper public static DateTime EpochStart { get; } = new(1970, 01, 01, 0, 0, 0, 0, DateTimeKind.Utc); public static uint GetSecondsSinceEpoch() - => (uint)(DateTime.UtcNow - EpochStart).TotalSeconds; + => (uint) (DateTime.UtcNow - EpochStart).TotalSeconds; public static string BuildSignature(string hashedId, string httpMethod, string requestUri, uint secondsSinceEpoch, string nonce) => $"{hashedId}{httpMethod.ToUpperInvariant()}{requestUri.ToLowerInvariant()}{secondsSinceEpoch}{nonce}"; @@ -45,6 +43,7 @@ public static class HmacHelper if (signatureData is null) { throw new ArgumentNullException(nameof(signatureData)); } + using HMAC hmac = new HMACSHA256(); hmac.Key = secret ?? throw new ArgumentNullException(nameof(secret)); return Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(signatureData))); diff --git a/src/vpk/Velopack.Flow/Velopack.Flow.csproj b/src/vpk/Velopack.Flow/Velopack.Flow.csproj new file mode 100644 index 00000000..09ed9be8 --- /dev/null +++ b/src/vpk/Velopack.Flow/Velopack.Flow.csproj @@ -0,0 +1,24 @@ + + + + net472;net6.0 + enable + $(NoWarn);CA2007;CS8002 + enable + true + + + + + + + + + + + + + + + + diff --git a/src/vpk/Velopack.Packaging/Flow/VelopackLoginOptions.cs b/src/vpk/Velopack.Flow/VelopackFlowLoginOptions.cs similarity index 60% rename from src/vpk/Velopack.Packaging/Flow/VelopackLoginOptions.cs rename to src/vpk/Velopack.Flow/VelopackFlowLoginOptions.cs index 1a2b7734..7d549ad0 100644 --- a/src/vpk/Velopack.Packaging/Flow/VelopackLoginOptions.cs +++ b/src/vpk/Velopack.Flow/VelopackFlowLoginOptions.cs @@ -1,9 +1,8 @@ -#nullable enable -namespace Velopack.Packaging.Flow; +namespace Velopack.Flow; -public class VelopackLoginOptions : VelopackServiceOptions +public class VelopackFlowLoginOptions { public bool AllowCacheCredentials { get; set; } = true; public bool AllowInteractiveLogin { get; set; } = true; public bool AllowDeviceCodeFlow { get; set; } = true; -} +} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/Flow/VelopackFlowServiceClient.cs b/src/vpk/Velopack.Flow/VelopackFlowServiceClient.cs similarity index 66% rename from src/vpk/Velopack.Packaging/Flow/VelopackFlowServiceClient.cs rename to src/vpk/Velopack.Flow/VelopackFlowServiceClient.cs index 9143409b..62064e0c 100644 --- a/src/vpk/Velopack.Packaging/Flow/VelopackFlowServiceClient.cs +++ b/src/vpk/Velopack.Flow/VelopackFlowServiceClient.cs @@ -5,8 +5,10 @@ using NuGet.Versioning; using Microsoft.Extensions.Logging; using System.Text; using System.Net.Http.Headers; +using Velopack.Core; +using Velopack.Core.Abstractions; using Velopack.NuGet; -using Velopack.Packaging.Abstractions; +using Velopack.Packaging; using Velopack.Util; #if NET6_0_OR_GREATER @@ -16,29 +18,12 @@ using System.Net.Http; #endif #nullable enable -namespace Velopack.Packaging.Flow; - -public interface IVelopackFlowServiceClient -{ - Task LoginAsync(VelopackLoginOptions? options, bool suppressOutput, CancellationToken cancellationToken); - - Task LogoutAsync(VelopackServiceOptions? options, CancellationToken cancellationToken); - - Task GetProfileAsync(VelopackServiceOptions? options, CancellationToken cancellationToken); - - Task InvokeEndpointAsync(VelopackServiceOptions? options, string endpointUri, - string method, - string? body, - CancellationToken cancellationToken); - - Task UploadLatestReleaseAssetsAsync(string? channel, string releaseDirectory, string? serviceUrl, RuntimeOs os, - bool noWaitForLive, CancellationToken cancellationToken); -} +namespace Velopack.Flow; public class VelopackFlowServiceClient( - IHttpMessageHandlerFactory HttpMessageHandlerFactory, + VelopackFlowServiceOptions Options, ILogger Logger, - IFancyConsole Console) : IVelopackFlowServiceClient + IFancyConsole Console) { private static readonly string[] Scopes = ["openid", "offline_access"]; @@ -48,7 +33,7 @@ public class VelopackFlowServiceClient( private HttpClient GetHttpClient(Action? progress = null) { - HttpMessageHandler primaryHandler = HttpMessageHandlerFactory.CreateHandler("flow"); + HttpMessageHandler primaryHandler = new HmacAuthHttpClientHandler(); if (progress != null) { var ph = new HttpFormatting::System.Net.Http.Handlers.ProgressMessageHandler(primaryHandler); @@ -59,37 +44,51 @@ public class VelopackFlowServiceClient( ph.HttpReceiveProgress += (_, args) => { progress(args.ProgressPercentage); }; + primaryHandler = ph; } var client = new HttpClient(primaryHandler); client.DefaultRequestHeaders.Authorization = Authorization; + client.Timeout = TimeSpan.FromMinutes(Options.Timeout); return client; } - public async Task LoginAsync(VelopackLoginOptions? options, bool suppressOutput, CancellationToken cancellationToken) + private FlowApi GetFlowApi(Action? progress = null) { - options ??= new VelopackLoginOptions(); - if (!suppressOutput) { - Logger.LogInformation("Preparing to login to Velopack ({ServiceUrl})", options.VelopackBaseUrl); + var client = GetHttpClient(progress); + var api = new FlowApi(client); + if (!String.IsNullOrWhiteSpace(Options.VelopackBaseUrl)) { + api.BaseUrl = Options.VelopackBaseUrl; } - var authConfiguration = await GetAuthConfigurationAsync(options, cancellationToken); + return api; + } + + public async Task LoginAsync(VelopackFlowLoginOptions? loginOptions, bool suppressOutput, CancellationToken cancellationToken) + { + loginOptions ??= new VelopackFlowLoginOptions(); + var serviceUrl = Options.VelopackBaseUrl ?? GetFlowApi().BaseUrl; + if (!suppressOutput) { + Logger.LogInformation("Preparing to login to Velopack ({serviceUrl})", serviceUrl); + } + + var authConfiguration = await GetAuthConfigurationAsync(cancellationToken); var pca = await BuildPublicApplicationAsync(authConfiguration); - if (!string.IsNullOrWhiteSpace(options.ApiKey)) { - Authorization = new(HmacHelper.HmacScheme, options.ApiKey); + if (!string.IsNullOrWhiteSpace(Options.ApiKey)) { + Authorization = new(HmacHelper.HmacScheme, Options.ApiKey); } else { AuthenticationResult? rv = null; - if (options.AllowCacheCredentials) { + if (loginOptions.AllowCacheCredentials) { rv = await AcquireSilentlyAsync(pca, cancellationToken); } - if (rv is null && options.AllowInteractiveLogin) { + if (rv is null && loginOptions.AllowInteractiveLogin) { rv = await AcquireInteractiveAsync(pca, authConfiguration, cancellationToken); } - if (rv is null && options.AllowDeviceCodeFlow) { + if (rv is null && loginOptions.AllowDeviceCodeFlow) { rv = await AcquireByDeviceCodeAsync(pca, cancellationToken); } @@ -101,7 +100,7 @@ public class VelopackFlowServiceClient( Authorization = new("Bearer", rv.IdToken ?? rv.AccessToken); } - var profile = await GetProfileAsync(options, cancellationToken); + var profile = await GetProfileAsync(cancellationToken); if (!suppressOutput) { Logger.LogInformation("{UserName} logged into Velopack", profile?.GetDisplayName()); @@ -110,9 +109,9 @@ public class VelopackFlowServiceClient( return true; } - public async Task LogoutAsync(VelopackServiceOptions? options, CancellationToken cancellationToken) + public async Task LogoutAsync(CancellationToken cancellationToken) { - var authConfiguration = await GetAuthConfigurationAsync(options, cancellationToken); + var authConfiguration = await GetAuthConfigurationAsync(cancellationToken); var pca = await BuildPublicApplicationAsync(authConfiguration); @@ -125,31 +124,30 @@ public class VelopackFlowServiceClient( Logger.LogInformation("Cleared saved login(s) for Velopack"); } - public async Task GetProfileAsync(VelopackServiceOptions? options, CancellationToken cancellationToken) + public async Task GetProfileAsync(CancellationToken cancellationToken) { AssertAuthenticated(); - var endpoint = GetEndpoint("v1/user/profile", options?.VelopackBaseUrl); - - var client = GetHttpClient(); - return await client.GetFromJsonAsync(endpoint, cancellationToken); + var client = GetFlowApi(); + return await client.GetUserProfileAsync(cancellationToken); } public async Task InvokeEndpointAsync( - VelopackServiceOptions? options, + VelopackFlowServiceOptions? options, string endpointUri, string method, string? body, CancellationToken cancellationToken) { AssertAuthenticated(); - var endpoint = GetEndpoint(endpointUri, options?.VelopackBaseUrl); + + var client = GetHttpClient(); + var endpoint = new FlowApi(client).BaseUrl; HttpRequestMessage request = new(new HttpMethod(method), endpoint); if (body is not null) { request.Content = new StringContent(body, Encoding.UTF8, "application/json"); } - var client = GetHttpClient(); HttpResponseMessage response = await client.SendAsync(request, cancellationToken); #if NET6_0_OR_GREATER @@ -166,14 +164,14 @@ public class VelopackFlowServiceClient( } } - public async Task UploadLatestReleaseAssetsAsync(string? channel, string releaseDirectory, string? serviceUrl, - RuntimeOs os, bool noWaitForLive, CancellationToken cancellationToken) + public async Task UploadLatestReleaseAssetsAsync(string? channel, string releaseDirectory, + RuntimeOs os, bool waitForLive, CancellationToken cancellationToken) { AssertAuthenticated(); - channel ??= ReleaseEntryHelper.GetDefaultChannel(os); + channel ??= DefaultName.GetDefaultChannel(os); BuildAssets assets = BuildAssets.Read(releaseDirectory, channel); - var fullAsset = assets.GetReleaseEntries().SingleOrDefault(a => a.Type == VelopackAssetType.Full); + var fullAsset = assets.GetReleaseEntries().SingleOrDefault(a => a.Type == Velopack.VelopackAssetType.Full); if (fullAsset is null) { Logger.LogError("No full asset found in release directory {ReleaseDirectory} (or it's missing from assets file)", releaseDirectory); @@ -188,7 +186,7 @@ public class VelopackFlowServiceClient( .Concat([(fullAssetPath, FileType.Release)]) .ToArray(); - Logger.LogInformation("Beginning upload to Velopack Flow (serviceUrl={ServiceUrl})", serviceUrl); + Logger.LogInformation("Beginning upload to Velopack Flow"); await Console.ExecuteProgressAsync( async (progress) => { @@ -196,7 +194,7 @@ public class VelopackFlowServiceClient( $"Creating release {version}", async (report) => { report(-1); - var result = await CreateReleaseGroupAsync(packageId, version, channel, serviceUrl, cancellationToken); + var result = await CreateReleaseGroupAsync(packageId, version, channel, cancellationToken); report(100); return result; }); @@ -209,7 +207,6 @@ public class VelopackFlowServiceClient( async (report) => { await UploadReleaseAssetAsync( assetTuple.Item1, - serviceUrl, releaseGroup.Id, assetTuple.Item2, report, @@ -225,7 +222,7 @@ public class VelopackFlowServiceClient( var prevZip = await progress.RunTask( $"Downloading delta base for {version}", async (report) => { - await DownloadLatestRelease(packageId, channel, serviceUrl, prevVersion, report, cancellationToken); + await DownloadLatestRelease(packageId, channel, prevVersion, report, cancellationToken); return new ZipPackage(prevVersion); }); @@ -234,7 +231,7 @@ public class VelopackFlowServiceClient( $"Latest version in channel {channel} is greater than or equal to local (remote={prevZip.Version}, local={version})"); } - var suggestedDeltaName = ReleaseEntryHelper.GetSuggestedReleaseName(packageId, version.ToFullString(), channel, true, RuntimeOs.Unknown); + var suggestedDeltaName = DefaultName.GetSuggestedReleaseName(packageId, version.ToFullString(), channel, true, RuntimeOs.Unknown); var deltaPath = Path.Combine(releaseDirectory, suggestedDeltaName); await progress.RunTask( @@ -254,7 +251,6 @@ public class VelopackFlowServiceClient( async (report) => { await UploadReleaseAssetAsync( deltaPath, - serviceUrl, releaseGroup.Id, FileType.Release, report, @@ -269,50 +265,35 @@ public class VelopackFlowServiceClient( $"Publishing release {version}", async (report) => { report(-1); - var result = await PublishReleaseGroupAsync(releaseGroup, serviceUrl, cancellationToken); + var result = await PublishReleaseGroupAsync(releaseGroup.Id, cancellationToken); report(100); return result; }); - if (!noWaitForLive) { + if (waitForLive) { await progress.RunTask( "Waiting for release to go live", async (report) => { report(-1); - await WaitUntilReleaseGroupLive(publishedGroup.Id, serviceUrl, cancellationToken); + await WaitUntilReleaseGroupLive(publishedGroup.Id, cancellationToken); report(100); }); } }); } - private async Task DownloadLatestRelease(string packageId, string channel, string? velopackBaseUrl, string localPath, - Action progress, CancellationToken cancellationToken) + private async Task DownloadLatestRelease(string packageId, string channel, string localPath, Action progress, CancellationToken cancellationToken) { - var client = GetHttpClient(progress); - var endpoint = GetEndpoint($"v1/download/{packageId}/{channel}", velopackBaseUrl) + $"?assetType=Full"; - - using var fs = File.Create(localPath); - - var response = await client.GetAsync(endpoint, cancellationToken); - response.EnsureSuccessStatusCode(); - -#if NET6_0_OR_GREATER - await response.Content.CopyToAsync(fs, cancellationToken); -#else - await response.Content.CopyToAsync(fs); -#endif + var client = GetFlowApi(progress); + await client.DownloadInstallerLatestToFileAsync(packageId, channel, DownloadAssetType.Full, localPath, cancellationToken); } - private async Task WaitUntilReleaseGroupLive(Guid releaseGroupId, string? velopackBaseUrl, CancellationToken cancellationToken) + private async Task WaitUntilReleaseGroupLive(Guid releaseGroupId, CancellationToken cancellationToken) { - var client = GetHttpClient(); - var endpoint = GetEndpoint($"v1/releaseGroups/{releaseGroupId}", velopackBaseUrl); + var client = GetFlowApi(); for (int i = 0; i < 300; i++) { - var response = await client.GetAsync(endpoint, cancellationToken); - response.EnsureSuccessStatusCode(); - var releaseGroup = await response.Content.ReadFromJsonAsync(cancellationToken: cancellationToken); + var releaseGroup = await client.GetReleaseGroupAsync(releaseGroupId, cancellationToken); if (releaseGroup?.FileUploads == null) { Logger.LogWarning("Failed to get release group status, it may not be live yet."); return; @@ -329,9 +310,7 @@ public class VelopackFlowServiceClient( Logger.LogWarning("Release did not go live within 5 minutes (timeout)."); } - private async Task CreateReleaseGroupAsync( - string packageId, SemanticVersion version, string channel, - string? velopackBaseUrl, CancellationToken cancellationToken) + private async Task CreateReleaseGroupAsync(string packageId, SemanticVersion version, string channel, CancellationToken cancellationToken) { CreateReleaseGroupRequest request = new() { ChannelIdentifier = channel, @@ -339,70 +318,37 @@ public class VelopackFlowServiceClient( Version = version.ToNormalizedString() }; - var client = GetHttpClient(); - var endpoint = GetEndpoint("v1/releaseGroups/create", velopackBaseUrl); - var response = await client.PostAsJsonAsync(endpoint, request, cancellationToken); - - if (!response.IsSuccessStatusCode) { - string content = await response.Content.ReadAsStringAsync(cancellationToken); - throw new InvalidOperationException( - $"Failed to create release group with version {version.ToNormalizedString()}" + - $"{Environment.NewLine}Response status code: {response.StatusCode}{Environment.NewLine}{content}"); - } - - return await response.Content.ReadFromJsonAsync(cancellationToken: cancellationToken) - ?? throw new InvalidOperationException($"Failed to create release group with version {version.ToNormalizedString()}"); + var client = GetFlowApi(); + return await client.CreateReleaseGroupAsync(request, cancellationToken); } - private async Task UploadReleaseAssetAsync(string filePath, string? velopackBaseUrl, Guid releaseGroupId, - FileType fileType, Action progress, CancellationToken cancellationToken) + private async Task UploadReleaseAssetAsync(string filePath, Guid releaseGroupId, FileType fileType, Action progress, + CancellationToken cancellationToken) { - using var formData = new MultipartFormDataContent(); - formData.Add(new StringContent(releaseGroupId.ToString()), "ReleaseGroupId"); - formData.Add(new StringContent(fileType.ToString()), "FileType"); - - using var fileStream = File.OpenRead(filePath); - - using var fileContent = new StreamContent(fileStream); - formData.Add(fileContent, "File", Path.GetFileName(filePath)); - - var endpoint = GetEndpoint("v1/releases/upload", velopackBaseUrl); - - var client = GetHttpClient(progress); - var response = await client.PostAsync(endpoint, formData, cancellationToken); - response.EnsureSuccessStatusCode(); + using var stream = File.OpenRead(filePath); + var file = new FileParameter(stream); + var client = GetFlowApi(progress); + await client.UploadReleaseAsync(releaseGroupId, fileType, file, cancellationToken); } - private async Task PublishReleaseGroupAsync( - ReleaseGroup releaseGroup, string? velopackBaseUrl, CancellationToken cancellationToken) + private async Task PublishReleaseGroupAsync(Guid releaseGroupId, CancellationToken cancellationToken) { UpdateReleaseGroupRequest request = new() { State = ReleaseGroupState.Published }; - var client = GetHttpClient(); - var endpoint = GetEndpoint($"v1/releaseGroups/{releaseGroup.Id}", velopackBaseUrl); - var response = await client.PutAsJsonAsync(endpoint, request, cancellationToken); - - if (!response.IsSuccessStatusCode) { - string content = await response.Content.ReadAsStringAsync(cancellationToken); - throw new InvalidOperationException( - $"Failed to publish release group with id {releaseGroup.Id}.{Environment.NewLine}Response status code: {response.StatusCode}{Environment.NewLine}{content}"); - } - - return await response.Content.ReadFromJsonAsync(cancellationToken: cancellationToken) - ?? throw new InvalidOperationException($"Failed to publish release group with id {releaseGroup.Id}"); + var client = GetFlowApi(); + return await client.UpdateReleaseGroupAsync(releaseGroupId, request, cancellationToken); } - private async Task GetAuthConfigurationAsync(VelopackServiceOptions? options, CancellationToken cancellationToken) + private async Task GetAuthConfigurationAsync(CancellationToken cancellationToken) { if (AuthConfiguration is not null) return AuthConfiguration; - var endpoint = GetEndpoint("v1/auth/config", options); + var client = GetFlowApi(); + var authConfig = await client.GetV1AuthConfigAsync(cancellationToken); - var client = GetHttpClient(); - var authConfig = await client.GetFromJsonAsync(endpoint, cancellationToken); if (authConfig is null) throw new Exception("Failed to get auth configuration."); if (authConfig.B2CAuthority is null) @@ -415,16 +361,6 @@ public class VelopackFlowServiceClient( return authConfig; } - private static Uri GetEndpoint(string relativePath, VelopackServiceOptions? options) - => GetEndpoint(relativePath, options?.VelopackBaseUrl); - - private static Uri GetEndpoint(string relativePath, string? velopackBaseUrl) - { - var baseUrl = velopackBaseUrl ?? VelopackServiceOptions.DefaultBaseUrl; - var endpoint = new Uri(relativePath, UriKind.Relative); - return new(new Uri(baseUrl), endpoint); - } - private void AssertAuthenticated() { if (Authorization is null) { @@ -516,7 +452,7 @@ public class VelopackFlowServiceClient( .WithB2CAuthority(authConfiguration.B2CAuthority) .WithRedirectUri(authConfiguration.RedirectUri) #if DEBUG - .WithLogging((Microsoft.Identity.Client.LogLevel level, string message, bool containsPii) => System.Console.WriteLine($"[{level}]: {message}"), enablePiiLogging: true, enableDefaultPlatformLogging: true) + .WithLogging((Microsoft.Identity.Client.LogLevel level, string message, bool containsPii) => System.Console.WriteLine($"[{level}]: {message}"), enablePiiLogging: true, enableDefaultPlatformLogging: true) #endif .WithClientName("velopack") .Build(); @@ -524,11 +460,4 @@ public class VelopackFlowServiceClient( cacheHelper.RegisterCache(pca.UserTokenCache); return pca; } - - private enum FileType - { - Unknown, - Release, - Installer, - } } \ No newline at end of file diff --git a/src/vpk/Velopack.Flow/VelopackFlowServiceOptions.cs b/src/vpk/Velopack.Flow/VelopackFlowServiceOptions.cs new file mode 100644 index 00000000..2b6cd2bd --- /dev/null +++ b/src/vpk/Velopack.Flow/VelopackFlowServiceOptions.cs @@ -0,0 +1,10 @@ +namespace Velopack.Flow; + +public class VelopackFlowServiceOptions +{ + public string? VelopackBaseUrl { get; set; } = string.Empty; + + public string? ApiKey { get; set; } = string.Empty; + + public double Timeout { get; set; } = 30d; +} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging.Unix/Commands/LinuxPackCommandRunner.cs b/src/vpk/Velopack.Packaging.Unix/Commands/LinuxPackCommandRunner.cs index d46884c5..d0cb3bba 100644 --- a/src/vpk/Velopack.Packaging.Unix/Commands/LinuxPackCommandRunner.cs +++ b/src/vpk/Velopack.Packaging.Unix/Commands/LinuxPackCommandRunner.cs @@ -1,6 +1,7 @@ using ELFSharp.ELF; using Microsoft.Extensions.Logging; -using Velopack.Packaging.Abstractions; +using Velopack.Core; +using Velopack.Core.Abstractions; using Velopack.Util; namespace Velopack.Packaging.Unix.Commands; diff --git a/src/vpk/Velopack.Packaging.Unix/Commands/OsxBundleCommandRunner.cs b/src/vpk/Velopack.Packaging.Unix/Commands/OsxBundleCommandRunner.cs index 96aa350a..aac4224f 100644 --- a/src/vpk/Velopack.Packaging.Unix/Commands/OsxBundleCommandRunner.cs +++ b/src/vpk/Velopack.Packaging.Unix/Commands/OsxBundleCommandRunner.cs @@ -2,8 +2,8 @@ using System.Text.RegularExpressions; using Microsoft.Extensions.Logging; using NuGet.Versioning; -using Velopack.Packaging.Abstractions; -using Velopack.Packaging.Exceptions; +using Velopack.Core; +using Velopack.Core.Abstractions; using Velopack.Util; namespace Velopack.Packaging.Unix.Commands; diff --git a/src/vpk/Velopack.Packaging.Unix/Commands/OsxPackCommandRunner.cs b/src/vpk/Velopack.Packaging.Unix/Commands/OsxPackCommandRunner.cs index 89a21006..a36cb5fd 100644 --- a/src/vpk/Velopack.Packaging.Unix/Commands/OsxPackCommandRunner.cs +++ b/src/vpk/Velopack.Packaging.Unix/Commands/OsxPackCommandRunner.cs @@ -1,7 +1,6 @@ -using System.Collections.Concurrent; -using System.Runtime.Versioning; +using System.Runtime.Versioning; using Microsoft.Extensions.Logging; -using Velopack.Packaging.Abstractions; +using Velopack.Core.Abstractions; using Velopack.Util; namespace Velopack.Packaging.Unix.Commands; diff --git a/src/vpk/Velopack.Packaging.Unix/OsxBuildTools.cs b/src/vpk/Velopack.Packaging.Unix/OsxBuildTools.cs index df031b29..f297659b 100644 --- a/src/vpk/Velopack.Packaging.Unix/OsxBuildTools.cs +++ b/src/vpk/Velopack.Packaging.Unix/OsxBuildTools.cs @@ -1,6 +1,7 @@ using System.Runtime.Versioning; using System.Security; using Microsoft.Extensions.Logging; +using Velopack.Core; using Velopack.Util; namespace Velopack.Packaging.Unix; diff --git a/src/vpk/Velopack.Packaging.Windows/CodeSign.cs b/src/vpk/Velopack.Packaging.Windows/CodeSign.cs index 18afc967..98c712b2 100644 --- a/src/vpk/Velopack.Packaging.Windows/CodeSign.cs +++ b/src/vpk/Velopack.Packaging.Windows/CodeSign.cs @@ -1,7 +1,7 @@ using System.Diagnostics; using System.Text.RegularExpressions; using Microsoft.Extensions.Logging; -using Velopack.Packaging.Exceptions; +using Velopack.Core; using Velopack.Util; namespace Velopack.Packaging.Windows; diff --git a/src/vpk/Velopack.Packaging.Windows/Commands/WindowsPackCommandRunner.cs b/src/vpk/Velopack.Packaging.Windows/Commands/WindowsPackCommandRunner.cs index af97cb70..4b04400c 100644 --- a/src/vpk/Velopack.Packaging.Windows/Commands/WindowsPackCommandRunner.cs +++ b/src/vpk/Velopack.Packaging.Windows/Commands/WindowsPackCommandRunner.cs @@ -1,11 +1,9 @@ -using System.IO.Compression; -using System.Runtime.Versioning; +using System.Runtime.Versioning; using Microsoft.Extensions.Logging; using Velopack.Compression; +using Velopack.Core; +using Velopack.Core.Abstractions; using Velopack.NuGet; -using Velopack.Packaging.Abstractions; -using Velopack.Packaging.Exceptions; -using Velopack.Packaging.NuGet; using Velopack.Util; using Velopack.Windows; diff --git a/src/vpk/Velopack.Packaging.Windows/Commands/WindowsReleasifyOptions.cs b/src/vpk/Velopack.Packaging.Windows/Commands/WindowsReleasifyOptions.cs index 747953a1..7eecd93b 100644 --- a/src/vpk/Velopack.Packaging.Windows/Commands/WindowsReleasifyOptions.cs +++ b/src/vpk/Velopack.Packaging.Windows/Commands/WindowsReleasifyOptions.cs @@ -1,4 +1,6 @@ -namespace Velopack.Packaging.Windows.Commands; +using Velopack.Core; + +namespace Velopack.Packaging.Windows.Commands; public class WindowsReleasifyOptions : WindowsSigningOptions { diff --git a/src/vpk/Velopack.Packaging.Windows/CompatUtil.cs b/src/vpk/Velopack.Packaging.Windows/CompatUtil.cs index f8390d83..c67fb06b 100644 --- a/src/vpk/Velopack.Packaging.Windows/CompatUtil.cs +++ b/src/vpk/Velopack.Packaging.Windows/CompatUtil.cs @@ -6,8 +6,8 @@ using AsmResolver.PE.DotNet.Cil; using AsmResolver.PE.Win32Resources.Version; using Microsoft.Extensions.Logging; using NuGet.Versioning; -using Velopack.Packaging.Abstractions; -using Velopack.Packaging.Exceptions; +using Velopack.Core; +using Velopack.Core.Abstractions; using Velopack.Util; namespace Velopack.Packaging.Windows; diff --git a/src/vpk/Velopack.Packaging/Abstractions/IPlatformOptions.cs b/src/vpk/Velopack.Packaging/Abstractions/IPlatformOptions.cs index d7267262..a6dc421b 100644 --- a/src/vpk/Velopack.Packaging/Abstractions/IPlatformOptions.cs +++ b/src/vpk/Velopack.Packaging/Abstractions/IPlatformOptions.cs @@ -2,5 +2,5 @@ public interface IPlatformOptions : IOutputOptions { - RID TargetRuntime { get; set; } + RID? TargetRuntime { get; set; } } diff --git a/src/vpk/Velopack.Packaging/Commands/DeltaGenCommandRunner.cs b/src/vpk/Velopack.Packaging/Commands/DeltaGenCommandRunner.cs index 3d3ae6ba..cf7b93b6 100644 --- a/src/vpk/Velopack.Packaging/Commands/DeltaGenCommandRunner.cs +++ b/src/vpk/Velopack.Packaging/Commands/DeltaGenCommandRunner.cs @@ -1,5 +1,5 @@ using Microsoft.Extensions.Logging; -using Velopack.Packaging.Abstractions; +using Velopack.Core.Abstractions; namespace Velopack.Packaging.Commands; @@ -16,15 +16,18 @@ public class DeltaGenCommandRunner : ICommand public async Task Run(DeltaGenOptions options) { - await _console.ExecuteProgressAsync(async (ctx) => { - var pold = new ReleasePackage(options.BasePackage); - var pnew = new ReleasePackage(options.NewPackage); - await ctx.RunTask($"Building delta {pold.Version} -> {pnew.Version}", (progress) => { - var delta = new DeltaPackageBuilder(_logger); - delta.CreateDeltaPackage(pold, pnew, options.OutputFile, options.DeltaMode, progress); - progress(100); - return Task.CompletedTask; + await _console.ExecuteProgressAsync( + async (ctx) => { + var pold = new ReleasePackage(options.BasePackage); + var pnew = new ReleasePackage(options.NewPackage); + await ctx.RunTask( + $"Building delta {pold.Version} -> {pnew.Version}", + (progress) => { + var delta = new DeltaPackageBuilder(_logger); + delta.CreateDeltaPackage(pold, pnew, options.OutputFile, options.DeltaMode, progress); + progress(100); + return Task.CompletedTask; + }); }); - }); } -} +} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/Commands/DeltaGenOptions.cs b/src/vpk/Velopack.Packaging/Commands/DeltaGenOptions.cs index 8de0f415..92f00a2d 100644 --- a/src/vpk/Velopack.Packaging/Commands/DeltaGenOptions.cs +++ b/src/vpk/Velopack.Packaging/Commands/DeltaGenOptions.cs @@ -1,4 +1,6 @@ -namespace Velopack.Packaging.Commands; +using Velopack.Core; + +namespace Velopack.Packaging.Commands; public class DeltaGenOptions { @@ -9,4 +11,4 @@ public class DeltaGenOptions public string NewPackage { get; set; } public string OutputFile { get; set; } -} +} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/Commands/DeltaPatchCommandRunner.cs b/src/vpk/Velopack.Packaging/Commands/DeltaPatchCommandRunner.cs index d24e7f2d..9bca63a6 100644 --- a/src/vpk/Velopack.Packaging/Commands/DeltaPatchCommandRunner.cs +++ b/src/vpk/Velopack.Packaging/Commands/DeltaPatchCommandRunner.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.Logging; using Velopack.Compression; -using Velopack.Packaging.Exceptions; -using Velopack.Packaging.Abstractions; +using Velopack.Core; +using Velopack.Core.Abstractions; using Velopack.Util; namespace Velopack.Packaging.Commands; @@ -35,18 +35,24 @@ public class DeltaPatchCommandRunner : ICommand var delta = new DeltaEmbedded(HelperFile.GetZstdPath(), _logger, tmp); EasyZip.ExtractZipToDirectory(_logger, options.BasePackage, workDir); - await _console.ExecuteProgressAsync(async (ctx) => { - foreach (var f in options.PatchFiles) { - await ctx.RunTask($"Applying {f.Name}", (progress) => { - delta.ApplyDeltaPackageFast(workDir, f.FullName, progress); - progress(100); - return Task.CompletedTask; - }); - } - await ctx.RunTask($"Building {Path.GetFileName(options.OutputFile)}", async (progress) => { - await EasyZip.CreateZipFromDirectoryAsync(_logger, options.OutputFile, workDir, progress); - progress(100); + await _console.ExecuteProgressAsync( + async (ctx) => { + foreach (var f in options.PatchFiles) { + await ctx.RunTask( + $"Applying {f.Name}", + (progress) => { + delta.ApplyDeltaPackageFast(workDir, f.FullName, progress); + progress(100); + return Task.CompletedTask; + }); + } + + await ctx.RunTask( + $"Building {Path.GetFileName(options.OutputFile)}", + async (progress) => { + await EasyZip.CreateZipFromDirectoryAsync(_logger, options.OutputFile, workDir, progress); + progress(100); + }); }); - }); } -} +} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/Commands/DeltaPatchOptions.cs b/src/vpk/Velopack.Packaging/Commands/DeltaPatchOptions.cs index f742f892..7946549d 100644 --- a/src/vpk/Velopack.Packaging/Commands/DeltaPatchOptions.cs +++ b/src/vpk/Velopack.Packaging/Commands/DeltaPatchOptions.cs @@ -7,4 +7,4 @@ public class DeltaPatchOptions public FileInfo[] PatchFiles { get; set; } public string OutputFile { get; set; } -} +} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/DeltaPackageBuilder.cs b/src/vpk/Velopack.Packaging/DeltaPackageBuilder.cs index a3a11ef3..16a646a7 100644 --- a/src/vpk/Velopack.Packaging/DeltaPackageBuilder.cs +++ b/src/vpk/Velopack.Packaging/DeltaPackageBuilder.cs @@ -2,6 +2,7 @@ using System.Text; using Microsoft.Extensions.Logging; using Velopack.Compression; +using Velopack.Core; using Velopack.Packaging.Exceptions; using Velopack.Util; @@ -26,11 +27,13 @@ public class DeltaPackageBuilder public int Removed { get; set; } } - public (ReleasePackage package, DeltaStats stats) CreateDeltaPackage(ReleasePackage basePackage, ReleasePackage newPackage, string outputFile, DeltaMode mode, Action progress) + public (ReleasePackage package, DeltaStats stats) CreateDeltaPackage(ReleasePackage basePackage, ReleasePackage newPackage, string outputFile, + DeltaMode mode, Action progress) { if (basePackage == null) throw new ArgumentNullException(nameof(basePackage)); if (newPackage == null) throw new ArgumentNullException(nameof(newPackage)); - if (String.IsNullOrEmpty(outputFile) || File.Exists(outputFile)) throw new ArgumentException("The output file is null or already exists", nameof(outputFile)); + if (String.IsNullOrEmpty(outputFile) || File.Exists(outputFile)) + throw new ArgumentException("The output file is null or already exists", nameof(outputFile)); Zstd zstd = null; try { @@ -137,6 +140,7 @@ public class DeltaPackageBuilder File.WriteAllText(targetFile.FullName + ".shasum", rl.EntryAsString, Encoding.UTF8); Interlocked.Increment(ref fChanged); } + targetFile.Delete(); baseLibFiles.Remove(relativePath); var p = Interlocked.Increment(ref fProcessed); @@ -152,39 +156,47 @@ public class DeltaPackageBuilder } try { - Parallel.ForEach(newLibFiles, new ParallelOptions() { MaxDegreeOfParallelism = numParallel }, (f) => { - // we try to use zstd first, if it fails we'll try bsdiff - if (zstd != null) { + Parallel.ForEach( + newLibFiles, + new ParallelOptions() { MaxDegreeOfParallelism = numParallel }, + (f) => { + // we try to use zstd first, if it fails we'll try bsdiff + if (zstd != null) { + try { + createDeltaForSingleFile(f, tempInfo, true); + return; // success, so return from this function + } catch (ProcessFailedException ex) { + _logger.Error( + $"Failed to create zstd diff for file '{f.FullName}' (will try to fallback to legacy bsdiff format - this will be much slower). " + + Environment.NewLine + ex.Message); + } catch (Exception ex) { + _logger.Error($"Failed to create zstd diff for file '{f.FullName}'. " + Environment.NewLine + ex.Message); + throw; + } + } + + // if we're here, either zstd is not available or it failed try { - createDeltaForSingleFile(f, tempInfo, true); - return; // success, so return from this function - } catch (ProcessFailedException ex) { - _logger.Error($"Failed to create zstd diff for file '{f.FullName}' (will try to fallback to legacy bsdiff format - this will be much slower). " + Environment.NewLine + ex.Message); + createDeltaForSingleFile(f, tempInfo, false); + if (zstd != null) { + _logger.Info($"Successfully created fallback bsdiff for file '{f.FullName}'."); + } } catch (Exception ex) { - _logger.Error($"Failed to create zstd diff for file '{f.FullName}'. " + Environment.NewLine + ex.Message); + _logger.Error($"Failed to create bsdiff for file '{f.FullName}'. " + Environment.NewLine + ex.Message); throw; } - } - // if we're here, either zstd is not available or it failed - try { - createDeltaForSingleFile(f, tempInfo, false); - if (zstd != null) { - _logger.Info($"Successfully created fallback bsdiff for file '{f.FullName}'."); - } - } catch (Exception ex) { - _logger.Error($"Failed to create bsdiff for file '{f.FullName}'. " + Environment.NewLine + ex.Message); - throw; - } - }); + }); } catch { - throw new UserInfoException("Delta creation failed for one or more files. See log for details. To skip delta generation, use the '--delta none' argument."); + throw new UserInfoException( + "Delta creation failed for one or more files. See log for details. To skip delta generation, use the '--delta none' argument."); } EasyZip.CreateZipFromDirectoryAsync(_logger, outputFile, tempInfo.FullName, CoreUtil.CreateProgressDelegate(progress, 70, 100)).GetAwaiterResult(); progress(100); fRemoved = baseLibFiles.Count; - _logger.Info($"Delta processed {fProcessed:D4} files. " + _logger.Info( + $"Delta processed {fProcessed:D4} files. " + $"{fChanged:D4} patched, {fSame:D4} unchanged, {fNew:D4} new, {fRemoved:D4} removed"); _logger.Debug( @@ -241,4 +253,4 @@ public class DeltaPackageBuilder return true; } -} +} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/Exceptions/ProcessFailedException.cs b/src/vpk/Velopack.Packaging/Exceptions/ProcessFailedException.cs index f903802b..37f7f9f0 100644 --- a/src/vpk/Velopack.Packaging/Exceptions/ProcessFailedException.cs +++ b/src/vpk/Velopack.Packaging/Exceptions/ProcessFailedException.cs @@ -9,7 +9,8 @@ public class ProcessFailedException : Exception public string StdOutput { get; } public ProcessFailedException(string command, string stdOutput, string stdErr) - : base($"Process failed: '{command}'{Environment.NewLine}Output was -{Environment.NewLine}{stdOutput}{Environment.NewLine}StdErr was -{Environment.NewLine}{stdErr}") + : base( + $"Process failed: '{command}'{Environment.NewLine}Output was -{Environment.NewLine}{stdOutput}{Environment.NewLine}StdErr was -{Environment.NewLine}{stdErr}") { Command = command; StdOutput = stdOutput; @@ -20,4 +21,4 @@ public class ProcessFailedException : Exception if (result.ExitCode != 0) throw new ProcessFailedException(result.Command, result.StdOutput, result.StdErr); } -} +} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/Exceptions/VelopackAppVerificationException.cs b/src/vpk/Velopack.Packaging/Exceptions/VelopackAppVerificationException.cs index 31f572c0..59226c51 100644 --- a/src/vpk/Velopack.Packaging/Exceptions/VelopackAppVerificationException.cs +++ b/src/vpk/Velopack.Packaging/Exceptions/VelopackAppVerificationException.cs @@ -1,4 +1,5 @@ using System.Diagnostics.CodeAnalysis; +using Velopack.Core; namespace Velopack.Packaging.Exceptions; @@ -7,9 +8,9 @@ public class VelopackAppVerificationException : UserInfoException { public VelopackAppVerificationException(string message) : base( - $"Failed to verify VelopackApp ({message}). " + - $"Ensure you have added the startup code to the beginning of your Program.Main(): VelopackApp.Build().Run(); " + - $"and then re-compile/re-publish your application.") + $"Failed to verify VelopackApp ({message}). " + + $"Ensure you have added the startup code to the beginning of your Program.Main(): VelopackApp.Build().Run(); " + + $"and then re-compile/re-publish your application.") { } -} +} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/Exe.cs b/src/vpk/Velopack.Packaging/Exe.cs index a4cc6cfb..b83fa78b 100644 --- a/src/vpk/Velopack.Packaging/Exe.cs +++ b/src/vpk/Velopack.Packaging/Exe.cs @@ -1,5 +1,6 @@ using System.Diagnostics; using System.Text; +using Velopack.Core; using Velopack.Packaging.Exceptions; using Velopack.Util; @@ -134,14 +135,15 @@ public static class Exe process.Kill(); ct.ThrowIfCancellationRequested(); } - + // need to call this once more to wait for the streams to finish. if WaitForExit is called with a timeout, the streams will not be fully read. - process.WaitForExit(); + process.WaitForExit(); return (process.ExitCode, sOut.ToString().Trim(), sErr.ToString().Trim()); } - public static (int ExitCode, string StdOutput, string StdErr, string Command) InvokeProcess(string fileName, IEnumerable args, string workingDirectory, CancellationToken ct = default, + public static (int ExitCode, string StdOutput, string StdErr, string Command) InvokeProcess(string fileName, IEnumerable args, + string workingDirectory, CancellationToken ct = default, IDictionary envVar = null) { var psi = CreateProcessStartInfo(fileName, workingDirectory); diff --git a/src/vpk/Velopack.Packaging/Flow/AuthConfiguration.cs b/src/vpk/Velopack.Packaging/Flow/AuthConfiguration.cs deleted file mode 100644 index a1bc20db..00000000 --- a/src/vpk/Velopack.Packaging/Flow/AuthConfiguration.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Velopack.Packaging.Flow; - -#nullable enable -public class AuthConfiguration -{ - public string? B2CAuthority { get; set; } - public string? RedirectUri { get; set; } - public string? ClientId { get; set; } -} diff --git a/src/vpk/Velopack.Packaging/Flow/CreateReleaseGroupRequest.cs b/src/vpk/Velopack.Packaging/Flow/CreateReleaseGroupRequest.cs deleted file mode 100644 index 673420c4..00000000 --- a/src/vpk/Velopack.Packaging/Flow/CreateReleaseGroupRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -#nullable enable -namespace Velopack.Packaging.Flow; - -internal sealed class CreateReleaseGroupRequest -{ - public string? PackageId { get; set; } - public string? Version { get; set; } - public string? ChannelIdentifier { get; set; } -} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/Flow/Profile.cs b/src/vpk/Velopack.Packaging/Flow/Profile.cs deleted file mode 100644 index 6e783ff6..00000000 --- a/src/vpk/Velopack.Packaging/Flow/Profile.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Velopack.Packaging.Flow; - -#nullable enable -public class Profile -{ - public string? Id { get; set; } - public string? DisplayName { get; set; } - public string? Email { get; set; } - - public string? GetDisplayName() - { - return DisplayName ?? Email ?? ""; - } -} diff --git a/src/vpk/Velopack.Packaging/Flow/ReleaseGroup.cs b/src/vpk/Velopack.Packaging/Flow/ReleaseGroup.cs deleted file mode 100644 index d5d3200b..00000000 --- a/src/vpk/Velopack.Packaging/Flow/ReleaseGroup.cs +++ /dev/null @@ -1,20 +0,0 @@ -#if NET6_0_OR_GREATER -#else -using System.Net.Http; -#endif - -#nullable enable -namespace Velopack.Packaging.Flow; - -internal sealed class FileUpload -{ - public string? Status { get; set; } - public string? Md5Hash { get; set; } -} - -internal sealed class ReleaseGroup -{ - public Guid Id { get; set; } - public string? Version { get; set; } - public List? FileUploads { get; set; } -} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/Flow/UpdateReleaseGroupRequest.cs b/src/vpk/Velopack.Packaging/Flow/UpdateReleaseGroupRequest.cs deleted file mode 100644 index 2524de74..00000000 --- a/src/vpk/Velopack.Packaging/Flow/UpdateReleaseGroupRequest.cs +++ /dev/null @@ -1,20 +0,0 @@ -#nullable enable -using Newtonsoft.Json.Converters; -using Newtonsoft.Json; - -namespace Velopack.Packaging.Flow; - -internal sealed class UpdateReleaseGroupRequest -{ - public string? NotesHtml { get; set; } - public string? NotesMarkdown { get; set; } - public ReleaseGroupState? State { get; set; } -} - -[JsonConverter(typeof(StringEnumConverter))] -internal enum ReleaseGroupState -{ - Draft, - Published, - Unlisted -} diff --git a/src/vpk/Velopack.Packaging/Flow/UploadOptions.cs b/src/vpk/Velopack.Packaging/Flow/UploadOptions.cs deleted file mode 100644 index bb918f99..00000000 --- a/src/vpk/Velopack.Packaging/Flow/UploadOptions.cs +++ /dev/null @@ -1,10 +0,0 @@ -#nullable enable - -namespace Velopack.Packaging.Flow; - -public class UploadOptions(Stream releaseData, string fileName, string channel) : VelopackServiceOptions -{ - public Stream ReleaseData { get; } = releaseData; - public string FileName { get; } = fileName; - public string Channel { get; } = channel; -} diff --git a/src/vpk/Velopack.Packaging/Flow/VelopackServiceOptions.cs b/src/vpk/Velopack.Packaging/Flow/VelopackServiceOptions.cs deleted file mode 100644 index 9844d56f..00000000 --- a/src/vpk/Velopack.Packaging/Flow/VelopackServiceOptions.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Velopack.Packaging.Flow; - -public class VelopackServiceOptions -{ - public const string DefaultBaseUrl = "https://api.velopack.io/"; - - public string VelopackBaseUrl { get; set; } = DefaultBaseUrl; - - public string ApiKey { get; set; } = string.Empty; -} diff --git a/src/vpk/Velopack.Packaging/PackageBuilder.cs b/src/vpk/Velopack.Packaging/PackageBuilder.cs index 1da9b7fa..d1f88ef6 100644 --- a/src/vpk/Velopack.Packaging/PackageBuilder.cs +++ b/src/vpk/Velopack.Packaging/PackageBuilder.cs @@ -5,9 +5,10 @@ using Markdig; using Microsoft.Extensions.Logging; using NuGet.Versioning; using Velopack.Compression; +using Velopack.Core; +using Velopack.Core.Abstractions; using Velopack.NuGet; using Velopack.Packaging.Abstractions; -using Velopack.Packaging.Exceptions; using Velopack.Util; namespace Velopack.Packaging; @@ -44,8 +45,9 @@ public abstract class PackageBuilder : ICommand options.TargetRuntime = RID.Parse(TargetOs.GetOsShortName()); } - if (options.TargetRuntime.BaseRID != TargetOs) { - throw new UserInfoException($"To build packages for {TargetOs.GetOsLongName()}, " + + if (options.TargetRuntime!.BaseRID != TargetOs) { + throw new UserInfoException( + $"To build packages for {TargetOs.GetOsLongName()}, " + $"the target rid must be {TargetOs} (actually was {options.TargetRuntime?.BaseRID}). " + $"If your real intention was to cross-compile a release for {options.TargetRuntime?.BaseRID} then you " + $"should provide an OS directive: eg. 'vpk [{options.TargetRuntime?.BaseRID.GetOsShortName()}] pack ...'"); @@ -55,16 +57,19 @@ public abstract class PackageBuilder : ICommand Log.Info("Releases Directory: " + options.ReleaseDir.FullName); var releaseDir = options.ReleaseDir; - var channel = options.Channel?.ToLower() ?? ReleaseEntryHelper.GetDefaultChannel(TargetOs); + var channel = options.Channel?.ToLower() ?? DefaultName.GetDefaultChannel(TargetOs); options.Channel = channel; var entryHelper = new ReleaseEntryHelper(releaseDir.FullName, channel, Log, TargetOs); if (entryHelper.DoesSimilarVersionExist(SemanticVersion.Parse(options.PackVersion))) { - if (await Console.PromptYesNo("A release in this channel with the same or greater version already exists. Do you want to continue and potentially overwrite files?") != true) { - throw new UserInfoException($"There is a release in channel {channel} which is equal or greater to the current version {options.PackVersion}. Please increase the current package version or remove that release."); + if (await Console.PromptYesNo( + "A release in this channel with the same or greater version already exists. Do you want to continue and potentially overwrite files?") != + true) { + throw new UserInfoException( + $"There is a release in channel {channel} which is equal or greater to the current version {options.PackVersion}. Please increase the current package version or remove that release."); } } - + using var _1 = TempUtil.GetTempDirectory(out var pkgTempDir); TempDir = new DirectoryInfo(pkgTempDir); @@ -85,10 +90,12 @@ public abstract class PackageBuilder : ICommand break; } } + if (mainExePath == null) { throw new UserInfoException( $"Could not find main application executable (the one that runs 'VelopackApp.Build().Run()'). " + Environment.NewLine + - $"If your main binary is not named '{mainExeName}', please specify the name with the argument: --mainExe {{yourBinary.exe}}" + Environment.NewLine + + $"If your main binary is not named '{mainExeName}', please specify the name with the argument: --mainExe {{yourBinary.exe}}" + + Environment.NewLine + $"I searched the following paths and none exist: " + Environment.NewLine + String.Join(Environment.NewLine, mainSearchPaths) ); @@ -105,72 +112,93 @@ public abstract class PackageBuilder : ICommand var incomplete = Path.Combine(pkgTempDir, fileName); var final = Path.Combine(releaseDir.FullName, fileName); try { File.Delete(incomplete); } catch { } + filesToCopy.Add((incomplete, final)); return incomplete; } - await Console.ExecuteProgressAsync(async (ctx) => { - ReleasePackage prev = null; - await ctx.RunTask("Pre-process steps", async (progress) => { - prev = entryHelper.GetPreviousFullRelease(NuGetVersion.Parse(packVersion)); - packDirectory = await PreprocessPackDir(progress, packDirectory); - }); + await Console.ExecuteProgressAsync( + async (ctx) => { + ReleasePackage prev = null; + await ctx.RunTask( + "Pre-process steps", + async (progress) => { + prev = entryHelper.GetPreviousFullRelease(NuGetVersion.Parse(packVersion)); + packDirectory = await PreprocessPackDir(progress, packDirectory); + }); - if (TargetOs != RuntimeOs.Linux) { - await ctx.RunTask("Code-sign application", async (progress) => { - await CodeSign(progress, packDirectory); - }); - } - - Task portableTask = null; - if (TargetOs == RuntimeOs.Linux || !Options.NoPortable) { - portableTask = ctx.RunTask("Building portable package", async (progress) => { - var suggestedName = ReleaseEntryHelper.GetSuggestedPortableName(packId, channel, TargetOs); - var path = getIncompletePath(suggestedName); - await CreatePortablePackage(progress, packDirectory, path); - }); - } - - // TODO: hack, this is a prerequisite for building full package but only on linux - if (TargetOs == RuntimeOs.Linux) await portableTask; - - string releasePath = null; - await ctx.RunTask($"Building release {packVersion}", async (progress) => { - var suggestedName = ReleaseEntryHelper.GetSuggestedReleaseName(packId, packVersion, channel, false, TargetOs); - releasePath = getIncompletePath(suggestedName); - await CreateReleasePackage(progress, packDirectory, releasePath); - }); - - Task setupTask = null; - if (!Options.NoInst && TargetOs != RuntimeOs.Linux) { - setupTask = ctx.RunTask("Building setup package", async (progress) => { - var suggestedName = ReleaseEntryHelper.GetSuggestedSetupName(packId, channel, TargetOs); - var path = getIncompletePath(suggestedName); - await CreateSetupPackage(progress, releasePath, packDirectory, path); - }); - } - - if (prev != null && options.DeltaMode != DeltaMode.None) { - await ctx.RunTask($"Building delta {prev.Version} -> {packVersion}", async (progress) => { - var suggestedName = ReleaseEntryHelper.GetSuggestedReleaseName(packId, packVersion, channel, true, TargetOs); - var deltaPkg = await CreateDeltaPackage(progress, releasePath, prev.PackageFile, getIncompletePath(suggestedName), options.DeltaMode); - }); - } - - if (TargetOs != RuntimeOs.Linux && portableTask != null) await portableTask; - if (setupTask != null) await setupTask; - - await ctx.RunTask("Post-process steps", (progress) => { - foreach (var f in filesToCopy) { - IoUtil.MoveFile(f.from, f.to, true); + if (TargetOs != RuntimeOs.Linux) { + await ctx.RunTask( + "Code-sign application", + async (progress) => { + await CodeSign(progress, packDirectory); + }); } - ReleaseEntryHelper.UpdateReleaseFiles(releaseDir.FullName, Log); - BuildAssets.Write(releaseDir.FullName, channel, filesToCopy.Select(x => x.to)); - progress(100); - return Task.CompletedTask; + Task portableTask = null; + if (TargetOs == RuntimeOs.Linux || !Options.NoPortable) { + portableTask = ctx.RunTask( + "Building portable package", + async (progress) => { + var suggestedName = DefaultName.GetSuggestedPortableName(packId, channel, TargetOs); + var path = getIncompletePath(suggestedName); + await CreatePortablePackage(progress, packDirectory, path); + }); + } + + // TODO: hack, this is a prerequisite for building full package but only on linux + if (TargetOs == RuntimeOs.Linux) await portableTask!; + + string releasePath = null; + await ctx.RunTask( + $"Building release {packVersion}", + async (progress) => { + var suggestedName = DefaultName.GetSuggestedReleaseName(packId, packVersion, channel, false, TargetOs); + releasePath = getIncompletePath(suggestedName); + await CreateReleasePackage(progress, packDirectory, releasePath); + }); + + Task setupTask = null; + if (!Options.NoInst && TargetOs != RuntimeOs.Linux) { + setupTask = ctx.RunTask( + "Building setup package", + async (progress) => { + var suggestedName = DefaultName.GetSuggestedSetupName(packId, channel, TargetOs); + var path = getIncompletePath(suggestedName); + await CreateSetupPackage(progress, releasePath, packDirectory, path); + }); + } + + if (prev != null && options.DeltaMode != DeltaMode.None) { + await ctx.RunTask( + $"Building delta {prev.Version} -> {packVersion}", + async (progress) => { + var suggestedName = DefaultName.GetSuggestedReleaseName(packId, packVersion, channel, true, TargetOs); + var deltaPkg = await CreateDeltaPackage( + progress, + releasePath, + prev.PackageFile, + getIncompletePath(suggestedName), + options.DeltaMode); + }); + } + + if (TargetOs != RuntimeOs.Linux && portableTask != null) await portableTask; + if (setupTask != null) await setupTask; + + await ctx.RunTask( + "Post-process steps", + (progress) => { + foreach (var f in filesToCopy) { + IoUtil.MoveFile(f.from, f.to, true); + } + + ReleaseEntryHelper.UpdateReleaseFiles(releaseDir.FullName, Log); + BuildAssets.Write(releaseDir.FullName, channel, filesToCopy.Select(x => x.to)); + progress(100); + return Task.CompletedTask; + }); }); - }); } protected virtual string ExtractPackDir(string packDirectory) => packDirectory; @@ -187,12 +215,14 @@ public abstract class PackageBuilder : ICommand var rid = Options.TargetRuntime; string extraMetadata = ""; + void addMetadata(string key, string value) { if (!String.IsNullOrEmpty(key) && !String.IsNullOrEmpty(value)) { if (!SecurityElement.IsValidText(value)) { value = $""""""; } + extraMetadata += $"<{key}>{value}{Environment.NewLine}"; } } @@ -218,22 +248,22 @@ public abstract class PackageBuilder : ICommand } string nuspec = $""" - - - -{packId} -{packTitle ?? packId} -{packTitle ?? packId} -{packAuthors ?? packId} -{packVersion} -{Options.Channel} -{Options.EntryExecutableName} -{rid.BaseRID.GetOsShortName()} -{rid.ToDisplay(RidDisplayType.NoVersion)} -{extraMetadata.Trim()} - - -""".Trim(); + + + + {packId} + {packTitle ?? packId} + {packTitle ?? packId} + {packAuthors ?? packId} + {packVersion} + {Options.Channel} + {Options.EntryExecutableName} + {rid.BaseRID.GetOsShortName()} + {rid.ToDisplay(RidDisplayType.NoVersion)} + {extraMetadata.Trim()} + + + """.Trim(); return nuspec; } @@ -315,6 +345,7 @@ public abstract class PackageBuilder : ICommand Log.Debug("Skipping because matched exclude pattern: " + path); continue; } + fileInfo.CopyTo(path, true); } @@ -356,12 +387,12 @@ public abstract class PackageBuilder : ICommand .ToArray(); var contentType = $""" - - - -{String.Join(Environment.NewLine, extensions)} - -"""; + + + + {String.Join(Environment.NewLine, extensions)} + + """; File.WriteAllText(Path.Combine(rootDirectory, NugetUtil.ContentTypeFileName), contentType); @@ -369,11 +400,11 @@ public abstract class PackageBuilder : ICommand Directory.CreateDirectory(relsDir); var rels = $""" - - - - -"""; + + + + + """; File.WriteAllText(Path.Combine(relsDir, ".rels"), rels); } -} +} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/ReleaseEntryHelper.cs b/src/vpk/Velopack.Packaging/ReleaseEntryHelper.cs index b81a07f8..7c0c7b89 100644 --- a/src/vpk/Velopack.Packaging/ReleaseEntryHelper.cs +++ b/src/vpk/Velopack.Packaging/ReleaseEntryHelper.cs @@ -1,6 +1,7 @@ using System.Text; using Microsoft.Extensions.Logging; using NuGet.Versioning; +using Velopack.Core; using Velopack.NuGet; using Velopack.Util; @@ -17,7 +18,7 @@ public class ReleaseEntryHelper { _outputDir = outputDir; _logger = logger; - _channel = channel ?? GetDefaultChannel(os); + _channel = channel ?? DefaultName.GetDefaultChannel(os); _releases = GetReleasesFromDir(outputDir); } @@ -26,11 +27,12 @@ public class ReleaseEntryHelper var rel = new Dictionary>(StringComparer.OrdinalIgnoreCase); foreach (var releaseFile in Directory.EnumerateFiles(dir, "*.nupkg")) { var zip = new ZipPackage(releaseFile); - var ch = zip.Channel ?? GetDefaultChannel(VelopackRuntimeInfo.SystemOs); + var ch = zip.Channel ?? DefaultName.GetDefaultChannel(VelopackRuntimeInfo.SystemOs); if (!rel.ContainsKey(ch)) rel[ch] = new List(); rel[ch].Add(VelopackAsset.FromZipPackage(zip)); } + return rel; } @@ -43,6 +45,7 @@ public class ReleaseEntryHelper return true; } } + return false; } @@ -94,10 +97,12 @@ public class ReleaseEntryHelper foreach (var releaseFile in Directory.EnumerateFiles(outputDir, "RELEASES*")) { File.Delete(releaseFile); } + foreach (var kvp in releases) { var exclude = kvp.Value.Where(x => x.Version.ReleaseLabels.Any(r => r.Contains('.')) || x.Version.HasMetadata).ToArray(); if (exclude.Any()) { - log.Warn($"Excluding {exclude.Length} asset(s) from legacy RELEASES file, because they " + + log.Warn( + $"Excluding {exclude.Length} asset(s) from legacy RELEASES file, because they " + $"contain an invalid character in the version: {string.Join(", ", exclude.Select(x => x.FileName))}"); } @@ -151,54 +156,6 @@ public class ReleaseEntryHelper return Encoding.UTF8.GetString(ms.ToArray()); } - public static string GetSuggestedReleaseName(string id, string version, string channel, bool delta, RuntimeOs os) - { - var suffix = GetUniqueAssetSuffix(channel); - version = SemanticVersion.Parse(version).ToNormalizedString(); - if (os == RuntimeOs.Windows && channel == GetDefaultChannel(RuntimeOs.Windows)) { - return $"{id}-{version}{(delta ? "-delta" : "-full")}.nupkg"; - } - return $"{id}-{version}{suffix}{(delta ? "-delta" : "-full")}.nupkg"; - } - - public static string GetSuggestedPortableName(string id, string channel, RuntimeOs os) - { - var suffix = GetUniqueAssetSuffix(channel); - if (os == RuntimeOs.Linux) { - if (channel == GetDefaultChannel(RuntimeOs.Linux)) { - return $"{id}.AppImage"; - } else { - return $"{id}{suffix}.AppImage"; - } - } else { - return $"{id}{suffix}-Portable.zip"; - } - } - - public static string GetSuggestedSetupName(string id, string channel, RuntimeOs os) - { - var suffix = GetUniqueAssetSuffix(channel); - if (os == RuntimeOs.Windows) - return $"{id}{suffix}-Setup.exe"; - else if (os == RuntimeOs.OSX) - return $"{id}{suffix}-Setup.pkg"; - else - throw new PlatformNotSupportedException("Platform not supported."); - } - - private static string GetUniqueAssetSuffix(string channel) - { - return "-" + channel; - } - - public static string GetDefaultChannel(RuntimeOs os) - { - if (os == RuntimeOs.Windows) return "win"; - if (os == RuntimeOs.OSX) return "osx"; - if (os == RuntimeOs.Linux) return "linux"; - throw new NotSupportedException("Unsupported OS: " + os); - } - public enum AssetsMode { AllPackages, @@ -267,6 +224,4 @@ public class ReleaseEntryHelper // return ret; //} - - -} +} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/ReleasePackage.cs b/src/vpk/Velopack.Packaging/ReleasePackage.cs index 5f89b131..3e81745a 100644 --- a/src/vpk/Velopack.Packaging/ReleasePackage.cs +++ b/src/vpk/Velopack.Packaging/ReleasePackage.cs @@ -16,4 +16,4 @@ public class ReleasePackage public string PackageFile { get; protected set; } public SemanticVersion Version => _package.Value.Version; -} +} \ No newline at end of file diff --git a/src/vpk/Velopack.Packaging/Velopack.Packaging.csproj b/src/vpk/Velopack.Packaging/Velopack.Packaging.csproj index 5f68c98e..debedbc3 100644 --- a/src/vpk/Velopack.Packaging/Velopack.Packaging.csproj +++ b/src/vpk/Velopack.Packaging/Velopack.Packaging.csproj @@ -9,6 +9,7 @@ + diff --git a/src/vpk/Velopack.Packaging/Zstd.cs b/src/vpk/Velopack.Packaging/Zstd.cs index 63a08e5c..aadc82fe 100644 --- a/src/vpk/Velopack.Packaging/Zstd.cs +++ b/src/vpk/Velopack.Packaging/Zstd.cs @@ -1,4 +1,5 @@ -using Velopack.Packaging.Exceptions; +using Velopack.Core; +using Velopack.Packaging.Exceptions; namespace Velopack.Packaging; @@ -30,7 +31,8 @@ public class Zstd } if (windowLog > 30) { - throw new UserInfoException($"The file '{Path.GetFileName(oldFile)}' is too large for delta compression. You can disable delta generation using '--delta none'."); + throw new UserInfoException( + $"The file '{Path.GetFileName(oldFile)}' is too large for delta compression. You can disable delta generation using '--delta none'."); } if (mode == DeltaMode.BestSize) { @@ -64,7 +66,11 @@ public class Zstd { int count = 0; v >>= 1; - while (v > 0) { v >>= 1; count++; } + while (v > 0) { + v >>= 1; + count++; + } + return count; } -} +} \ No newline at end of file diff --git a/src/vpk/Velopack.Vpk/Commands/DeltaGenCommand.cs b/src/vpk/Velopack.Vpk/Commands/DeltaGenCommand.cs index d3b354bf..b04dbfa0 100644 --- a/src/vpk/Velopack.Vpk/Commands/DeltaGenCommand.cs +++ b/src/vpk/Velopack.Vpk/Commands/DeltaGenCommand.cs @@ -1,4 +1,5 @@ -using Velopack.Packaging; +using Velopack.Core; +using Velopack.Packaging; namespace Velopack.Vpk.Commands; diff --git a/src/vpk/Velopack.Vpk/Commands/Flow/ApiCommandRunner.cs b/src/vpk/Velopack.Vpk/Commands/Flow/ApiCommandRunner.cs deleted file mode 100644 index 6802f388..00000000 --- a/src/vpk/Velopack.Vpk/Commands/Flow/ApiCommandRunner.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Threading; -using Serilog.Core; -using Velopack.Packaging.Abstractions; -using Velopack.Packaging.Flow; - -namespace Velopack.Vpk.Commands.Flow; -public class ApiCommandRunner(IVelopackFlowServiceClient Client) : ICommand -{ - public async Task Run(ApiOptions options) - { - CancellationToken token = CancellationToken.None; - if (!await Client.LoginAsync(new VelopackLoginOptions() { - AllowCacheCredentials = true, - AllowDeviceCodeFlow = false, - AllowInteractiveLogin = false, - ApiKey = options.ApiKey, - VelopackBaseUrl = options.VelopackBaseUrl - }, true, token)) { - return; - } - - string response = await Client.InvokeEndpointAsync(options, options.Endpoint, options.Method, options.Body, token); - Console.WriteLine(response); - } -} - diff --git a/src/vpk/Velopack.Vpk/Commands/Flow/ApiOptions.cs b/src/vpk/Velopack.Vpk/Commands/Flow/ApiOptions.cs deleted file mode 100644 index 5c826f8a..00000000 --- a/src/vpk/Velopack.Vpk/Commands/Flow/ApiOptions.cs +++ /dev/null @@ -1,11 +0,0 @@ -#nullable enable -using Velopack.Packaging.Flow; - -namespace Velopack.Vpk.Commands.Flow; - -public sealed class ApiOptions : VelopackServiceOptions -{ - public string Endpoint { get; set; } = ""; - public string Method { get; set; } = ""; - public string? Body { get; set; } -} \ No newline at end of file diff --git a/src/vpk/Velopack.Vpk/Commands/Flow/LoginCommandRunner.cs b/src/vpk/Velopack.Vpk/Commands/Flow/LoginCommandRunner.cs deleted file mode 100644 index 381cca82..00000000 --- a/src/vpk/Velopack.Vpk/Commands/Flow/LoginCommandRunner.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Threading; -using Velopack.Packaging.Abstractions; -using Velopack.Packaging.Flow; - -namespace Velopack.Vpk.Commands.Flow; -#nullable enable - -public class LoginCommandRunner(IVelopackFlowServiceClient Client) : ICommand -{ - public async Task Run(LoginOptions options) - { - await Client.LoginAsync(new() { - VelopackBaseUrl = options.VelopackBaseUrl, - ApiKey = options.ApiKey, - }, false, CancellationToken.None); - } -} diff --git a/src/vpk/Velopack.Vpk/Commands/Flow/LoginOptions.cs b/src/vpk/Velopack.Vpk/Commands/Flow/LoginOptions.cs deleted file mode 100644 index 1f87aee1..00000000 --- a/src/vpk/Velopack.Vpk/Commands/Flow/LoginOptions.cs +++ /dev/null @@ -1,5 +0,0 @@ -using Velopack.Packaging.Flow; - -namespace Velopack.Vpk.Commands.Flow; - -public sealed class LoginOptions : VelopackServiceOptions; diff --git a/src/vpk/Velopack.Vpk/Commands/Flow/LogoutCommandRunner.cs b/src/vpk/Velopack.Vpk/Commands/Flow/LogoutCommandRunner.cs deleted file mode 100644 index 5a8292ac..00000000 --- a/src/vpk/Velopack.Vpk/Commands/Flow/LogoutCommandRunner.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Threading; -using Velopack.Packaging.Abstractions; -using Velopack.Packaging.Flow; - -#nullable enable -namespace Velopack.Vpk.Commands.Flow; - -internal class LogoutCommandRunner(IVelopackFlowServiceClient Client) : ICommand -{ - public async Task Run(LogoutOptions options) - { - await Client.LogoutAsync(options, CancellationToken.None); - } -} \ No newline at end of file diff --git a/src/vpk/Velopack.Vpk/Commands/Flow/LogoutOptions.cs b/src/vpk/Velopack.Vpk/Commands/Flow/LogoutOptions.cs deleted file mode 100644 index 95ff20ed..00000000 --- a/src/vpk/Velopack.Vpk/Commands/Flow/LogoutOptions.cs +++ /dev/null @@ -1,5 +0,0 @@ -using Velopack.Packaging.Flow; - -namespace Velopack.Vpk.Commands.Flow; - -public sealed class LogoutOptions : VelopackServiceOptions; diff --git a/src/vpk/Velopack.Vpk/Commands/Flow/PublishCommand.cs b/src/vpk/Velopack.Vpk/Commands/Flow/PublishCommand.cs index c774996f..23682319 100644 --- a/src/vpk/Velopack.Vpk/Commands/Flow/PublishCommand.cs +++ b/src/vpk/Velopack.Vpk/Commands/Flow/PublishCommand.cs @@ -7,7 +7,7 @@ public class PublishCommand : VelopackServiceCommand public string? Channel { get; set; } - public bool NoWaitForLive { get; set; } + public bool WaitForLive { get; set; } public PublishCommand() : base("publish", "Uploads a release to Velopack's hosted service") @@ -21,7 +21,7 @@ public class PublishCommand : VelopackServiceCommand .SetArgumentHelpName("NAME") .SetDescription("The channel used for the release."); - AddOption(v => NoWaitForLive = v, "--noWaitForLive") - .SetDescription("Skip waiting for the release to finish processing and go live."); + AddOption(v => WaitForLive = v, "--waitForLive") + .SetDescription("Wait for the release to finish processing and go live."); } } \ No newline at end of file diff --git a/src/vpk/Velopack.Vpk/Commands/Flow/PublishCommandRunner.cs b/src/vpk/Velopack.Vpk/Commands/Flow/PublishCommandRunner.cs deleted file mode 100644 index f58a424e..00000000 --- a/src/vpk/Velopack.Vpk/Commands/Flow/PublishCommandRunner.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Threading; -using Velopack.Packaging.Abstractions; -using Velopack.Packaging.Flow; - -namespace Velopack.Vpk.Commands.Flow; - -public class PublishCommandRunner(IVelopackFlowServiceClient Client) : ICommand -{ - public async Task Run(PublishOptions options) - { - CancellationToken token = CancellationToken.None; - if (!await Client.LoginAsync(new VelopackLoginOptions() { - AllowCacheCredentials = true, - AllowDeviceCodeFlow = false, - AllowInteractiveLogin = false, - ApiKey = options.ApiKey, - VelopackBaseUrl = options.VelopackBaseUrl - }, false, token)) { - return; - } - - await Client.UploadLatestReleaseAssetsAsync(options.Channel, options.ReleaseDirectory, - options.VelopackBaseUrl, options.TargetOs, options.NoWaitForLive, token); - } -} diff --git a/src/vpk/Velopack.Vpk/Commands/Flow/PublishOptions.cs b/src/vpk/Velopack.Vpk/Commands/Flow/PublishOptions.cs deleted file mode 100644 index 061b5cab..00000000 --- a/src/vpk/Velopack.Vpk/Commands/Flow/PublishOptions.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Velopack.Packaging.Flow; - -namespace Velopack.Vpk.Commands.Flow; - -#nullable enable -public sealed class PublishOptions : VelopackServiceOptions -{ - public RuntimeOs TargetOs { get; set; } - - public string ReleaseDirectory { get; set; } = ""; - - public string? Channel { get; set; } - - public bool NoWaitForLive { get; set; } -} \ No newline at end of file diff --git a/src/vpk/Velopack.Vpk/Commands/Flow/VelopackServiceCommand.cs b/src/vpk/Velopack.Vpk/Commands/Flow/VelopackServiceCommand.cs index 2c5f374c..834ecb29 100644 --- a/src/vpk/Velopack.Vpk/Commands/Flow/VelopackServiceCommand.cs +++ b/src/vpk/Velopack.Vpk/Commands/Flow/VelopackServiceCommand.cs @@ -1,23 +1,27 @@ -using Velopack.Packaging.Flow; - -namespace Velopack.Vpk.Commands.Flow; +namespace Velopack.Vpk.Commands.Flow; public abstract class VelopackServiceCommand : BaseCommand { public string VelopackBaseUrl { get; private set; } public string ApiKey { get; private set; } + + public double Timeout { get; private set; } protected VelopackServiceCommand(string name, string description) : base(name, description) { AddOption(v => VelopackBaseUrl = v, "--baseUrl") .SetDescription("The base Uri for the Velopack API service.") - .SetArgumentHelpName("URI") - .SetDefault(VelopackServiceOptions.DefaultBaseUrl); + .SetArgumentHelpName("URI"); AddOption(v => ApiKey = v, "--api-key") .SetDescription("The API key to use to authenticate with Velopack API service.") .SetArgumentHelpName("ApiKey"); + + AddOption((v) => Timeout = v, "--timeout") + .SetDescription("Network timeout in minutes.") + .SetArgumentHelpName("MINUTES") + .SetDefault(30); } } \ No newline at end of file diff --git a/src/vpk/Velopack.Vpk/Commands/_OutputCommand.cs b/src/vpk/Velopack.Vpk/Commands/_OutputCommand.cs index 1f3f7067..c0138403 100644 --- a/src/vpk/Velopack.Vpk/Commands/_OutputCommand.cs +++ b/src/vpk/Velopack.Vpk/Commands/_OutputCommand.cs @@ -1,4 +1,5 @@ -using Velopack.Packaging; +using Velopack.Core; +using Velopack.Packaging; namespace Velopack.Vpk.Commands; @@ -24,7 +25,7 @@ public abstract class OutputCommand : BaseCommand .SetDescription("The channel to use for this release.") .RequiresValidNuGetId() .SetArgumentHelpName("NAME") - .SetDefault(ReleaseEntryHelper.GetDefaultChannel(targetOs == RuntimeOs.Unknown ? VelopackRuntimeInfo.SystemOs : targetOs)); + .SetDefault(DefaultName.GetDefaultChannel(targetOs == RuntimeOs.Unknown ? VelopackRuntimeInfo.SystemOs : targetOs)); } public DirectoryInfo GetReleaseDirectory() diff --git a/src/vpk/Velopack.Vpk/Logging/BasicConsole.cs b/src/vpk/Velopack.Vpk/Logging/BasicConsole.cs index 87662b93..2683ddaa 100644 --- a/src/vpk/Velopack.Vpk/Logging/BasicConsole.cs +++ b/src/vpk/Velopack.Vpk/Logging/BasicConsole.cs @@ -1,4 +1,4 @@ -using Velopack.Packaging.Abstractions; +using Velopack.Core.Abstractions; using Velopack.Util; namespace Velopack.Vpk.Logging; diff --git a/src/vpk/Velopack.Vpk/Logging/SpectreConsole.cs b/src/vpk/Velopack.Vpk/Logging/SpectreConsole.cs index 73cd261c..77299101 100644 --- a/src/vpk/Velopack.Vpk/Logging/SpectreConsole.cs +++ b/src/vpk/Velopack.Vpk/Logging/SpectreConsole.cs @@ -1,6 +1,6 @@ using System.Threading; using Spectre.Console; -using Velopack.Packaging.Abstractions; +using Velopack.Core.Abstractions; using Velopack.Util; namespace Velopack.Vpk.Logging; diff --git a/src/vpk/Velopack.Vpk/OptionMapper.cs b/src/vpk/Velopack.Vpk/OptionMapper.cs index 91b99e15..b71674c0 100644 --- a/src/vpk/Velopack.Vpk/OptionMapper.cs +++ b/src/vpk/Velopack.Vpk/OptionMapper.cs @@ -1,5 +1,6 @@ using Riok.Mapperly.Abstractions; using Velopack.Deployment; +using Velopack.Flow.Commands; using Velopack.Packaging.Commands; using Velopack.Packaging.Unix.Commands; using Velopack.Packaging.Windows.Commands; diff --git a/src/vpk/Velopack.Vpk/Program.cs b/src/vpk/Velopack.Vpk/Program.cs index 3690e6e6..40d72a1b 100644 --- a/src/vpk/Velopack.Vpk/Program.cs +++ b/src/vpk/Velopack.Vpk/Program.cs @@ -5,11 +5,13 @@ using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Core; using Serilog.Events; +using Velopack.Core; +using Velopack.Core.Abstractions; using Velopack.Deployment; -using Velopack.Packaging.Abstractions; +using Velopack.Flow; +using Velopack.Flow.Commands; using Velopack.Packaging.Commands; using Velopack.Packaging.Exceptions; -using Velopack.Packaging.Flow; using Velopack.Packaging.Unix.Commands; using Velopack.Packaging.Windows.Commands; using Velopack.Util; @@ -94,8 +96,7 @@ public class Program SetupConfig(builder); SetupLogging(builder, verbose, legacyConsole); - SetupVelopackService(builder.Services); - + RuntimeOs targetOs = VelopackRuntimeInfo.SystemOs; if (new bool[] { directiveWin, directiveLinux, directiveOsx }.Count(x => x) > 1) { throw new UserInfoException( @@ -208,15 +209,6 @@ public class Program Log.Logger = conf.CreateLogger(); builder.Logging.AddSerilog(); } - - private static void SetupVelopackService(IServiceCollection services) - { - services.AddSingleton(); - services.AddSingleton(); - services.AddHttpClient().ConfigureHttpClientDefaults(x => - x.AddHttpMessageHandler() - .ConfigureHttpClient(httpClient => httpClient.Timeout = TimeSpan.FromMinutes(60))); - } } public static class ProgramCommandExtensions diff --git a/src/vpk/Velopack.Vpk/Velopack.Vpk.csproj b/src/vpk/Velopack.Vpk/Velopack.Vpk.csproj index c08a3920..aafac710 100644 --- a/src/vpk/Velopack.Vpk/Velopack.Vpk.csproj +++ b/src/vpk/Velopack.Vpk/Velopack.Vpk.csproj @@ -33,6 +33,7 @@ + diff --git a/test/Velopack.Packaging.Tests/CompatUtilTests.cs b/test/Velopack.Packaging.Tests/CompatUtilTests.cs index 049ba1ea..bd488cd3 100644 --- a/test/Velopack.Packaging.Tests/CompatUtilTests.cs +++ b/test/Velopack.Packaging.Tests/CompatUtilTests.cs @@ -1,4 +1,5 @@ using Neovolve.Logging.Xunit; +using Velopack.Core; using Velopack.Packaging.Exceptions; using Velopack.Packaging.Windows; using Velopack.Util; diff --git a/test/Velopack.Packaging.Tests/GithubDeploymentTests.cs b/test/Velopack.Packaging.Tests/GithubDeploymentTests.cs index d1062188..34ff7eac 100644 --- a/test/Velopack.Packaging.Tests/GithubDeploymentTests.cs +++ b/test/Velopack.Packaging.Tests/GithubDeploymentTests.cs @@ -1,6 +1,7 @@ using Velopack.Deployment; using Velopack.Sources; using Octokit; +using Velopack.Core; using Velopack.Packaging.Exceptions; using Velopack.Util; diff --git a/test/Velopack.Packaging.Tests/WindowsPackTests.cs b/test/Velopack.Packaging.Tests/WindowsPackTests.cs index 30708d53..4c7b95dc 100644 --- a/test/Velopack.Packaging.Tests/WindowsPackTests.cs +++ b/test/Velopack.Packaging.Tests/WindowsPackTests.cs @@ -5,6 +5,7 @@ using System.Xml.Linq; using Microsoft.Win32; using NuGet.Packaging; using Velopack.Compression; +using Velopack.Core; using Velopack.Packaging.Commands; using Velopack.Packaging.Exceptions; using Velopack.Packaging.Windows.Commands; diff --git a/test/Velopack.Tests/TestHelpers/FakeFixtureRepository.cs b/test/Velopack.Tests/TestHelpers/FakeFixtureRepository.cs index 90d6e2e5..775db5bd 100644 --- a/test/Velopack.Tests/TestHelpers/FakeFixtureRepository.cs +++ b/test/Velopack.Tests/TestHelpers/FakeFixtureRepository.cs @@ -1,7 +1,7 @@ #pragma warning disable CS0618 // Type or member is obsolete #pragma warning disable CS0612 // Type or member is obsolete using System.Text; -using Velopack.Packaging; +using Velopack.Core; using Velopack.Sources; using Velopack.Util; @@ -39,13 +39,14 @@ internal class FakeFixtureRepository : Sources.IFileDownloader var name = new ReleaseEntryName(maxfullVer.PackageId, maxDeltaVer.Version, false); releases.Add(new ReleaseEntry("0000000000000000000000000000000000000000", name.ToFileName(), maxfullVer.Filesize)); - releasesNew.Add(new VelopackAsset { - PackageId = maxfullVer.PackageId, - Version = maxDeltaVer.Version, - Type = VelopackAssetType.Full, - FileName = $"{maxfullVer.PackageId}-{maxDeltaVer.Version}-full.nupkg", - Size = maxfullVer.Filesize, - }); + releasesNew.Add( + new VelopackAsset { + PackageId = maxfullVer.PackageId, + Version = maxDeltaVer.Version, + Type = VelopackAssetType.Full, + FileName = $"{maxfullVer.PackageId}-{maxDeltaVer.Version}-full.nupkg", + Size = maxfullVer.Filesize, + }); } } @@ -80,7 +81,8 @@ internal class FakeFixtureRepository : Sources.IFileDownloader return Task.FromResult(File.ReadAllBytes(filePath)); } - public Task DownloadFile(string url, string targetFile, Action progress, string authorization = null, string accept = null, double timeout = 30, CancellationToken token = default) + public Task DownloadFile(string url, string targetFile, Action progress, string authorization = null, string accept = null, double timeout = 30, + CancellationToken token = default) { var rel = _releases.FirstOrDefault(r => url.EndsWith(r.OriginalFilename)); var filePath = PathHelper.GetFixture(rel.OriginalFilename); @@ -111,4 +113,4 @@ internal class FakeFixtureRepository : Sources.IFileDownloader throw new NotSupportedException("FakeFixtureRepository doesn't have: " + url); } -} +} \ No newline at end of file diff --git a/test/Velopack.Tests/UpdateManagerTests.cs b/test/Velopack.Tests/UpdateManagerTests.cs index d1eca115..d9bb1eb0 100644 --- a/test/Velopack.Tests/UpdateManagerTests.cs +++ b/test/Velopack.Tests/UpdateManagerTests.cs @@ -1,7 +1,7 @@ using System.Text; using NuGet.Versioning; using Velopack.Compression; -using Velopack.Packaging; +using Velopack.Core; using Velopack.Locators; using Velopack.Sources; using Velopack.Tests.TestHelpers; diff --git a/test/Velopack.Tests/Velopack.Tests.csproj b/test/Velopack.Tests/Velopack.Tests.csproj index c95314a8..305fb341 100644 --- a/test/Velopack.Tests/Velopack.Tests.csproj +++ b/test/Velopack.Tests/Velopack.Tests.csproj @@ -1,6 +1,6 @@ - + $(NoWarn);CA1416 @@ -19,29 +19,29 @@ - + - + - - - - + + + + - + - +