diff --git a/server/src/api/controllers/statusPageThemeFlag.ts b/server/src/api/controllers/statusPageThemeFlag.ts deleted file mode 100644 index 0fc2baedc..000000000 --- a/server/src/api/controllers/statusPageThemeFlag.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { DEFAULT_STATUS_PAGE_THEME, DEFAULT_STATUS_PAGE_THEME_MODE, type StatusPage } from "@/domain/status-pages/status-page.type.js"; - -/** - * When STATUS_PAGE_THEMES_ENABLED is false, the controller drops incoming - * theme fields before persisting so an admin client can't accidentally store - * a value the public page won't honour. Whatever a caller sends here for - * `theme` / `themeMode` is silently ignored — the rest of the body is - * preserved verbatim. - * - * The strip is silent (not a 400) because the kill switch is an ops-side - * concern: API clients should not have to know whether the operator has - * disabled themes today, only that their saved value won't take effect. - * If we later decide we'd rather fail loudly, change this to throw a - * 400 AppError; downstream consumers already handle it. - */ -export const withoutThemeFields = (body: Record): Record => { - const rest = { ...body }; - delete rest.theme; - delete rest.themeMode; - return rest; -}; - -/** - * When STATUS_PAGE_THEMES_ENABLED is false, callers reading a status page - * should see the canonical default theme / mode regardless of what's stored - * in Mongo. Whatever the user previously chose stays in the DB so flipping - * the flag back on resurfaces their selection. - */ -export const applyDefaultTheme = (statusPage: StatusPage): StatusPage => ({ - ...statusPage, - theme: DEFAULT_STATUS_PAGE_THEME, - themeMode: DEFAULT_STATUS_PAGE_THEME_MODE, -}); diff --git a/server/test/unit/controllers/statusPageThemeFlag.test.ts b/server/test/unit/controllers/statusPageThemeFlag.test.ts deleted file mode 100644 index b1d51361a..000000000 --- a/server/test/unit/controllers/statusPageThemeFlag.test.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { describe, expect, it } from "@jest/globals"; -import { applyDefaultTheme, withoutThemeFields } from "../../../src/api/controllers/statusPageThemeFlag.ts"; -import { DEFAULT_STATUS_PAGE_THEME, DEFAULT_STATUS_PAGE_THEME_MODE } from "../../../src/domain/status-pages/status-page.type.ts"; -import { makeStatusPage } from "../../helpers/makeStatusPage.ts"; - -describe("statusPageThemeFlag", () => { - describe("withoutThemeFields", () => { - it("removes theme and themeMode from a body that has them", () => { - const body = { companyName: "Co", theme: "modern", themeMode: "dark" }; - const result = withoutThemeFields(body); - expect(result).toEqual({ companyName: "Co" }); - }); - - it("is a no-op when neither field is present", () => { - const body = { companyName: "Co", url: "page" }; - const result = withoutThemeFields(body); - expect(result).toEqual({ companyName: "Co", url: "page" }); - }); - - it("removes only the theme fields when one is present", () => { - const body = { companyName: "Co", theme: "bold" }; - const result = withoutThemeFields(body); - expect(result).toEqual({ companyName: "Co" }); - }); - - it("does not mutate the input body", () => { - const body = { companyName: "Co", theme: "modern", themeMode: "dark" }; - withoutThemeFields(body); - expect(body).toEqual({ companyName: "Co", theme: "modern", themeMode: "dark" }); - }); - - it("preserves all other fields verbatim", () => { - const body = { - companyName: "Co", - monitors: ["m-1", "m-2"], - isPublished: true, - showCharts: false, - color: "#13715B", - theme: "editorial", - themeMode: "light", - }; - const result = withoutThemeFields(body); - expect(result).toEqual({ - companyName: "Co", - monitors: ["m-1", "m-2"], - isPublished: true, - showCharts: false, - color: "#13715B", - }); - }); - }); - - describe("applyDefaultTheme", () => { - it("overwrites theme and themeMode with the canonical defaults", () => { - const sp = makeStatusPage({ theme: "modern", themeMode: "dark" }); - const result = applyDefaultTheme(sp); - expect(result.theme).toBe(DEFAULT_STATUS_PAGE_THEME); - expect(result.themeMode).toBe(DEFAULT_STATUS_PAGE_THEME_MODE); - }); - - it("leaves all other fields untouched", () => { - const sp = makeStatusPage({ - companyName: "Test Co", - url: "my-page", - monitors: ["mon-1", "mon-2"], - isPublished: true, - color: "#13715B", - }); - const result = applyDefaultTheme(sp); - expect(result.companyName).toBe("Test Co"); - expect(result.url).toBe("my-page"); - expect(result.monitors).toEqual(["mon-1", "mon-2"]); - expect(result.isPublished).toBe(true); - expect(result.color).toBe("#13715B"); - }); - - it("does not mutate the input status page", () => { - const sp = makeStatusPage({ theme: "modern", themeMode: "dark" }); - applyDefaultTheme(sp); - expect(sp.theme).toBe("modern"); - expect(sp.themeMode).toBe("dark"); - }); - - it("works on a status page that has no theme set yet", () => { - const sp = makeStatusPage({ theme: undefined, themeMode: undefined }); - const result = applyDefaultTheme(sp); - expect(result.theme).toBe(DEFAULT_STATUS_PAGE_THEME); - expect(result.themeMode).toBe(DEFAULT_STATUS_PAGE_THEME_MODE); - }); - }); -});