313 lines
16 KiB
C#
313 lines
16 KiB
C#
using Band.Models;
|
|
using System.Text.Json;
|
|
|
|
namespace Band.Services;
|
|
|
|
public class BandService(ILogger<Program> logger, AppSettings appSettings, IHttpClientFactory httpClientFactory) {
|
|
|
|
#pragma warning disable CS9124
|
|
private readonly ILogger<Program> _Logger = logger;
|
|
private readonly Models.Band _Band = appSettings.Settings.Band ?? throw new Exception();
|
|
private readonly IHttpClientFactory _HttpClientFactory = httpClientFactory;
|
|
#pragma warning restore CS9124
|
|
|
|
public string? GetAuthorizationCode() {
|
|
string? result;
|
|
HttpClient httpClient = _HttpClientFactory.CreateClient(nameof(AppSettings.Settings.Band));
|
|
result = GetAuthorizationCode(_Logger, _Band, httpClient);
|
|
httpClient.Dispose();
|
|
return result;
|
|
}
|
|
|
|
private static string? GetAuthorizationCode(ILogger<Program> logger, Models.Band band, HttpClient httpClient) {
|
|
string? result;
|
|
Uri requestUri = new($"https://auth.band.us/oauth2/authorize?response_type=code&client_id={band.ClientId}&redirect_uri={band.Redirect}");
|
|
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(requestUri);
|
|
result = GetString(logger, requestUri, httpResponseMessage, System.Net.HttpStatusCode.Redirect);
|
|
return result;
|
|
}
|
|
|
|
public Token? GetToken(string code) {
|
|
Token? result;
|
|
HttpClient httpClient = _HttpClientFactory.CreateClient(nameof(AppSettings.Settings.Band));
|
|
result = GetToken(_Logger, _Band, code, httpClient);
|
|
httpClient.Dispose();
|
|
return result;
|
|
}
|
|
|
|
private static Token? GetToken(ILogger<Program> logger, Models.Band band, string code, HttpClient httpClient) {
|
|
Token? result;
|
|
Uri requestUri = new($"https://auth.band.us/oauth2/token?grant_type=authorization_code&code={code}");
|
|
HttpRequestMessage httpRequestMessage = new(HttpMethod.Get, requestUri);
|
|
httpRequestMessage.Headers.Add("Authorization", $"Basic {band.BasicAuthorization}");
|
|
Task<HttpResponseMessage> httpResponseMessage = httpClient.SendAsync(httpRequestMessage);
|
|
string? content = GetString(logger, requestUri, httpResponseMessage, System.Net.HttpStatusCode.OK);
|
|
result = content is null ? null : JsonSerializer.Deserialize(content, TokenSourceGenerationContext.Default.Token);
|
|
return result;
|
|
}
|
|
|
|
public Models.Bands.Root? GetBands(Dictionary<string, Token>? tokens) {
|
|
Models.Bands.Root? result;
|
|
Token? token = GetToken(tokens);
|
|
if (token is null) {
|
|
_Logger.LogWarning("Unable to get token");
|
|
result = null;
|
|
} else {
|
|
HttpClient httpClient = _HttpClientFactory.CreateClient(nameof(AppSettings.Settings.Band));
|
|
result = GetBands(_Logger, httpClient, token);
|
|
httpClient.Dispose();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static Token? GetToken(Dictionary<string, Token>? tokens) =>
|
|
tokens is null || tokens.Count == 0 ? null : tokens.ElementAt(0).Value;
|
|
|
|
private static string? GetString(ILogger<Program> logger, Uri requestUri, Task<HttpResponseMessage> httpResponseMessage, System.Net.HttpStatusCode httpStatusCode) {
|
|
string? result;
|
|
httpResponseMessage.Wait();
|
|
if (httpResponseMessage.Result.StatusCode != httpStatusCode) {
|
|
result = null;
|
|
logger.LogWarning("{StatusCode}: {requestUri}", httpResponseMessage.Result.StatusCode, requestUri.OriginalString);
|
|
} else {
|
|
Task<string> content = httpResponseMessage.Result.Content.ReadAsStringAsync();
|
|
content.Wait();
|
|
result = content.Result;
|
|
logger.LogDebug("{content}", result);
|
|
httpResponseMessage.Dispose();
|
|
content.Dispose();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static Models.Bands.Root? GetBands(ILogger<Program> logger, HttpClient httpClient, Token token) {
|
|
Models.Bands.Root? result;
|
|
Uri requestUri = new($"{httpClient.BaseAddress}v2.1/bands?access_token={token.AccessToken}");
|
|
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(requestUri);
|
|
string? content = GetString(logger, requestUri, httpResponseMessage, System.Net.HttpStatusCode.OK);
|
|
result = content is null ? null : JsonSerializer.Deserialize(content, Models.Bands.BandsRootSourceGenerationContext.Default.Root);
|
|
return result;
|
|
}
|
|
|
|
public Models.Profile.Root? GetProfile(Dictionary<string, Token>? tokens, string bandKey) {
|
|
Models.Profile.Root? result;
|
|
Token? token = GetToken(tokens);
|
|
if (token is null) {
|
|
_Logger.LogWarning("Unable to get token");
|
|
result = null;
|
|
} else {
|
|
HttpClient httpClient = _HttpClientFactory.CreateClient(nameof(AppSettings.Settings.Band));
|
|
result = GetProfile(_Logger, httpClient, token, bandKey);
|
|
httpClient.Dispose();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static Models.Profile.Root? GetProfile(ILogger<Program> logger, HttpClient httpClient, Token token, string bandKey) {
|
|
Models.Profile.Root? result;
|
|
Uri requestUri = new($"{httpClient.BaseAddress}v2/profile?access_token={token.AccessToken}&band_key={bandKey}");
|
|
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(requestUri);
|
|
string? content = GetString(logger, requestUri, httpResponseMessage, System.Net.HttpStatusCode.OK);
|
|
result = content is null ? null : JsonSerializer.Deserialize(content, Models.Profile.ProfileRootSourceGenerationContext.Default.Root);
|
|
return result;
|
|
}
|
|
|
|
public Models.Posts.Root? GetPosts(Dictionary<string, Token>? tokens, string bandKey) {
|
|
Models.Posts.Root? result;
|
|
Token? token = GetToken(tokens);
|
|
if (token is null) {
|
|
_Logger.LogWarning("Unable to get token");
|
|
result = null;
|
|
} else {
|
|
HttpClient httpClient = _HttpClientFactory.CreateClient(nameof(AppSettings.Settings.Band));
|
|
result = GetPosts(_Logger, httpClient, token, bandKey);
|
|
httpClient.Dispose();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static Models.Posts.Root? GetPosts(ILogger<Program> logger, HttpClient httpClient, Token token, string bandKey) {
|
|
Models.Posts.Root? result;
|
|
Uri requestUri = new($"{httpClient.BaseAddress}v2/band/posts?access_token={token.AccessToken}&band_key={bandKey}&locale=en_US");
|
|
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(requestUri);
|
|
string? content = GetString(logger, requestUri, httpResponseMessage, System.Net.HttpStatusCode.OK);
|
|
result = content is null ? null : JsonSerializer.Deserialize(content, Models.Posts.PostsRootSourceGenerationContext.Default.Root);
|
|
return result;
|
|
}
|
|
|
|
public Models.Post.Root? GetPost(Dictionary<string, Token>? tokens, string bandKey, string postKey) {
|
|
Models.Post.Root? result;
|
|
Token? token = GetToken(tokens);
|
|
if (token is null) {
|
|
_Logger.LogWarning("Unable to get token");
|
|
result = null;
|
|
} else {
|
|
HttpClient httpClient = _HttpClientFactory.CreateClient(nameof(AppSettings.Settings.Band));
|
|
result = GetPost(_Logger, httpClient, token, bandKey, postKey);
|
|
httpClient.Dispose();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static Models.Post.Root? GetPost(ILogger<Program> logger, HttpClient httpClient, Token token, string bandKey, string postKey) {
|
|
Models.Post.Root? result;
|
|
Uri requestUri = new($"{httpClient.BaseAddress}v2/band/post?access_token={token.AccessToken}&band_key={bandKey}&post_key={postKey}");
|
|
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(requestUri);
|
|
string? content = GetString(logger, requestUri, httpResponseMessage, System.Net.HttpStatusCode.OK);
|
|
result = content is null ? null : JsonSerializer.Deserialize(content, Models.Post.PostRootSourceGenerationContext.Default.Root);
|
|
return result;
|
|
}
|
|
|
|
public Models.Comments.Root? GetComments(Dictionary<string, Token>? tokens, string bandKey, string postKey, string sort) {
|
|
Models.Comments.Root? result;
|
|
Token? token = GetToken(tokens);
|
|
if (token is null) {
|
|
_Logger.LogWarning("Unable to get token");
|
|
result = null;
|
|
} else {
|
|
HttpClient httpClient = _HttpClientFactory.CreateClient(nameof(AppSettings.Settings.Band));
|
|
result = GetComments(_Logger, httpClient, token, bandKey, postKey, sort);
|
|
httpClient.Dispose();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static Models.Comments.Root? GetComments(ILogger<Program> logger, HttpClient httpClient, Token token, string bandKey, string postKey, string sort) {
|
|
Models.Comments.Root? result;
|
|
Uri requestUri = new($"{httpClient.BaseAddress}v2/band/post/comments?access_token={token.AccessToken}&band_key={bandKey}&post_key={postKey}&sort={sort}");
|
|
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(requestUri);
|
|
string? content = GetString(logger, requestUri, httpResponseMessage, System.Net.HttpStatusCode.OK);
|
|
result = content is null ? null : JsonSerializer.Deserialize(content, Models.Comments.CommentsRootSourceGenerationContext.Default.Root);
|
|
return result;
|
|
}
|
|
|
|
public Models.Albums.Root? GetAlbums(Dictionary<string, Token>? tokens, string bandKey) {
|
|
Models.Albums.Root? result;
|
|
Token? token = GetToken(tokens);
|
|
if (token is null) {
|
|
_Logger.LogWarning("Unable to get token");
|
|
result = null;
|
|
} else {
|
|
HttpClient httpClient = _HttpClientFactory.CreateClient(nameof(AppSettings.Settings.Band));
|
|
result = GetAlbums(_Logger, httpClient, token, bandKey);
|
|
httpClient.Dispose();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static Models.Albums.Root? GetAlbums(ILogger<Program> logger, HttpClient httpClient, Token token, string bandKey) {
|
|
Models.Albums.Root? result;
|
|
Uri requestUri = new($"{httpClient.BaseAddress}v2/band/albums?access_token={token.AccessToken}&band_key={bandKey}");
|
|
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(requestUri);
|
|
string? content = GetString(logger, requestUri, httpResponseMessage, System.Net.HttpStatusCode.OK);
|
|
result = content is null ? null : JsonSerializer.Deserialize(content, Models.Albums.AlbumsRootSourceGenerationContext.Default.Root);
|
|
return result;
|
|
}
|
|
|
|
public Models.Photos.Root? GetPhotos(Dictionary<string, Token>? tokens, string bandKey, string photoAlbumKey) {
|
|
Models.Photos.Root? result;
|
|
Token? token = GetToken(tokens);
|
|
if (token is null) {
|
|
_Logger.LogWarning("Unable to get token");
|
|
result = null;
|
|
} else {
|
|
HttpClient httpClient = _HttpClientFactory.CreateClient(nameof(AppSettings.Settings.Band));
|
|
result = GetPhotos(_Logger, httpClient, token, bandKey, photoAlbumKey);
|
|
httpClient.Dispose();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static Models.Photos.Root? GetPhotos(ILogger<Program> logger, HttpClient httpClient, Token token, string bandKey, string photoAlbumKey) {
|
|
Models.Photos.Root? result;
|
|
Uri requestUri = new($"{httpClient.BaseAddress}v2/band/album/photos?access_token={token.AccessToken}&band_key={bandKey}&photo_album_key={photoAlbumKey}");
|
|
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(requestUri);
|
|
string? content = GetString(logger, requestUri, httpResponseMessage, System.Net.HttpStatusCode.OK);
|
|
result = content is null ? null : JsonSerializer.Deserialize(content, Models.Photos.PhotosRootSourceGenerationContext.Default.Root);
|
|
return result;
|
|
}
|
|
|
|
public Models.Permissions.Root? GetPermissions(Dictionary<string, Token>? tokens, string bandKey, string permissions) {
|
|
Models.Permissions.Root? result;
|
|
Token? token = GetToken(tokens);
|
|
if (token is null) {
|
|
_Logger.LogWarning("Unable to get token");
|
|
result = null;
|
|
} else {
|
|
HttpClient httpClient = _HttpClientFactory.CreateClient(nameof(AppSettings.Settings.Band));
|
|
result = GetPermissions(_Logger, httpClient, token, bandKey, permissions);
|
|
httpClient.Dispose();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static Models.Permissions.Root? GetPermissions(ILogger<Program> logger, HttpClient httpClient, Token token, string bandKey, string permissions) {
|
|
Models.Permissions.Root? result;
|
|
Uri requestUri = new($"{httpClient.BaseAddress}v2/band/permissions?access_token={token.AccessToken}&band_key={bandKey}&permissions={permissions}");
|
|
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(requestUri);
|
|
string? content = GetString(logger, requestUri, httpResponseMessage, System.Net.HttpStatusCode.OK);
|
|
result = content is null ? null : JsonSerializer.Deserialize(content, Models.Permissions.PermissionsRootSourceGenerationContext.Default.Root);
|
|
return result;
|
|
}
|
|
|
|
public Root? WritePost(Dictionary<string, Token>? tokens, string bandKey, string message) {
|
|
Root? result;
|
|
Token? token = GetToken(tokens);
|
|
if (token is null) {
|
|
_Logger.LogWarning("Unable to get token");
|
|
result = null;
|
|
} else {
|
|
HttpClient httpClient = _HttpClientFactory.CreateClient(nameof(AppSettings.Settings.Band));
|
|
result = GetPostCreate(_Logger, httpClient, token, bandKey, message);
|
|
httpClient.Dispose();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static Root? GetPostCreate(ILogger<Program> logger, HttpClient httpClient, Token token, string bandKey, string message) {
|
|
Root? result;
|
|
List<KeyValuePair<string, string>> formData = [
|
|
new KeyValuePair<string, string>("access_token", token.AccessToken),
|
|
new KeyValuePair<string, string>("band_key", string.Concat(bandKey)),
|
|
new KeyValuePair<string, string>("content", message),
|
|
new KeyValuePair<string, string>("do_push", "true")
|
|
];
|
|
FormUrlEncodedContent formContent = new(formData);
|
|
Uri requestUri = new($"{httpClient.BaseAddress}v2.2/band/post/create");
|
|
Task<HttpResponseMessage> httpResponseMessage = httpClient.PostAsync(requestUri, formContent);
|
|
string? content = GetString(logger, requestUri, httpResponseMessage, System.Net.HttpStatusCode.OK);
|
|
result = content is null ? null : JsonSerializer.Deserialize(content, RootSourceGenerationContext.Default.Root);
|
|
return result;
|
|
}
|
|
|
|
public Root? WritePostComment(Dictionary<string, Token>? tokens, string bandKey, string postKey, string message) {
|
|
Root? result;
|
|
Token? token = GetToken(tokens);
|
|
if (token is null) {
|
|
_Logger.LogWarning("Unable to get token");
|
|
result = null;
|
|
} else {
|
|
HttpClient httpClient = _HttpClientFactory.CreateClient(nameof(AppSettings.Settings.Band));
|
|
result = GetPostCommentCreate(_Logger, httpClient, token, bandKey, postKey, message);
|
|
httpClient.Dispose();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static Root? GetPostCommentCreate(ILogger<Program> logger, HttpClient httpClient, Token token, string bandKey, string postKey, string message) {
|
|
Root? result;
|
|
List<KeyValuePair<string, string>> formData = [
|
|
new KeyValuePair<string, string>("access_token", token.AccessToken),
|
|
new KeyValuePair<string, string>("band_key", string.Concat(bandKey)),
|
|
new KeyValuePair<string, string>("post_key", postKey),
|
|
new KeyValuePair<string, string>("body", message)
|
|
];
|
|
FormUrlEncodedContent formContent = new(formData);
|
|
Uri requestUri = new($"{httpClient.BaseAddress}v2/band/post/comment/create");
|
|
Task<HttpResponseMessage> httpResponseMessage = httpClient.PostAsync(requestUri, formContent);
|
|
string? content = GetString(logger, requestUri, httpResponseMessage, System.Net.HttpStatusCode.OK);
|
|
result = content is null ? null : JsonSerializer.Deserialize(content, RootSourceGenerationContext.Default.Root);
|
|
return result;
|
|
}
|
|
|
|
} |