Files
band/src/Band/Services/BandService.cs
2025-09-05 19:56:32 -07:00

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;
}
}