Improve ZXDB releases list
Link release titles to release detail, add magref count badges, and show other releases on release detail. Signed-off-by: codex@lucy.xalior.com
This commit is contained in:
@@ -1103,6 +1103,7 @@ export interface ReleaseListItem {
|
||||
releaseSeq: number;
|
||||
entryTitle: string;
|
||||
year: number | null;
|
||||
magrefCount: number;
|
||||
}
|
||||
|
||||
export async function searchReleases(params: ReleaseSearchParams): Promise<PagedResult<ReleaseListItem>> {
|
||||
@@ -1192,12 +1193,33 @@ export async function searchReleases(params: ReleaseSearchParams): Promise<Paged
|
||||
.limit(pageSize)
|
||||
.offset(offset);
|
||||
|
||||
const entryIds = Array.from(new Set(rowsQB.map((r) => Number(r.entryId)).filter((id) => Number.isFinite(id))));
|
||||
const magrefCounts = new Map<number, number>();
|
||||
if (entryIds.length > 0) {
|
||||
try {
|
||||
const values = entryIds.map((id) => sql`${id}`);
|
||||
const rows = await db.execute(sql`
|
||||
select ${searchByMagrefs.entryId} as entryId, count(*) as count
|
||||
from ${searchByMagrefs}
|
||||
where ${searchByMagrefs.entryId} in (${sql.join(values, sql`, `)})
|
||||
group by ${searchByMagrefs.entryId}
|
||||
`);
|
||||
type CountRow = { entryId: number | string; count: number | string };
|
||||
for (const row of rows as unknown as CountRow[]) {
|
||||
magrefCounts.set(Number(row.entryId), Number(row.count));
|
||||
}
|
||||
} catch {
|
||||
// Helper table might be missing; default to 0 counts.
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure plain primitives
|
||||
const items: ReleaseListItem[] = rowsQB.map((r) => ({
|
||||
entryId: Number(r.entryId),
|
||||
releaseSeq: Number(r.releaseSeq),
|
||||
entryTitle: r.entryTitle ?? "",
|
||||
year: r.year != null ? Number(r.year) : null,
|
||||
magrefCount: magrefCounts.get(Number(r.entryId)) ?? 0,
|
||||
}));
|
||||
|
||||
return { items, page, pageSize, total };
|
||||
@@ -1209,6 +1231,10 @@ export interface ReleaseDetail {
|
||||
title: string;
|
||||
issueId: number | null;
|
||||
};
|
||||
entryReleases: Array<{
|
||||
releaseSeq: number;
|
||||
year: number | null;
|
||||
}>;
|
||||
release: {
|
||||
entryId: number;
|
||||
releaseSeq: number;
|
||||
@@ -1316,6 +1342,15 @@ export async function getReleaseDetail(entryId: number, releaseSeq: number): Pro
|
||||
const base = rows[0];
|
||||
if (!base) return null;
|
||||
|
||||
const entryReleaseRows = await db
|
||||
.select({
|
||||
releaseSeq: releases.releaseSeq,
|
||||
year: releases.releaseYear,
|
||||
})
|
||||
.from(releases)
|
||||
.where(eq(releases.entryId, entryId))
|
||||
.orderBy(asc(releases.releaseSeq));
|
||||
|
||||
type DownloadRow = {
|
||||
id: number | string;
|
||||
link: string;
|
||||
@@ -1455,6 +1490,10 @@ export async function getReleaseDetail(entryId: number, releaseSeq: number): Pro
|
||||
title: base.entryTitle ?? "",
|
||||
issueId: base.issueId ?? null,
|
||||
},
|
||||
entryReleases: entryReleaseRows.map((r) => ({
|
||||
releaseSeq: Number(r.releaseSeq),
|
||||
year: r.year != null ? Number(r.year) : null,
|
||||
})),
|
||||
release: {
|
||||
entryId: Number(base.entryId),
|
||||
releaseSeq: Number(base.releaseSeq),
|
||||
|
||||
Reference in New Issue
Block a user