using Band.Models; using System.Text.Json; namespace Band.Services; public class BandService(ILogger logger, AppSettings appSettings, IHttpClientFactory httpClientFactory) { #pragma warning disable CS9124 private readonly ILogger _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 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 = 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 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 = 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? 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? tokens) => tokens is null || tokens.Count == 0 ? null : tokens.ElementAt(0).Value; private static string? GetString(ILogger logger, Uri requestUri, Task 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 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 logger, HttpClient httpClient, Token token) { Models.Bands.Root? result; Uri requestUri = new($"{httpClient.BaseAddress}v2.1/bands?access_token={token.AccessToken}"); Task 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? 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 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 = 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? 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 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 = 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? 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 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 = 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? 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 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 = 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? 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 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 = 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? 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 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 = 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? 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 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 = 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? 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 logger, HttpClient httpClient, Token token, string bandKey, string message) { Root? result; List> formData = [ new KeyValuePair("access_token", token.AccessToken), new KeyValuePair("band_key", string.Concat(bandKey)), new KeyValuePair("content", message), new KeyValuePair("do_push", "true") ]; FormUrlEncodedContent formContent = new(formData); Uri requestUri = new($"{httpClient.BaseAddress}v2.2/band/post/create"); Task 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? 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 logger, HttpClient httpClient, Token token, string bandKey, string postKey, string message) { Root? result; List> formData = [ new KeyValuePair("access_token", token.AccessToken), new KeyValuePair("band_key", string.Concat(bandKey)), new KeyValuePair("post_key", postKey), new KeyValuePair("body", message) ]; FormUrlEncodedContent formContent = new(formData); Uri requestUri = new($"{httpClient.BaseAddress}v2/band/post/comment/create"); Task 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; } }