From 47743a5fa84887c9cac22a6957bc7f36b1465168 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 11 Feb 2026 10:26:50 -0800 Subject: [PATCH 1/5] Fix private import -> dynamic --- server/routers/badger/verifySession.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/routers/badger/verifySession.ts b/server/routers/badger/verifySession.ts index 828960d1..c446e0f7 100644 --- a/server/routers/badger/verifySession.ts +++ b/server/routers/badger/verifySession.ts @@ -39,7 +39,7 @@ import { import { logRequestAudit } from "./logRequestAudit"; import cache from "@server/lib/cache"; import { APP_VERSION } from "@server/lib/consts"; -import { isSubscribed } from "#private/lib/isSubscribed"; +import { isSubscribed } from "#dynamic/lib/isSubscribed"; import { tierMatrix } from "@server/lib/billing/tierMatrix"; const verifyResourceSessionSchema = z.object({ From 040a9457741f7dd273f4cd53dde36b3e0d77b3a1 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 11 Feb 2026 10:30:25 -0800 Subject: [PATCH 2/5] Fix dynamic -> private import violations --- server/private/routers/orgIdp/createOrgOidcIdp.ts | 2 +- server/private/routers/orgIdp/updateOrgOidcIdp.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/private/routers/orgIdp/createOrgOidcIdp.ts b/server/private/routers/orgIdp/createOrgOidcIdp.ts index 23fa4b7c..d1874033 100644 --- a/server/private/routers/orgIdp/createOrgOidcIdp.ts +++ b/server/private/routers/orgIdp/createOrgOidcIdp.ts @@ -25,7 +25,7 @@ import { generateOidcRedirectUrl } from "@server/lib/idp/generateRedirectUrl"; import { encrypt } from "@server/lib/crypto"; import config from "@server/lib/config"; import { CreateOrgIdpResponse } from "@server/routers/orgIdp/types"; -import { isSubscribed } from "#dynamic/lib/isSubscribed"; +import { isSubscribed } from "#private/lib/isSubscribed"; import { tierMatrix } from "@server/lib/billing/tierMatrix"; const paramsSchema = z.strictObject({ orgId: z.string().nonempty() }); diff --git a/server/private/routers/orgIdp/updateOrgOidcIdp.ts b/server/private/routers/orgIdp/updateOrgOidcIdp.ts index d83ff569..c5619460 100644 --- a/server/private/routers/orgIdp/updateOrgOidcIdp.ts +++ b/server/private/routers/orgIdp/updateOrgOidcIdp.ts @@ -24,7 +24,7 @@ import { idp, idpOidcConfig } from "@server/db"; import { eq, and } from "drizzle-orm"; import { encrypt } from "@server/lib/crypto"; import config from "@server/lib/config"; -import { isSubscribed } from "#dynamic/lib/isSubscribed"; +import { isSubscribed } from "#private/lib/isSubscribed"; import { tierMatrix } from "@server/lib/billing/tierMatrix"; const paramsSchema = z From 6475dceab9e1b5971aa18579c3f1ef00db0345d4 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 11 Feb 2026 12:38:18 -0800 Subject: [PATCH 3/5] Rename tiers in features and fix subscribed logic issue --- server/lib/billing/features.ts | 20 +++++++++---------- server/private/routers/billing/changeTier.ts | 12 +++++------ .../routers/billing/createCheckoutSession.ts | 12 +++++------ .../routers/billing/hooks/getSubType.ts | 12 +++++------ server/routers/idp/validateOidcCallback.ts | 2 +- 5 files changed, 29 insertions(+), 29 deletions(-) diff --git a/server/lib/billing/features.ts b/server/lib/billing/features.ts index 501fba36..3fec53b4 100644 --- a/server/lib/billing/features.ts +++ b/server/lib/billing/features.ts @@ -56,22 +56,22 @@ export function getFeatureIdByMetricId( export type FeaturePriceSet = Partial>; -export const homeLabFeaturePriceSet: FeaturePriceSet = { +export const tier1FeaturePriceSet: FeaturePriceSet = { [FeatureId.TIER1]: "price_1SzVE3D3Ee2Ir7Wm6wT5Dl3G" }; -export const homeLabFeaturePriceSetSandbox: FeaturePriceSet = { +export const tier1FeaturePriceSetSandbox: FeaturePriceSet = { [FeatureId.TIER1]: "price_1SxgpPDCpkOb237Bfo4rIsoT" }; -export function getHomeLabFeaturePriceSet(): FeaturePriceSet { +export function getTier1FeaturePriceSet(): FeaturePriceSet { if ( process.env.ENVIRONMENT == "prod" && process.env.SANDBOX_MODE !== "true" ) { - return homeLabFeaturePriceSet; + return tier1FeaturePriceSet; } else { - return homeLabFeaturePriceSetSandbox; + return tier1FeaturePriceSetSandbox; } } @@ -83,7 +83,7 @@ export const tier2FeaturePriceSetSandbox: FeaturePriceSet = { [FeatureId.USERS]: "price_1SxaEHDCpkOb237BD9lBkPiR" }; -export function getStarterFeaturePriceSet(): FeaturePriceSet { +export function getTier2FeaturePriceSet(): FeaturePriceSet { if ( process.env.ENVIRONMENT == "prod" && process.env.SANDBOX_MODE !== "true" @@ -102,7 +102,7 @@ export const tier3FeaturePriceSetSandbox: FeaturePriceSet = { [FeatureId.USERS]: "price_1SxaEODCpkOb237BiXdCBSfs" }; -export function getScaleFeaturePriceSet(): FeaturePriceSet { +export function getTier3FeaturePriceSet(): FeaturePriceSet { if ( process.env.ENVIRONMENT == "prod" && process.env.SANDBOX_MODE !== "true" @@ -116,9 +116,9 @@ export function getScaleFeaturePriceSet(): FeaturePriceSet { export function getFeatureIdByPriceId(priceId: string): FeatureId | undefined { // Check all feature price sets const allPriceSets = [ - getHomeLabFeaturePriceSet(), - getStarterFeaturePriceSet(), - getScaleFeaturePriceSet() + getTier1FeaturePriceSet(), + getTier2FeaturePriceSet(), + getTier3FeaturePriceSet() ]; for (const priceSet of allPriceSets) { diff --git a/server/private/routers/billing/changeTier.ts b/server/private/routers/billing/changeTier.ts index ee60c0ec..3c9b8e43 100644 --- a/server/private/routers/billing/changeTier.ts +++ b/server/private/routers/billing/changeTier.ts @@ -22,9 +22,9 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import stripe from "#private/lib/stripe"; import { - getHomeLabFeaturePriceSet, - getScaleFeaturePriceSet, - getStarterFeaturePriceSet, + getTier1FeaturePriceSet, + getTier3FeaturePriceSet, + getTier2FeaturePriceSet, FeatureId, type FeaturePriceSet } from "@server/lib/billing"; @@ -113,11 +113,11 @@ export async function changeTier( // Get the target tier's price set let targetPriceSet: FeaturePriceSet; if (tier === "tier1") { - targetPriceSet = getHomeLabFeaturePriceSet(); + targetPriceSet = getTier1FeaturePriceSet(); } else if (tier === "tier2") { - targetPriceSet = getStarterFeaturePriceSet(); + targetPriceSet = getTier2FeaturePriceSet(); } else if (tier === "tier3") { - targetPriceSet = getScaleFeaturePriceSet(); + targetPriceSet = getTier3FeaturePriceSet(); } else { return next(createHttpError(HttpCode.BAD_REQUEST, "Invalid tier")); } diff --git a/server/private/routers/billing/createCheckoutSession.ts b/server/private/routers/billing/createCheckoutSession.ts index e5bb95db..b35c6532 100644 --- a/server/private/routers/billing/createCheckoutSession.ts +++ b/server/private/routers/billing/createCheckoutSession.ts @@ -23,9 +23,9 @@ import config from "@server/lib/config"; import { fromError } from "zod-validation-error"; import stripe from "#private/lib/stripe"; import { - getHomeLabFeaturePriceSet, - getScaleFeaturePriceSet, - getStarterFeaturePriceSet + getTier1FeaturePriceSet, + getTier3FeaturePriceSet, + getTier2FeaturePriceSet } from "@server/lib/billing"; import { getLineItems } from "@server/lib/billing/getLineItems"; import Stripe from "stripe"; @@ -88,11 +88,11 @@ export async function createCheckoutSession( let lineItems: Stripe.Checkout.SessionCreateParams.LineItem[]; if (tier === "tier1") { - lineItems = await getLineItems(getHomeLabFeaturePriceSet(), orgId); + lineItems = await getLineItems(getTier1FeaturePriceSet(), orgId); } else if (tier === "tier2") { - lineItems = await getLineItems(getStarterFeaturePriceSet(), orgId); + lineItems = await getLineItems(getTier2FeaturePriceSet(), orgId); } else if (tier === "tier3") { - lineItems = await getLineItems(getScaleFeaturePriceSet(), orgId); + lineItems = await getLineItems(getTier3FeaturePriceSet(), orgId); } else { return next(createHttpError(HttpCode.BAD_REQUEST, "Invalid plan")); } diff --git a/server/private/routers/billing/hooks/getSubType.ts b/server/private/routers/billing/hooks/getSubType.ts index a38290eb..44cfe002 100644 --- a/server/private/routers/billing/hooks/getSubType.ts +++ b/server/private/routers/billing/hooks/getSubType.ts @@ -15,9 +15,9 @@ import { getLicensePriceSet, } from "@server/lib/billing/licenses"; import { - getHomeLabFeaturePriceSet, - getStarterFeaturePriceSet, - getScaleFeaturePriceSet, + getTier1FeaturePriceSet, + getTier2FeaturePriceSet, + getTier3FeaturePriceSet, } from "@server/lib/billing/features"; import Stripe from "stripe"; import { Tier } from "@server/types/Tiers"; @@ -40,19 +40,19 @@ export function getSubType(fullSubscription: Stripe.Response Date: Wed, 11 Feb 2026 12:41:22 -0800 Subject: [PATCH 4/5] Fix anouther subscribed logic issue --- server/routers/user/createOrgUser.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/routers/user/createOrgUser.ts b/server/routers/user/createOrgUser.ts index cac912f9..d0515e71 100644 --- a/server/routers/user/createOrgUser.ts +++ b/server/routers/user/createOrgUser.ts @@ -132,7 +132,7 @@ export async function createOrgUser( orgId, tierMatrix.orgOidc ); - if (subscribed) { + if (!subscribed) { return next( createHttpError( HttpCode.FORBIDDEN, From eab275095313fd016d6eab9c5c937e98a468e70d Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 11 Feb 2026 17:21:15 -0800 Subject: [PATCH 5/5] Add migrations for 1.15.3 --- server/setup/migrationsPg.ts | 4 ++- server/setup/migrationsSqlite.ts | 4 ++- server/setup/scriptsPg/1.15.3.ts | 39 ++++++++++++++++++++++++++++ server/setup/scriptsSqlite/1.15.3.ts | 28 ++++++++++++++++++++ 4 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 server/setup/scriptsPg/1.15.3.ts create mode 100644 server/setup/scriptsSqlite/1.15.3.ts diff --git a/server/setup/migrationsPg.ts b/server/setup/migrationsPg.ts index 7ae21836..c1ebfa09 100644 --- a/server/setup/migrationsPg.ts +++ b/server/setup/migrationsPg.ts @@ -17,6 +17,7 @@ import m9 from "./scriptsPg/1.12.0"; import m10 from "./scriptsPg/1.13.0"; import m11 from "./scriptsPg/1.14.0"; import m12 from "./scriptsPg/1.15.0"; +import m13 from "./scriptsPg/1.15.3"; // THIS CANNOT IMPORT ANYTHING FROM THE SERVER // EXCEPT FOR THE DATABASE AND THE SCHEMA @@ -34,7 +35,8 @@ const migrations = [ { version: "1.12.0", run: m9 }, { version: "1.13.0", run: m10 }, { version: "1.14.0", run: m11 }, - { version: "1.15.0", run: m12 } + { version: "1.15.0", run: m12 }, + { version: "1.15.3", run: m13 } // Add new migrations here as they are created ] as { version: string; diff --git a/server/setup/migrationsSqlite.ts b/server/setup/migrationsSqlite.ts index 0bbc86ee..170cf93d 100644 --- a/server/setup/migrationsSqlite.ts +++ b/server/setup/migrationsSqlite.ts @@ -35,6 +35,7 @@ import m30 from "./scriptsSqlite/1.12.0"; import m31 from "./scriptsSqlite/1.13.0"; import m32 from "./scriptsSqlite/1.14.0"; import m33 from "./scriptsSqlite/1.15.0"; +import m34 from "./scriptsSqlite/1.15.3"; // THIS CANNOT IMPORT ANYTHING FROM THE SERVER // EXCEPT FOR THE DATABASE AND THE SCHEMA @@ -68,7 +69,8 @@ const migrations = [ { version: "1.12.0", run: m30 }, { version: "1.13.0", run: m31 }, { version: "1.14.0", run: m32 }, - { version: "1.15.0", run: m33 } + { version: "1.15.0", run: m33 }, + { version: "1.15.3", run: m34 } // Add new migrations here as they are created ] as const; diff --git a/server/setup/scriptsPg/1.15.3.ts b/server/setup/scriptsPg/1.15.3.ts new file mode 100644 index 00000000..80c5f67d --- /dev/null +++ b/server/setup/scriptsPg/1.15.3.ts @@ -0,0 +1,39 @@ +import { db } from "@server/db/pg/driver"; +import { sql } from "drizzle-orm"; +import { __DIRNAME } from "@server/lib/consts"; + +const version = "1.15.3"; + +export default async function migration() { + console.log(`Running setup script ${version}...`); + + try { + await db.execute(sql`BEGIN`); + + await db.execute( + sql`ALTER TABLE "limits" ADD COLUMN "override" boolean DEFAULT false;` + ); + await db.execute( + sql`ALTER TABLE "subscriptionItems" ADD COLUMN "stripeSubscriptionItemId" varchar(255);` + ); + await db.execute( + sql`ALTER TABLE "subscriptionItems" ADD COLUMN "featureId" varchar(255);` + ); + await db.execute( + sql`ALTER TABLE "subscriptions" ADD COLUMN "version" integer;` + ); + await db.execute( + sql`ALTER TABLE "subscriptions" ADD COLUMN "type" varchar(50);` + ); + + await db.execute(sql`COMMIT`); + console.log("Migrated database"); + } catch (e) { + await db.execute(sql`ROLLBACK`); + console.log("Unable to migrate database"); + console.log(e); + throw e; + } + + console.log(`${version} migration complete`); +} diff --git a/server/setup/scriptsSqlite/1.15.3.ts b/server/setup/scriptsSqlite/1.15.3.ts new file mode 100644 index 00000000..614b0759 --- /dev/null +++ b/server/setup/scriptsSqlite/1.15.3.ts @@ -0,0 +1,28 @@ +import { __DIRNAME, APP_PATH } from "@server/lib/consts"; +import Database from "better-sqlite3"; +import path from "path"; + +const version = "1.15.3"; + +export default async function migration() { + console.log(`Running setup script ${version}...`); + + const location = path.join(APP_PATH, "db", "db.sqlite"); + const db = new Database(location); + + try { + db.transaction(() => { + db.prepare(`ALTER TABLE 'limits' ADD 'override' integer DEFAULT false;`).run(); + db.prepare(`ALTER TABLE 'subscriptionItems' ADD 'featureId' text;`).run(); + db.prepare(`ALTER TABLE 'subscriptions' ADD 'version' integer;`).run(); + db.prepare(`ALTER TABLE 'subscriptions' ADD 'type' text;`).run(); + })(); + + console.log(`Migrated database`); + } catch (e) { + console.log("Failed to migrate db:", e); + throw e; + } + + console.log(`${version} migration complete`); +}