Skip to content

Commit d0ac6ab

Browse files
committed
Allow config command to edit subgraph package.
1 parent 7b492e8 commit d0ac6ab

File tree

4 files changed

+80
-79
lines changed

4 files changed

+80
-79
lines changed

src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetHttpCommand.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
using HotChocolate.Fusion.CommandLine.Helpers;
33
using HotChocolate.Fusion.CommandLine.Options;
44
using HotChocolate.Fusion.Composition;
5+
using HotChocolate.Utilities;
56
using static System.IO.Path;
67
using static HotChocolate.Fusion.CommandLine.Defaults;
8+
using static HotChocolate.Fusion.CommandLine.Helpers.PackageHelper;
79

810
namespace HotChocolate.Fusion.CommandLine.Commands;
911

@@ -61,19 +63,33 @@ private static async Task ExecuteAsync(
6163
{
6264
new HttpClientConfiguration(uri, clientName)
6365
});
64-
var configJson = PackageHelper.FormatSubgraphConfig(config);
66+
var configJson = FormatSubgraphConfig(config);
6567
await File.WriteAllTextAsync(configFile.FullName, configJson, cancellationToken);
6668
}
69+
else if (configFile.Extension.EqualsOrdinal(".fsp"))
70+
{
71+
var config = await LoadSubgraphConfigFromSubgraphPackageAsync(configFile.FullName, cancellationToken);
72+
73+
var clients = config.Clients.ToList();
74+
75+
clients.RemoveAll(t => t is HttpClientConfiguration);
76+
clients.Add(new HttpClientConfiguration(uri, clientName));
77+
78+
await ReplaceSubgraphConfigInSubgraphPackageAsync(
79+
configFile.FullName,
80+
config with { Clients = clients },
81+
cancellationToken);
82+
}
6783
else
6884
{
69-
var config = await PackageHelper.LoadSubgraphConfigAsync(configFile.FullName, cancellationToken);
85+
var config = await LoadSubgraphConfigAsync(configFile.FullName, cancellationToken);
7086

7187
var clients = config.Clients.ToList();
7288

7389
clients.RemoveAll(t => t is HttpClientConfiguration);
7490
clients.Add(new HttpClientConfiguration(uri, clientName));
7591

76-
var configJson = PackageHelper.FormatSubgraphConfig(config with { Clients = clients });
92+
var configJson = FormatSubgraphConfig(config with { Clients = clients });
7793
await File.WriteAllTextAsync(configFile.FullName, configJson, cancellationToken);
7894
}
7995
}

src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetNameCommand.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.CommandLine;
22
using HotChocolate.Fusion.CommandLine.Helpers;
33
using HotChocolate.Fusion.CommandLine.Options;
4+
using HotChocolate.Utilities;
45
using static System.IO.Path;
56
using static HotChocolate.Fusion.CommandLine.Helpers.PackageHelper;
67
using static HotChocolate.Fusion.CommandLine.Defaults;
@@ -49,6 +50,15 @@ private static async Task ExecuteAsync(
4950
var configJson = FormatSubgraphConfig(config);
5051
await File.WriteAllTextAsync(configFile.FullName, configJson, cancellationToken);
5152
}
53+
else if (configFile.Extension.EqualsOrdinal(".fsp"))
54+
{
55+
var config = await LoadSubgraphConfigFromSubgraphPackageAsync(configFile.FullName, cancellationToken);
56+
57+
await ReplaceSubgraphConfigInSubgraphPackageAsync(
58+
configFile.FullName,
59+
config with { Name = subgraphName },
60+
cancellationToken);
61+
}
5262
else
5363
{
5464
var config = await LoadSubgraphConfigAsync(configFile.FullName, cancellationToken);

src/HotChocolate/Fusion/src/CommandLine/Commands/SubgraphConfigSetWebSocketCommand.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
using HotChocolate.Fusion.CommandLine.Helpers;
33
using HotChocolate.Fusion.CommandLine.Options;
44
using HotChocolate.Fusion.Composition;
5+
using HotChocolate.Utilities;
56
using static System.IO.Path;
67
using static HotChocolate.Fusion.CommandLine.Defaults;
8+
using static HotChocolate.Fusion.CommandLine.Helpers.PackageHelper;
79

810
namespace HotChocolate.Fusion.CommandLine.Commands;
911

@@ -61,19 +63,33 @@ private static async Task ExecuteAsync(
6163
{
6264
new WebSocketClientConfiguration(uri, clientName)
6365
});
64-
var configJson = PackageHelper.FormatSubgraphConfig(config);
66+
var configJson = FormatSubgraphConfig(config);
6567
await File.WriteAllTextAsync(configFile.FullName, configJson, cancellationToken);
6668
}
69+
else if (configFile.Extension.EqualsOrdinal(".fsp"))
70+
{
71+
var config = await LoadSubgraphConfigFromSubgraphPackageAsync(configFile.FullName, cancellationToken);
72+
73+
var clients = config.Clients.ToList();
74+
75+
clients.RemoveAll(t => t is WebSocketClientConfiguration);
76+
clients.Add(new WebSocketClientConfiguration(uri, clientName));
77+
78+
await ReplaceSubgraphConfigInSubgraphPackageAsync(
79+
configFile.FullName,
80+
config with { Clients = clients },
81+
cancellationToken);
82+
}
6783
else
6884
{
69-
var config = await PackageHelper.LoadSubgraphConfigAsync(configFile.FullName, cancellationToken);
85+
var config = await LoadSubgraphConfigAsync(configFile.FullName, cancellationToken);
7086

7187
var clients = config.Clients.ToList();
7288

7389
clients.RemoveAll(t => t is WebSocketClientConfiguration);
7490
clients.Add(new WebSocketClientConfiguration(uri, clientName));
7591

76-
var configJson = PackageHelper.FormatSubgraphConfig(config with { Clients = clients });
92+
var configJson = FormatSubgraphConfig(config with { Clients = clients });
7793
await File.WriteAllTextAsync(configFile.FullName, configJson, cancellationToken);
7894
}
7995
}

src/HotChocolate/Fusion/src/CommandLine/Helpers/PackageHelper.cs

Lines changed: 32 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ internal static class PackageHelper
2020
private const string _schemaExtensionKind = "urn:graphql:schema-extensions";
2121
private const string _subgraphConfigKind = "urn:hotchocolate:fusion:subgraph-config";
2222
private const string _subgraphConfigId = "subgraph-config";
23-
private const string _subgraphPackageKind = "urn:hotchocolate:fusion:subgraph-package";
2423

2524
public static async Task CreateSubgraphPackageAsync(
2625
string packageFile,
@@ -46,6 +45,24 @@ public static async Task CreateSubgraphPackageAsync(
4645
await AddTransportConfigToPackage(package, transportConfig);
4746
await AddSchemaExtensionsToPackage(package, extensions);
4847
}
48+
49+
public static async Task<SubgraphConfigurationDto> LoadSubgraphConfigFromSubgraphPackageAsync(
50+
string packageFile,
51+
CancellationToken ct = default)
52+
{
53+
using var package = Package.Open(packageFile, FileMode.Open, FileAccess.Read);
54+
var transportConfig = await ReadSubgraphConfigPartAsync(package, ct);
55+
return transportConfig;
56+
}
57+
58+
public static async Task ReplaceSubgraphConfigInSubgraphPackageAsync(
59+
string packageFile,
60+
SubgraphConfigurationDto config,
61+
CancellationToken ct = default)
62+
{
63+
using var package = Package.Open(packageFile, FileMode.Open, FileAccess.Read);
64+
await ReplaceTransportConfigInPackageAsync(package, config);
65+
}
4966

5067
public static async Task CreateSubgraphPackageAsync(
5168
Stream stream,
@@ -66,32 +83,6 @@ public static async Task CreateSubgraphPackageAsync(
6683
await AddSchemaExtensionsToPackage(package, extensions);
6784
}
6885

69-
public static async Task CreateFusionPackageAsync(
70-
string packageFile,
71-
DocumentNode schema,
72-
DocumentNode fusionGraph,
73-
IEnumerable<SubgraphConfiguration> subgraphConfigs)
74-
{
75-
if (File.Exists(packageFile))
76-
{
77-
File.Delete(packageFile);
78-
}
79-
80-
using var package = Package.Open(packageFile, FileMode.Create);
81-
82-
await AddSchemaToPackageAsync(package, schema);
83-
await AddFusionGraphToPackageAsync(package, fusionGraph);
84-
85-
foreach (var subgraphConfig in subgraphConfigs)
86-
{
87-
var uri = CreatePartUri(new Uri($"subgraphs/{subgraphConfig.Name}", Relative));
88-
var part = package.CreatePart(uri, "application/subgraph-package");
89-
await using var stream = part.GetStream(FileMode.Create);
90-
await CreateSubgraphPackageAsync(stream, subgraphConfig);
91-
package.CreateRelationship(part.Uri, TargetMode.Internal, _subgraphPackageKind);
92-
}
93-
}
94-
9586
public static async Task<SubgraphConfiguration> ReadSubgraphPackageAsync(
9687
string packageFile,
9788
CancellationToken cancellationToken = default)
@@ -115,25 +106,6 @@ public static async Task<SubgraphConfiguration> ReadSubgraphPackageAsync(
115106
subgraphConfig.Clients);
116107
}
117108

118-
public static async Task<SubgraphConfiguration[]> ReadSubgraphConfigsFromFusionPackageAsync(
119-
string packageFile,
120-
CancellationToken cancellationToken = default)
121-
{
122-
using var package = Package.Open(packageFile, FileMode.Open, FileAccess.Read);
123-
var configs = new List<SubgraphConfiguration>();
124-
125-
foreach (var extensionRel in package.GetRelationshipsByType(_subgraphPackageKind))
126-
{
127-
var schemaPart = package.GetPart(extensionRel.TargetUri);
128-
await using var stream = schemaPart.GetStream(FileMode.Open, FileAccess.Read);
129-
using var subgraphPackage = Package.Open(stream, FileMode.Open, FileAccess.Read);
130-
var config = await ReadSubgraphPackageAsync(subgraphPackage, cancellationToken);
131-
configs.Add(config);
132-
}
133-
134-
return configs.ToArray();
135-
}
136-
137109
public static async Task ExtractSubgraphPackageAsync(
138110
string packageFile,
139111
string targetDirectory,
@@ -303,33 +275,6 @@ public static string FormatSubgraphConfig(
303275
return Encoding.UTF8.GetString(buffer.WrittenSpan);
304276
}
305277

306-
private static async Task AddFusionGraphToPackageAsync(
307-
Package package,
308-
DocumentNode schema)
309-
{
310-
var uri = CreatePartUri(new Uri("fusion.graphql", Relative));
311-
var part = package.CreatePart(uri, "application/graphql-schema");
312-
313-
await using var stream = part.GetStream(FileMode.Create);
314-
await using var writer = new StreamWriter(stream, Encoding.UTF8);
315-
await writer.WriteAsync(schema.ToString(true));
316-
317-
package.CreateRelationship(part.Uri, TargetMode.Internal, _fusionKind, _fusionId);
318-
}
319-
320-
private static async Task<DocumentNode> ReadFusionGraphPartAsync(
321-
Package package,
322-
CancellationToken ct)
323-
{
324-
var schemaRel = package.GetRelationship(_fusionId);
325-
var schemaPart = package.GetPart(schemaRel.TargetUri);
326-
327-
await using var stream = schemaPart.GetStream(FileMode.Open);
328-
using var reader = new StreamReader(stream, Encoding.UTF8);
329-
var schema = await reader.ReadToEndAsync(ct);
330-
return Utf8GraphQLParser.Parse(schema);
331-
}
332-
333278
private static async Task AddSchemaToPackageAsync(
334279
Package package,
335280
DocumentNode schema)
@@ -406,6 +351,20 @@ private static async Task AddTransportConfigToPackage(
406351

407352
package.CreateRelationship(part.Uri, TargetMode.Internal, _subgraphConfigKind, _subgraphConfigId);
408353
}
354+
355+
private static async Task ReplaceTransportConfigInPackageAsync(
356+
Package package,
357+
SubgraphConfigurationDto subgraphConfig)
358+
{
359+
var uri = CreatePartUri(new Uri("subgraph.json", Relative));
360+
var part = package.GetPart(uri);
361+
362+
await using var stream = part.GetStream(FileMode.Create);
363+
await using var writer = new StreamWriter(stream, Encoding.UTF8);
364+
await writer.WriteAsync(FormatSubgraphConfig(subgraphConfig));
365+
366+
package.CreateRelationship(part.Uri, TargetMode.Internal, _subgraphConfigKind, _subgraphConfigId);
367+
}
409368

410369
private static async Task<SubgraphConfigurationDto> ReadSubgraphConfigPartAsync(
411370
Package package,

0 commit comments

Comments
 (0)