423 lines
12 KiB
TypeScript
423 lines
12 KiB
TypeScript
import { PERMS } from "@/lib/permission-slugs";
|
|
import type { MigrationEntry } from "./types";
|
|
|
|
type PlannedEconomyEntry = Omit<
|
|
MigrationEntry,
|
|
"targetDomain" | "requiredTests" | "parityEvidence" | "status" | "notes"
|
|
> & {
|
|
requiredTests?: MigrationEntry["requiredTests"];
|
|
notes?: MigrationEntry["notes"];
|
|
};
|
|
|
|
function plannedEconomyEntry(entry: PlannedEconomyEntry): MigrationEntry {
|
|
return {
|
|
...entry,
|
|
targetDomain: "economy",
|
|
requiredTests: entry.requiredTests ?? ["integration", "e2e", "visual"],
|
|
parityEvidence: [],
|
|
status: "PLANNED",
|
|
notes: entry.notes ?? [],
|
|
};
|
|
}
|
|
|
|
export const economyMigrationEntries: readonly MigrationEntry[] = [
|
|
// Batch 1: catalog pages, Builder Club, maintenance, and base items.
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/catalog",
|
|
sourceFile: "src/app/admin/catalog/page.tsx",
|
|
targetPath: "/admin/economy/catalog",
|
|
decision: "MERGE",
|
|
capabilities: {
|
|
read: [PERMS.CATALOG_VIEW],
|
|
mutate: [PERMS.CATALOG_EDIT],
|
|
},
|
|
dependencies: {
|
|
queries: [
|
|
"CatalogItems",
|
|
"CatalogItemsBc",
|
|
"CatalogPages",
|
|
"CatalogPagesBc",
|
|
"ItemsBase",
|
|
"GET /api/admin/catalog/items",
|
|
"GET /api/admin/catalog/tree",
|
|
"getCatalogItemCounts",
|
|
],
|
|
mutations: [
|
|
"createBcPage",
|
|
"createCatalogPage",
|
|
"DELETE /api/admin/catalog/tree",
|
|
"deleteBcTreePage",
|
|
"deleteCatalogPage",
|
|
"deleteTreePage",
|
|
"fixEverythingAction",
|
|
"PATCH /api/admin/catalog/tree",
|
|
"reorderBcTreePage",
|
|
"reorderTreePage",
|
|
"toggleBcPage",
|
|
"toggleCatalogPage",
|
|
"updateBcPage",
|
|
"updateCatalogPage",
|
|
],
|
|
},
|
|
auditRequirement: "PRIVILEGED_MUTATION",
|
|
localization: "PARTIAL",
|
|
accessibility: "PARTIAL",
|
|
notes: [
|
|
"Merge the overlapping table, tree, and visual-manager editors into one catalog workflow",
|
|
],
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/catalog/:id",
|
|
sourceFile: "src/app/admin/catalog/[id]/page.tsx",
|
|
targetPath: "/admin/economy/catalog/:id",
|
|
decision: "MERGE",
|
|
capabilities: {
|
|
read: [PERMS.CATALOG_VIEW],
|
|
mutate: [PERMS.CATALOG_EDIT],
|
|
},
|
|
dependencies: {
|
|
queries: [
|
|
"CatalogPages",
|
|
"GET /api/admin/catalog/suggest",
|
|
"GET /api/admin/furni/search",
|
|
"getAncestors",
|
|
"loadCatalogItemsData",
|
|
],
|
|
mutations: [
|
|
"bulkCreateCatalogItems",
|
|
"createCatalogItem",
|
|
"deleteCatalogItems",
|
|
"deleteCatalogPage",
|
|
"moveCatalogItems",
|
|
"reorderCatalogItems",
|
|
"translateCatalogItems",
|
|
"updateCatalogItem",
|
|
"updateCatalogPage",
|
|
],
|
|
},
|
|
auditRequirement: "PRIVILEGED_MUTATION",
|
|
localization: "PARTIAL",
|
|
accessibility: "PARTIAL",
|
|
notes: [
|
|
"Merge the detail tabs with the collection-level visual editor while preserving the page id",
|
|
],
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/catalog/builder-club",
|
|
sourceFile: "src/app/admin/catalog/builder-club/page.tsx",
|
|
targetPath: "/admin/economy/catalog",
|
|
decision: "MERGE",
|
|
capabilities: { read: [PERMS.CATALOG_VIEW], mutate: [] },
|
|
dependencies: { queries: [], mutations: [] },
|
|
auditRequirement: "NONE",
|
|
localization: "COMPLETE",
|
|
accessibility: "COMPLETE",
|
|
requiredTests: ["e2e"],
|
|
notes: ["Redirect-only entry into the Builder Club catalog view"],
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/catalog/builder-club/:id",
|
|
sourceFile: "src/app/admin/catalog/builder-club/[id]/page.tsx",
|
|
targetPath: "/admin/economy/catalog/builder-club/:id",
|
|
decision: "REBUILD",
|
|
capabilities: {
|
|
read: [PERMS.CATALOG_VIEW],
|
|
mutate: [PERMS.CATALOG_EDIT],
|
|
},
|
|
dependencies: {
|
|
queries: ["CatalogItemsBc", "CatalogPagesBc"],
|
|
mutations: [
|
|
"createBcItem",
|
|
"deleteBcItem",
|
|
"updateBcItem",
|
|
"updateBcPage",
|
|
],
|
|
},
|
|
auditRequirement: "PRIVILEGED_MUTATION",
|
|
localization: "PARTIAL",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/catalog/maintenance",
|
|
sourceFile: "src/app/admin/catalog/maintenance/page.tsx",
|
|
targetPath: "/admin/economy/catalog/maintenance",
|
|
decision: "REBUILD",
|
|
capabilities: {
|
|
read: [PERMS.CATALOG_VIEW],
|
|
mutate: [PERMS.CATALOG_EDIT],
|
|
},
|
|
dependencies: {
|
|
queries: ["getFurniHealthAction", "previewAlignIdsAction"],
|
|
mutations: [
|
|
"applyAlignIdsAction",
|
|
"fixCatalogOffersAction",
|
|
"fixEverythingAction",
|
|
"fixSpriteIdsAction",
|
|
"reconcileIdsAction",
|
|
"removeDuplicateItemsBaseAction",
|
|
],
|
|
},
|
|
auditRequirement: "PRIVILEGED_MUTATION",
|
|
localization: "PARTIAL",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/items",
|
|
sourceFile: "src/app/admin/items/page.tsx",
|
|
targetPath: "/admin/economy/items",
|
|
decision: "REBUILD",
|
|
capabilities: { read: [PERMS.CATALOG_VIEW], mutate: [] },
|
|
dependencies: { queries: ["fetchAdminList", "ItemsBase"], mutations: [] },
|
|
auditRequirement: "NONE",
|
|
localization: "PARTIAL",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/items/:id",
|
|
sourceFile: "src/app/admin/items/[id]/page.tsx",
|
|
targetPath: "/admin/economy/items/:id",
|
|
decision: "REBUILD",
|
|
capabilities: {
|
|
read: [PERMS.CATALOG_VIEW],
|
|
mutate: [PERMS.CATALOG_EDIT],
|
|
},
|
|
dependencies: {
|
|
queries: ["ItemsBase"],
|
|
mutations: ["updateItemsBase"],
|
|
},
|
|
auditRequirement: "PRIVILEGED_MUTATION",
|
|
localization: "COMPLETE",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
|
|
// Batch 2: commerce products, listings, vouchers, and subscriptions.
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/shop",
|
|
sourceFile: "src/app/admin/shop/page.tsx",
|
|
targetPath: "/admin/economy/commerce/shop",
|
|
decision: "REBUILD",
|
|
capabilities: { read: [PERMS.SHOP_VIEW], mutate: [] },
|
|
dependencies: {
|
|
queries: ["WebsitePaypalTransactions", "WebsiteShopArticles"],
|
|
mutations: [],
|
|
},
|
|
auditRequirement: "NONE",
|
|
localization: "PARTIAL",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/shop/new",
|
|
sourceFile: "src/app/admin/shop/new/page.tsx",
|
|
targetPath: "/admin/economy/commerce/shop/new",
|
|
decision: "REBUILD",
|
|
capabilities: {
|
|
read: [PERMS.SHOP_EDIT],
|
|
mutate: [PERMS.SHOP_EDIT],
|
|
},
|
|
dependencies: { queries: [], mutations: ["createShopArticle"] },
|
|
auditRequirement: "PRIVILEGED_MUTATION",
|
|
localization: "COMPLETE",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/shop/:id",
|
|
sourceFile: "src/app/admin/shop/[id]/page.tsx",
|
|
targetPath: "/admin/economy/commerce/shop/:id",
|
|
decision: "REBUILD",
|
|
capabilities: {
|
|
read: [PERMS.SHOP_VIEW],
|
|
mutate: [PERMS.SHOP_EDIT],
|
|
},
|
|
dependencies: {
|
|
queries: ["WebsiteShopArticles"],
|
|
mutations: ["deleteShopArticle", "updateShopArticle"],
|
|
},
|
|
auditRequirement: "PRIVILEGED_MUTATION",
|
|
localization: "COMPLETE",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/marketplace",
|
|
sourceFile: "src/app/admin/marketplace/page.tsx",
|
|
targetPath: "/admin/economy/commerce/marketplace",
|
|
decision: "REBUILD",
|
|
capabilities: {
|
|
read: [PERMS.SHOP_VIEW],
|
|
mutate: [PERMS.SHOP_EDIT],
|
|
},
|
|
dependencies: {
|
|
queries: ["MarketplaceItems", "User"],
|
|
mutations: ["cancelMarketplaceListing"],
|
|
},
|
|
auditRequirement: "PRIVILEGED_MUTATION",
|
|
localization: "COMPLETE",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/vouchers",
|
|
sourceFile: "src/app/admin/vouchers/page.tsx",
|
|
targetPath: "/admin/economy/commerce/vouchers",
|
|
decision: "REBUILD",
|
|
capabilities: {
|
|
read: [PERMS.SHOP_VIEW],
|
|
mutate: [PERMS.SHOP_EDIT],
|
|
},
|
|
dependencies: {
|
|
queries: ["WebsiteShopVouchers"],
|
|
mutations: ["createVoucher", "deleteVoucher"],
|
|
},
|
|
auditRequirement: "PRIVILEGED_MUTATION",
|
|
localization: "COMPLETE",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/subscriptions",
|
|
sourceFile: "src/app/admin/subscriptions/page.tsx",
|
|
targetPath: "/admin/economy/commerce/subscriptions",
|
|
decision: "REBUILD",
|
|
capabilities: { read: [PERMS.SHOP_VIEW], mutate: [] },
|
|
dependencies: { queries: ["users_subscriptions"], mutations: [] },
|
|
auditRequirement: "NONE",
|
|
localization: "PARTIAL",
|
|
accessibility: "PARTIAL",
|
|
notes: ["Current route reads users_subscriptions through raw SQL"],
|
|
}),
|
|
|
|
// Batch 3: transaction history and rare-value configuration.
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/transactions",
|
|
sourceFile: "src/app/admin/transactions/page.tsx",
|
|
targetPath: "/admin/economy/history/transactions",
|
|
decision: "REBUILD",
|
|
capabilities: { read: [PERMS.SHOP_VIEW], mutate: [] },
|
|
dependencies: {
|
|
queries: ["User", "WebsitePaypalTransactions"],
|
|
mutations: [],
|
|
},
|
|
auditRequirement: "NONE",
|
|
localization: "COMPLETE",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/rare-values",
|
|
sourceFile: "src/app/admin/rare-values/page.tsx",
|
|
targetPath: "/admin/economy/value/rare-values",
|
|
decision: "REBUILD",
|
|
capabilities: {
|
|
read: [PERMS.SHOP_VIEW],
|
|
mutate: [PERMS.SHOP_EDIT],
|
|
},
|
|
dependencies: {
|
|
queries: ["WebsiteRareValueCategories", "WebsiteRareValues"],
|
|
mutations: [
|
|
"createCategory",
|
|
"createValue",
|
|
"deleteCategory",
|
|
"deleteValue",
|
|
],
|
|
},
|
|
auditRequirement: "PRIVILEGED_MUTATION",
|
|
localization: "COMPLETE",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
|
|
// Batch 4: badges, achievements, soundtracks, and calendar rewards.
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/badges",
|
|
sourceFile: "src/app/admin/badges/page.tsx",
|
|
targetPath: "/admin/economy/rewards/badges",
|
|
decision: "REBUILD",
|
|
capabilities: {
|
|
read: [PERMS.CATALOG_VIEW],
|
|
mutate: [PERMS.CATALOG_EDIT],
|
|
},
|
|
dependencies: {
|
|
queries: ["WebsiteBadges"],
|
|
mutations: ["giveBadge", "uploadBadge"],
|
|
},
|
|
auditRequirement: "PRIVILEGED_MUTATION",
|
|
localization: "COMPLETE",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/achievements",
|
|
sourceFile: "src/app/admin/achievements/page.tsx",
|
|
targetPath: "/admin/economy/rewards/achievements",
|
|
decision: "REBUILD",
|
|
capabilities: { read: [PERMS.CATALOG_VIEW], mutate: [] },
|
|
dependencies: { queries: ["Achievements"], mutations: [] },
|
|
auditRequirement: "NONE",
|
|
localization: "COMPLETE",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/sounds",
|
|
sourceFile: "src/app/admin/sounds/page.tsx",
|
|
targetPath: "/admin/economy/rewards/sounds",
|
|
decision: "REBUILD",
|
|
capabilities: {
|
|
read: [PERMS.CATALOG_VIEW],
|
|
mutate: [PERMS.CATALOG_EDIT],
|
|
},
|
|
dependencies: {
|
|
queries: ["CatalogItems", "siteSettings.get", "Soundtracks"],
|
|
mutations: [
|
|
"deleteSoundtrack",
|
|
"POST /api/admin/sounds/upload",
|
|
"updateSoundtrack",
|
|
],
|
|
},
|
|
auditRequirement: "PRIVILEGED_MUTATION",
|
|
localization: "PARTIAL",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/calendar",
|
|
sourceFile: "src/app/admin/calendar/page.tsx",
|
|
targetPath: "/admin/economy/rewards/calendar",
|
|
decision: "REBUILD",
|
|
capabilities: { read: [PERMS.SHOP_VIEW], mutate: [] },
|
|
dependencies: {
|
|
queries: ["CalendarCampaigns", "CalendarRewards"],
|
|
mutations: [],
|
|
},
|
|
auditRequirement: "NONE",
|
|
localization: "PARTIAL",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
plannedEconomyEntry({
|
|
surface: "admin",
|
|
legacyPath: "/admin/calendar/:id",
|
|
sourceFile: "src/app/admin/calendar/[id]/page.tsx",
|
|
targetPath: "/admin/economy/rewards/calendar/:id",
|
|
decision: "REBUILD",
|
|
capabilities: { read: [PERMS.SHOP_VIEW], mutate: [] },
|
|
dependencies: {
|
|
queries: ["CalendarCampaigns", "CalendarRewards"],
|
|
mutations: [],
|
|
},
|
|
auditRequirement: "NONE",
|
|
localization: "COMPLETE",
|
|
accessibility: "PARTIAL",
|
|
}),
|
|
];
|