using Google.Rpc; using Grpc.Core; using GrpcShared; using GrpcShared.DTO.Search; using GrpcShared.DTO.Track.MultipleTrack; using GrpcShared.DTO.Track.SaveTracks; using GrpcShared.DTO.Track.SingleTrack; using GrpcShared.DTO.TrackByID; using GrpcShared.Interfaces; using Microsoft.AspNetCore.Authorization; using Microsoft.Net.Http.Headers; using NemAnBlazor.Services; using Newtonsoft.Json; using System.Text; using System.Text.Json; using System.Web; using static GrpcShared.DTO.Search.SearchDetails; namespace SpotifyService.Services { public class TrackService : ITrackService { private readonly IHttpClientFactory _httpClientFactory; public TrackService(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } public async Task ListSearchAsync(SearchRequest request) { var client = _httpClientFactory.CreateClient("HttpClient"); string url = $"search?q={request.Query}&type={request.Type}"; return await HttpUtils.HttpUtils.GetData(client, url, request.Token!); } public async Task ListSingleTrackAsync(SingleTrackRequest request) { var client = _httpClientFactory.CreateClient("HttpClient"); string url = $"audio-features/{request.Id}"; return await HttpUtils.HttpUtils.GetData(client, url, request.Token!); } public async Task ListMultipleTrackAsync(MultipleTrackRequest request) { var client = _httpClientFactory.CreateClient("HttpClient"); var param = new Dictionary>(); param["ids"] = request.Ids!; var query = UriUtil(param); string url = $"audio-features{query}"; return await HttpUtils.HttpUtils.GetData(client,url,request.Token!); } public async Task SaveTracks(SaveTracksRequest request) { var client = _httpClientFactory.CreateClient("HttpClient"); var param = new Dictionary>(); param["ids"] = request.Ids!; var query = UriUtil(param); string url = $"me/tracks/{query}"; //the response type has nothing to do with the method, it's there so that the method can be called await HttpUtils.HttpUtils.PutData(client, url, request.Token!); } public static string UriUtil(Dictionary> param) { bool startingQuestionMarkAdded = false; var sb = new StringBuilder(); foreach (var id in param) { sb.Append(startingQuestionMarkAdded ? '&' : '?'); sb.Append(id.Key); sb.Append('='); foreach (var Xid in id.Value) { sb.Append(Xid); sb.Append("%2C"); startingQuestionMarkAdded = true; } } sb.Length = sb.Length - 3; return sb.ToString(); } public async Task GetById(TrackRequest request) { var client = _httpClientFactory.CreateClient("HttpClient"); string url = $"tracks/{request.TrackID}"; return await HttpUtils.HttpUtils.GetData(client, url, request.Token!); } } }