Skip to content
Snippets Groups Projects
FunctionalBaseClass.cs 2.85 KiB
Newer Older
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");
    }
}