fix(public): distinguish unavailable data from empty results and missing pages
CI / check (push) Successful in 56s
CI / deploy (push) Successful in 1m30s
CI / publish-container (push) Successful in 44s

This commit is contained in:
Simo committed 2026-09-11 00:39:53 +02:00
1 parent db4acbb46e
commit 445ef13846
16 files changed
+608 -169

No files matched your search

+9 -5
View File
@@ -2,9 +2,11 @@ import { desc } from "drizzle-orm";
import type { Metadata } from "next";
import { getTranslations } from "next-intl/server";
import Link from "@/components/link";
import { PublicLoadError } from "@/components/public/load-error";
import { ContentCard, EmptyState } from "@/components/public/ui";
import { db, Guilds } from "@/lib/db";
import { excerpt } from "@/lib/format";
import { publicReadFailure } from "@/lib/services/public-read";
export async function generateMetadata(): Promise<Metadata> {
const t = await getTranslations("pages.guilds");
@@ -26,7 +28,7 @@ type GuildCard = {
badge: string;
};
async function getGuilds(): Promise<GuildCard[]> {
async function getGuilds(): Promise<GuildCard[] | null> {
try {
return await db
.select({
@@ -38,8 +40,8 @@ async function getGuilds(): Promise<GuildCard[]> {
.from(Guilds)
.orderBy(desc(Guilds.id))
.limit(40);
} catch {
return [];
} catch (error) {
return publicReadFailure("guilds")(error);
}
}
@@ -51,8 +53,10 @@ export default async function GuildsPage() {
<main className="page-grid">
<ContentCard icon="🚪" title={t("title")} subtitle={t("subtitle")} />
<ContentCard padded={guilds.length === 0}>
{guilds.length === 0 ? (
<ContentCard padded={!guilds?.length}>
{guilds === null ? (
<PublicLoadError href="/guilds" />
) : guilds.length === 0 ? (
<EmptyState icon="🚪">{t("empty")}</EmptyState>
) : (
<div className="card-grid sm-2 lg-3" style={{ padding: "1rem" }}>