v1.0.0: Fixed url with confirmation email working behind proxy. Updated SQL identity seeds.

This commit is contained in:
Steven Hildreth 2019-05-26 08:10:28 -05:00
parent 1a63e49ade
commit 6d2716363e
2 changed files with 73 additions and 44 deletions

View file

@ -24,6 +24,8 @@ namespace Roadie.Api.Controllers
[AllowAnonymous] [AllowAnonymous]
public class AccountController : ControllerBase public class AccountController : ControllerBase
{ {
private string _baseUrl = null;
private readonly IConfiguration Configuration; private readonly IConfiguration Configuration;
private readonly ILogger<AccountController> Logger; private readonly ILogger<AccountController> Logger;
private readonly SignInManager<ApplicationUser> SignInManager; private readonly SignInManager<ApplicationUser> SignInManager;
@ -35,6 +37,28 @@ namespace Roadie.Api.Controllers
private IHttpContext RoadieHttpContext { get; } private IHttpContext RoadieHttpContext { get; }
private IRoadieSettings RoadieSettings { get; } private IRoadieSettings RoadieSettings { get; }
private string BaseUrl
{
get
{
if (this._baseUrl == null)
{
var scheme = Request.Scheme;
if (this.RoadieSettings.UseSSLBehindProxy)
{
scheme = "https";
}
var host = Request.Host;
if (!string.IsNullOrEmpty(this.RoadieSettings.BehindProxyHost))
{
host = new Microsoft.AspNetCore.Http.HostString(this.RoadieSettings.BehindProxyHost);
}
this._baseUrl = $"{ scheme }://{ host }";
}
return this._baseUrl;
}
}
public AccountController( public AccountController(
IAdminService adminService, IAdminService adminService,
UserManager<ApplicationUser> userManager, UserManager<ApplicationUser> userManager,
@ -102,7 +126,7 @@ namespace Roadie.Api.Controllers
try try
{ {
var code = await this.UserManager.GenerateEmailConfirmationTokenAsync(user); var code = await this.UserManager.GenerateEmailConfirmationTokenAsync(user);
var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, Request.Scheme); var callbackUrl = $"{ this.BaseUrl}/auth/confirmemail?userId={ user.Id}&code={ code }";
await this.EmailSender.SendEmailAsync(user.Email, $"Confirm your { this.RoadieSettings.SiteName } email", $"Please confirm your { this.RoadieSettings.SiteName } account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>."); await this.EmailSender.SendEmailAsync(user.Email, $"Confirm your { this.RoadieSettings.SiteName } email", $"Please confirm your { this.RoadieSettings.SiteName } account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
} }
catch (Exception ex) catch (Exception ex)
@ -181,7 +205,7 @@ namespace Roadie.Api.Controllers
try try
{ {
var code = await this.UserManager.GenerateEmailConfirmationTokenAsync(user); var code = await this.UserManager.GenerateEmailConfirmationTokenAsync(user);
var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, Request.Scheme); var callbackUrl = $"{ this.BaseUrl}/auth/confirmemail?userId={ user.Id}&code={ code }";
await this.EmailSender.SendEmailAsync(user.Email, $"Confirm your { this.RoadieSettings.SiteName } email", $"Please confirm your { this.RoadieSettings.SiteName } account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>."); await this.EmailSender.SendEmailAsync(user.Email, $"Confirm your { this.RoadieSettings.SiteName } email", $"Please confirm your { this.RoadieSettings.SiteName } account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
} }
catch (Exception ex) catch (Exception ex)
@ -253,6 +277,11 @@ namespace Roadie.Api.Controllers
public async Task<IActionResult> SendPasswordResetEmail(string username, string callbackUrl) public async Task<IActionResult> SendPasswordResetEmail(string username, string callbackUrl)
{ {
var user = await UserManager.FindByNameAsync(username); var user = await UserManager.FindByNameAsync(username);
if(user == null)
{
this.Logger.LogError($"Unable to find user by username [{ username }]");
return StatusCode(500);
}
var token = await this.UserManager.GeneratePasswordResetTokenAsync(user); var token = await this.UserManager.GeneratePasswordResetTokenAsync(user);
callbackUrl = callbackUrl + "?username=" + username + "&token=" + WebEncoders.Base64UrlEncode(System.Text.Encoding.ASCII.GetBytes(token)); callbackUrl = callbackUrl + "?username=" + username + "&token=" + WebEncoders.Base64UrlEncode(System.Text.Encoding.ASCII.GetBytes(token));
try try

View file

@ -1,13 +1,13 @@
-- MySQL dump 10.14 Distrib 5.5.60-MariaDB, for Linux (x86_64) -- MySQL dump 10.17 Distrib 10.3.15-MariaDB, for Linux (x86_64)
-- --
-- Host: localhost Database: roadie -- Host: localhost Database: roadie
-- ------------------------------------------------------ -- ------------------------------------------------------
-- Server version 5.5.60-MariaDB -- Server version 10.3.15-MariaDB-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */; /*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */; /*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
@ -37,19 +37,19 @@ CREATE TABLE `artist` (
`iTunesId` varchar(100) DEFAULT NULL, `iTunesId` varchar(100) DEFAULT NULL,
`amgId` varchar(100) DEFAULT NULL, `amgId` varchar(100) DEFAULT NULL,
`spotifyId` varchar(100) DEFAULT NULL, `spotifyId` varchar(100) DEFAULT NULL,
`thumbnail` blob, `thumbnail` blob DEFAULT NULL,
`profile` text, `profile` text DEFAULT NULL,
`birthDate` date DEFAULT NULL, `birthDate` date DEFAULT NULL,
`beginDate` date DEFAULT NULL, `beginDate` date DEFAULT NULL,
`endDate` date DEFAULT NULL, `endDate` date DEFAULT NULL,
`artistType` enum('Person','Group','Orchestra','Choir','Character','Meta','Other') DEFAULT NULL, `artistType` enum('Person','Group','Orchestra','Choir','Character','Meta','Other') DEFAULT NULL,
`bioContext` text, `bioContext` text DEFAULT NULL,
`bandStatus` enum('Active','On Hold','Split Up','Deceased') DEFAULT NULL, `bandStatus` enum('Active','On Hold','Split Up','Deceased') DEFAULT NULL,
`discogsId` varchar(50) DEFAULT NULL, `discogsId` varchar(50) DEFAULT NULL,
`tags` text, `tags` text DEFAULT NULL,
`alternateNames` text, `alternateNames` text DEFAULT NULL,
`urls` text, `urls` text DEFAULT NULL,
`isniList` text, `isniList` text DEFAULT NULL,
`releaseCount` int(11) DEFAULT NULL, `releaseCount` int(11) DEFAULT NULL,
`trackCount` int(11) DEFAULT NULL, `trackCount` int(11) DEFAULT NULL,
`playedCount` int(11) DEFAULT NULL, `playedCount` int(11) DEFAULT NULL,
@ -168,15 +168,15 @@ CREATE TABLE `collection` (
`sortName` varchar(100) DEFAULT NULL, `sortName` varchar(100) DEFAULT NULL,
`edition` varchar(200) DEFAULT NULL, `edition` varchar(200) DEFAULT NULL,
`listInCSVFormat` varchar(200) DEFAULT NULL, `listInCSVFormat` varchar(200) DEFAULT NULL,
`listInCSV` text, `listInCSV` text DEFAULT NULL,
`description` varchar(4000) DEFAULT NULL, `description` varchar(4000) DEFAULT NULL,
`thumbnail` blob, `thumbnail` blob DEFAULT NULL,
`urls` text, `urls` text DEFAULT NULL,
`maintainerId` int(11) DEFAULT NULL, `maintainerId` int(11) DEFAULT NULL,
`collectionType` enum('Collection','Chart','Rank','Unknown') DEFAULT NULL, `collectionType` enum('Collection','Chart','Rank','Unknown') DEFAULT NULL,
`collectionCount` int(11) DEFAULT NULL, `collectionCount` int(11) DEFAULT NULL,
`tags` text, `tags` text DEFAULT NULL,
`alternateNames` text, `alternateNames` text DEFAULT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `ix_collection_name` (`name`), UNIQUE KEY `ix_collection_name` (`name`),
KEY `maintainerId` (`maintainerId`), KEY `maintainerId` (`maintainerId`),
@ -246,7 +246,7 @@ CREATE TABLE `image` (
`roadieId` varchar(36) DEFAULT NULL, `roadieId` varchar(36) DEFAULT NULL,
`createdDate` datetime DEFAULT NULL, `createdDate` datetime DEFAULT NULL,
`lastUpdated` datetime DEFAULT NULL, `lastUpdated` datetime DEFAULT NULL,
`image` mediumblob, `image` mediumblob DEFAULT NULL,
`url` varchar(500) DEFAULT NULL, `url` varchar(500) DEFAULT NULL,
`caption` varchar(100) DEFAULT NULL, `caption` varchar(100) DEFAULT NULL,
`signature` varchar(50) DEFAULT NULL, `signature` varchar(50) DEFAULT NULL,
@ -281,11 +281,11 @@ CREATE TABLE `label` (
`beginDate` date DEFAULT NULL, `beginDate` date DEFAULT NULL,
`endDate` date DEFAULT NULL, `endDate` date DEFAULT NULL,
`imageUrl` varchar(500) DEFAULT NULL, `imageUrl` varchar(500) DEFAULT NULL,
`tags` text, `tags` text DEFAULT NULL,
`alternateNames` text, `alternateNames` text DEFAULT NULL,
`urls` text, `urls` text DEFAULT NULL,
`thumbnail` blob, `thumbnail` blob DEFAULT NULL,
`profile` text, `profile` text DEFAULT NULL,
`discogsId` varchar(50) DEFAULT NULL, `discogsId` varchar(50) DEFAULT NULL,
`artistCount` int(11) DEFAULT NULL, `artistCount` int(11) DEFAULT NULL,
`releaseCount` int(11) DEFAULT NULL, `releaseCount` int(11) DEFAULT NULL,
@ -313,11 +313,11 @@ CREATE TABLE `playlist` (
`isPublic` tinyint(1) DEFAULT NULL, `isPublic` tinyint(1) DEFAULT NULL,
`name` varchar(100) NOT NULL, `name` varchar(100) NOT NULL,
`description` varchar(1000) DEFAULT NULL, `description` varchar(1000) DEFAULT NULL,
`thumbnail` blob, `thumbnail` blob DEFAULT NULL,
`urls` text, `urls` text DEFAULT NULL,
`tags` text, `tags` text DEFAULT NULL,
`userId` int(11) DEFAULT NULL, `userId` int(11) DEFAULT NULL,
`alternateNames` text, `alternateNames` text DEFAULT NULL,
`trackCount` smallint(6) DEFAULT NULL, `trackCount` smallint(6) DEFAULT NULL,
`duration` int(11) DEFAULT NULL, `duration` int(11) DEFAULT NULL,
`releaseCount` int(11) DEFAULT NULL, `releaseCount` int(11) DEFAULT NULL,
@ -372,24 +372,24 @@ CREATE TABLE `release` (
`lastUpdated` datetime DEFAULT NULL, `lastUpdated` datetime DEFAULT NULL,
`isVirtual` tinyint(1) DEFAULT NULL, `isVirtual` tinyint(1) DEFAULT NULL,
`title` varchar(250) NOT NULL, `title` varchar(250) NOT NULL,
`alternateNames` text, `alternateNames` text DEFAULT NULL,
`releaseDate` date DEFAULT NULL, `releaseDate` date DEFAULT NULL,
`rating` smallint(6) NOT NULL, `rating` smallint(6) NOT NULL,
`trackCount` smallint(6) NOT NULL, `trackCount` smallint(6) NOT NULL,
`mediaCount` smallint(6) DEFAULT NULL, `mediaCount` smallint(6) DEFAULT NULL,
`thumbnail` blob, `thumbnail` blob DEFAULT NULL,
`profile` text, `profile` text DEFAULT NULL,
`discogsId` varchar(50) DEFAULT NULL, `discogsId` varchar(50) DEFAULT NULL,
`releaseType` enum('Release','EP','Single','Unknown') DEFAULT NULL, `releaseType` enum('Release','EP','Single','Unknown') DEFAULT NULL,
`libraryStatus` enum('Complete','Incomplete','Missing','Wishlist') DEFAULT NULL, `libraryStatus` enum('Complete','Incomplete','Missing','Wishlist') DEFAULT NULL,
`iTunesId` varchar(100) DEFAULT NULL, `iTunesId` varchar(100) DEFAULT NULL,
`amgId` varchar(100) DEFAULT NULL, `amgId` varchar(100) DEFAULT NULL,
`lastFMId` varchar(100) DEFAULT NULL, `lastFMId` varchar(100) DEFAULT NULL,
`lastFMSummary` text, `lastFMSummary` text DEFAULT NULL,
`musicBrainzId` varchar(100) DEFAULT NULL, `musicBrainzId` varchar(100) DEFAULT NULL,
`spotifyId` varchar(100) DEFAULT NULL, `spotifyId` varchar(100) DEFAULT NULL,
`tags` text, `tags` text DEFAULT NULL,
`urls` text, `urls` text DEFAULT NULL,
`artistId` int(11) DEFAULT NULL, `artistId` int(11) DEFAULT NULL,
`lastPlayed` datetime DEFAULT NULL, `lastPlayed` datetime DEFAULT NULL,
`playedCount` int(11) DEFAULT NULL, `playedCount` int(11) DEFAULT NULL,
@ -566,21 +566,21 @@ CREATE TABLE `track` (
`hash` varchar(32) DEFAULT NULL, `hash` varchar(32) DEFAULT NULL,
`playedCount` int(11) DEFAULT NULL, `playedCount` int(11) DEFAULT NULL,
`lastPlayed` datetime DEFAULT NULL, `lastPlayed` datetime DEFAULT NULL,
`partTitles` text, `partTitles` text DEFAULT NULL,
`rating` smallint(6) NOT NULL, `rating` smallint(6) NOT NULL,
`musicBrainzId` varchar(100) DEFAULT NULL, `musicBrainzId` varchar(100) DEFAULT NULL,
`lastFMId` varchar(50) DEFAULT NULL, `lastFMId` varchar(50) DEFAULT NULL,
`amgId` varchar(100) DEFAULT NULL, `amgId` varchar(100) DEFAULT NULL,
`spotifyId` varchar(100) DEFAULT NULL, `spotifyId` varchar(100) DEFAULT NULL,
`title` varchar(250) NOT NULL, `title` varchar(250) NOT NULL,
`alternateNames` text, `alternateNames` text DEFAULT NULL,
`trackNumber` smallint(6) NOT NULL, `trackNumber` smallint(6) NOT NULL,
`duration` int(11) DEFAULT NULL, `duration` int(11) DEFAULT NULL,
`tags` text, `tags` text DEFAULT NULL,
`releaseMediaId` int(11) DEFAULT NULL, `releaseMediaId` int(11) DEFAULT NULL,
`artistId` int(11) DEFAULT NULL, `artistId` int(11) DEFAULT NULL,
`isrc` varchar(15) DEFAULT NULL, `isrc` varchar(15) DEFAULT NULL,
`thumbnail` blob, `thumbnail` blob DEFAULT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `idx_track_unique_to_eleasemedia` (`releaseMediaId`,`trackNumber`), UNIQUE KEY `idx_track_unique_to_eleasemedia` (`releaseMediaId`,`trackNumber`),
UNIQUE KEY `track_hash_IDX` (`hash`) USING BTREE, UNIQUE KEY `track_hash_IDX` (`hash`) USING BTREE,
@ -633,15 +633,15 @@ CREATE TABLE `user` (
`registeredOn` datetime DEFAULT NULL, `registeredOn` datetime DEFAULT NULL,
`lastLogin` datetime DEFAULT NULL, `lastLogin` datetime DEFAULT NULL,
`isActive` tinyint(1) DEFAULT NULL, `isActive` tinyint(1) DEFAULT NULL,
`avatar` blob, `avatar` blob DEFAULT NULL,
`doUseHtmlPlayer` tinyint(1) DEFAULT NULL, `doUseHtmlPlayer` tinyint(1) DEFAULT NULL,
`timezone` varchar(50) DEFAULT NULL, `timezone` varchar(50) DEFAULT NULL,
`playerTrackLimit` smallint(6) DEFAULT '50', `playerTrackLimit` smallint(6) DEFAULT 50,
`profile` text, `profile` text DEFAULT NULL,
`timeformat` varchar(50) DEFAULT 'YYYY-MM-DD HH:mm:ss', `timeformat` varchar(50) DEFAULT 'YYYY-MM-DD HH:mm:ss',
`isPrivate` tinyint(1) DEFAULT NULL, `isPrivate` tinyint(1) DEFAULT NULL,
`recentlyPlayedLimit` smallint(6) DEFAULT '50', `recentlyPlayedLimit` smallint(6) DEFAULT 50,
`randomReleaseLimit` smallint(6) DEFAULT '12', `randomReleaseLimit` smallint(6) DEFAULT 12,
`ftpUrl` varchar(250) DEFAULT NULL, `ftpUrl` varchar(250) DEFAULT NULL,
`ftpDirectory` varchar(500) DEFAULT NULL, `ftpDirectory` varchar(500) DEFAULT NULL,
`ftpUsername` varchar(50) DEFAULT NULL, `ftpUsername` varchar(50) DEFAULT NULL,
@ -926,7 +926,7 @@ SET character_set_client = @saved_cs_client;
/*!50001 SET collation_connection = utf8_general_ci */; /*!50001 SET collation_connection = utf8_general_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */ /*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`roadie`@`%` SQL SECURITY DEFINER */ /*!50013 DEFINER=`roadie`@`%` SQL SECURITY DEFINER */
/*!50001 VIEW `vTrackList` AS select `t`.`id` AS `trackId`,`t`.`roadieId` AS `trackRoadieId`,`t`.`createdDate` AS `trackCreatedDate`,`t`.`lastUpdated` AS `trackLastUpdated`,`t`.`duration` AS `trackDuration`,`t`.`fileSize` AS `trackFileSize`,`t`.`playedCount` AS `trackPlayedCount`,`t`.`rating` AS `trackRating`,`t`.`title` AS `trackTitle`,`rm`.`releaseMediaNumber` AS `releaseMediaNumber`,`r`.`id` AS `releaseId`,`r`.`roadieId` AS `releaseRoadieId`,`r`.`title` AS `releaseTitle`,`r`.`createdDate` AS `releaseCreatedDate`,`r`.`lastUpdated` AS `releaseLastUpdated`,`r`.`libraryStatus` AS `releaseLibraryStatus`,`r`.`rating` AS `releaseRating`,`r`.`releaseDate` AS `releaseDate`,`r`.`status` AS `releaseStatus`,`r`.`trackCount` AS `releaseTrackCount`,`r`.`playedCount` AS `releasePlayedCount`,`ra`.`id` AS `artistId`,`ra`.`roadieId` AS `artistRoadieId`,`ra`.`name` AS `artistName`,`ra`.`rating` AS `artistRating`,`ra`.`createdDate` AS `artistCreatedDate`,`ra`.`lastUpdated` AS `artistLastUpdated`,`ra`.`lastPlayed` AS `artistLastPlayed`,`ra`.`playedCount` AS `artistPlayedCount`,`ra`.`releaseCount` AS `artistReleaseCount`,`ra`.`trackCount` AS `artistTrackCount`,`ra`.`sortName` AS `artistSortName`,`ta`.`id` AS `trackArtistId`,`ta`.`roadieId` AS `trackArtistRoadieId`,`ta`.`name` AS `trackArtistName`,`ta`.`rating` AS `trackArtistRating`,`ta`.`createdDate` AS `trackArtistCreatedDate`,`ta`.`lastUpdated` AS `trackArtistLastUpdated`,`ta`.`lastPlayed` AS `trackArtistLastPlayed`,`ta`.`playedCount` AS `trackArtistPlayedCount`,`ta`.`releaseCount` AS `trackArtistReleaseCount`,`ta`.`trackCount` AS `trackArtistTrackCount`,`ta`.`sortName` AS `trackArtistSortName` from ((((`track` `t` join `releasemedia` `rm` on((`t`.`releaseMediaId` = `rm`.`id`))) join `release` `r` on((`rm`.`releaseId` = `r`.`id`))) join `artist` `ra` on((`r`.`artistId` = `ra`.`id`))) left join `artist` `ta` on((`t`.`artistId` = `ta`.`id`))) where (`t`.`hash` is not null) */; /*!50001 VIEW `vTrackList` AS select `t`.`id` AS `trackId`,`t`.`roadieId` AS `trackRoadieId`,`t`.`createdDate` AS `trackCreatedDate`,`t`.`lastUpdated` AS `trackLastUpdated`,`t`.`duration` AS `trackDuration`,`t`.`fileSize` AS `trackFileSize`,`t`.`playedCount` AS `trackPlayedCount`,`t`.`rating` AS `trackRating`,`t`.`title` AS `trackTitle`,`rm`.`releaseMediaNumber` AS `releaseMediaNumber`,`r`.`id` AS `releaseId`,`r`.`roadieId` AS `releaseRoadieId`,`r`.`title` AS `releaseTitle`,`r`.`createdDate` AS `releaseCreatedDate`,`r`.`lastUpdated` AS `releaseLastUpdated`,`r`.`libraryStatus` AS `releaseLibraryStatus`,`r`.`rating` AS `releaseRating`,`r`.`releaseDate` AS `releaseDate`,`r`.`status` AS `releaseStatus`,`r`.`trackCount` AS `releaseTrackCount`,`r`.`playedCount` AS `releasePlayedCount`,`ra`.`id` AS `artistId`,`ra`.`roadieId` AS `artistRoadieId`,`ra`.`name` AS `artistName`,`ra`.`rating` AS `artistRating`,`ra`.`createdDate` AS `artistCreatedDate`,`ra`.`lastUpdated` AS `artistLastUpdated`,`ra`.`lastPlayed` AS `artistLastPlayed`,`ra`.`playedCount` AS `artistPlayedCount`,`ra`.`releaseCount` AS `artistReleaseCount`,`ra`.`trackCount` AS `artistTrackCount`,`ra`.`sortName` AS `artistSortName`,`ta`.`id` AS `trackArtistId`,`ta`.`roadieId` AS `trackArtistRoadieId`,`ta`.`name` AS `trackArtistName`,`ta`.`rating` AS `trackArtistRating`,`ta`.`createdDate` AS `trackArtistCreatedDate`,`ta`.`lastUpdated` AS `trackArtistLastUpdated`,`ta`.`lastPlayed` AS `trackArtistLastPlayed`,`ta`.`playedCount` AS `trackArtistPlayedCount`,`ta`.`releaseCount` AS `trackArtistReleaseCount`,`ta`.`trackCount` AS `trackArtistTrackCount`,`ta`.`sortName` AS `trackArtistSortName` from ((((`track` `t` join `releasemedia` `rm` on(`t`.`releaseMediaId` = `rm`.`id`)) join `release` `r` on(`rm`.`releaseId` = `r`.`id`)) join `artist` `ra` on(`r`.`artistId` = `ra`.`id`)) left join `artist` `ta` on(`t`.`artistId` = `ta`.`id`)) where `t`.`hash` is not null */;
/*!50001 SET character_set_client = @saved_cs_client */; /*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */; /*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */; /*!50001 SET collation_connection = @saved_col_connection */;
@ -940,4 +940,4 @@ SET character_set_client = @saved_cs_client;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2019-03-02 15:11:06 -- Dump completed on 2019-05-25 18:53:16