Skip to content

Commit 865a104

Browse files
Add upload command
1 parent 9213e4c commit 865a104

File tree

8 files changed

+1746
-282
lines changed

8 files changed

+1746
-282
lines changed

src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/OpenApi/OpenApiCommand.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ public OpenApiCommand() : base("openapi")
1111
AddCommand(new CreateOpenApiCollectionCommand());
1212
AddCommand(new DeleteOpenApiCollectionCommand());
1313
AddCommand(new ListOpenApiCollectionCommand());
14+
AddCommand(new UploadOpenApiCollectionCommand());
1415
}
1516
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
using ChilliCream.Nitro.CommandLine.Cloud.Client;
2+
using ChilliCream.Nitro.CommandLine.Cloud.Helpers;
3+
using ChilliCream.Nitro.CommandLine.Cloud.Option;
4+
using ChilliCream.Nitro.CommandLine.Cloud.Option.Binders;
5+
using StrawberryShake;
6+
using Command = System.CommandLine.Command;
7+
8+
namespace ChilliCream.Nitro.CommandLine.Cloud;
9+
10+
internal sealed class UploadOpenApiCollectionCommand : Command
11+
{
12+
public UploadOpenApiCollectionCommand() : base("upload")
13+
{
14+
Description = "Upload a new OpenAPI collection version";
15+
16+
AddOption(Opt<TagOption>.Instance);
17+
AddOption(Opt<OpenApiCollectionFileOption>.Instance);
18+
AddOption(Opt<OpenApiCollectionIdOption>.Instance);
19+
20+
this.SetHandler(
21+
ExecuteAsync,
22+
Bind.FromServiceProvider<IAnsiConsole>(),
23+
Bind.FromServiceProvider<IApiClient>(),
24+
Opt<TagOption>.Instance,
25+
Opt<OpenApiCollectionFileOption>.Instance,
26+
Opt<OpenApiCollectionIdOption>.Instance,
27+
Bind.FromServiceProvider<CancellationToken>());
28+
}
29+
30+
private static async Task<int> ExecuteAsync(
31+
IAnsiConsole console,
32+
IApiClient client,
33+
string tag,
34+
FileInfo operationsFile,
35+
string openApiCollectionId,
36+
CancellationToken cancellationToken)
37+
{
38+
console.Title($"Uploading OpenAPI collection {operationsFile.FullName.EscapeMarkup()}");
39+
40+
if (console.IsHumanReadable())
41+
{
42+
await console
43+
.Status()
44+
.Spinner(Spinner.Known.BouncingBar)
45+
.SpinnerStyle(Style.Parse("green bold"))
46+
.StartAsync("Uploading OpenAPI collection...", UploadOpenApiCollection);
47+
}
48+
else
49+
{
50+
await UploadOpenApiCollection(null);
51+
}
52+
53+
return ExitCodes.Success;
54+
55+
async Task UploadOpenApiCollection(StatusContext? ctx)
56+
{
57+
console.Log("Initialized");
58+
console.Log($"Reading file [blue]{operationsFile.FullName.EscapeMarkup()}[/]");
59+
60+
var stream = FileHelpers.CreateFileStream(operationsFile);
61+
62+
var input = new UploadOpenApiCollectionInput
63+
{
64+
Collection = new Upload(stream, "operations.graphql"),
65+
OpenApiCollectionId = openApiCollectionId,
66+
Tag = tag
67+
};
68+
69+
console.Log("Uploading OpenAPI collection..");
70+
var result = await client.UploadOpenApiCollectionCommandMutation.ExecuteAsync(input, cancellationToken);
71+
72+
console.EnsureNoErrors(result);
73+
var data = console.EnsureData(result);
74+
console.PrintErrorsAndExit(data.UploadOpenApiCollection.Errors);
75+
76+
if (data.UploadOpenApiCollection.OpenApiCollectionVersion?.Id is null)
77+
{
78+
throw new ExitException("Upload of OpenAPI collection failed!");
79+
}
80+
81+
console.Success("Successfully uploaded OpenAPI collection!");
82+
}
83+
}
84+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
mutation UploadOpenApiCollectionCommandMutation($input: UploadOpenApiCollectionInput!) {
2+
uploadOpenApiCollection(input: $input) {
3+
openApiCollectionVersion {
4+
id
5+
}
6+
errors {
7+
...UnauthorizedOperation
8+
...OpenApiCollectionNotFoundError
9+
...DuplicatedTagError
10+
...ConcurrentOperationError
11+
...Error
12+
}
13+
}
14+
}

src/Nitro/CommandLine/src/CommandLine.Cloud/Generated/ApiClient.Client.cs

Lines changed: 1521 additions & 271 deletions
Large diffs are not rendered by default.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace ChilliCream.Nitro.CommandLine.Cloud.Option;
2+
3+
internal sealed class OpenApiCollectionFileOption : Option<FileInfo>
4+
{
5+
public OpenApiCollectionFileOption() : base("--openapi-collection-file")
6+
{
7+
Description = "The path to an OpenAPI collection archive";
8+
IsRequired = true;
9+
this.DefaultFileFromEnvironmentValue("OPENAPI_COLLECTION_FILE");
10+
}
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace ChilliCream.Nitro.CommandLine.Cloud.Option;
2+
3+
internal sealed class OpenApiCollectionIdOption : Option<string>
4+
{
5+
public OpenApiCollectionIdOption() : base("--openapi-collection-id")
6+
{
7+
Description = "The id of the OpenAPI collection";
8+
IsRequired = true;
9+
this.DefaultFromEnvironmentValue("OPENAPI_COLLECTION_ID");
10+
}
11+
}

src/Nitro/CommandLine/src/CommandLine.Cloud/persisted/operations.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)