feat(db): mesh data model — meshes, members, invites, audit log
- pgSchema "mesh" with 4 tables isolating the peer mesh domain - Enums: visibility, transport, tier, role - audit_log is metadata-only (E2E encryption enforced at broker/client) - Cascade on mesh delete, soft-delete via archivedAt/revokedAt Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
107
packages/billing/src/config/plans.ts
Normal file
107
packages/billing/src/config/plans.ts
Normal file
@@ -0,0 +1,107 @@
|
||||
import {
|
||||
BillingModel,
|
||||
PricingPlanType,
|
||||
RecurringInterval,
|
||||
BillingDiscountType,
|
||||
} from "../types";
|
||||
|
||||
import type { Discount } from "../types";
|
||||
|
||||
export const plans = [
|
||||
{
|
||||
id: PricingPlanType.FREE,
|
||||
name: "plan.starter.name",
|
||||
description: "plan.starter.description",
|
||||
badge: null,
|
||||
prices: [
|
||||
{
|
||||
id: "starter-lifetime",
|
||||
amount: 0,
|
||||
type: BillingModel.ONE_TIME,
|
||||
},
|
||||
{
|
||||
id: "starter-monthly",
|
||||
amount: 0,
|
||||
interval: RecurringInterval.MONTH,
|
||||
type: BillingModel.RECURRING,
|
||||
},
|
||||
{
|
||||
id: "starter-yearly",
|
||||
amount: 0,
|
||||
interval: RecurringInterval.YEAR,
|
||||
type: BillingModel.RECURRING,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: PricingPlanType.PREMIUM,
|
||||
name: "plan.premium.name",
|
||||
description: "plan.premium.description",
|
||||
badge: "plan.premium.badge",
|
||||
prices: [
|
||||
{
|
||||
id: "price_1PpUagFQH4McJDTlHCzOmyT6",
|
||||
amount: 29900,
|
||||
type: BillingModel.ONE_TIME,
|
||||
},
|
||||
{
|
||||
id: "price_1PpZAAFQH4McJDTlig6FBPyy",
|
||||
amount: 1900,
|
||||
interval: RecurringInterval.MONTH,
|
||||
trialDays: 7,
|
||||
type: BillingModel.RECURRING,
|
||||
},
|
||||
{
|
||||
id: "price_1PpZALFQH4McJDTl8SWorWTO",
|
||||
amount: 8900,
|
||||
interval: RecurringInterval.YEAR,
|
||||
trialDays: 7,
|
||||
type: BillingModel.RECURRING,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: PricingPlanType.ENTERPRISE,
|
||||
name: "plan.enterprise.name",
|
||||
description: "plan.enterprise.description",
|
||||
badge: null,
|
||||
prices: [
|
||||
{
|
||||
id: "enterprise-lifetime",
|
||||
label: "common:contactUs",
|
||||
href: "/contact",
|
||||
type: BillingModel.ONE_TIME,
|
||||
custom: true,
|
||||
},
|
||||
{
|
||||
id: "enterprise-monthly",
|
||||
label: "common:contactUs",
|
||||
href: "/contact",
|
||||
type: BillingModel.RECURRING,
|
||||
interval: RecurringInterval.MONTH,
|
||||
custom: true,
|
||||
},
|
||||
{
|
||||
id: "enterprise-yearly",
|
||||
label: "common:contactUs",
|
||||
href: "/contact",
|
||||
type: BillingModel.RECURRING,
|
||||
interval: RecurringInterval.YEAR,
|
||||
custom: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
export const discounts: Discount[] = [
|
||||
{
|
||||
code: "50OFF",
|
||||
type: BillingDiscountType.PERCENT,
|
||||
off: 50,
|
||||
appliesTo: [
|
||||
"price_1PpUagFQH4McJDTlHCzOmyT6",
|
||||
"price_1PpZAAFQH4McJDTlig6FBPyy",
|
||||
"price_1PpZALFQH4McJDTl8SWorWTO",
|
||||
],
|
||||
},
|
||||
];
|
||||
Reference in New Issue
Block a user