-
Notifications
You must be signed in to change notification settings - Fork 0
/
LightroomClient.cs
131 lines (117 loc) · 4.94 KB
/
LightroomClient.cs
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
using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;
using ldam.co.za.lib.Configuration;
using Microsoft.Extensions.Options;
namespace ldam.co.za.lib.Lightroom;
public class LightroomClient : ILightroomClient, IDisposable
{
private readonly HttpClient httpClient;
private readonly IAccessTokenProvider accessTokenProvider;
private static readonly Regex WhileRegex = new(@"^while\s*\(\s*1\s*\)\s*{\s*}\s*", RegexOptions.Compiled);
public LightroomClient(IHttpClientFactory httpClientFactory, IAccessTokenProvider accessTokenProvider, IOptionsSnapshot<LightroomOptions> options)
{
this.accessTokenProvider = accessTokenProvider;
httpClient = httpClientFactory.CreateClient("lightroom");
httpClient.DefaultRequestHeaders.Add("X-API-KEY", options.Value.ClientId);
httpClient.BaseAddress = options.Value.BaseUrl;
}
protected async Task<HttpRequestMessage> PrepareRequest(HttpMethod method, string resource)
{
var request = new HttpRequestMessage();
var accessToken = await accessTokenProvider.GetAccessToken();
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
request.RequestUri = new Uri(resource, UriKind.Relative);
request.Method = method;
return request;
}
protected static async Task<T> HandleResponse<T>(HttpResponseMessage response, bool stripWhile = true)
{
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
if (stripWhile)
{
content = WhileRegex.Replace(content, "");
}
var result = (T)JsonSerializer.Deserialize(content, typeof(T), LightroomSerializerContext.Default);
return result;
}
public void Dispose()
{
httpClient.Dispose();
GC.SuppressFinalize(this);
}
public async Task<CatalogResponse> GetCatalog()
{
var request = await PrepareRequest(HttpMethod.Get, "v2/catalog");
var response = await httpClient.SendAsync(request);
var result = await HandleResponse<CatalogResponse>(response);
return result;
}
public async Task<HealthResponse> GetHealth()
{
var request = await PrepareRequest(HttpMethod.Get, "v2/health");
var response = await httpClient.SendAsync(request);
var result = await HandleResponse<HealthResponse>(response);
return result;
}
public async Task<AlbumsResponse> GetAlbums(string catalogId, string after = null)
{
var builder = new StringBuilder();
builder.Append("v2/catalogs/");
builder.Append(catalogId);
builder.Append("/albums");
if (!string.IsNullOrWhiteSpace(after))
{
builder.Append("?name_after=");
builder.Append(after);
}
var request = await PrepareRequest(HttpMethod.Get, builder.ToString());
var response = await httpClient.SendAsync(request);
var result = await HandleResponse<AlbumsResponse>(response);
return result;
}
public async Task<AlbumAssetResponse> GetAlbumAssets(string catalogId, string albumId, string after = null)
{
var builder = new StringBuilder();
builder.Append("v2/catalogs/");
builder.Append(catalogId);
builder.Append("/albums/");
builder.Append(albumId);
builder.Append("/assets?embed=asset;spaces;user&subtype=image");
if (!string.IsNullOrWhiteSpace(after))
{
builder.Append("captured_after=");
builder.Append(after);
}
var request = await PrepareRequest(HttpMethod.Get, builder.ToString());
var response = await httpClient.SendAsync(request);
var result = await HandleResponse<AlbumAssetResponse>(response);
return result;
}
public async Task<AssetResponse> GetAsset(string catalogId, string assetId)
{
var request = await PrepareRequest(HttpMethod.Get, $"v2/catalogs/{catalogId}/assets/{assetId}");
var response = await httpClient.SendAsync(request);
var result = await HandleResponse<AssetResponse>(response);
return result;
}
public async Task<Stream> GetImageStream(string catalogId, string assetId, string size)
{
var asset = await GetAsset(catalogId, assetId);
var href = asset.Links[$"/rels/rendition_type/{size}"]?.Href;
if (string.IsNullOrWhiteSpace(href))
{
throw new InvalidOperationException($"Size {size} is not available");
}
var builder = new StringBuilder();
builder.Append("v2/catalogs/");
builder.Append(catalogId);
builder.Append('/');
builder.Append(href);
var request = await PrepareRequest(HttpMethod.Get, builder.ToString());
var response = await httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStreamAsync();
}
}