52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
import "server-only";
|
|
|
|
import { PERMS } from "@/lib/permission-slugs";
|
|
import {
|
|
anyCapability,
|
|
type HousekeepingCapabilityContext,
|
|
} from "../../foundation/contracts";
|
|
import { economyQuery } from "./queries/catalog";
|
|
import type { EconomySearchCandidate } from "./search";
|
|
|
|
type EconomySearchKind = "catalog-pages" | "items" | "transactions";
|
|
|
|
const ROUTES = {
|
|
"catalog-pages": [
|
|
"economy.catalog.overview",
|
|
anyCapability(PERMS.CATALOG_VIEW),
|
|
],
|
|
items: ["economy.items.overview", anyCapability(PERMS.CATALOG_VIEW)],
|
|
transactions: [
|
|
"economy.history.transactions",
|
|
anyCapability(PERMS.SHOP_VIEW),
|
|
],
|
|
} as const;
|
|
|
|
export async function loadEconomySearchCandidates(
|
|
kind: EconomySearchKind,
|
|
context: HousekeepingCapabilityContext,
|
|
term: string,
|
|
limit: number,
|
|
query: Pick<typeof economyQuery, "run"> = economyQuery,
|
|
): Promise<readonly EconomySearchCandidate[]> {
|
|
const [routeId, capability] = ROUTES[kind];
|
|
const result = await query.run(context, {
|
|
routeId,
|
|
list: { search: term, pageSize: limit, offset: 0 },
|
|
});
|
|
if (!result.ok) throw new Error("Economy search query unavailable");
|
|
return result.data.items.flatMap((item) =>
|
|
item.href
|
|
? [
|
|
{
|
|
id: `${routeId}:${item.id}`,
|
|
title: item.title,
|
|
description: item.description ?? item.status ?? item.amount,
|
|
href: item.href,
|
|
capability,
|
|
},
|
|
]
|
|
: [],
|
|
);
|
|
}
|