From d8344988c0a62b00801c7ccc18634427e29e35e5 Mon Sep 17 00:00:00 2001 From: Owen Date: Thu, 13 Nov 2025 21:11:05 -0500 Subject: [PATCH] Restrict license --- server/lib/isLicencedOrSubscribed.ts | 23 +++++++++++++++++++++++ server/routers/org/updateOrg.ts | 23 ++--------------------- server/routers/resource/updateResource.ts | 14 ++++++++++++-- 3 files changed, 37 insertions(+), 23 deletions(-) create mode 100644 server/lib/isLicencedOrSubscribed.ts diff --git a/server/lib/isLicencedOrSubscribed.ts b/server/lib/isLicencedOrSubscribed.ts new file mode 100644 index 00000000..8f1b3d00 --- /dev/null +++ b/server/lib/isLicencedOrSubscribed.ts @@ -0,0 +1,23 @@ +import { build } from "@server/build"; +import license from "@server/license/license"; +import { getOrgTierData } from "#dynamic/lib/billing"; +import { TierId } from "./billing/tiers"; + +export async function isLicensedOrSubscribed(orgId: string): Promise { + if (build === "enterprise") { + const isUnlocked = await license.isUnlocked(); + if (!isUnlocked) { + return false; + } + } + + if (build === "saas") { + const { tier } = await getOrgTierData(orgId); + const subscribed = tier === TierId.STANDARD; + if (!subscribed) { + return false; + } + } + + return true; +} diff --git a/server/routers/org/updateOrg.ts b/server/routers/org/updateOrg.ts index aa9e2151..cdf6aa73 100644 --- a/server/routers/org/updateOrg.ts +++ b/server/routers/org/updateOrg.ts @@ -10,10 +10,10 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; import { build } from "@server/build"; -import license from "#dynamic/license/license"; import { getOrgTierData } from "#dynamic/lib/billing"; import { TierId } from "@server/lib/billing/tiers"; import { cache } from "@server/lib/cache"; +import { isLicensedOrSubscribed } from "@server/lib/isLicencedOrSubscribed"; const updateOrgParamsSchema = z.strictObject({ orgId: z.string() @@ -154,23 +154,4 @@ export async function updateOrg( createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred") ); } -} - -async function isLicensedOrSubscribed(orgId: string): Promise { - if (build === "enterprise") { - const isUnlocked = await license.isUnlocked(); - if (!isUnlocked) { - return false; - } - } - - if (build === "saas") { - const { tier } = await getOrgTierData(orgId); - const subscribed = tier === TierId.STANDARD; - if (!subscribed) { - return false; - } - } - - return true; -} +} \ No newline at end of file diff --git a/server/routers/resource/updateResource.ts b/server/routers/resource/updateResource.ts index 9d71e21f..2051b075 100644 --- a/server/routers/resource/updateResource.ts +++ b/server/routers/resource/updateResource.ts @@ -22,8 +22,8 @@ import { registry } from "@server/openApi"; import { OpenAPITags } from "@server/openApi"; import { createCertificate } from "#dynamic/routers/certificates/createCertificate"; import { validateAndConstructDomain } from "@server/lib/domainUtils"; -import { validateHeaders } from "@server/lib/validators"; import { build } from "@server/build"; +import { isLicensedOrSubscribed } from "@server/lib/isLicencedOrSubscribed"; const updateResourceParamsSchema = z.strictObject({ resourceId: z.string().transform(Number).pipe(z.int().positive()) @@ -54,7 +54,7 @@ const updateHttpResourceBodySchema = z maintenanceModeType: z.enum(["forced", "automatic"]).optional(), maintenanceTitle: z.string().max(255).nullable().optional(), maintenanceMessage: z.string().max(2000).nullable().optional(), - maintenanceEstimatedTime: z.string().max(100).nullable().optional(), + maintenanceEstimatedTime: z.string().max(100).nullable().optional() }) .refine((data) => Object.keys(data).length > 0, { error: "At least one field must be provided for update" @@ -341,6 +341,16 @@ async function updateHttpResource( headers = null; } + const isLicensed = await isLicensedOrSubscribed(resource.orgId); + if (build == "enterprise" && !isLicensed) { + // null the maintenance mode fields if not licensed + updateData.maintenanceModeEnabled = undefined; + updateData.maintenanceModeType = undefined; + updateData.maintenanceTitle = undefined; + updateData.maintenanceMessage = undefined; + updateData.maintenanceEstimatedTime = undefined; + } + const updatedResource = await db .update(resources) .set({ ...updateData, headers })