using System; using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using Bit.App.Models.Api; using Newtonsoft.Json; using Plugin.Connectivity.Abstractions; namespace Bit.App.Repositories { public abstract class BaseApiRepository { public BaseApiRepository(IConnectivity connectivity) { Connectivity = connectivity; } protected IConnectivity Connectivity { get; private set; } protected abstract string ApiRoute { get; } protected ApiResult HandledNotConnected() { return ApiResult.Failed(System.Net.HttpStatusCode.RequestTimeout, new ApiError { Message = "Not connected to the internet." }); } protected ApiResult HandledNotConnected() { return ApiResult.Failed(System.Net.HttpStatusCode.RequestTimeout, new ApiError { Message = "Not connected to the internet." }); } protected ApiResult HandledWebException() { return ApiResult.Failed(System.Net.HttpStatusCode.BadGateway, new ApiError { Message = "There is a problem connecting to the server." }); } protected ApiResult HandledWebException() { return ApiResult.Failed(System.Net.HttpStatusCode.BadGateway, new ApiError { Message = "There is a problem connecting to the server." }); } protected async Task> HandleErrorAsync(HttpResponseMessage response) { try { var errors = await ParseErrorsAsync(response).ConfigureAwait(false); return ApiResult.Failed(response.StatusCode, errors.ToArray()); } catch(JsonReaderException) { } return ApiResult.Failed(response.StatusCode, new ApiError { Message = "An unknown error has occured." }); } protected async Task HandleErrorAsync(HttpResponseMessage response) { try { var errors = await ParseErrorsAsync(response).ConfigureAwait(false); return ApiResult.Failed(response.StatusCode, errors.ToArray()); } catch(JsonReaderException) { } return ApiResult.Failed(response.StatusCode, new ApiError { Message = "An unknown error has occured." }); } private async Task> ParseErrorsAsync(HttpResponseMessage response) { var errors = new List(); if(response.StatusCode == System.Net.HttpStatusCode.BadRequest) { var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); var errorResponseModel = JsonConvert.DeserializeObject(responseContent); foreach(var valError in errorResponseModel.ValidationErrors) { foreach(var errorMessage in valError.Value) { errors.Add(new ApiError { Message = errorMessage }); } } } return errors; } } }