Exemplo n.º 1
0
        /// <inheritdoc />
        public async Task <TSource> AddOrUpdateAsync(TSource document, bool batch = false, CancellationToken cancellationToken = default)
        {
            Check.NotNull(document, nameof(document));

            if (string.IsNullOrEmpty(document.Id))
            {
                throw new InvalidOperationException("Cannot add or update a document without an ID.");
            }

            IFlurlRequest request = NewRequest()
                                    .AppendPathSegment(document.Id);

            if (batch)
            {
                request = request.SetQueryParam("batch", "ok");
            }

            DocumentSaveResponse response = await request
                                            .PutJsonAsync(document, cancellationToken)
                                            .ReceiveJson <DocumentSaveResponse>()
                                            .SendRequestAsync()
                                            .ConfigureAwait(false);

            document.ProcessSaveResponse(response);

            await UpdateAttachments(document, cancellationToken)
            .ConfigureAwait(false);

            return(document);
        }
Exemplo n.º 2
0
        /// <summary>
        /// UPDATE request to the API
        /// </summary>
        /// <typeparam name="T">Type of return data</typeparam>
        /// <param name="id">Unique identifier of entity that will be updated</param>
        /// <param name="dtoForUpdate">Data Transfer Object for updating entity</param>
        /// <param name="pathToAppend">Additional path to append on base url (e.g. "lock" custom operation as "/users/1/lock")</param>
        public async Task <APIServiceResult <T> > Update <T>(int id, object dtoForUpdate, string pathToAppend = "")
        {
            try
            {
                request.Url.AppendPathSegment(id);
                if (!string.IsNullOrWhiteSpace(pathToAppend))
                {
                    request.Url.AppendPathSegment(pathToAppend);
                }

                var response = await request.PutJsonAsync(dtoForUpdate);

                RevertToBaseRequest();

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    if (response.StatusCode == HttpStatusCode.Forbidden)
                    {
                        dlgError.ShowDialog(Resources.AccessDenied);
                    }
                    else if (response.StatusCode == HttpStatusCode.BadRequest)
                    {
                        var msg = string.Empty;
                        if (response.Content != null)
                        {
                            msg = await response.Content.ReadAsStringAsync();
                        }
                        dlgError.ShowDialog(msg);
                    }
                    else if ((int)response.StatusCode == 422)
                    {
                        var msg = Resources.InvalidInputData;

                        if (response.Content != null)
                        {
                            msg = await response.Content.ReadAsStringAsync();
                        }
                        dlgError.ShowDialog(msg);
                    }

                    return(APIServiceResult <T> .WithStatusCode(response.StatusCode));
                }
                var headers = response.Headers;

                var result = await response.Content.ReadAsAsync <T>();

                return(APIServiceResult <T> .OK(result));
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                dlgError.ShowDialog(Resources.TemporarilyUnvailable);
                return(APIServiceResult <T> .Exception());
            }
        }
Exemplo n.º 3
0
        public async Task <Result> UpdateDNSRecordAsync(string domainName, DigitalOceanUpdateDomainRecordRequest request, string token, CancellationToken cancellation)
        {
            string         path        = string.Format(_updateDNSRecordFormat, domainName, request.Id);
            IFlurlRequest  httpRequest = BuildRequest(token, path);
            IFlurlResponse response    = await httpRequest.PutJsonAsync(request, cancellation);

            HttpResponseMessage message = response.ResponseMessage;

            if (message.IsSuccessStatusCode)
            {
                return(Result.Ok().WithSuccess(string.Format(_updateDNSRecordsSuccessMessageTemplate, domainName, request.Name)));
            }
            return(Result.Fail(string.Format(_updateDNSRecordsFailureMessageTemplate, request.Name, domainName)));
        }
Exemplo n.º 4
0
        public async Task <Result> UpdateDNSRecordAsync(GoDaddyUpdateDNSRecordsRequest request, CancellationToken cancellation)
        {
            string         path        = string.Format(_updateDNSRecordsFormat, request.DomainName, request.RecordType.Value, request.RecordName);
            IFlurlRequest  httpRequest = BuildRequest(request.ApiKey, request.ApiSecret, path);
            IFlurlResponse response    = await httpRequest.PutJsonAsync(new [] { request.Record }, cancellation);

            HttpResponseMessage message = response.ResponseMessage;

            if (message.StatusCode == HttpStatusCode.OK)
            {
                string resultMessage = string.Format(_updateDNSRecordsSuccessMessageTemplate, request.DomainName, request.RecordName);
                return(Result.Ok().WithSuccess(resultMessage));
            }
            return(Result.Fail(string.Format(_updateDNSRecordsFailureMessageTemplate, request.RecordName, request.DomainName)));
        }
        /// <summary>
        /// UPDATE request to the API
        /// </summary>
        /// <typeparam name="T">Type of return data</typeparam>
        /// <param name="id">Unique identifier of entity that will be updated</param>
        /// <param name="dtoForUpdate">Data Transfer Object for updating entity</param>
        /// <param name="pathToAppend">Additional path to append on base url (e.g. "lock" custom operation as "/users/1/lock")</param>
        public async Task <APIServiceResult <T> > Update <T>(int id, object dtoForUpdate, string pathToAppend = "")
        {
            try
            {
                request.Url.AppendPathSegment(id);
                if (!string.IsNullOrWhiteSpace(pathToAppend))
                {
                    request.Url.AppendPathSegment(pathToAppend);
                }

                HttpResponseMessage response = null;

                response = await request.PutJsonAsync(dtoForUpdate);

                RevertToBaseRequest();

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    if ((int)response.StatusCode == 422 || response.StatusCode == HttpStatusCode.BadRequest)
                    {
                        if (response.Content != null)
                        {
                            var errorMessage = await response.Content.ReadAsStringAsync();

                            return(APIServiceResult <T> .WithStatusCode((HttpStatusCode)422, errorMessage));
                        }
                    }

                    return(APIServiceResult <T> .WithStatusCode(response.StatusCode));
                }

                var result = await response.Content.ReadAsAsync <T>();

                return(APIServiceResult <T> .OK(result));
            }
            catch (Exception ex)
            {
                return(APIServiceResult <T> .Exception());
            }
        }
Exemplo n.º 6
0
        /// <summary>
        /// Creates or updates the document with the given ID.
        /// </summary>
        /// <param name="document">The document to create or update</param>
        /// <param name="batch">Stores document in batch mode.</param>
        /// <returns>A task that represents the asynchronous operation. The task result contains the element created or updated.</returns>
        public async Task <TSource> CreateOrUpdateAsync(TSource document, bool batch = false)
        {
            if (string.IsNullOrEmpty(document.Id))
            {
                throw new InvalidOperationException("Cannot add or update a document without an ID.");
            }

            IFlurlRequest request = NewRequest()
                                    .AppendPathSegment(document.Id);

            if (batch)
            {
                request = request.SetQueryParam("batch", "ok");
            }

            DocumentSaveResponse response = await request
                                            .PutJsonAsync(document)
                                            .ReceiveJson <DocumentSaveResponse>()
                                            .SendRequestAsync()
                                            .ConfigureAwait(false);

            document.ProcessSaveResponse(response);
            return(document);
        }
Exemplo n.º 7
0
        private async Task <ServiceResult <TResult> > ResolveHttpResponseAsync <TResult>(DoType type, int retryCount, IFlurlRequest webApiObject, object bodyObject = null, int secondsTimeout = 30, string callerMemberName = null)
        {
            var                 _retMessage = "";
            ReturnMessage       _message;
            HttpResponseMessage _exec           = null;
            HttpStatusCode      _HttpStatusCode = HttpStatusCode.BadRequest;

            var _policyResult = await Policy
                                .Handle <FlurlHttpTimeoutException>().Or <FlurlHttpException>().Or <Exception>()
                                .RetryAsync(retryCount, (exception, retryNumber) =>
            {
                System.Diagnostics.Debug.WriteLine($"==================================================================");
                System.Diagnostics.Debug.WriteLine($"Method: {callerMemberName} -> Retry: number#{retryNumber} -> exception:{exception.Message}");
                System.Diagnostics.Debug.WriteLine($"==================================================================");
            })
                                .ExecuteAndCaptureAsync(new Func <Task <ServiceResult <TResult> > >(async() =>
            {
                var _token   = this.GetCancelationToken(secondsTimeout).Token;
                var _content = "";

#if DEBUG
                var _json = JsonConvert.SerializeObject(bodyObject);
#endif
                switch (type)
                {
                case DoType.Get:
                    _exec = await webApiObject.GetAsync(_token);
                    break;

                case DoType.Post:
                    _exec = await webApiObject.PostJsonAsync(bodyObject, _token);
                    break;

                case DoType.Put:
                    _exec = await webApiObject.PutJsonAsync(bodyObject, _token);
                    break;

                case DoType.Delete:
                    _exec = bodyObject == null ? await webApiObject.DeleteAsync(_token) : await webApiObject.SendJsonAsync(HttpMethod.Delete, bodyObject, _token);
                    break;
                }

                switch (_exec.StatusCode)
                {
                case HttpStatusCode.OK:
                    switch (type)
                    {
                    case DoType.Get:
                    case DoType.Post:
                    case DoType.Put:
                        // lê o retorno do serviço
                        var _stringContent = await _exec.Content.ReadAsStringAsync();

                        // checa se está nulo, se estiver manda uma string vazia
                        _stringContent = string.IsNullOrEmpty(_stringContent) ? "" : _stringContent;

                        // vê se o conteúdo é um json, se não for, formatamos para que seja
                        TResult _result = default(TResult);

                        if (this.IsValidJson(_stringContent))
                        {
                            _result = JsonConvert.DeserializeObject <TResult>(_stringContent);
                        }
                        else
                        {
                            _result = (TResult)Convert.ChangeType(_stringContent, typeof(TResult), CultureInfo.CurrentCulture);
                        }

                        // retornamos o resultado deserializando no formato informado
                        return(new ServiceResult <TResult>(_result, true, _exec.StatusCode));

                    case DoType.Delete:
                        object _RetBool = true;
                        return(new ServiceResult <TResult>((TResult)_RetBool, true, _exec.StatusCode));
                    }
                    break;

                case HttpStatusCode.Unauthorized:
                    _retMessage = $"Você não está autorizado a executar essa rotina: {callerMemberName}!\r\nPor favor contacte o suporte.";
                    break;

                case HttpStatusCode.InternalServerError:
                case HttpStatusCode.BadRequest:
                    _content = await _exec.Content.ReadAsStringAsync();
                    try
                    {
                        _message    = JsonConvert.DeserializeObject <ReturnMessage>(_content);
                        _retMessage = _message.Message;
                    }
                    catch (Exception)
                    {
                        _retMessage = _content;
                    }

                    break;

                case HttpStatusCode.NoContent:
                    return(new ServiceResult <TResult>(default(TResult), false, _exec.StatusCode));

                case HttpStatusCode.NotFound:
                    return(new ServiceResult <TResult>(default(TResult), false, _exec.StatusCode));

                default:
                    _content    = await _exec.Content.ReadAsStringAsync();
                    _message    = JsonConvert.DeserializeObject <ReturnMessage>(_content);
                    _retMessage = $"Ocorreu um erro ao executar operação na rotina {callerMemberName}!\r\nPor favor contacte o suporte:\r\n\r\n{_message.Message}";
                    break;
                }
                _HttpStatusCode = _exec.StatusCode;
                return(new ServiceResult <TResult>(default(TResult), false, _HttpStatusCode, _retMessage));
            }));

            if (_policyResult.Outcome == OutcomeType.Successful)
            {
                return(_policyResult.Result);
            }
            else
            {
                switch (_policyResult.FinalException)
                {
                case FlurlHttpTimeoutException fhtex:
                    _HttpStatusCode = HttpStatusCode.GatewayTimeout;
                    _retMessage     = $"O tempo para execução desta tarefa expirou!Rotina{callerMemberName}\r\nTente novamente em alguns segundos.";
                    break;

                case FlurlHttpException fhex:
                    string _retString = fhex.Message;
                    if (fhex.Call.HttpStatus.HasValue)
                    {
                        _HttpStatusCode = fhex.Call.HttpStatus.Value;
                        switch (fhex.Call.HttpStatus.Value)
                        {
                        case HttpStatusCode.InternalServerError:
                        case HttpStatusCode.BadRequest:
                            _retMessage = fhex.Call.Response.Content.ReadAsStringAsync().Result;
                            break;
                        }
                    }
                    else
                    {
                        //_retMessage = $"Ocorreu um erro ao executar a operação na rotina {callerMemberName}!\r\nPor favor contacte o suporte:\r\n\r\n{_retString}";
                        _retMessage = $"Não foi possível executar a sua solicitação. Verifique a sua conexão com a Internet e tente novamente.";
                    }
                    break;

                case Exception ex:
                    _retMessage = this.GetInnerExceptionMessages(ex);
                    break;

                default:
                    _retMessage = this.GetInnerExceptionMessages(_policyResult.FinalException);
                    break;
                }
                return(new ServiceResult <TResult>(default(TResult), false, _HttpStatusCode, _retMessage));
            }
        }