import { dbGlobal } from "drizzle-pkg/lib/db"; import { users } from "drizzle-pkg/lib/schema/auth"; import { and, asc, count, eq, isNotNull, ne } from "drizzle-orm"; import { DISCOVER_LIST_PAGE_SIZE } from "#server/constants/discover-list"; import { discoverCardAvatarUrl, discoverCardLocationLine } from "#server/utils/discover-card"; import { normalizePublicListPage } from "#server/utils/public-pagination"; const listWhere = and( eq(users.status, "active"), eq(users.discoverVisible, true), isNotNull(users.publicSlug), ne(users.publicSlug, ""), ); export type DiscoverListItem = { publicSlug: string; displayName: string; avatar: string | null; location: string | null; }; function mapRow(row: typeof users.$inferSelect): DiscoverListItem { const displayName = row.nickname?.trim() || row.username; const discoverVis = Boolean(row.discoverVisible); const showLoc = Boolean(row.discoverShowLocation); return { publicSlug: row.publicSlug as string, displayName, avatar: discoverCardAvatarUrl(row.avatar, row.avatarVisibility), location: discoverCardLocationLine(discoverVis, showLoc, row.discoverLocation), }; } export async function listDiscoverUsersPage(pageRaw: unknown) { const page = normalizePublicListPage(pageRaw); const pageSize = DISCOVER_LIST_PAGE_SIZE; const offset = (page - 1) * pageSize; const [countRows, rows] = await Promise.all([ dbGlobal.select({ total: count() }).from(users).where(listWhere), dbGlobal .select() .from(users) .where(listWhere) .orderBy(asc(users.id)) .limit(pageSize) .offset(offset), ]); return { items: rows.map(mapRow), total: countRows[0]?.total ?? 0, page, pageSize, }; }