chore: add UNLOCK_ALL_FEATURES env flag to bypass plan gating for testing
Some checks failed
CI / Lint, Unit & Integration Tests (push) Has been cancelled
Some checks failed
CI / Lint, Unit & Integration Tests (push) Has been cancelled
getShopTier() returns "pro" when UNLOCK_ALL_FEATURES=true, so every plan-gated screen (Zones, Rates, Product rules, Dashboard) and the per-tier location cap open up regardless of the shop's real subscription. Single choke point — every tierAtLeast()/locationLimitFor() call derives from getShopTier(). Default off; documented in .env.example as production-unsafe. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
3749b4d134
commit
d98b29ec76
@ -16,3 +16,9 @@ REDIS_URL=redis://127.0.0.1:6380
|
|||||||
|
|
||||||
# Google Maps (Phase 5 — geocoding, radius/distance eligibility, map display).
|
# Google Maps (Phase 5 — geocoding, radius/distance eligibility, map display).
|
||||||
GOOGLE_MAPS_API_KEY=
|
GOOGLE_MAPS_API_KEY=
|
||||||
|
|
||||||
|
# Test/dev only: when "true", every shop resolves as the top tier so all
|
||||||
|
# plan-gated features (Zones, Rates, Product rules, Dashboard, unlimited
|
||||||
|
# locations) are open regardless of subscription. Bypasses billing — leave
|
||||||
|
# unset / "false" in production.
|
||||||
|
UNLOCK_ALL_FEATURES=false
|
||||||
|
|||||||
@ -4,7 +4,15 @@ import { locationLimitFor, type Tier } from "../lib/billing-plans";
|
|||||||
export type { Tier };
|
export type { Tier };
|
||||||
export { tierAtLeast, tierFromPlanName, locationLimitFor, LOCATION_LIMITS, PLAN_PRICING } from "../lib/billing-plans";
|
export { tierAtLeast, tierFromPlanName, locationLimitFor, LOCATION_LIMITS, PLAN_PRICING } from "../lib/billing-plans";
|
||||||
|
|
||||||
|
// Test/dev escape hatch: set UNLOCK_ALL_FEATURES=true in .env to make every
|
||||||
|
// shop resolve as the top tier, so plan-gated screens (Zones, Rates,
|
||||||
|
// Product rules, Dashboard) and the per-tier location cap are all open
|
||||||
|
// regardless of the shop's real subscription. MUST stay off in production —
|
||||||
|
// it bypasses billing entirely.
|
||||||
|
const UNLOCK_ALL_FEATURES = process.env.UNLOCK_ALL_FEATURES === "true";
|
||||||
|
|
||||||
export async function getShopTier(shopDomain: string): Promise<Tier> {
|
export async function getShopTier(shopDomain: string): Promise<Tier> {
|
||||||
|
if (UNLOCK_ALL_FEATURES) return "pro";
|
||||||
const shop = await db.shop.findUnique({ where: { shopDomain }, select: { tier: true } });
|
const shop = await db.shop.findUnique({ where: { shopDomain }, select: { tier: true } });
|
||||||
return (shop?.tier as Tier | undefined) ?? "free";
|
return (shop?.tier as Tier | undefined) ?? "free";
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user