150 lines
4.0 KiB
TypeScript
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;
|
|
}
|