Reworked main page content
This commit is contained in:
+32
-7
@@ -40,6 +40,7 @@ struct ArtistCard {
|
|||||||
name: String,
|
name: String,
|
||||||
image_url: Option<String>,
|
image_url: Option<String>,
|
||||||
release_count: i64,
|
release_count: i64,
|
||||||
|
track_count: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, JsonSchema)]
|
#[derive(Debug, Serialize, JsonSchema)]
|
||||||
@@ -221,6 +222,7 @@ struct ArtistRow {
|
|||||||
name: String,
|
name: String,
|
||||||
image_file_id: Option<i64>,
|
image_file_id: Option<i64>,
|
||||||
release_count: i64,
|
release_count: i64,
|
||||||
|
track_count: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(sqlx::FromRow)]
|
#[derive(sqlx::FromRow)]
|
||||||
@@ -314,6 +316,7 @@ struct SearchArtistRow {
|
|||||||
name: String,
|
name: String,
|
||||||
image_file_id: Option<i64>,
|
image_file_id: Option<i64>,
|
||||||
release_count: i64,
|
release_count: i64,
|
||||||
|
track_count: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(sqlx::FromRow)]
|
#[derive(sqlx::FromRow)]
|
||||||
@@ -387,7 +390,11 @@ async fn artists_handler(
|
|||||||
let offset = (page - 1) as i64 * per_page as i64;
|
let offset = (page - 1) as i64 * per_page as i64;
|
||||||
|
|
||||||
let total_row = sqlx::query_as::<_, CountRow>(
|
let total_row = sqlx::query_as::<_, CountRow>(
|
||||||
"SELECT COUNT(*) as count FROM furumusic__artist WHERE is_hidden = false",
|
r#"SELECT COUNT(DISTINCT a.id) AS count
|
||||||
|
FROM furumusic__artist a
|
||||||
|
JOIN furumusic__release_artist ra ON ra.artist_id = a.id
|
||||||
|
JOIN furumusic__release r ON r.id = ra.release_id
|
||||||
|
WHERE a.is_hidden = false AND r.is_hidden = false"#,
|
||||||
)
|
)
|
||||||
.fetch_one(pool)
|
.fetch_one(pool)
|
||||||
.await
|
.await
|
||||||
@@ -395,12 +402,20 @@ async fn artists_handler(
|
|||||||
|
|
||||||
let rows = sqlx::query_as::<_, ArtistRow>(
|
let rows = sqlx::query_as::<_, ArtistRow>(
|
||||||
r#"SELECT a.id, a.name::text as name, a.image_file_id,
|
r#"SELECT a.id, a.name::text as name, a.image_file_id,
|
||||||
COALESCE((SELECT COUNT(*) FROM furumusic__release_artist ra
|
s.release_count,
|
||||||
JOIN furumusic__release r ON r.id = ra.release_id AND r.is_hidden = false
|
s.track_count
|
||||||
WHERE ra.artist_id = a.id), 0) as release_count
|
|
||||||
FROM furumusic__artist a
|
FROM furumusic__artist a
|
||||||
|
JOIN (
|
||||||
|
SELECT ra.artist_id,
|
||||||
|
COUNT(DISTINCT r.id) AS release_count,
|
||||||
|
COUNT(t.id) AS track_count
|
||||||
|
FROM furumusic__release_artist ra
|
||||||
|
JOIN furumusic__release r ON r.id = ra.release_id AND r.is_hidden = false
|
||||||
|
LEFT JOIN furumusic__track t ON t.release_id = r.id AND t.is_hidden = false
|
||||||
|
GROUP BY ra.artist_id
|
||||||
|
) s ON s.artist_id = a.id
|
||||||
WHERE a.is_hidden = false
|
WHERE a.is_hidden = false
|
||||||
ORDER BY a.name_sort
|
ORDER BY s.release_count DESC, s.track_count DESC, a.name_sort
|
||||||
LIMIT $1 OFFSET $2"#,
|
LIMIT $1 OFFSET $2"#,
|
||||||
)
|
)
|
||||||
.bind(per_page as i64)
|
.bind(per_page as i64)
|
||||||
@@ -416,6 +431,7 @@ async fn artists_handler(
|
|||||||
name: r.name,
|
name: r.name,
|
||||||
image_url: cover_url(r.image_file_id),
|
image_url: cover_url(r.image_file_id),
|
||||||
release_count: r.release_count,
|
release_count: r.release_count,
|
||||||
|
track_count: r.track_count,
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
@@ -1205,7 +1221,11 @@ async fn search_handler(
|
|||||||
r#"SELECT a.id, a.name::text AS name, a.image_file_id,
|
r#"SELECT a.id, a.name::text AS name, a.image_file_id,
|
||||||
COALESCE((SELECT COUNT(*) FROM furumusic__release_artist ra
|
COALESCE((SELECT COUNT(*) FROM furumusic__release_artist ra
|
||||||
JOIN furumusic__release r ON r.id = ra.release_id AND r.is_hidden = false
|
JOIN furumusic__release r ON r.id = ra.release_id AND r.is_hidden = false
|
||||||
WHERE ra.artist_id = a.id), 0) AS release_count
|
WHERE ra.artist_id = a.id), 0) AS release_count,
|
||||||
|
COALESCE((SELECT COUNT(*) FROM furumusic__release_artist ra
|
||||||
|
JOIN furumusic__release r ON r.id = ra.release_id AND r.is_hidden = false
|
||||||
|
JOIN furumusic__track t ON t.release_id = r.id AND t.is_hidden = false
|
||||||
|
WHERE ra.artist_id = a.id), 0) AS track_count
|
||||||
FROM furumusic__artist a
|
FROM furumusic__artist a
|
||||||
WHERE a.is_hidden = false AND a.name_sort ILIKE '%' || $1 || '%'
|
WHERE a.is_hidden = false AND a.name_sort ILIKE '%' || $1 || '%'
|
||||||
ORDER BY a.name_sort LIMIT $2"#,
|
ORDER BY a.name_sort LIMIT $2"#,
|
||||||
@@ -1242,11 +1262,15 @@ async fn search_handler(
|
|||||||
tokio::try_join!(a, r, t).map_err(|e| cot::Error::internal(e.to_string()))?
|
tokio::try_join!(a, r, t).map_err(|e| cot::Error::internal(e.to_string()))?
|
||||||
} else {
|
} else {
|
||||||
let a = sqlx::query_as::<_, SearchArtistRow>(
|
let a = sqlx::query_as::<_, SearchArtistRow>(
|
||||||
r#"SELECT id, name, image_file_id, release_count FROM (
|
r#"SELECT id, name, image_file_id, release_count, track_count FROM (
|
||||||
SELECT a.id, a.name::text AS name, a.image_file_id,
|
SELECT a.id, a.name::text AS name, a.image_file_id,
|
||||||
COALESCE((SELECT COUNT(*) FROM furumusic__release_artist ra
|
COALESCE((SELECT COUNT(*) FROM furumusic__release_artist ra
|
||||||
JOIN furumusic__release r ON r.id = ra.release_id AND r.is_hidden = false
|
JOIN furumusic__release r ON r.id = ra.release_id AND r.is_hidden = false
|
||||||
WHERE ra.artist_id = a.id), 0) AS release_count,
|
WHERE ra.artist_id = a.id), 0) AS release_count,
|
||||||
|
COALESCE((SELECT COUNT(*) FROM furumusic__release_artist ra
|
||||||
|
JOIN furumusic__release r ON r.id = ra.release_id AND r.is_hidden = false
|
||||||
|
JOIN furumusic__track t ON t.release_id = r.id AND t.is_hidden = false
|
||||||
|
WHERE ra.artist_id = a.id), 0) AS track_count,
|
||||||
MAX(sim) AS similarity
|
MAX(sim) AS similarity
|
||||||
FROM (
|
FROM (
|
||||||
SELECT id, name, image_file_id, name_sort, similarity(name_sort, $1) AS sim
|
SELECT id, name, image_file_id, name_sort, similarity(name_sort, $1) AS sim
|
||||||
@@ -1363,6 +1387,7 @@ async fn search_handler(
|
|||||||
name: r.name,
|
name: r.name,
|
||||||
image_url: cover_url(r.image_file_id),
|
image_url: cover_url(r.image_file_id),
|
||||||
release_count: r.release_count,
|
release_count: r.release_count,
|
||||||
|
track_count: r.track_count,
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
|||||||
@@ -1341,7 +1341,7 @@ body {
|
|||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-title" x-text="artist.name"></div>
|
<div class="card-title" x-text="artist.name"></div>
|
||||||
<div class="card-subtitle" x-text="artist.release_count + ' releases'"></div>
|
<div class="card-subtitle" x-text="artist.release_count + ' releases · ' + artist.track_count + ' tracks'"></div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user