using Google.Rpc; using Grpc.Core; using GrpcShared; using GrpcShared.DTO; 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; private IIdentityService _identityService; private IAuthService _authService; public TrackService(IHttpClientFactory httpClientFactory, IIdentityService identityService, IAuthService authService) { _httpClientFactory = httpClientFactory; _identityService = identityService; _authService = authService; } public async Task ListSearchAsync(SearchRequest request) { string url = $"search?q={request.Query}&type={request.Type}"; return await HttpUtils.HttpUtils.GetData(_httpClientFactory, url, request.UserId!, _identityService, _authService); } public async Task ListSingleTrackAsync(SingleTrackRequest request) { string url = $"audio-features/{request.Id}"; return await HttpUtils.HttpUtils.GetData(_httpClientFactory, url, request.UserId!, _identityService,_authService); } public async Task ListMultipleTrackAsync(MultipleTrackRequest request) { var param = new Dictionary>(); param["ids"] = request.Ids!; var query = UriUtil(param); string url = $"audio-features{query}"; return await HttpUtils.HttpUtils.GetData(_httpClientFactory, url, request.UserId, _identityService, _authService); } 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.UserId!, _identityService); } 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) { string url = $"tracks/{request.TrackID}"; return await HttpUtils.HttpUtils.GetData(_httpClientFactory, url, request.UserId!, _identityService, _authService); } } }