-
Notifications
You must be signed in to change notification settings - Fork 244
Expand file tree
/
Copy pathGateway.cs
More file actions
246 lines (200 loc) · 9.71 KB
/
Gateway.cs
File metadata and controls
246 lines (200 loc) · 9.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
using Azure.Core.Pipeline;
using Flurl;
using LanguageExt;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
namespace common;
public sealed record GatewayName : ResourceName, IResourceName<GatewayName>
{
public static GatewayName Managed { get; } = From("managed");
private GatewayName(string value) : base(value) { }
public static GatewayName From(string value) => new(value);
}
public sealed record GatewaysUri : ResourceUri
{
public required ManagementServiceUri ServiceUri { get; init; }
private static string PathSegment { get; } = "gateways";
protected override Uri Value => ServiceUri.ToUri().AppendPathSegment(PathSegment).ToUri();
public static GatewaysUri From(ManagementServiceUri serviceUri) =>
new() { ServiceUri = serviceUri };
}
public sealed record GatewayUri : ResourceUri
{
public required GatewaysUri Parent { get; init; }
public required GatewayName Name { get; init; }
protected override Uri Value => Parent.ToUri().AppendPathSegment(Name.ToString()).ToUri();
public static GatewayUri From(GatewayName name, ManagementServiceUri serviceUri) =>
new()
{
Parent = GatewaysUri.From(serviceUri),
Name = name
};
}
public sealed record GatewaysDirectory : ResourceDirectory
{
public required ManagementServiceDirectory ServiceDirectory { get; init; }
private static string Name { get; } = "gateways";
protected override DirectoryInfo Value =>
ServiceDirectory.ToDirectoryInfo().GetChildDirectory(Name);
public static GatewaysDirectory From(ManagementServiceDirectory serviceDirectory) =>
new() { ServiceDirectory = serviceDirectory };
public static Option<GatewaysDirectory> TryParse(DirectoryInfo? directory, ManagementServiceDirectory serviceDirectory) =>
directory is not null &&
directory.Name == Name &&
directory.Parent?.FullName == serviceDirectory.ToDirectoryInfo().FullName
? new GatewaysDirectory { ServiceDirectory = serviceDirectory }
: Option<GatewaysDirectory>.None;
}
public sealed record GatewayDirectory : ResourceDirectory
{
public required GatewaysDirectory Parent { get; init; }
public required GatewayName Name { get; init; }
protected override DirectoryInfo Value =>
Parent.ToDirectoryInfo().GetChildDirectory(Name.ToString());
public static GatewayDirectory From(GatewayName name, ManagementServiceDirectory serviceDirectory) =>
new()
{
Parent = GatewaysDirectory.From(serviceDirectory),
Name = name
};
public static Option<GatewayDirectory> TryParse(DirectoryInfo? directory, ManagementServiceDirectory serviceDirectory) =>
from parent in GatewaysDirectory.TryParse(directory?.Parent, serviceDirectory)
select new GatewayDirectory
{
Parent = parent,
Name = GatewayName.From(directory!.Name)
};
}
public sealed record GatewayInformationFile : ResourceFile
{
public required GatewayDirectory Parent { get; init; }
private static string Name { get; } = "gatewayInformation.json";
protected override FileInfo Value =>
Parent.ToDirectoryInfo().GetChildFile(Name);
public static GatewayInformationFile From(GatewayName name, ManagementServiceDirectory serviceDirectory) =>
new()
{
Parent = new GatewayDirectory
{
Parent = GatewaysDirectory.From(serviceDirectory),
Name = name
}
};
public static Option<GatewayInformationFile> TryParse(FileInfo? file, ManagementServiceDirectory serviceDirectory) =>
file is not null && file.Name == Name
? from parent in GatewayDirectory.TryParse(file.Directory, serviceDirectory)
select new GatewayInformationFile { Parent = parent }
: Option<GatewayInformationFile>.None;
}
public sealed record GatewayDto
{
public static GatewayDto Managed { get; } = new()
{
Properties = new GatewayContract
{
Description = null,
LocationData = null
}
};
[JsonPropertyName("properties")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public required GatewayContract Properties { get; init; }
public sealed record GatewayContract
{
[JsonPropertyName("description")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public string? Description { get; init; }
[JsonPropertyName("locationData")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public ResourceLocationDataContract? LocationData { get; init; }
}
public sealed record ResourceLocationDataContract
{
[JsonPropertyName("city")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public string? City { get; init; }
[JsonPropertyName("countryOrRegion")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public string? CountryOrRegion { get; init; }
[JsonPropertyName("district")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public string? District { get; init; }
[JsonPropertyName("name")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public string? Name { get; init; }
}
}
public static class GatewayModule
{
public static async ValueTask DeleteAll(this GatewaysUri uri, HttpPipeline pipeline, CancellationToken cancellationToken) =>
await uri.ListNames(pipeline, cancellationToken)
.IterParallel(async name => await GatewayUri.From(name, uri.ServiceUri)
.Delete(pipeline, cancellationToken),
cancellationToken);
public static IAsyncEnumerable<GatewayName> ListNames(this GatewaysUri uri, HttpPipeline pipeline, CancellationToken cancellationToken)
{
var exceptionHandler = (HttpRequestException exception) =>
exception.StatusCode == HttpStatusCode.BadRequest
&& exception.Message.Contains("MethodNotAllowedInPricingTier", StringComparison.OrdinalIgnoreCase)
? AsyncEnumerable.Empty<GatewayName>()
: throw exception;
return pipeline.ListJsonObjects(uri.ToUri(), cancellationToken)
.Select(jsonObject => jsonObject.GetStringProperty("name"))
.Select(GatewayName.From)
.Catch(exceptionHandler);
}
public static IAsyncEnumerable<(GatewayName Name, GatewayDto Dto)> List(this GatewaysUri gatewaysUri, HttpPipeline pipeline, CancellationToken cancellationToken) =>
gatewaysUri.ListNames(pipeline, cancellationToken)
.SelectAwait(async name =>
{
var uri = new GatewayUri { Parent = gatewaysUri, Name = name };
var dto = await uri.GetDto(pipeline, cancellationToken);
return (name, dto);
});
public static async ValueTask<Option<GatewayDto>> TryGetDto(this GatewayUri uri, HttpPipeline pipeline, CancellationToken cancellationToken)
{
var contentOption = await pipeline.GetContentOption(uri.ToUri(), cancellationToken);
return contentOption.Map(content => content.ToObjectFromJson<GatewayDto>());
}
public static async ValueTask<GatewayDto> GetDto(this GatewayUri uri, HttpPipeline pipeline, CancellationToken cancellationToken)
{
var content = await pipeline.GetContent(uri.ToUri(), cancellationToken);
return content.ToObjectFromJson<GatewayDto>();
}
public static async ValueTask Delete(this GatewayUri uri, HttpPipeline pipeline, CancellationToken cancellationToken) =>
await pipeline.DeleteResource(uri.ToUri(), waitForCompletion: true, cancellationToken);
public static async ValueTask PutDto(this GatewayUri uri, GatewayDto dto, HttpPipeline pipeline, CancellationToken cancellationToken)
{
var content = BinaryData.FromObjectAsJson(dto);
await pipeline.PutContent(uri.ToUri(), content, cancellationToken);
}
public static IEnumerable<GatewayDirectory> ListDirectories(ManagementServiceDirectory serviceDirectory)
{
var gatewaysDirectory = GatewaysDirectory.From(serviceDirectory);
return gatewaysDirectory.ToDirectoryInfo()
.ListDirectories("*")
.Select(directoryInfo => GatewayName.From(directoryInfo.Name))
.Select(name => new GatewayDirectory { Parent = gatewaysDirectory, Name = name });
}
public static IEnumerable<GatewayInformationFile> ListInformationFiles(ManagementServiceDirectory serviceDirectory) =>
ListDirectories(serviceDirectory)
.Select(directory => new GatewayInformationFile { Parent = directory })
.Where(informationFile => informationFile.ToFileInfo().Exists());
public static async ValueTask WriteDto(this GatewayInformationFile file, GatewayDto dto, CancellationToken cancellationToken)
{
var content = BinaryData.FromObjectAsJson(dto, JsonObjectExtensions.SerializerOptions);
await file.ToFileInfo().OverwriteWithBinaryData(content, cancellationToken);
}
public static async ValueTask<GatewayDto> ReadDto(this GatewayInformationFile file, CancellationToken cancellationToken)
{
var content = await file.ToFileInfo().ReadAsBinaryData(cancellationToken);
return content.ToObjectFromJson<GatewayDto>();
}
}