using Microsoft.AspNetCore.Components; using SpotifyAPI.Web; using SpotiParty.Web.Models; namespace SpotiParty.Web.Services; public sealed class AuthorizationHandler(NavigationManager navigator, DatabaseContext context) { private async Task<(string clientId, string clientSecret)> GetClientSecrets() { var fileLines = await File.ReadAllLinesAsync(Path.Combine(Environment.CurrentDirectory, ".dev-token")); return (fileLines[0], fileLines[1]); } public async Task ConfigureClient(Guid userId) { var user = await context.Users.FindAsync(userId); if (user is null) return null; var (clientId, clientSecret) = await GetClientSecrets(); var request = new AuthorizationCodeRefreshRequest(clientId, clientSecret, user.RefreshToken); var response = await new OAuthClient().RequestToken(request); return new SpotifyClient(response.AccessToken); } public async Task ConstructLoginUri() { var (clientId, _) = await GetClientSecrets(); var request = new LoginRequest( new Uri(navigator.BaseUri + "callback"), clientId, LoginRequest.ResponseType.Code) { Scope = [Scopes.UserReadPlaybackState, Scopes.UserModifyPlaybackState, Scopes.UserReadPrivate, Scopes.UserReadEmail] }; return request.ToUri(); } public async Task HandleCallback(string code) { var (clientId, clientSecret) = await GetClientSecrets(); var response = await new OAuthClient().RequestToken( new AuthorizationCodeTokenRequest( clientId, clientSecret, code, new Uri(navigator.BaseUri + "callback"))); var client = new SpotifyClient(response.AccessToken); var spotiUser = await client.UserProfile.Current(); var user = new User { DisplayName = spotiUser.DisplayName, RefreshToken = response.RefreshToken }; await context.Users.AddAsync(user); await context.SaveChangesAsync(); } }