Files
EpicNext-Cms/src/features/housekeeping/domains/economy/search-production.ts
T
Simo 9c4b973faf
CI / check (pull_request) Successful in 40s
CI / release (pull_request) Skipped
CI / deploy (pull_request) Skipped
feat(housekeeping): deliver economy vertical
2026-08-30 13:47:06 +02:00

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,
},
]
: [],
);
}