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( 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; }