Skip to content
Snippets Groups Projects
DevkitConnector.cs 4.17 KiB
Newer Older
using SDK.Exceptions;
using System;
Daniel Andrášik's avatar
Daniel Andrášik committed
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
Michal Ondrejička's avatar
Michal Ondrejička committed

namespace SDK
{
    public abstract class DevkitConnector
    {
Daniel Andrášik's avatar
Daniel Andrášik committed
        protected readonly ConnectionOptions connectionOptions;
        protected HttpClient httpClient;

        public bool EnsureSuccessStatusCode { get; set; } = true;

        public DevkitConnector(ConnectionOptions connectionOptions) : this(connectionOptions, new HttpClient())
        {
        }

        public DevkitConnector(ConnectionOptions connectionOptions, HttpClient httpClient)
        {
            this.connectionOptions = connectionOptions;
            this.httpClient = httpClient;
            httpClient.BaseAddress = new Uri(connectionOptions.Url + "/" + connectionOptions.Version + "/");

            ResetHttpClientHeaders();
        }

        protected void ResetHttpClientHeaders()
        {
            httpClient.DefaultRequestHeaders.Clear();
            httpClient.DefaultRequestHeaders.Add("Client", connectionOptions.ClientGuid);
            httpClient.DefaultRequestHeaders.Add("Branch", connectionOptions.BranchGuid);
            httpClient.DefaultRequestHeaders.Add("Token", connectionOptions.Token);
            httpClient.DefaultRequestHeaders.Add("Api-Key", connectionOptions.ApiKey);
        }

        #region REQUESTS
        protected async Task<Type> GetRequest<Type>(string subUrl)
        {
            var response = await httpClient.GetAsync(subUrl);
            return await JsonResponse<Type>(response);
        }

        protected async Task<Type> PostRequest<Type>(string subUrl, object body)
        {
            string bodyContent = JsonSerializer.Serialize(body);
            HttpContent httpContent = new StringContent(bodyContent, Encoding.UTF8, "application/json");
            var response = await httpClient.PostAsync(subUrl, httpContent);
            return await JsonResponse<Type>(response);
        }

        protected async Task<Type> PatchRequest<Type>(string subUrl, object body)
        {
            string bodyContent = JsonSerializer.Serialize(body);
            HttpContent httpContent = new StringContent(bodyContent, Encoding.UTF8, "application/json");
            var response = await httpClient.PatchAsync(subUrl, httpContent);
            return await JsonResponse<Type>(response);
        }

        protected async Task PatchRequest(string subUrl, object body)
        {
            string bodyContent = JsonSerializer.Serialize(body);
            HttpContent httpContent = new StringContent(bodyContent, Encoding.UTF8, "application/json");
            var response = await httpClient.PatchAsync(subUrl, httpContent);
Daniel Andrášik's avatar
Daniel Andrášik committed
            await EmptyResponse(response);
Daniel Andrášik's avatar
Daniel Andrášik committed
        }

        protected async Task<Type> DeleteRequest<Type>(string subUrl)
        {
            var response = await httpClient.DeleteAsync(subUrl);
            return await JsonResponse<Type>(response);
        }

        protected async Task DeleteRequest(string subUrl)
        {
            var response = await httpClient.DeleteAsync(subUrl);
Daniel Andrášik's avatar
Daniel Andrášik committed
            await EmptyResponse(response);
Daniel Andrášik's avatar
Daniel Andrášik committed
        }
        #endregion

        protected async Task<Type> JsonResponse<Type>(HttpResponseMessage response)
        {
            if (EnsureSuccessStatusCode)
            {
                if (!response.IsSuccessStatusCode)
                    await HandleError(response);
Daniel Andrášik's avatar
Daniel Andrášik committed
            }
            else
            {
                if (!response.IsSuccessStatusCode)
Daniel Andrášik's avatar
Daniel Andrášik committed
                    return default;
Daniel Andrášik's avatar
Daniel Andrášik committed
            }

            var jsonString = await response.Content.ReadAsStringAsync();
            return JsonSerializer.Deserialize<Type>(jsonString);
        }

        protected async Task EmptyResponse(HttpResponseMessage response)
Daniel Andrášik's avatar
Daniel Andrášik committed
        {
            if (EnsureSuccessStatusCode)
                if (!response.IsSuccessStatusCode)
                    await HandleError(response);
        }

        protected async Task HandleError(HttpResponseMessage response)
        {
            var stringContent = await response.Content.ReadAsStringAsync();
Daniel Andrášik's avatar
Daniel Andrášik committed

Daniel Andrášik's avatar
Daniel Andrášik committed
            throw response.StatusCode switch
Daniel Andrášik's avatar
Daniel Andrášik committed
                _ => throw new ServerResponseException(stringContent),
            };