From d0ac6ab9da4bc578e166ed42c43c7f04df51f7e1 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 6 Jul 2023 00:08:12 +0200 Subject: [PATCH] Allow config command to edit subgraph package. --- .../Commands/SubgraphConfigSetHttpCommand.cs | 22 +++- .../Commands/SubgraphConfigSetNameCommand.cs | 10 ++ .../SubgraphConfigSetWebSocketCommand.cs | 22 +++- .../src/CommandLine/Helpers/PackageHelper.cs | 105 ++++++------------ 4 files changed, 80 insertions(+), 79 deletions(-) diff --git a/src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetHttpCommand.cs b/src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetHttpCommand.cs index de8d76263cb..21dc9461a98 100644 --- a/src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetHttpCommand.cs +++ b/src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetHttpCommand.cs @@ -2,8 +2,10 @@ using HotChocolate.Fusion.CommandLine.Helpers; using HotChocolate.Fusion.CommandLine.Options; using HotChocolate.Fusion.Composition; +using HotChocolate.Utilities; using static System.IO.Path; using static HotChocolate.Fusion.CommandLine.Defaults; +using static HotChocolate.Fusion.CommandLine.Helpers.PackageHelper; namespace HotChocolate.Fusion.CommandLine.Commands; @@ -61,19 +63,33 @@ private static async Task ExecuteAsync( { new HttpClientConfiguration(uri, clientName) }); - var configJson = PackageHelper.FormatSubgraphConfig(config); + var configJson = FormatSubgraphConfig(config); await File.WriteAllTextAsync(configFile.FullName, configJson, cancellationToken); } + else if (configFile.Extension.EqualsOrdinal(".fsp")) + { + var config = await LoadSubgraphConfigFromSubgraphPackageAsync(configFile.FullName, cancellationToken); + + var clients = config.Clients.ToList(); + + clients.RemoveAll(t => t is HttpClientConfiguration); + clients.Add(new HttpClientConfiguration(uri, clientName)); + + await ReplaceSubgraphConfigInSubgraphPackageAsync( + configFile.FullName, + config with { Clients = clients }, + cancellationToken); + } else { - var config = await PackageHelper.LoadSubgraphConfigAsync(configFile.FullName, cancellationToken); + var config = await LoadSubgraphConfigAsync(configFile.FullName, cancellationToken); var clients = config.Clients.ToList(); clients.RemoveAll(t => t is HttpClientConfiguration); clients.Add(new HttpClientConfiguration(uri, clientName)); - var configJson = PackageHelper.FormatSubgraphConfig(config with { Clients = clients }); + var configJson = FormatSubgraphConfig(config with { Clients = clients }); await File.WriteAllTextAsync(configFile.FullName, configJson, cancellationToken); } } diff --git a/src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetNameCommand.cs b/src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetNameCommand.cs index ad606db5b60..1d77d93505e 100644 --- a/src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetNameCommand.cs +++ b/src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetNameCommand.cs @@ -1,6 +1,7 @@ using System.CommandLine; using HotChocolate.Fusion.CommandLine.Helpers; using HotChocolate.Fusion.CommandLine.Options; +using HotChocolate.Utilities; using static System.IO.Path; using static HotChocolate.Fusion.CommandLine.Helpers.PackageHelper; using static HotChocolate.Fusion.CommandLine.Defaults; @@ -49,6 +50,15 @@ private static async Task ExecuteAsync( var configJson = FormatSubgraphConfig(config); await File.WriteAllTextAsync(configFile.FullName, configJson, cancellationToken); } + else if (configFile.Extension.EqualsOrdinal(".fsp")) + { + var config = await LoadSubgraphConfigFromSubgraphPackageAsync(configFile.FullName, cancellationToken); + + await ReplaceSubgraphConfigInSubgraphPackageAsync( + configFile.FullName, + config with { Name = subgraphName }, + cancellationToken); + } else { var config = await LoadSubgraphConfigAsync(configFile.FullName, cancellationToken); diff --git a/src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetWebSocketCommand.cs b/src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetWebSocketCommand.cs index 90313625a4a..7d4bbbb9bed 100644 --- a/src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetWebSocketCommand.cs +++ b/src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetWebSocketCommand.cs @@ -2,8 +2,10 @@ using HotChocolate.Fusion.CommandLine.Helpers; using HotChocolate.Fusion.CommandLine.Options; using HotChocolate.Fusion.Composition; +using HotChocolate.Utilities; using static System.IO.Path; using static HotChocolate.Fusion.CommandLine.Defaults; +using static HotChocolate.Fusion.CommandLine.Helpers.PackageHelper; namespace HotChocolate.Fusion.CommandLine.Commands; @@ -61,19 +63,33 @@ private static async Task ExecuteAsync( { new WebSocketClientConfiguration(uri, clientName) }); - var configJson = PackageHelper.FormatSubgraphConfig(config); + var configJson = FormatSubgraphConfig(config); await File.WriteAllTextAsync(configFile.FullName, configJson, cancellationToken); } + else if (configFile.Extension.EqualsOrdinal(".fsp")) + { + var config = await LoadSubgraphConfigFromSubgraphPackageAsync(configFile.FullName, cancellationToken); + + var clients = config.Clients.ToList(); + + clients.RemoveAll(t => t is WebSocketClientConfiguration); + clients.Add(new WebSocketClientConfiguration(uri, clientName)); + + await ReplaceSubgraphConfigInSubgraphPackageAsync( + configFile.FullName, + config with { Clients = clients }, + cancellationToken); + } else { - var config = await PackageHelper.LoadSubgraphConfigAsync(configFile.FullName, cancellationToken); + var config = await LoadSubgraphConfigAsync(configFile.FullName, cancellationToken); var clients = config.Clients.ToList(); clients.RemoveAll(t => t is WebSocketClientConfiguration); clients.Add(new WebSocketClientConfiguration(uri, clientName)); - var configJson = PackageHelper.FormatSubgraphConfig(config with { Clients = clients }); + var configJson = FormatSubgraphConfig(config with { Clients = clients }); await File.WriteAllTextAsync(configFile.FullName, configJson, cancellationToken); } } diff --git a/src/HotChocolate/Fusion/src/CommandLine/Helpers/PackageHelper.cs b/src/HotChocolate/Fusion/src/CommandLine/Helpers/PackageHelper.cs index c87ad1f30ac..3b6d936ab29 100644 --- a/src/HotChocolate/Fusion/src/CommandLine/Helpers/PackageHelper.cs +++ b/src/HotChocolate/Fusion/src/CommandLine/Helpers/PackageHelper.cs @@ -20,7 +20,6 @@ internal static class PackageHelper private const string _schemaExtensionKind = "urn:graphql:schema-extensions"; private const string _subgraphConfigKind = "urn:hotchocolate:fusion:subgraph-config"; private const string _subgraphConfigId = "subgraph-config"; - private const string _subgraphPackageKind = "urn:hotchocolate:fusion:subgraph-package"; public static async Task CreateSubgraphPackageAsync( string packageFile, @@ -46,6 +45,24 @@ public static async Task CreateSubgraphPackageAsync( await AddTransportConfigToPackage(package, transportConfig); await AddSchemaExtensionsToPackage(package, extensions); } + + public static async Task LoadSubgraphConfigFromSubgraphPackageAsync( + string packageFile, + CancellationToken ct = default) + { + using var package = Package.Open(packageFile, FileMode.Open, FileAccess.Read); + var transportConfig = await ReadSubgraphConfigPartAsync(package, ct); + return transportConfig; + } + + public static async Task ReplaceSubgraphConfigInSubgraphPackageAsync( + string packageFile, + SubgraphConfigurationDto config, + CancellationToken ct = default) + { + using var package = Package.Open(packageFile, FileMode.Open, FileAccess.Read); + await ReplaceTransportConfigInPackageAsync(package, config); + } public static async Task CreateSubgraphPackageAsync( Stream stream, @@ -66,32 +83,6 @@ public static async Task CreateSubgraphPackageAsync( await AddSchemaExtensionsToPackage(package, extensions); } - public static async Task CreateFusionPackageAsync( - string packageFile, - DocumentNode schema, - DocumentNode fusionGraph, - IEnumerable subgraphConfigs) - { - if (File.Exists(packageFile)) - { - File.Delete(packageFile); - } - - using var package = Package.Open(packageFile, FileMode.Create); - - await AddSchemaToPackageAsync(package, schema); - await AddFusionGraphToPackageAsync(package, fusionGraph); - - foreach (var subgraphConfig in subgraphConfigs) - { - var uri = CreatePartUri(new Uri($"subgraphs/{subgraphConfig.Name}", Relative)); - var part = package.CreatePart(uri, "application/subgraph-package"); - await using var stream = part.GetStream(FileMode.Create); - await CreateSubgraphPackageAsync(stream, subgraphConfig); - package.CreateRelationship(part.Uri, TargetMode.Internal, _subgraphPackageKind); - } - } - public static async Task ReadSubgraphPackageAsync( string packageFile, CancellationToken cancellationToken = default) @@ -115,25 +106,6 @@ public static async Task ReadSubgraphPackageAsync( subgraphConfig.Clients); } - public static async Task ReadSubgraphConfigsFromFusionPackageAsync( - string packageFile, - CancellationToken cancellationToken = default) - { - using var package = Package.Open(packageFile, FileMode.Open, FileAccess.Read); - var configs = new List(); - - foreach (var extensionRel in package.GetRelationshipsByType(_subgraphPackageKind)) - { - var schemaPart = package.GetPart(extensionRel.TargetUri); - await using var stream = schemaPart.GetStream(FileMode.Open, FileAccess.Read); - using var subgraphPackage = Package.Open(stream, FileMode.Open, FileAccess.Read); - var config = await ReadSubgraphPackageAsync(subgraphPackage, cancellationToken); - configs.Add(config); - } - - return configs.ToArray(); - } - public static async Task ExtractSubgraphPackageAsync( string packageFile, string targetDirectory, @@ -303,33 +275,6 @@ public static string FormatSubgraphConfig( return Encoding.UTF8.GetString(buffer.WrittenSpan); } - private static async Task AddFusionGraphToPackageAsync( - Package package, - DocumentNode schema) - { - var uri = CreatePartUri(new Uri("fusion.graphql", Relative)); - var part = package.CreatePart(uri, "application/graphql-schema"); - - await using var stream = part.GetStream(FileMode.Create); - await using var writer = new StreamWriter(stream, Encoding.UTF8); - await writer.WriteAsync(schema.ToString(true)); - - package.CreateRelationship(part.Uri, TargetMode.Internal, _fusionKind, _fusionId); - } - - private static async Task ReadFusionGraphPartAsync( - Package package, - CancellationToken ct) - { - var schemaRel = package.GetRelationship(_fusionId); - var schemaPart = package.GetPart(schemaRel.TargetUri); - - await using var stream = schemaPart.GetStream(FileMode.Open); - using var reader = new StreamReader(stream, Encoding.UTF8); - var schema = await reader.ReadToEndAsync(ct); - return Utf8GraphQLParser.Parse(schema); - } - private static async Task AddSchemaToPackageAsync( Package package, DocumentNode schema) @@ -406,6 +351,20 @@ private static async Task AddTransportConfigToPackage( package.CreateRelationship(part.Uri, TargetMode.Internal, _subgraphConfigKind, _subgraphConfigId); } + + private static async Task ReplaceTransportConfigInPackageAsync( + Package package, + SubgraphConfigurationDto subgraphConfig) + { + var uri = CreatePartUri(new Uri("subgraph.json", Relative)); + var part = package.GetPart(uri); + + await using var stream = part.GetStream(FileMode.Create); + await using var writer = new StreamWriter(stream, Encoding.UTF8); + await writer.WriteAsync(FormatSubgraphConfig(subgraphConfig)); + + package.CreateRelationship(part.Uri, TargetMode.Internal, _subgraphConfigKind, _subgraphConfigId); + } private static async Task ReadSubgraphConfigPartAsync( Package package,