| { | { | ||||
| public class SpotifyDbConfig | public class SpotifyDbConfig | ||||
| { | { | ||||
| public string ConnectionString { get; set; } = null!; | |||||
| public string DatabaseName { get; set; } = null!; | |||||
| public string UserCollection { get; set; } = null!; | |||||
| public string TracksCollection { get; set; } = null!; | |||||
| public string ConnectionString { get; set; } = "mongodb://127.0.0.1:27017"; | |||||
| public string DatabaseName { get; set; } = "spotifyDb"; | |||||
| public string UserCollection { get; set; } = "Users"; | |||||
| public string TracksCollection { get; set; } = "Tracks"; | |||||
| } | } | ||||
| } | } |
| //call spotify api | //call spotify api | ||||
| builder.Services.AddHttpClient(); | builder.Services.AddHttpClient(); | ||||
| builder.Services.Configure<CodeRequest>( | |||||
| builder.Configuration.GetSection("AuthParams")); | |||||
| builder.Services.AddSingleton<SpotifyDbConfig>(); | builder.Services.AddSingleton<SpotifyDbConfig>(); | ||||
| builder.Services.Configure<SpotifyDbConfig>( | builder.Services.Configure<SpotifyDbConfig>( | ||||
| builder.Configuration.GetSection("SpotifyDb")); | builder.Configuration.GetSection("SpotifyDb")); | ||||
| builder.Services.AddHttpClient("HttpClient", c => | |||||
| { | |||||
| c.BaseAddress = new Uri(builder.Configuration.GetSection("SpotifyConfig:SpotifyURL").Value.ToString()); | |||||
| c.DefaultRequestHeaders.Add("Accept", builder.Configuration.GetSection("SpotifyConfig:MediaType").Value.ToString()); | |||||
| //builder.Services.AddHttpClient("HttpClient", c => | |||||
| //{ | |||||
| // c.BaseAddress = new Uri(builder.Configuration.GetSection("SpotifyConfig:SpotifyURL").Value.ToString()); | |||||
| // c.DefaultRequestHeaders.Add("Accept", builder.Configuration.GetSection("SpotifyConfig:MediaType").Value.ToString()); | |||||
| }); | |||||
| //}); | |||||
| var app = builder.Build(); | var app = builder.Build(); | ||||
| return new UserResponse | return new UserResponse | ||||
| { | { | ||||
| Id = user.Id, | Id = user.Id, | ||||
| Token = user.Token | |||||
| Token = user.Token, | |||||
| RefreshToken = user.RefreshToken | |||||
| }; | }; | ||||
| else return new UserResponse(); | else return new UserResponse(); | ||||
| } | } |
| "AllowedHosts": "*", | "AllowedHosts": "*", | ||||
| "Kestrel": { | "Kestrel": { | ||||
| "EndpointDefaults": { | "EndpointDefaults": { | ||||
| "Protocols": "Http2" | |||||
| "Protocols": "Http1AndHttp2" | |||||
| } | } | ||||
| }, | }, | ||||
| "AuthParams": { | |||||
| "ClientId": "83e1d09876b049c4bb1953185a4b3bfb", | |||||
| "RedirectURI": "https://localhost:44342/callback", | |||||
| "Scope": "user-read-currently-playing user-read-email user-library-modify user-top-read user-read-private", | |||||
| "ClientSecret": "ea752433d0774fad87fab5c1ee788c8d" | |||||
| }, | |||||
| "SpotifyDb": { | "SpotifyDb": { | ||||
| "ConnectionString": "mongodb://127.0.0.1:27017", | "ConnectionString": "mongodb://127.0.0.1:27017", | ||||
| "DatabaseName": "spotifyDb", | "DatabaseName": "spotifyDb", | ||||
| "UserCollection": "Users", | "UserCollection": "Users", | ||||
| "TracksCollection": "Tracks" | "TracksCollection": "Tracks" | ||||
| }, | |||||
| "SpotifyConfig": { | |||||
| "SpotifyURL": "https://api.spotify.com/v1/", | |||||
| "MediaType": "application/json" | |||||
| } | } | ||||
| //"SpotifyConfig": { | |||||
| // "SpotifyURL": "https://api.spotify.com/v1/", | |||||
| // "MediaType": "application/json" | |||||
| //} | |||||
| } | } |
| if (req.StatusCode == System.Net.HttpStatusCode.Unauthorized) | if (req.StatusCode == System.Net.HttpStatusCode.Unauthorized) | ||||
| { | { | ||||
| await SpotifyHelper.TryRefreshToken(authService, userResponse, identityService); | |||||
| string newToken = await SpotifyHelper.TryRefreshToken(authService, userResponse, identityService); | |||||
| if (newToken != null) | |||||
| { | |||||
| client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + newToken); | |||||
| req = await client.GetAsync(url); | |||||
| response = JsonConvert.DeserializeObject<T>(await req.Content.ReadAsStringAsync())!; | |||||
| } | |||||
| //ako to ne radi to znaci da je refresh token isteko, treba da se refreshuje | |||||
| } | } | ||||
| return response; | return response; | ||||
| } | } | ||||
| } | } | ||||
| public static async Task PutData(HttpClient client, string url, string userId, IIdentityService identityService) | |||||
| public static async Task PutData(HttpClient client, string url, string userId, IIdentityService identityService, IAuthService authService) | |||||
| { | { | ||||
| var tokenMessage = await identityService.GetTokenByIdAsync(new GrpcShared.DTO.Db.DbRequestMessage { Id = userId }); | |||||
| //add header | |||||
| client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + tokenMessage.Token); | |||||
| try | |||||
| { | |||||
| var tokenMessage = await identityService.GetTokenByIdAsync(new GrpcShared.DTO.Db.DbRequestMessage { Id = userId }); | |||||
| //add header | |||||
| client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + tokenMessage.Token); | |||||
| //get request | |||||
| var responseMessage = await client.PutAsync(url, null); | |||||
| if(responseMessage.StatusCode == System.Net.HttpStatusCode.Unauthorized) | |||||
| { | |||||
| string newToken = await SpotifyHelper.TryRefreshToken(authService, tokenMessage, identityService); | |||||
| if (newToken != null) | |||||
| { | |||||
| responseMessage = await client.PutAsync(url, null); | |||||
| } | |||||
| } | |||||
| } | |||||
| catch (RpcException e) | |||||
| { | |||||
| if (e.StatusCode == StatusCode.Cancelled) | |||||
| { | |||||
| //vrati message sa status kodom? | |||||
| return; | |||||
| } | |||||
| throw; | |||||
| } | |||||
| //get request | |||||
| await client.PutAsync(url, null); | |||||
| } | } | ||||
| builder.Services.AddCodeFirstGrpcReflection(); | builder.Services.AddCodeFirstGrpcReflection(); | ||||
| builder.Services.Configure<CodeRequest>(builder.Configuration.GetSection("AuthParams")); | builder.Services.Configure<CodeRequest>(builder.Configuration.GetSection("AuthParams")); | ||||
| builder.Services.AddScoped<IIdentityService, IdentityService>(); | |||||
| builder.Services.AddScoped<IAuthService, AuthService>(); | |||||
| var app = builder.Build(); | var app = builder.Build(); | ||||
| _authService = authService; | _authService = authService; | ||||
| } | } | ||||
| public async Task<CurrentTrackResponse> GetCurrentlyPlayingTrack(SessionMessage message) | public async Task<CurrentTrackResponse> GetCurrentlyPlayingTrack(SessionMessage message) | ||||
| { | { | ||||
| string url = "me/player/currently-playing"; | string url = "me/player/currently-playing"; |
| string url = $"me/tracks/{query}"; | 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 | //the response type has nothing to do with the method, it's there so that the method can be called | ||||
| await HttpUtils.HttpUtils<StatusCodeMessage>.PutData(client, url, request.UserId!, _identityService); | |||||
| await HttpUtils.HttpUtils<StatusCodeMessage>.PutData(client, url, request.UserId!, _identityService, _authService); | |||||
| } | } | ||||
| public static string UriUtil(Dictionary<string, List<string>> param) | public static string UriUtil(Dictionary<string, List<string>> param) |