Merge pull request #7859 from Budibase/feature/enterprise

Enterprise / license override support
This commit is contained in:
Rory Powell 2022-09-21 20:18:54 +01:00 committed by GitHub
commit c3ee8b0e56
15 changed files with 157 additions and 32 deletions

View File

@ -23,9 +23,11 @@ export default class LoggingProcessor implements EventProcessor {
return
}
let timestampString = getTimestampString(timestamp)
console.log(
`[audit] [tenant=${identity.tenantId}] [identityType=${identity.type}] [identity=${identity.id}] ${timestampString} ${event} `
)
let message = `[audit] [tenant=${identity.tenantId}] [identityType=${identity.type}] [identity=${identity.id}] ${timestampString} ${event} `
if (env.isDev()) {
message = message + `[debug: [properties=${JSON.stringify(properties)}] ]`
}
console.log(message)
}
async identify(identity: Identity, timestamp?: string | number) {

View File

@ -1,27 +1,78 @@
import { publishEvent } from "../events"
import {
Event,
License,
LicenseActivatedEvent,
LicenseDowngradedEvent,
LicenseUpdatedEvent,
LicenseUpgradedEvent,
LicensePlanChangedEvent,
LicenseTierChangedEvent,
PlanType,
Account,
LicensePortalOpenedEvent,
LicenseCheckoutSuccessEvent,
LicenseCheckoutOpenedEvent,
LicensePaymentFailedEvent,
LicensePaymentRecoveredEvent,
} from "@budibase/types"
// TODO
export async function updgraded(license: License) {
const properties: LicenseUpgradedEvent = {}
await publishEvent(Event.LICENSE_UPGRADED, properties)
export async function tierChanged(account: Account, from: number, to: number) {
const properties: LicenseTierChangedEvent = {
accountId: account.accountId,
to,
from,
}
await publishEvent(Event.LICENSE_TIER_CHANGED, properties)
}
// TODO
export async function downgraded(license: License) {
const properties: LicenseDowngradedEvent = {}
await publishEvent(Event.LICENSE_DOWNGRADED, properties)
export async function planChanged(
account: Account,
from: PlanType,
to: PlanType
) {
const properties: LicensePlanChangedEvent = {
accountId: account.accountId,
to,
from,
}
await publishEvent(Event.LICENSE_PLAN_CHANGED, properties)
}
// TODO
export async function activated(license: License) {
const properties: LicenseActivatedEvent = {}
export async function activated(account: Account) {
const properties: LicenseActivatedEvent = {
accountId: account.accountId,
}
await publishEvent(Event.LICENSE_ACTIVATED, properties)
}
export async function checkoutOpened(account: Account) {
const properties: LicenseCheckoutOpenedEvent = {
accountId: account.accountId,
}
await publishEvent(Event.LICENSE_CHECKOUT_OPENED, properties)
}
export async function checkoutSuccess(account: Account) {
const properties: LicenseCheckoutSuccessEvent = {
accountId: account.accountId,
}
await publishEvent(Event.LICENSE_CHECKOUT_SUCCESS, properties)
}
export async function portalOpened(account: Account) {
const properties: LicensePortalOpenedEvent = {
accountId: account.accountId,
}
await publishEvent(Event.LICENSE_PORTAL_OPENED, properties)
}
export async function paymentFailed(account: Account) {
const properties: LicensePaymentFailedEvent = {
accountId: account.accountId,
}
await publishEvent(Event.LICENSE_PAYMENT_FAILED, properties)
}
export async function paymentRecovered(account: Account) {
const properties: LicensePaymentRecoveredEvent = {
accountId: account.accountId,
}
await publishEvent(Event.LICENSE_PAYMENT_RECOVERED, properties)
}

View File

@ -5,10 +5,12 @@ const { doInAppContext } = require("@budibase/backend-core/context")
const { doInTenant } = require("@budibase/backend-core/tenancy")
const {
quotas,
} = require("@budibase/pro")
const {
QuotaUsageType,
StaticQuotaName,
MonthlyQuotaName,
} = require("@budibase/pro")
} = require("@budibase/types")
describe("/rows", () => {
let request = setup.getRequest()

View File

@ -1,6 +1,7 @@
import { getTenantId } from "@budibase/backend-core/tenancy"
import { getAllApps } from "@budibase/backend-core/db"
import { quotas, QuotaUsageType, StaticQuotaName } from "@budibase/pro"
import { quotas } from "@budibase/pro"
import { QuotaUsageType, StaticQuotaName } from "@budibase/types"
export const run = async () => {
// get app count

View File

@ -1,7 +1,8 @@
import { getTenantId } from "@budibase/backend-core/tenancy"
import { getAllApps } from "@budibase/backend-core/db"
import { getUniqueRows } from "../../../utilities/usageQuota/rows"
import { quotas, QuotaUsageType, StaticQuotaName } from "@budibase/pro"
import { quotas } from "@budibase/pro"
import { QuotaUsageType, StaticQuotaName } from "@budibase/types"
export const run = async () => {
// get all rows in all apps

View File

@ -1,6 +1,7 @@
import TestConfig from "../../../../tests/utilities/TestConfiguration"
import * as syncApps from "../syncApps"
import { quotas, QuotaUsageType, StaticQuotaName } from "@budibase/pro"
import { quotas } from "@budibase/pro"
import { QuotaUsageType, StaticQuotaName } from "@budibase/types"
describe("syncApps", () => {
let config = new TestConfig(false)

View File

@ -1,6 +1,7 @@
import TestConfig from "../../../../tests/utilities/TestConfiguration"
import * as syncRows from "../syncRows"
import { quotas, QuotaUsageType, StaticQuotaName } from "@budibase/pro"
import { quotas } from "@budibase/pro"
import { QuotaUsageType, StaticQuotaName } from "@budibase/types"
describe("syncRows", () => {
let config = new TestConfig(false)

View File

@ -1,4 +1,4 @@
import { Hosting } from "../../sdk"
import { Feature, Hosting, PlanType, Quotas } from "../../sdk"
export interface CreateAccount {
email: string
@ -22,6 +22,11 @@ export const isCreatePasswordAccount = (
account: CreateAccount
): account is CreatePassswordAccount => account.authType === AuthType.PASSWORD
export interface LicenseOverrides {
features?: Feature[]
quotas?: Quotas
}
export interface Account extends CreateAccount {
// generated
accountId: string
@ -31,9 +36,12 @@ export interface Account extends CreateAccount {
verificationSent: boolean
// licensing
tier: string // deprecated
planType?: PlanType
planTier?: number
stripeCustomerId?: string
licenseKey?: string
licenseKeyActivatedAt?: number
licenseOverrides?: LicenseOverrides
}
export interface PasswordAccount extends Account {

View File

@ -2,3 +2,4 @@ export * from "./config"
export * from "./user"
export * from "./userGroup"
export * from "./plugin"
export * from "./quotas"

View File

@ -0,0 +1,15 @@
import { MonthlyQuotaName, StaticQuotaName } from "../../sdk"
export interface QuotaUsage {
_id: string
_rev?: string
quotaReset: string
usageQuota: {
[key in StaticQuotaName]: number
}
monthly: {
[key: string]: {
[key in MonthlyQuotaName]: number
}
}
}

View File

@ -133,9 +133,14 @@ export enum Event {
AUTOMATION_TRIGGER_UPDATED = "automation:trigger:updated",
// LICENSE
LICENSE_UPGRADED = "license:upgraded",
LICENSE_DOWNGRADED = "license:downgraded",
LICENSE_PLAN_CHANGED = "license:plan:changed",
LICENSE_TIER_CHANGED = "license:tier:changed",
LICENSE_ACTIVATED = "license:activated",
LICENSE_PAYMENT_FAILED = "license:payment:failed",
LICENSE_PAYMENT_RECOVERED = "license:payment:recovered",
LICENSE_CHECKOUT_OPENED = "license:checkout:opened",
LICENSE_CHECKOUT_SUCCESS = "license:checkout:success",
LICENSE_PORTAL_OPENED = "license:portal:opened",
// ACCOUNT
ACCOUNT_CREATED = "account:created",

View File

@ -1,7 +1,37 @@
export interface LicenseUpgradedEvent {}
import { PlanType } from "../licensing"
export interface LicenseDowngradedEvent {}
export interface LicenseTierChangedEvent {
accountId: string
from: number
to: number
}
export interface LicenseUpdatedEvent {}
export interface LicensePlanChangedEvent {
accountId: string
from: PlanType
to: PlanType
}
export interface LicenseActivatedEvent {}
export interface LicenseActivatedEvent {
accountId: string
}
export interface LicenseCheckoutOpenedEvent {
accountId: string
}
export interface LicenseCheckoutSuccessEvent {
accountId: string
}
export interface LicensePortalOpenedEvent {
accountId: string
}
export interface LicensePaymentFailedEvent {
accountId: string
}
export interface LicensePaymentRecoveredEvent {
accountId: string
}

View File

@ -12,6 +12,9 @@ export interface Subscription {
cancelAt: number | null | undefined
currentPeriodStart: number
currentPeriodEnd: number
status: string
pastDueAt?: number | null
downgradeAt?: number
}
export interface Billing {

View File

@ -6,6 +6,7 @@ export interface AccountPlan {
export enum PlanType {
FREE = "free",
PRO = "pro",
TEAM = "team",
BUSINESS = "business",
ENTERPRISE = "enterprise",
}

View File

@ -13,6 +13,8 @@ export enum QuotaType {
export enum StaticQuotaName {
ROWS = "rows",
APPS = "apps",
USER_GROUPS = "userGroups",
PLUGINS = "plugins",
}
export enum MonthlyQuotaName {
@ -22,7 +24,6 @@ export enum MonthlyQuotaName {
}
export enum ConstantQuotaName {
QUERY_TIMEOUT_SECONDS = "queryTimeoutSeconds",
AUTOMATION_LOG_RETENTION_DAYS = "automationLogRetentionDays",
}
@ -54,6 +55,7 @@ export const isConstantQuota = (
export type PlanQuotas = {
[PlanType.FREE]: Quotas
[PlanType.PRO]: Quotas
[PlanType.TEAM]: Quotas
[PlanType.BUSINESS]: Quotas
[PlanType.ENTERPRISE]: Quotas
}
@ -68,10 +70,11 @@ export type Quotas = {
[QuotaUsageType.STATIC]: {
[StaticQuotaName.ROWS]: Quota
[StaticQuotaName.APPS]: Quota
[StaticQuotaName.USER_GROUPS]: Quota
[StaticQuotaName.PLUGINS]: Quota
}
}
[QuotaType.CONSTANT]: {
[ConstantQuotaName.QUERY_TIMEOUT_SECONDS]: Quota
[ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS]: Quota
}
}