< Summary

Class:DCL.Helpers.NFT.Markets.OpenSea_Internal.RequestController
Assembly:OpenSea_Internal
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/ServiceProviders/OpenSea/RequestController.cs
Covered lines:42
Uncovered lines:34
Coverable lines:76
Total lines:191
Line coverage:55.2% (42 of 76)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
RequestController()0%110100%
Dispose()0%110100%
FetchNFT(...)0%4.024090%
FetchOwnedNFT(...)0%2.012087.5%
FetchSingleNFT(...)0%6200%
SendRequest(...)0%110100%
OnRequestFailed(...)0%2100%
OnRequestFailed(...)0%2100%
OnRequestFailed(...)0%2100%
AddToCache(...)0%2.062075%
AddToCache(...)0%2.062075%
AddToCache(...)0%6200%
RemoveFromCache(...)0%2100%
RemoveFromCache(...)0%2100%
RemoveFromCache(...)0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/ServiceProviders/OpenSea/RequestController.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using UnityEngine;
 4using UnityEngine.Networking;
 5
 6namespace DCL.Helpers.NFT.Markets.OpenSea_Internal
 7{
 8    public class RequestController : IDisposable
 9    {
 10        private const bool VERBOSE = false;
 11
 67112        internal readonly RequestScheduler requestScheduler = new RequestScheduler();
 67113        private readonly Dictionary<string, RequestBase<AssetResponse>> cacheAssetResponses = new Dictionary<string, Req
 67114        private readonly Dictionary<string, RequestBase<AssetsResponse>> cacheSeveralAssetsResponse = new Dictionary<str
 67115        private readonly Dictionary<string, RequestBase<SingleAssetResponse>> cacheSingleAssetResponses = new Dictionary
 16
 17        private BatchAssetsRequestHandler openBatchAssetsRequestHandler = null;
 18
 201319        public RequestController() { requestScheduler.OnRequestReadyToSend += SendRequest; }
 20
 138421        public void Dispose() { requestScheduler.OnRequestReadyToSend -= SendRequest; }
 22
 23        public RequestBase<AssetResponse> FetchNFT(string contractAddress, string tokenId)
 24        {
 825            if (cacheAssetResponses.TryGetValue(RequestAssetInBatch.GetId(contractAddress, tokenId), out RequestBase<Ass
 26            {
 027                return request;
 28            }
 29
 830            var newRequest = new RequestAssetInBatch(contractAddress, tokenId);
 31
 832            AddToCache(newRequest);
 33
 834            newRequest.OnFail += OnRequestFailed;
 35
 836            if (openBatchAssetsRequestHandler == null || !openBatchAssetsRequestHandler.isOpen)
 37            {
 838                openBatchAssetsRequestHandler = new BatchAssetsRequestHandler(this);
 839                requestScheduler.EnqueueRequest(openBatchAssetsRequestHandler);
 40            }
 41
 842            openBatchAssetsRequestHandler.AddRequest(newRequest);
 43
 844            return newRequest;
 45        }
 46
 47        public RequestBase<AssetsResponse> FetchOwnedNFT(string address)
 48        {
 449            if (cacheSeveralAssetsResponse.TryGetValue(RequestOwnedNFTs.GetId(address), out RequestBase<AssetsResponse> 
 50            {
 051                return request;
 52            }
 53
 454            var newRequest = new RequestOwnedNFTs(address);
 55
 456            AddToCache(newRequest);
 57
 458            newRequest.OnFail += OnRequestFailed;
 59
 460            var requestHandler = new OwnedNFTRequestHandler(newRequest, this);
 461            requestScheduler.EnqueueRequest(requestHandler);
 62
 463            return newRequest;
 64        }
 65
 66        public RequestBase<SingleAssetResponse> FetchSingleNFT(string contractAddress, string tokenId)
 67        {
 068            if (cacheSingleAssetResponses.TryGetValue(RequestAssetSingle.GetId(contractAddress, tokenId), out RequestBas
 69            {
 070                return request;
 71            }
 72
 073            var newRequest = new RequestAssetSingle(contractAddress, tokenId);
 74
 075            AddToCache(newRequest);
 76
 077            newRequest.OnFail += OnRequestFailed;
 78
 079            var requestHandler = new SingleAssetRequestHandler(newRequest, this);
 080            requestScheduler.EnqueueRequest(requestHandler);
 81
 082            return newRequest;
 83        }
 84
 85        private void SendRequest(IRequestHandler requestHandler)
 86        {
 1187            string url = requestHandler.GetUrl();
 88
 89            if (VERBOSE)
 90                Debug.Log($"RequestController: Send Request: {url}");
 91
 92            // NOTE: In this case, as this code is implementing a very specific retries system (including delays), we us
 93            //              custom WebRequest system without retries (requestAttemps = 1) and let the current code to ap
 1194            WebRequestAsyncOperation asyncOp = Environment.i.platform.webRequest.Get(url, requestAttemps: 1, disposeOnCo
 95
 1196            asyncOp.completed += operation =>
 97            {
 798                UnityWebRequest unityWebRequest = operation.webRequest;
 799                bool shouldTryToRetry = true;
 7100                string serverResponse = unityWebRequest.downloadHandler.text;
 101
 102                if (VERBOSE)
 103                    Debug.Log($"RequestController: Request completed: success? {unityWebRequest.result == UnityWebReques
 104
 7105                if (unityWebRequest.result == UnityWebRequest.Result.Success)
 106                {
 7107                    requestHandler.SetApiResponse(serverResponse,
 108                        () =>
 109                        {
 110                            if (VERBOSE)
 111                                Debug.Log($"RequestController: Request Succeeded: {url}");
 112
 7113                            shouldTryToRetry = false;
 7114                        },
 115                        error =>
 116                        {
 0117                            serverResponse = $"RequestController: Parse Request Error: {url}: {error}";
 118
 119                            if (VERBOSE)
 120                                Debug.Log(serverResponse);
 0121                        });
 122                }
 123
 7124                if (shouldTryToRetry)
 125                {
 0126                    if (requestHandler.CanRetry())
 127                    {
 0128                        requestHandler.Retry();
 0129                    }
 130                    else
 131                    {
 0132                        requestHandler.SetApiResponseError(serverResponse);
 133                    }
 134                }
 135
 7136                unityWebRequest.Dispose();
 7137            };
 11138        }
 139
 140        private void OnRequestFailed(RequestBase<AssetResponse> request)
 141        {
 0142            request.OnFail -= OnRequestFailed;
 143
 0144            RemoveFromCache(request);
 0145        }
 146
 147        private void OnRequestFailed(RequestBase<AssetsResponse> request)
 148        {
 0149            request.OnFail -= OnRequestFailed;
 150
 0151            RemoveFromCache(request);
 0152        }
 153
 154        private void OnRequestFailed(RequestBase<SingleAssetResponse> request)
 155        {
 0156            request.OnFail -= OnRequestFailed;
 157
 0158            RemoveFromCache(request);
 0159        }
 160
 161        private void AddToCache(RequestBase<AssetResponse> request)
 162        {
 8163            if (cacheAssetResponses.ContainsKey(request.requestId))
 0164                return;
 165
 8166            cacheAssetResponses.Add(request.requestId, request);
 8167        }
 168
 169        private void AddToCache(RequestBase<AssetsResponse> request)
 170        {
 4171            if (cacheSeveralAssetsResponse.ContainsKey(request.requestId))
 0172                return;
 173
 4174            cacheSeveralAssetsResponse.Add(request.requestId, request);
 4175        }
 176
 177        private void AddToCache(RequestBase<SingleAssetResponse> request)
 178        {
 0179            if (cacheSingleAssetResponses.ContainsKey(request.requestId))
 0180                return;
 181
 0182            cacheSingleAssetResponses.Add(request.requestId, request);
 0183        }
 184
 0185        private void RemoveFromCache(RequestBase<AssetResponse> request) { cacheAssetResponses.Remove(request.requestId)
 186
 0187        private void RemoveFromCache(RequestBase<AssetsResponse> request) { cacheSeveralAssetsResponse.Remove(request.re
 188
 0189        private void RemoveFromCache(RequestBase<SingleAssetResponse> request) { cacheSingleAssetResponses.Remove(reques
 190    }
 191}