Blazor & WASM in combination to get statistics from Spotify API for performing the song analysis. With separate microservices for auth, Spotify, user data tracking, and application, connected through gRPC with Polly.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using Grpc.Core;
  2. using GrpcShared.DTO.Db;
  3. using GrpcShared.Interfaces;
  4. using Microsoft.Net.Http.Headers;
  5. using Newtonsoft.Json;
  6. namespace SpotifyService.HttpUtils
  7. {
  8. public static class HttpUtils<T> where T : new()
  9. {
  10. public static async Task<T> GetData
  11. (IHttpClientFactory _httpClientFactory,
  12. string url,
  13. string userId,
  14. IIdentityService identityService,
  15. IAuthService authService)
  16. {
  17. try
  18. {
  19. var client = _httpClientFactory.CreateClient("HttpClient");
  20. var userResponse = await identityService.GetTokenByIdAsync(new DbRequestMessage { Id = userId });
  21. //add header
  22. client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + userResponse.Token);
  23. //get request
  24. var req = await client.GetAsync(url);
  25. //read response
  26. var response = JsonConvert.DeserializeObject<T>(await req.Content.ReadAsStringAsync())!;
  27. if (req.StatusCode == System.Net.HttpStatusCode.Unauthorized)
  28. {
  29. string? newToken = await TryRefreshToken(authService, userResponse, identityService);
  30. if (newToken != null)
  31. {
  32. client.DefaultRequestHeaders.Remove(HeaderNames.Authorization);
  33. client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + newToken);
  34. req = await client.GetAsync(url);
  35. response = JsonConvert.DeserializeObject<T>(await req.Content.ReadAsStringAsync())!;
  36. }
  37. //ako to ne radi to znaci da je refresh token isteko, treba da se refreshuje
  38. }
  39. return response;
  40. }
  41. catch (RpcException e)
  42. {
  43. if (e.StatusCode == StatusCode.Cancelled)
  44. {
  45. //vrati message sa status kodom?
  46. return new T();
  47. }
  48. throw;
  49. }
  50. }
  51. public static async Task PutData(HttpClient client,
  52. string url,
  53. string userId,
  54. IIdentityService identityService,
  55. IAuthService authService)
  56. {
  57. try
  58. {
  59. var tokenMessage = await identityService.GetTokenByIdAsync(new DbRequestMessage { Id = userId });
  60. //add header
  61. client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + tokenMessage.Token);
  62. //get request
  63. var responseMessage = await client.PutAsync(url, null);
  64. if (responseMessage.StatusCode == System.Net.HttpStatusCode.Unauthorized)
  65. {
  66. string? newToken = await TryRefreshToken(authService, tokenMessage, identityService);
  67. if (newToken != null)
  68. {
  69. client.DefaultRequestHeaders.Remove(HeaderNames.Authorization);
  70. client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + newToken);
  71. responseMessage = await client.PutAsync(url, null);
  72. }
  73. }
  74. }
  75. catch (RpcException e)
  76. {
  77. if (e.StatusCode == StatusCode.Cancelled)
  78. {
  79. //vrati message sa status kodom?
  80. return;
  81. }
  82. throw;
  83. }
  84. }
  85. public static async Task<string?> TryRefreshToken(
  86. IAuthService authService,
  87. UserResponse user,
  88. IIdentityService identityService)
  89. {
  90. var refreshResponse = await authService.RefreshAccessToken(user);
  91. if (refreshResponse.AccessToken != null)
  92. {
  93. await identityService.UpdateTokenAsync(new UserResponse
  94. {
  95. Id = user.Id,
  96. Token = refreshResponse.AccessToken,
  97. RefreshToken = user.RefreshToken
  98. });
  99. return refreshResponse.AccessToken;
  100. }
  101. else return null;
  102. }
  103. }
  104. }