public Task Handle(InvestmentsRequest request, Exception exception, RequestExceptionHandlerState <Response <InvestmentsResponse> > state, CancellationToken cancellationToken)
        {
            var response = new Response <InvestmentsResponse>("Error getting Portfolio", new Notification(exception.Source, $"{Error().Message}: {exception.Message}"), Error().StatusCode);

            state.SetHandled(response);

            _tracer.ActiveSpan.SetTag("error", true);
            _tracer.ActiveSpan.SetTag("statusCode", (int)Error().StatusCode);

            return(Task.CompletedTask);

            (string Message, HttpStatusCode StatusCode) Error()
            => exception.Source == "Refit" ? ("Error on External API", state.Response?.StatusCode ?? HttpStatusCode.BadRequest) : (exception.GetType().Name, HttpStatusCode.InternalServerError);
        }
        public async Task <Response <InvestmentsResponse> > Handle(InvestmentsRequest request, CancellationToken cancellationToken)
        {
            var responseCache = await _cache.GetAsync(CacheKeys.Portfolio, cancellationToken);

            if (responseCache is null)
            {
                _tracer.ActiveSpan.SetTag("cache", false);
                var investmentResponse = await _portfolio.GetAsync();

                _ = _cache.SetAsync(CacheKeys.Portfolio, JsonSerializer.SerializeToUtf8Bytes(investmentResponse), DateTime.Now.UntilMidnight(), cancellationToken);
                return(new Response <InvestmentsResponse>(investmentResponse));
            }
            else
            {
                _tracer.ActiveSpan.SetTag("cache", true);
                var investmentResponse = JsonSerializer.Deserialize <InvestmentsResponse>(new ReadOnlySpan <byte>(responseCache));
                return(new Response <InvestmentsResponse>(investmentResponse));
            }
        }