You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.7 KiB
56 lines
1.7 KiB
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,
|
|
};
|
|
}
|
|
|