diff --git a/src/features/housekeeping/migration/hotel.test.ts b/src/features/housekeeping/migration/hotel.test.ts index 898916a8..9fa43e8a 100644 --- a/src/features/housekeeping/migration/hotel.test.ts +++ b/src/features/housekeeping/migration/hotel.test.ts @@ -88,6 +88,34 @@ describe("hotelMigrationEntries", () => { ).toBe(true); }); + it("classifies Studio Audit repair operations as privileged mutations", () => { + const studioAudit = hotelMigrationEntries.find( + (row) => row.legacyPath === "/admin/studio/audit", + ); + + expect(studioAudit).toEqual( + expect.objectContaining({ + capabilities: { + read: [PERMS.ASSETS_IMPORT], + mutate: [PERMS.ASSETS_IMPORT], + }, + dependencies: expect.objectContaining({ + mutations: expect.arrayContaining([ + "POST /api/admin/import/audit", + "applyCatalogSql", + "ensureDirectories", + "repairDuplicateClassnames", + "repairFurniData", + "repairMissingIcons", + "repairMissingNitros", + "repairOrphanedCatalog", + ]), + }), + auditRequirement: "PRIVILEGED_MUTATION", + }), + ); + }); + it("records the actual permissions for room, radio, and Studio mutations", () => { expect(hotelMigrationEntries).toContainEqual( expect.objectContaining({ diff --git a/src/features/housekeeping/migration/hotel.ts b/src/features/housekeeping/migration/hotel.ts index 095f9888..a44b56d2 100644 --- a/src/features/housekeeping/migration/hotel.ts +++ b/src/features/housekeeping/migration/hotel.ts @@ -368,16 +368,28 @@ export const hotelMigrationEntries: readonly MigrationEntry[] = [ sourceFile: "src/app/admin/studio/audit/page.tsx", targetPath: "/admin/hotel/studio/audit", decision: "REBUILD", - capabilities: { read: [PERMS.ASSETS_IMPORT], mutate: [] }, - dependencies: { - queries: ["POST /api/admin/import/audit", "runCatalogAudit"], - mutations: [], + capabilities: { + read: [PERMS.ASSETS_IMPORT], + mutate: [PERMS.ASSETS_IMPORT], }, - auditRequirement: "NONE", + dependencies: { + queries: ["runCatalogAudit"], + mutations: [ + "POST /api/admin/import/audit", + "applyCatalogSql", + "ensureDirectories", + "repairDuplicateClassnames", + "repairFurniData", + "repairMissingIcons", + "repairMissingNitros", + "repairOrphanedCatalog", + ], + }, + auditRequirement: "PRIVILEGED_MUTATION", localization: "PARTIAL", accessibility: "PARTIAL", notes: [ - "The POST endpoint performs a read-only database and filesystem audit", + "Audit repairs can mutate asset files, catalog data, FurnitureData, and database structure", ], }), plannedHotelEntry({