/// <summary>
        /// Saves a file.
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task <ApiResponse <CreatedWithIdResponse <int> > > SaveFileAsync(SaveFileRequest request)
        {
            Arg.IsNotNull(request, nameof(request));

            var streamContent = new StreamContent(request.FileStream);

            streamContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(request.ContentType);

            var path             = UrlHelper.GetSaveFilePath();
            var multiPartContent = new MultipartFormDataContent
            {
                { streamContent, "file", request.FileName },
                { new StringContent(request.RecordId.ToString()), nameof(request.RecordId) },
                { new StringContent(request.FieldId.ToString()), nameof(request.FieldId) },
                { new StringContent(request.Notes), nameof(request.Notes) },
            };

            if (request.ModifiedDate != null)
            {
                multiPartContent.Add(new StringContent(request.ModifiedDate.ToString()), nameof(request.ModifiedDate));
            }

            var httpRequest = new HttpRequestMessage(HttpMethod.Post, path)
            {
                Content = multiPartContent,
            };

            var httpResponse = await HttpClient.SendAsync(httpRequest);

            var apiResponse = await ApiResponseFactory.GetApiResponseAsync <CreatedWithIdResponse <int> >(httpResponse, ClientConfig.JsonSerializer);

            return(apiResponse);
        }
        /// <summary>
        /// Performs an HTTP POST request to the <paramref name="path"/> and adds an API Key header.
        /// </summary>
        /// <param name="path"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        private async Task <ApiResponse> PostAsync(string path, object content)
        {
            var httpResponse = await HttpClient.PostAsync(path, ClientConfig.ApiKey, content);

            var apiResponse = await ApiResponseFactory.GetApiResponseAsync(httpResponse, ClientConfig.JsonSerializer);

            return(apiResponse);
        }
        // ------------------------------------ Client internals ------------------------------------

        /// <summary>
        /// Performs an HTTP DELETE request to the <paramref name="path"/> and adds an API Key header.
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        private async Task <ApiResponse> DeleteAsync(string path)
        {
            var httpResponse = await HttpClient.DeleteAsync(path, ClientConfig.ApiKey);

            var apiResponse = await ApiResponseFactory.GetApiResponseAsync(httpResponse, ClientConfig.JsonSerializer);

            return(apiResponse);
        }
        /// <summary>
        /// Performs an HTTP PUT request to the <paramref name="path"/> and adds an API Key header.
        /// </summary>
        /// <typeparam name="TOutput"></typeparam>
        /// <param name="path"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        private async Task <ApiResponse <TOutput> > PutAsync <TOutput>(string path, object content)
            where TOutput : class
        {
            var httpResponse = await HttpClient.PutAsync(path, ClientConfig.ApiKey, content);

            var apiResponse = await ApiResponseFactory.GetApiResponseAsync <TOutput>(httpResponse, ClientConfig.JsonSerializer);

            return(apiResponse);
        }
        /// <summary>
        /// Performs an HTTP GET request to the <paramref name="path"/> and adds an API Key header.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="path"></param>
        /// <returns></returns>
        private async Task <ApiResponse <T> > GetAsync <T>(string path)
            where T : class
        {
            var httpResponse = await HttpClient.GetAsync(path, ClientConfig.ApiKey);

            var apiResponse = await ApiResponseFactory.GetApiResponseAsync <T>(httpResponse, ClientConfig.JsonSerializer);

            return(apiResponse);
        }