public async Task <IActionResult> OnGetAsync([FromQuery] int offset = 0) { this.Offset = offset; VisifyUser user = await _userManager.GetUserAsync(User); if (user == null) { return(NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.")); } VOption <IList <VisifySavedTrack> > stracks = await DatabaseService.GetUsersSavedTracks(user.Id, offset, 50); if (!stracks.WasSuccess) { StatusMessage = "Sorry, we coudln't retrieve your saved songs, we are having database problems. Please try again later."; IsDisabled = true; } VOption <int> libCountO = await DatabaseService.GetUserLibraryCount(user.Id); if (!libCountO.WasSuccess) { StatusMessage = "Sorry, we coudln't retrieve your saved songs, we are having database problems. Please try again later."; IsDisabled = true; } SavedTracks = stracks.Value; LibraryCount = libCountO.Value; CanGoForwards = (!IsDisabled && this.Offset < LibraryCount); CanGoBackwards = (!IsDisabled && this.Offset > 0); return(Page()); }
public async Task <IActionResult> GetArtistLinks() { VisifyUser user = await _userManager.GetUserAsync(User); if (user == null) { logger.LogInformation($"Tried to get Artist Song Count graph data for user {_userManager.GetUserId(User)}, but user did not exist"); return(NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.")); } // Get the tracks and artists VOption <IList <VisifySavedTrack> > stracks = await DatabaseService.GetUsersSavedTracks(user.Id, limit : 10_000); if (!stracks.WasSuccess) { logger.LogError($"Failed to retreive saved tracks for user {_userManager.GetUserId(User)}", stracks.ErrorMessage); return(Json("FAILED")); } // create a proper d3 structure Dictionary <string, FDGNode> nodes = new Dictionary <string, FDGNode>(); Dictionary <string, FDGEdge> edges = new Dictionary <string, FDGEdge>(); foreach (VisifySavedTrack vst in stracks.Value) { string tid = $"tid_{vst.VisifyTrack.SpotifyId}"; string[] idarr = new string[2]; foreach (VisifyArtist va in vst.VisifyTrack.Artists) { string sid = $"aid_{va.SpotifyId}"; idarr[0] = sid; idarr[1] = tid; Array.Sort(idarr); string lid0 = String.Join("", idarr); string lid1 = $"at_{lid0}"; if (!nodes.ContainsKey(sid)) { nodes.Add(sid, new FDGNode(sid, 0, va.ArtistName, 0, 1)); } else { nodes[sid].size += 1; } nodes.Add(lid1, new FDGNode(lid1, 0, vst.VisifyTrack.TrackName, 1, 1)); if (!edges.ContainsKey(lid0)) { edges.Add(lid0, new FDGEdge(lid1, sid, 0.1)); } } } Dictionary <string, object> keys = new Dictionary <string, object>() { { "nodes", nodes.Values }, { "links", edges.Values } }; return(Json(keys)); }
public async Task <IActionResult> OnGetCallbackAsync(string returnUrl = null, string remoteError = null) { returnUrl = returnUrl ?? Url.Content("~/"); if (remoteError != null) { ErrorMessage = $"Error from external provider: {remoteError}"; return(RedirectToPage("./Login", new { ReturnUrl = returnUrl })); } var info = await _signInManager.GetExternalLoginInfoAsync(); if (info == null) { ErrorMessage = "Error loading external login information."; return(RedirectToPage("./Login", new { ReturnUrl = returnUrl })); } // Sign in the user with this external login provider if the user already has a login. var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent : false, bypassTwoFactor : true); string aspnetid = _userManager.GetUserId(info.Principal); if (result.Succeeded) { _logger.LogInformation("{Name} logged in with {LoginProvider} provider.", info.Principal.Identity.Name, info.LoginProvider); await _signInManager.UpdateExternalAuthenticationTokensAsync(info); _spotify.GetUsersLibrary(aspnetid); return(LocalRedirect(returnUrl)); } if (result.IsLockedOut) { return(RedirectToPage("./Lockout")); } else { // If the user does not have an account, then ask the user to create an account. string uid = _userManager.GetUserId(info.Principal); string uname = _userManager.GetUserName(info.Principal); var user = new VisifyUser { UserName = String.IsNullOrWhiteSpace(uname) ? uid : uname, Id = uid }; var result2 = await _userManager.CreateAsync(user); if (result2.Succeeded) { result2 = await _userManager.AddLoginAsync(user, info); if (result2.Succeeded) { await _signInManager.UpdateExternalAuthenticationTokensAsync(info); _spotify.GetUsersLibrary(aspnetid); // Purposefully do not await ReturnUrl = returnUrl; LoginProvider = info.LoginProvider; await _signInManager.SignInAsync(user, isPersistent : false); _logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider); return(LocalRedirect(returnUrl)); } } foreach (var error in result2.Errors) { ModelState.AddModelError(string.Empty, error.Description); } return(Page()); } }
public async Task <IActionResult> GetArtistCollabLinks() { VisifyUser user = await _userManager.GetUserAsync(User); if (user == null) { logger.LogInformation($"Tried to get Artist Collab Link graph data for user {_userManager.GetUserId(User)}, but user did not exist"); return(NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.")); } // Get the tracks and artists VOption <IList <VisifySavedTrack> > stracks = await DatabaseService.GetUsersSavedTracks(user.Id, limit : 10_000); if (!stracks.WasSuccess) { logger.LogError($"Failed to retreive saved tracks for user {_userManager.GetUserId(User)}", stracks.ErrorMessage); return(Json("FAILED")); } // create a proper d3 structure Dictionary <string, FDGNode> nodes = new Dictionary <string, FDGNode>(); Dictionary <string, FDGEdge> edges = new Dictionary <string, FDGEdge>(); foreach (VisifySavedTrack vst in stracks.Value) { string tid = $"tid_{vst.VisifyTrack.SpotifyId}"; string[] idarr = new string[2]; Stack <string> artistsOnThisTrack = new Stack <string>(vst.VisifyTrack.Artists.Count); for (int i = 0; i < vst.VisifyTrack.Artists.Count; i++) { VisifyArtist va = vst.VisifyTrack.Artists[i]; if (!nodes.ContainsKey(va.SpotifyId)) { nodes.Add(va.SpotifyId, new FDGNode(va.SpotifyId, 0, va.ArtistName, 1, 1000)); } artistsOnThisTrack.Push(va.SpotifyId); } while (artistsOnThisTrack.Count > 0) { string a = artistsOnThisTrack.Pop(); foreach (string othera in artistsOnThisTrack) { idarr[0] = a; idarr[1] = othera; Array.Sort(idarr); string lid0 = String.Join("", idarr); Dictionary <string, string> tn = new Dictionary <string, string>() { { "name", vst.VisifyTrack.TrackName } }; if (edges.ContainsKey(lid0)) { edges[lid0].strength += 0.1; edges[lid0].tracks.Add(tn); } else { FDGEdge n = new FDGEdge(othera, a, 0.1); n.tracks.Add(tn); edges.Add(lid0, n); } } } } Dictionary <string, object> keys = new Dictionary <string, object>() { { "nodes", nodes.Values }, { "links", edges.Values } }; return(Json(keys)); }