< Summary

Class:DCLServices.Lambdas.LambdasService
Assembly:LambdasService
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLServices/Lambdas/LambdasService.cs
Covered lines:4
Uncovered lines:50
Coverable lines:54
Total lines:216
Line coverage:7.4% (4 of 54)
Covered branches:0
Total branches:0
Covered methods:3
Total methods:8
Method coverage:37.5% (3 of 8)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
LambdasService()0%110100%
GetUrl(...)0%1561200%
AppendQueryParamsToUrl(...)0%56700%
TryParseResponse[TResponse](...)0%2100%
GetLambdasUrl()0%2100%
PrintError[TResponse](...)0%2100%
Initialize()0%110100%
Dispose()0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLServices/Lambdas/LambdasService.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using DCL;
 3using Newtonsoft.Json;
 4using System;
 5using System.Collections.Generic;
 6using System.Text;
 7using System.Threading;
 8using UnityEngine;
 9using UnityEngine.Networking;
 10using UnityEngine.Pool;
 11
 12namespace DCLServices.Lambdas
 13{
 14    public class LambdasService : ILambdasService
 15    {
 16        private ICatalyst catalyst;
 17
 18        private Service<IWebRequestController> webRequestController;
 42519        private readonly Dictionary<string, string> jsonHeaders = new() { { "Content-Type", "application/json" } };
 20
 21        public async UniTask<(TResponse response, bool success)> Post<TResponse, TBody>(
 22            string endPointTemplate,
 23            string endPoint,
 24            TBody postData,
 25            int timeout = ILambdasService.DEFAULT_TIMEOUT,
 26            int attemptsNumber = ILambdasService.DEFAULT_ATTEMPTS_NUMBER,
 27            CancellationToken cancellationToken = default,
 28            params (string paramName, string paramValue)[] urlEncodedParams)
 29        {
 30            var postDataJson = JsonUtility.ToJson(postData);
 31            string lambdaUrl = await catalyst.GetLambdaUrl(cancellationToken);
 32            var url = GetUrl(endPoint, lambdaUrl, urlEncodedParams);
 33            var wr = webRequestController.Ref.Post(url, postDataJson, requestAttemps: attemptsNumber, timeout: timeout, 
 34
 35            return await SendRequestAsync<TResponse>(wr, cancellationToken, endPoint);
 36        }
 37
 38        public async UniTask<(TResponse response, bool success)> Get<TResponse>(
 39            string endPointTemplate,
 40            string endPoint,
 41            int timeout = ILambdasService.DEFAULT_TIMEOUT,
 42            int attemptsNumber = ILambdasService.DEFAULT_ATTEMPTS_NUMBER,
 43            CancellationToken cancellationToken = default,
 44            params (string paramName, string paramValue)[] urlEncodedParams)
 45        {
 46            string lambdaUrl = await catalyst.GetLambdaUrl(cancellationToken);
 47            var url = GetUrl(endPoint, lambdaUrl, urlEncodedParams);
 48            var wr = webRequestController.Ref.Get(url, requestAttemps: attemptsNumber, timeout: timeout, disposeOnComple
 49
 50            return await SendRequestAsync<TResponse>(wr, cancellationToken, endPoint);
 51        }
 52
 53        public async UniTask<(TResponse response, bool success)> GetFromSpecificUrl<TResponse>(
 54            string endPointTemplate,
 55            string url,
 56            int timeout = ILambdasService.DEFAULT_TIMEOUT,
 57            int attemptsNumber = ILambdasService.DEFAULT_ATTEMPTS_NUMBER,
 58            bool isSigned = false,
 59            string signUrl = null,
 60            CancellationToken cancellationToken = default,
 61            params (string paramName, string paramValue)[] urlEncodedParams)
 62        {
 63            string urlWithParams = AppendQueryParamsToUrl(url, urlEncodedParams);
 64            UnityWebRequest request = await webRequestController.Ref.GetAsync(urlWithParams, requestAttemps: attemptsNum
 65
 66            if (request.result != UnityWebRequest.Result.Success)
 67                return (default(TResponse), false);
 68
 69            string text = request.downloadHandler.text;
 70
 71            try
 72            {
 73                var response = JsonConvert.DeserializeObject<TResponse>(text);
 74                return (response, true);
 75            }
 76            catch (Exception e)
 77            {
 78                PrintError<TResponse>(url, e.Message);
 79                return (default(TResponse), false);
 80            }
 81        }
 82
 83        public async UniTask<(TResponse response, bool success)> PostFromSpecificUrl<TResponse, TBody>(
 84            string endPointTemplate,
 85            string url,
 86            TBody postData,
 87            int timeout = ILambdasService.DEFAULT_TIMEOUT,
 88            int attemptsNumber = ILambdasService.DEFAULT_ATTEMPTS_NUMBER,
 89            CancellationToken cancellationToken = default)
 90        {
 91            var postDataJson = JsonUtility.ToJson(postData);
 92            var wr = webRequestController.Ref.Post(url, postDataJson, requestAttemps: attemptsNumber, timeout: timeout, 
 93
 94            return await SendRequestAsync<TResponse>(wr, cancellationToken, url);
 95        }
 96
 97        private async UniTask<(TResponse response, bool success)> SendRequestAsync<TResponse>(
 98            IWebRequestAsyncOperation webRequestAsyncOperation,
 99            CancellationToken cancellationToken,
 100            string endPoint)
 101        {
 102            await webRequestAsyncOperation.WithCancellation(cancellationToken);
 103
 104            if (!webRequestAsyncOperation.isSucceeded)
 105            {
 106                Debug.LogError($"{webRequestAsyncOperation.asyncOp.webRequest.error} {webRequestAsyncOperation.asyncOp.w
 107                return (default, false);
 108            }
 109
 110            string textResponse = webRequestAsyncOperation.webRequest.downloadHandler.text;
 111            webRequestAsyncOperation.Dispose();
 112
 113            var res = !TryParseResponse(endPoint, textResponse, out TResponse response) ? (default, false) : (response, 
 114            return res;
 115        }
 116
 117        internal string GetUrl(string endPoint, string lambdaUrl, params (string paramName, string paramValue)[] urlEnco
 118        {
 0119            var urlBuilder = GenericPool<StringBuilder>.Get();
 0120            urlBuilder.Clear();
 0121            urlBuilder.Append(lambdaUrl);
 0122            if (!urlBuilder.ToString().EndsWith('/'))
 0123                urlBuilder.Append('/');
 124
 0125            var endPointSpan = endPoint.AsSpan();
 126
 0127            if (endPoint.StartsWith('/') || endPoint.StartsWith('\\'))
 0128                endPointSpan = endPointSpan[1..];
 129
 0130            if (endPoint.EndsWith('/') || endPoint.EndsWith('\\') || endPoint.EndsWith('?'))
 0131                endPointSpan = endPointSpan[..^1];
 132
 0133            urlBuilder.Append(endPointSpan);
 134
 0135            if (urlEncodedParams.Length > 0)
 136            {
 0137                urlBuilder.Append(endPoint.Contains('?') ? '&' : '?');
 138
 0139                for (var i = 0; i < urlEncodedParams.Length; i++)
 140                {
 0141                    var param = urlEncodedParams[i];
 0142                    urlBuilder.Append(param.paramName);
 0143                    urlBuilder.Append('=');
 0144                    urlBuilder.Append(param.paramValue);
 145
 0146                    if (i < urlEncodedParams.Length - 1)
 0147                        urlBuilder.Append('&');
 148                }
 149            }
 150
 0151            var url = urlBuilder.ToString();
 0152            GenericPool<StringBuilder>.Release(urlBuilder);
 0153            return url;
 154        }
 155
 156        private string AppendQueryParamsToUrl(string url, params (string paramName, string paramValue)[] urlEncodedParam
 157        {
 0158            var urlBuilder = GenericPool<StringBuilder>.Get();
 0159            urlBuilder.Clear();
 0160            urlBuilder.Append(url);
 0161            if (!urlBuilder.ToString().EndsWith('/'))
 0162                urlBuilder.Append('/');
 163
 0164            if (urlEncodedParams.Length > 0)
 165            {
 0166                urlBuilder.Append(url.Contains('?') ? '&' : '?');
 167
 0168                for (var i = 0; i < urlEncodedParams.Length; i++)
 169                {
 0170                    var param = urlEncodedParams[i];
 0171                    urlBuilder.Append(param.paramName);
 0172                    urlBuilder.Append('=');
 0173                    urlBuilder.Append(param.paramValue);
 174
 0175                    if (i < urlEncodedParams.Length - 1)
 0176                        urlBuilder.Append('&');
 177                }
 178            }
 179
 0180            var result = urlBuilder.ToString();
 0181            GenericPool<StringBuilder>.Release(urlBuilder);
 0182            return result;
 183        }
 184
 185        internal static bool TryParseResponse<TResponse>(string endPoint,
 186            string textResponse, out TResponse response)
 187        {
 188            try
 189            {
 0190                response = JsonConvert.DeserializeObject<TResponse>(textResponse);
 0191                return true;
 192            }
 0193            catch (Exception e)
 194            {
 0195                response = default;
 0196                PrintError<TResponse>(endPoint, e.Message);
 0197                return false;
 198            }
 0199        }
 200
 201        internal string GetLambdasUrl() =>
 0202            catalyst.lambdasUrl;
 203
 204        private static void PrintError<TResponse>(string endPoint, string message)
 205        {
 0206            Debug.LogError($"Lambda {endPoint}, response {typeof(TResponse)}: {message}");
 0207        }
 208
 209        public void Initialize()
 210        {
 425211            catalyst = DCL.Environment.i.serviceLocator.Get<IServiceProviders>().catalyst;
 425212        }
 213
 425214        public void Dispose() { }
 215    }
 216}