using System.Net.Http.Json; using System.Text; using Microsoft.Extensions.Logging; namespace FitConnect; public class FitConnectEndpoints { public FitConnectEndpoints(string tokenUrl, string submissionApi, string routingApi) { TokenUrl = tokenUrl; SubmissionApi = submissionApi; RoutingApi = routingApi; } public string TokenUrl { get; } public string SubmissionApi { get; } public string RoutingApi { get; } public enum EndpointType { Development, Testing, Production } public static FitConnectEndpoints Create(EndpointType endpointType) { return endpointType switch { EndpointType.Development => DevEndpoints, EndpointType.Testing => throw new ArgumentException("Not approved for online testing"), EndpointType.Production => throw new ArgumentException("NOT PRODUCTION READY"), _ => throw new ArgumentOutOfRangeException(nameof(endpointType), endpointType, null) }; } private static readonly FitConnectEndpoints DevEndpoints = new( "https://auth-testing.fit-connect.fitko.dev/token", "https://submission-api-testing.fit-connect.fitko.dev", "https://routing-api-testing.fit-connect.fitko.dev" ); private static readonly FitConnectEndpoints TestEndpoints = new( "https://auth-testing.fit-connect.fitko.dev/token", "https://submission-api-testing.fit-connect.fitko.dev", "https://routing-api-testing.fit-connect.fitko.dev" ); private static readonly FitConnectEndpoints ProductionEndpoints = new( "https://auth-testing.fit-connect.fitko.dev/token", "https://submission-api-testing.fit-connect.fitko.dev", "https://routing-api-testing.fit-connect.fitko.dev" ); } public class FunctionalBaseClass { private readonly ILogger? logger; public FitConnectEndpoints Endpoints { get; } protected FunctionalBaseClass(ILogger? logger, FitConnectEndpoints? endpoints) { Endpoints = endpoints ?? FitConnectEndpoints.Create(FitConnectEndpoints.EndpointType.Development); this.logger = logger; } private async Task<T?> RestCall<T>(Uri uri, HttpMethod method, string body) { var client = new HttpClient(); client.DefaultRequestHeaders.Add("Accept", "application/json"); client.DefaultRequestHeaders.Add("Content-Type", "application/json"); var request = new HttpRequestMessage(); request.Method = method; request.Content = new StringContent(body, Encoding.UTF8, "application/json"); request.RequestUri = uri; var response = await client.SendAsync(request); if (response.IsSuccessStatusCode) return (await response.Content.ReadFromJsonAsync<T>()); throw new HttpRequestException("Error calling FitConnect API"); } }