using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace ScoreTracker.API { internal class Request { private static readonly HttpClient client = new HttpClient(); private class AuthHelper { public bool IsLoggedIn; public string FailReason = ""; public async Task EnsureLoggedIn() { if (Authentication.IsSignedIn() && await Authentication.ValidateAuthToken()) { return; // Already logged in with a valid token } await Authentication.LoginUser( token => { IsLoggedIn = true; PersistHeaders(new Dictionary { { "Authorization", $"Bearer {token}" } }); }, reason => { FailReason = reason; // Store the reason for failure client.DefaultRequestHeaders.Clear(); // Clear headers } ); } } /// /// Persist the given headers for all future requests /// /// the headers to persist public static void PersistHeaders(Dictionary headers) { client.DefaultRequestHeaders.Clear(); // Clear existing headers foreach (var header in headers) { client.DefaultRequestHeaders.Add(header.Key, header.Value); } } /// /// Create a POST request to the given URL with the given data /// /// the url to post to /// the data to post /// whether to check for authentication /// the task public static async Task PostJsonAsync(string url, Dictionary json, bool checkAuth = true) { if (checkAuth) { var authHelper = new AuthHelper(); await authHelper.EnsureLoggedIn(); if (!authHelper.IsLoggedIn) { throw new Exception($"Failed to log in: {authHelper.FailReason}"); } } var jsonString = JsonConvert.SerializeObject(json, Formatting.None); var content = new StringContent(jsonString, Encoding.UTF8, "application/json"); // Send the POST request var response = await client.PostAsync(url, content); return response; } } }