import { PERMS } from "@/lib/permission-slugs"; import type { MigrationEntry } from "./types"; type PlannedContentEntry = Omit< MigrationEntry, "targetDomain" | "requiredTests" | "parityEvidence" | "status" | "notes" > & { requiredTests?: MigrationEntry["requiredTests"]; notes?: MigrationEntry["notes"]; }; function plannedContentEntry(entry: PlannedContentEntry): MigrationEntry { return { ...entry, targetDomain: "content", requiredTests: entry.requiredTests ?? ["integration", "e2e", "visual"], parityEvidence: [], status: "PLANNED", notes: entry.notes ?? [], }; } export const contentMigrationEntries: readonly MigrationEntry[] = [ // Batch 1: editorial publishing and media management. plannedContentEntry({ surface: "admin", legacyPath: "/admin/articles", sourceFile: "src/app/admin/articles/page.tsx", targetPath: "/admin/content/editorial/articles", decision: "REBUILD", capabilities: { read: [PERMS.NEWS_VIEW], mutate: [PERMS.NEWS_EDIT], }, dependencies: { queries: ["User", "WebsiteArticles"], mutations: ["deleteArticle"], }, auditRequirement: "MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/articles/new", sourceFile: "src/app/admin/articles/new/page.tsx", targetPath: "/admin/content/editorial/articles/new", decision: "REBUILD", capabilities: { read: [PERMS.NEWS_EDIT], mutate: [PERMS.NEWS_EDIT], }, dependencies: { queries: ["GET /api/media"], mutations: ["createArticle", "uploadMediaAndReturn"], }, auditRequirement: "MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/articles/:id", sourceFile: "src/app/admin/articles/[id]/page.tsx", targetPath: "/admin/content/editorial/articles/:id", decision: "REBUILD", capabilities: { read: [PERMS.NEWS_VIEW], mutate: [PERMS.NEWS_EDIT], }, dependencies: { queries: ["GET /api/media", "WebsiteArticles"], mutations: ["deleteArticle", "updateArticle", "uploadMediaAndReturn"], }, auditRequirement: "MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/photos", sourceFile: "src/app/admin/photos/page.tsx", targetPath: "/admin/content/media/photos", decision: "REBUILD", capabilities: { read: [PERMS.PAGES_VIEW], mutate: [PERMS.PAGES_EDIT], }, dependencies: { queries: ["CameraWeb", "User"], mutations: ["deletePhoto"], }, auditRequirement: "MUTATION", localization: "COMPLETE", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/media", sourceFile: "src/app/admin/media/page.tsx", targetPath: "/admin/content/media/library", decision: "REBUILD", capabilities: { read: [PERMS.PAGES_VIEW], mutate: [PERMS.PAGES_EDIT], }, dependencies: { queries: ["GET /api/media"], mutations: ["deleteMedia", "uploadMedia"], }, auditRequirement: "MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/banners", sourceFile: "src/app/admin/banners/page.tsx", targetPath: "/admin/content/media/banners", decision: "REBUILD", capabilities: { read: [PERMS.BANNERS_VIEW], mutate: [PERMS.BANNERS_EDIT], }, dependencies: { queries: ["WebsiteBanner"], mutations: ["createBanner", "deleteBanner", "updateBanner"], }, auditRequirement: "MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/ads", sourceFile: "src/app/admin/ads/page.tsx", targetPath: "/admin/content/media/ads", decision: "REBUILD", capabilities: { read: [PERMS.PAGES_VIEW], mutate: [PERMS.PAGES_EDIT], }, dependencies: { queries: ["WebsiteAds"], mutations: ["deleteAd"], }, auditRequirement: "MUTATION", localization: "COMPLETE", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/ads/new", sourceFile: "src/app/admin/ads/new/page.tsx", targetPath: "/admin/content/media/ads/new", decision: "REBUILD", capabilities: { read: [PERMS.PAGES_EDIT], mutate: [PERMS.PAGES_EDIT], }, dependencies: { queries: [], mutations: ["createAd"] }, auditRequirement: "MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/ads/:id", sourceFile: "src/app/admin/ads/[id]/page.tsx", targetPath: "/admin/content/media/ads/:id", decision: "REBUILD", capabilities: { read: [PERMS.PAGES_VIEW], mutate: [PERMS.PAGES_EDIT], }, dependencies: { queries: ["WebsiteAds"], mutations: ["deleteAd", "updateAd"], }, auditRequirement: "MUTATION", localization: "COMPLETE", accessibility: "PARTIAL", }), // Batch 2: events, polls, help content, and supporting taxonomies. plannedContentEntry({ surface: "admin", legacyPath: "/admin/events", sourceFile: "src/app/admin/events/page.tsx", targetPath: "/admin/content/engagement/events", decision: "REBUILD", capabilities: { read: [PERMS.EVENTS_VIEW], mutate: [PERMS.EVENTS_EDIT], }, dependencies: { queries: ["fetchAdminList", "WebsiteEvent", "WebsiteEventType"], mutations: ["deleteEvent"], }, auditRequirement: "MUTATION", localization: "COMPLETE", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/events/create", sourceFile: "src/app/admin/events/create/page.tsx", targetPath: "/admin/content/engagement/events/create", decision: "REBUILD", capabilities: { read: [PERMS.EVENTS_EDIT], mutate: [PERMS.EVENTS_EDIT], }, dependencies: { queries: ["WebsiteEventType"], mutations: ["createEvent"], }, auditRequirement: "MUTATION", localization: "COMPLETE", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/events/types", sourceFile: "src/app/admin/events/types/page.tsx", targetPath: "/admin/content/engagement/events/types", decision: "REBUILD", capabilities: { read: [PERMS.EVENTS_EDIT], mutate: [PERMS.EVENTS_EDIT], }, dependencies: { queries: ["WebsiteEventType"], mutations: ["createEventType", "deleteEventType", "updateEventType"], }, auditRequirement: "MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/events/:id", sourceFile: "src/app/admin/events/[id]/page.tsx", targetPath: "/admin/content/engagement/events/:id", decision: "REBUILD", capabilities: { read: [PERMS.EVENTS_EDIT], mutate: [PERMS.EVENTS_EDIT], }, dependencies: { queries: ["User", "WebsiteEvent", "WebsiteEventType"], mutations: [ "addEventPrize", "addEventWinner", "deleteEventPrize", "updateEvent", ], }, auditRequirement: "MUTATION", localization: "COMPLETE", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/polls", sourceFile: "src/app/admin/polls/page.tsx", targetPath: "/admin/content/engagement/polls", decision: "REBUILD", capabilities: { read: [PERMS.POLLS_VIEW], mutate: [PERMS.POLLS_EDIT], }, dependencies: { queries: ["fetchAdminList", "WebsitePoll"], mutations: ["deletePoll"], }, auditRequirement: "MUTATION", localization: "COMPLETE", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/polls/create", sourceFile: "src/app/admin/polls/create/page.tsx", targetPath: "/admin/content/engagement/polls/create", decision: "REBUILD", capabilities: { read: [PERMS.POLLS_EDIT], mutate: [PERMS.POLLS_EDIT], }, dependencies: { queries: [], mutations: ["createPoll"] }, auditRequirement: "MUTATION", localization: "COMPLETE", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/polls/:id", sourceFile: "src/app/admin/polls/[id]/page.tsx", targetPath: "/admin/content/engagement/polls/:id", decision: "REBUILD", capabilities: { read: [PERMS.POLLS_EDIT], mutate: [PERMS.POLLS_EDIT], }, dependencies: { queries: ["WebsitePoll"], mutations: [ "addPollQuestion", "deletePollQuestion", "updatePoll", "updatePollQuestion", ], }, auditRequirement: "MUTATION", localization: "COMPLETE", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/help-questions", sourceFile: "src/app/admin/help-questions/page.tsx", targetPath: "/admin/content/help/questions", decision: "REBUILD", capabilities: { read: [PERMS.PAGES_VIEW], mutate: [] }, dependencies: { queries: ["WebsiteHelpCenterCategories"], mutations: [], }, auditRequirement: "NONE", localization: "PARTIAL", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/help-questions/new", sourceFile: "src/app/admin/help-questions/new/page.tsx", targetPath: "/admin/content/help/questions/new", decision: "REBUILD", capabilities: { read: [PERMS.PAGES_EDIT], mutate: [PERMS.PAGES_EDIT], }, dependencies: { queries: [], mutations: ["createHelpQuestion"] }, auditRequirement: "MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/help-questions/:id", sourceFile: "src/app/admin/help-questions/[id]/page.tsx", targetPath: "/admin/content/help/questions/:id", decision: "REBUILD", capabilities: { read: [PERMS.PAGES_VIEW], mutate: [PERMS.PAGES_EDIT], }, dependencies: { queries: ["WebsiteHelpCenterCategories"], mutations: ["deleteHelpQuestion", "updateHelpQuestion"], }, auditRequirement: "MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/tags", sourceFile: "src/app/admin/tags/page.tsx", targetPath: "/admin/content/editorial/tags", decision: "REBUILD", capabilities: { read: [PERMS.PAGES_VIEW], mutate: [PERMS.PAGES_EDIT], }, dependencies: { queries: ["Taggables", "Tags"], mutations: ["createTag", "deleteTag", "updateTag"], }, auditRequirement: "MUTATION", localization: "COMPLETE", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/prefixes", sourceFile: "src/app/admin/prefixes/page.tsx", targetPath: "/admin/content/engagement/prefixes", decision: "REBUILD", capabilities: { read: [PERMS.PREFIXES_VIEW], mutate: [PERMS.PREFIXES_EDIT], }, dependencies: { queries: [ "GET /api/admin/prefixes", "GET /api/admin/prefixes/blacklist", "GET /api/admin/prefixes/settings", ], mutations: [ "addBlacklistWord", "createPrefix", "deletePrefix", "removeBlacklistWord", "updatePrefix", "updatePrefixSettings", ], }, auditRequirement: "MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/writeable-boxes", sourceFile: "src/app/admin/writeable-boxes/page.tsx", targetPath: "/admin/content/editorial/writeable-boxes", decision: "REBUILD", capabilities: { read: [PERMS.PAGES_VIEW], mutate: [PERMS.PAGES_EDIT], }, dependencies: { queries: ["WebsiteWriteableBoxes"], mutations: ["createBox", "deleteBox", "toggleBox", "updateBox"], }, auditRequirement: "MUTATION", localization: "COMPLETE", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/email-templates", sourceFile: "src/app/admin/email-templates/page.tsx", targetPath: "/admin/content/help/email-templates", decision: "REBUILD", capabilities: { read: [PERMS.PAGES_VIEW], mutate: [PERMS.PAGES_EDIT], }, dependencies: { queries: ["EmailTemplates"], mutations: [ "createEmailTemplate", "deleteEmailTemplate", "updateEmailTemplate", ], }, auditRequirement: "MUTATION", localization: "COMPLETE", accessibility: "PARTIAL", }), // Batch 3: brand presentation and global localization configuration. plannedContentEntry({ surface: "admin", legacyPath: "/admin/theme", sourceFile: "src/app/admin/theme/page.tsx", targetPath: "/admin/content/brand/theme", decision: "REBUILD", capabilities: { read: [PERMS.SETTINGS_VIEW], mutate: [PERMS.SETTINGS_EDIT], }, dependencies: { queries: ["listCustomThemes", "siteSettings.get"], mutations: [ "applyCustomTheme", "applyPreset", "deleteCustomTheme", "renameCustomTheme", "saveCustomTheme", "saveTheme", ], }, auditRequirement: "PRIVILEGED_MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/favicon", sourceFile: "src/app/admin/favicon/page.tsx", targetPath: "/admin/content/brand/favicon", decision: "REBUILD", capabilities: { read: [PERMS.SETTINGS_VIEW], mutate: [PERMS.SETTINGS_EDIT], }, dependencies: { queries: ["WebsiteSetting"], mutations: ["deleteFavicon", "saveFavicon"], }, auditRequirement: "PRIVILEGED_MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", notes: [ "Current favicon actions do not enforce an edit permission or emit an audit record", ], }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/translations", sourceFile: "src/app/admin/translations/page.tsx", targetPath: "/admin/content/localization", decision: "MERGE", capabilities: { read: [PERMS.SETTINGS_VIEW], mutate: [] }, dependencies: { queries: [], mutations: [] }, auditRequirement: "NONE", localization: "COMPLETE", accessibility: "COMPLETE", requiredTests: ["e2e"], notes: ["Redirect-only landing page for the localization workflow"], }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/translations/client", sourceFile: "src/app/admin/translations/client/page.tsx", targetPath: "/admin/content/localization/client", decision: "REBUILD", capabilities: { read: [PERMS.SETTINGS_VIEW], mutate: [PERMS.SETTINGS_EDIT], }, dependencies: { queries: ["CLIENT_TRANSLATION_FILES", "fs.readFile"], mutations: ["saveClientTranslations"], }, auditRequirement: "PRIVILEGED_MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", notes: ["Current file mutation does not emit an audit record"], }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/translations/cms", sourceFile: "src/app/admin/translations/cms/page.tsx", targetPath: "/admin/content/localization/cms", decision: "REBUILD", capabilities: { read: [PERMS.SETTINGS_VIEW], mutate: [PERMS.SETTINGS_EDIT], }, dependencies: { queries: ["fs.readFile"], mutations: ["saveTranslations"], }, auditRequirement: "PRIVILEGED_MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", notes: ["Current file mutation does not emit an audit record"], }), plannedContentEntry({ surface: "admin", legacyPath: "/admin/translations/emulator", sourceFile: "src/app/admin/translations/emulator/page.tsx", targetPath: "/admin/content/localization/emulator", decision: "REBUILD", capabilities: { read: [PERMS.SETTINGS_VIEW], mutate: [PERMS.SETTINGS_EDIT], }, dependencies: { queries: ["EmulatorSettings"], mutations: ["saveEmulatorSettings"], }, auditRequirement: "PRIVILEGED_MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", }), ];