Files
EpicNext-Cms/src/features/housekeeping/domains/economy/routes.ts
T
Simo 43470ebf82
CI / check (pull_request) Failing after 10s
CI / deploy (pull_request) Skipped
CI / release (pull_request) Skipped
feat(housekeeping): unify complete rebuild in gated preview
2026-08-31 20:37:51 +02:00

150 lines
4.0 KiB
TypeScript

import { PERMS } from "@/lib/permission-slugs";
import {
anyCapability,
type CanonicalHousekeepingHref,
type HousekeepingRouteDefinition,
} from "../../foundation/contracts";
export const ECONOMY_ROUTE_GROUPS = [
"catalog",
"items",
"commerce",
"history",
"value",
"rewards",
] as const;
export type EconomyRouteGroup = (typeof ECONOMY_ROUTE_GROUPS)[number];
export const ECONOMY_ROUTE_IDS = [
"economy.catalog.overview",
"economy.catalog.detail",
"economy.catalog.builder-club-detail",
"economy.catalog.maintenance",
"economy.items.overview",
"economy.items.detail",
"economy.commerce.shop",
"economy.commerce.shop-create",
"economy.commerce.shop-detail",
"economy.commerce.marketplace",
"economy.commerce.vouchers",
"economy.commerce.subscriptions",
"economy.history.transactions",
"economy.value.rare-values",
"economy.rewards.badges",
"economy.rewards.achievements",
"economy.rewards.sounds",
"economy.rewards.calendar",
"economy.rewards.calendar-detail",
] as const;
export type EconomyRouteId = (typeof ECONOMY_ROUTE_IDS)[number];
function economyRoute(
id: EconomyRouteId,
href: CanonicalHousekeepingHref,
permissions: readonly string[],
): HousekeepingRouteDefinition {
return {
id,
labelKey: `pages.housekeeping.routes.${id}`,
href,
capability: anyCapability(...permissions),
};
}
export const ECONOMY_ROUTES = [
economyRoute("economy.catalog.overview", "/ase-next/economy/catalog", [
PERMS.CATALOG_VIEW,
]),
economyRoute("economy.catalog.detail", "/ase-next/economy/catalog/:id", [
PERMS.CATALOG_VIEW,
]),
economyRoute(
"economy.catalog.builder-club-detail",
"/ase-next/economy/catalog/builder-club/:id",
[PERMS.CATALOG_VIEW],
),
economyRoute(
"economy.catalog.maintenance",
"/ase-next/economy/catalog/maintenance",
[PERMS.CATALOG_VIEW],
),
economyRoute("economy.items.overview", "/ase-next/economy/items", [
PERMS.CATALOG_VIEW,
]),
economyRoute("economy.items.detail", "/ase-next/economy/items/:id", [
PERMS.CATALOG_VIEW,
]),
economyRoute("economy.commerce.shop", "/ase-next/economy/commerce/shop", [
PERMS.SHOP_VIEW,
]),
economyRoute(
"economy.commerce.shop-create",
"/ase-next/economy/commerce/shop/new",
[PERMS.SHOP_EDIT],
),
economyRoute(
"economy.commerce.shop-detail",
"/ase-next/economy/commerce/shop/:id",
[PERMS.SHOP_VIEW],
),
economyRoute(
"economy.commerce.marketplace",
"/ase-next/economy/commerce/marketplace",
[PERMS.SHOP_VIEW],
),
economyRoute("economy.commerce.vouchers", "/ase-next/economy/commerce/vouchers", [
PERMS.SHOP_VIEW,
]),
economyRoute(
"economy.commerce.subscriptions",
"/ase-next/economy/commerce/subscriptions",
[PERMS.SHOP_VIEW],
),
economyRoute(
"economy.history.transactions",
"/ase-next/economy/history/transactions",
[PERMS.SHOP_VIEW],
),
economyRoute("economy.value.rare-values", "/ase-next/economy/value/rare-values", [
PERMS.SHOP_VIEW,
]),
economyRoute("economy.rewards.badges", "/ase-next/economy/rewards/badges", [
PERMS.CATALOG_VIEW,
]),
economyRoute(
"economy.rewards.achievements",
"/ase-next/economy/rewards/achievements",
[PERMS.CATALOG_VIEW],
),
economyRoute("economy.rewards.sounds", "/ase-next/economy/rewards/sounds", [
PERMS.CATALOG_VIEW,
]),
economyRoute("economy.rewards.calendar", "/ase-next/economy/rewards/calendar", [
PERMS.SHOP_VIEW,
]),
economyRoute(
"economy.rewards.calendar-detail",
"/ase-next/economy/rewards/calendar/:id",
[PERMS.SHOP_VIEW],
),
] as const satisfies readonly HousekeepingRouteDefinition[];
const groups = new Map<EconomyRouteId, EconomyRouteGroup>(
ECONOMY_ROUTE_IDS.map((routeId) => [
routeId,
routeId.split(".")[1] as EconomyRouteGroup,
]),
);
export function economyRouteGroup(routeId: EconomyRouteId): EconomyRouteGroup {
const group = groups.get(routeId);
if (!group) throw new Error(`unknown Economy route: ${routeId}`);
return group;
}
export function economyRouteById(routeId: EconomyRouteId) {
const route = ECONOMY_ROUTES.find((candidate) => candidate.id === routeId);
if (!route) throw new Error(`unknown Economy route: ${routeId}`);
return route;
}