fix(public): distinguish unavailable data from empty results and missing pages

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

+14 -10
View File
@@ -1,3 +1,4 @@
import { publicReadFailure } from "./public-read";
import "server-only";
import { and, asc, count, desc, eq, gt, inArray, or } from "drizzle-orm";
import {
@@ -65,7 +66,7 @@ export async function loadUserDashboard(userId: number) {
.from(Rooms)
.orderBy(desc(Rooms.id))
.limit(6)
.catch(() => null),
.catch(publicReadFailure("dashboard.rooms")),
db
.select({
badgeCode: UsersBadges.badgeCode,
@@ -74,7 +75,7 @@ export async function loadUserDashboard(userId: number) {
.from(UsersBadges)
.where(and(eq(UsersBadges.userId, userId), gt(UsersBadges.slotId, 0)))
.orderBy(asc(UsersBadges.slotId))
.catch(() => []),
.catch(publicReadFailure("dashboard.badges")),
db
.select({
achievementScore: UsersSettings.achievementScore,
@@ -83,19 +84,19 @@ export async function loadUserDashboard(userId: number) {
.from(UsersSettings)
.where(eq(UsersSettings.userId, userId))
.limit(1)
.catch(() => []),
.catch(publicReadFailure("dashboard.settings")),
db
.select({ value: count() })
.from(MessengerOffline)
.where(eq(MessengerOffline.userId, userId))
.catch(() => null),
.catch(publicReadFailure("dashboard.unread")),
db
.select({ referralsTotal: UserReferrals.referralsTotal })
.from(UserReferrals)
.where(eq(UserReferrals.userId, userId))
.orderBy(desc(UserReferrals.id))
.limit(1)
.catch(() => []),
.catch(publicReadFailure("dashboard.referrals")),
db
.select({
id: User.id,
@@ -124,7 +125,7 @@ export async function loadUserDashboard(userId: number) {
eq(MessengerFriendships.userTwoId, userId),
),
)
.catch(() => []),
.catch(publicReadFailure("dashboard.friends")),
db
.select({ type: UsersCurrency.type, amount: UsersCurrency.amount })
.from(UsersCurrency)
@@ -134,13 +135,13 @@ export async function loadUserDashboard(userId: number) {
inArray(UsersCurrency.type, [0, 5]),
),
)
.catch(() => null),
.catch(publicReadFailure("dashboard.currency")),
]);
// Each friendship can have two directional rows; expose users, not edges.
const uniqueFriends = [
...new Map(
friends
(friends ?? [])
.filter((friend) => friend.id !== userId)
.map((friend) => [friend.id, friend]),
).values(),
@@ -155,8 +156,11 @@ export async function loadUserDashboard(userId: number) {
currencySettings,
alertRaw,
recentRooms,
badges,
userSettingsRows,
badges: badges ?? [],
badgesUnavailable: badges === null,
userSettingsRows: userSettingsRows ?? [],
userSettingsUnavailable: userSettingsRows === null,
friendsUnavailable: friends === null,
friendCountRows: [{ value: uniqueFriends.length }],
unreadCountRows,
referralsRows,