Merge branch 'master' into fix-table-metadata
This commit is contained in:
commit
7c19e9ed96
|
@ -21,8 +21,9 @@ import {
|
||||||
User,
|
User,
|
||||||
DatabaseQueryOpts,
|
DatabaseQueryOpts,
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
import * as context from "../context"
|
|
||||||
import { getGlobalDB } from "../context"
|
import { getGlobalDB } from "../context"
|
||||||
|
import * as context from "../context"
|
||||||
|
import { isCreator } from "./utils"
|
||||||
|
|
||||||
type GetOpts = { cleanup?: boolean }
|
type GetOpts = { cleanup?: boolean }
|
||||||
|
|
||||||
|
@ -286,6 +287,19 @@ export async function getUserCount() {
|
||||||
return response.total_rows
|
return response.total_rows
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getCreatorCount() {
|
||||||
|
let creators = 0
|
||||||
|
async function iterate(startPage?: string) {
|
||||||
|
const page = await paginatedUsers({ bookmark: startPage })
|
||||||
|
creators += page.data.filter(isCreator).length
|
||||||
|
if (page.hasNextPage) {
|
||||||
|
await iterate(page.nextPage)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await iterate()
|
||||||
|
return creators
|
||||||
|
}
|
||||||
|
|
||||||
// used to remove the builder/admin permissions, for processing the
|
// used to remove the builder/admin permissions, for processing the
|
||||||
// user as an app user (they may have some specific role/group
|
// user as an app user (they may have some specific role/group
|
||||||
export function removePortalUserPermissions(user: User | ContextUser) {
|
export function removePortalUserPermissions(user: User | ContextUser) {
|
||||||
|
|
|
@ -10,6 +10,7 @@ import { getAccountByTenantId } from "../accounts"
|
||||||
// extract from shared-core to make easily accessible from backend-core
|
// extract from shared-core to make easily accessible from backend-core
|
||||||
export const isBuilder = sdk.users.isBuilder
|
export const isBuilder = sdk.users.isBuilder
|
||||||
export const isAdmin = sdk.users.isAdmin
|
export const isAdmin = sdk.users.isAdmin
|
||||||
|
export const isCreator = sdk.users.isCreator
|
||||||
export const isGlobalBuilder = sdk.users.isGlobalBuilder
|
export const isGlobalBuilder = sdk.users.isGlobalBuilder
|
||||||
export const isAdminOrBuilder = sdk.users.isAdminOrBuilder
|
export const isAdminOrBuilder = sdk.users.isAdminOrBuilder
|
||||||
export const hasAdminPermissions = sdk.users.hasAdminPermissions
|
export const hasAdminPermissions = sdk.users.hasAdminPermissions
|
||||||
|
|
|
@ -72,6 +72,11 @@ export function quotas(): Quotas {
|
||||||
value: 1,
|
value: 1,
|
||||||
triggers: [],
|
triggers: [],
|
||||||
},
|
},
|
||||||
|
creators: {
|
||||||
|
name: "Creators",
|
||||||
|
value: 1,
|
||||||
|
triggers: [],
|
||||||
|
},
|
||||||
userGroups: {
|
userGroups: {
|
||||||
name: "User Groups",
|
name: "User Groups",
|
||||||
value: 1,
|
value: 1,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { MonthlyQuotaName, QuotaUsage } from "@budibase/types"
|
import { MonthlyQuotaName, QuotaUsage } from "@budibase/types"
|
||||||
|
|
||||||
export const usage = (): QuotaUsage => {
|
export const usage = (users: number = 0, creators: number = 0): QuotaUsage => {
|
||||||
return {
|
return {
|
||||||
_id: "usage_quota",
|
_id: "usage_quota",
|
||||||
quotaReset: new Date().toISOString(),
|
quotaReset: new Date().toISOString(),
|
||||||
|
@ -58,7 +58,8 @@ export const usage = (): QuotaUsage => {
|
||||||
usageQuota: {
|
usageQuota: {
|
||||||
apps: 0,
|
apps: 0,
|
||||||
plugins: 0,
|
plugins: 0,
|
||||||
users: 0,
|
users,
|
||||||
|
creators,
|
||||||
userGroups: 0,
|
userGroups: 0,
|
||||||
rows: 0,
|
rows: 0,
|
||||||
triggers: {},
|
triggers: {},
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit f7e7cffe422086d9449c2075a74a378c16caff9d
|
Subproject commit d24c0dc3a30014cbe61860252aa48104cad36376
|
|
@ -3,6 +3,7 @@ import * as syncApps from "./usageQuotas/syncApps"
|
||||||
import * as syncRows from "./usageQuotas/syncRows"
|
import * as syncRows from "./usageQuotas/syncRows"
|
||||||
import * as syncPlugins from "./usageQuotas/syncPlugins"
|
import * as syncPlugins from "./usageQuotas/syncPlugins"
|
||||||
import * as syncUsers from "./usageQuotas/syncUsers"
|
import * as syncUsers from "./usageQuotas/syncUsers"
|
||||||
|
import * as syncCreators from "./usageQuotas/syncCreators"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Synchronise quotas to the state of the db.
|
* Synchronise quotas to the state of the db.
|
||||||
|
@ -13,5 +14,6 @@ export const run = async () => {
|
||||||
await syncRows.run()
|
await syncRows.run()
|
||||||
await syncPlugins.run()
|
await syncPlugins.run()
|
||||||
await syncUsers.run()
|
await syncUsers.run()
|
||||||
|
await syncCreators.run()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
import { users } from "@budibase/backend-core"
|
||||||
|
import { quotas } from "@budibase/pro"
|
||||||
|
import { QuotaUsageType, StaticQuotaName } from "@budibase/types"
|
||||||
|
|
||||||
|
export const run = async () => {
|
||||||
|
const creatorCount = await users.getCreatorCount()
|
||||||
|
console.log(`Syncing creator count: ${creatorCount}`)
|
||||||
|
await quotas.setUsage(
|
||||||
|
creatorCount,
|
||||||
|
StaticQuotaName.CREATORS,
|
||||||
|
QuotaUsageType.STATIC
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
import TestConfig from "../../../../tests/utilities/TestConfiguration"
|
||||||
|
import * as syncCreators from "../syncCreators"
|
||||||
|
import { quotas } from "@budibase/pro"
|
||||||
|
|
||||||
|
describe("syncCreators", () => {
|
||||||
|
let config = new TestConfig(false)
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await config.init()
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll(config.end)
|
||||||
|
|
||||||
|
it("syncs creators", async () => {
|
||||||
|
return config.doInContext(null, async () => {
|
||||||
|
await config.createUser({ admin: true })
|
||||||
|
|
||||||
|
await syncCreators.run()
|
||||||
|
|
||||||
|
const usageDoc = await quotas.getQuotaUsage()
|
||||||
|
// default + additional creator
|
||||||
|
const creatorsCount = 2
|
||||||
|
expect(usageDoc.usageQuota.creators).toBe(creatorsCount)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
|
@ -6,6 +6,7 @@ import {
|
||||||
InternalTable,
|
InternalTable,
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
import { getProdAppID } from "./applications"
|
import { getProdAppID } from "./applications"
|
||||||
|
import * as _ from "lodash/fp"
|
||||||
|
|
||||||
// checks if a user is specifically a builder, given an app ID
|
// checks if a user is specifically a builder, given an app ID
|
||||||
export function isBuilder(user: User | ContextUser, appId?: string): boolean {
|
export function isBuilder(user: User | ContextUser, appId?: string): boolean {
|
||||||
|
@ -58,6 +59,18 @@ export function hasAppBuilderPermissions(user?: User | ContextUser): boolean {
|
||||||
return !isGlobalBuilder && appLength != null && appLength > 0
|
return !isGlobalBuilder && appLength != null && appLength > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function hasAppCreatorPermissions(user?: User | ContextUser): boolean {
|
||||||
|
if (!user) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return _.flow(
|
||||||
|
_.get("roles"),
|
||||||
|
_.values,
|
||||||
|
_.find(x => ["CREATOR", "ADMIN"].includes(x)),
|
||||||
|
x => !!x
|
||||||
|
)(user)
|
||||||
|
}
|
||||||
|
|
||||||
// checks if a user is capable of building any app
|
// checks if a user is capable of building any app
|
||||||
export function hasBuilderPermissions(user?: User | ContextUser): boolean {
|
export function hasBuilderPermissions(user?: User | ContextUser): boolean {
|
||||||
if (!user) {
|
if (!user) {
|
||||||
|
@ -74,6 +87,18 @@ export function hasAdminPermissions(user?: User | ContextUser): boolean {
|
||||||
return !!user.admin?.global
|
return !!user.admin?.global
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isCreator(user?: User | ContextUser): boolean {
|
||||||
|
if (!user) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
isGlobalBuilder(user) ||
|
||||||
|
hasAdminPermissions(user) ||
|
||||||
|
hasAppBuilderPermissions(user) ||
|
||||||
|
hasAppCreatorPermissions(user)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
export function getGlobalUserID(userId?: string): string | undefined {
|
export function getGlobalUserID(userId?: string): string | undefined {
|
||||||
if (typeof userId !== "string") {
|
if (typeof userId !== "string") {
|
||||||
return userId
|
return userId
|
||||||
|
|
|
@ -32,6 +32,7 @@ export interface StaticUsage {
|
||||||
[StaticQuotaName.APPS]: number
|
[StaticQuotaName.APPS]: number
|
||||||
[StaticQuotaName.PLUGINS]: number
|
[StaticQuotaName.PLUGINS]: number
|
||||||
[StaticQuotaName.USERS]: number
|
[StaticQuotaName.USERS]: number
|
||||||
|
[StaticQuotaName.CREATORS]: number
|
||||||
[StaticQuotaName.USER_GROUPS]: number
|
[StaticQuotaName.USER_GROUPS]: number
|
||||||
[StaticQuotaName.ROWS]: number
|
[StaticQuotaName.ROWS]: number
|
||||||
triggers: {
|
triggers: {
|
||||||
|
|
|
@ -14,6 +14,7 @@ export enum StaticQuotaName {
|
||||||
ROWS = "rows",
|
ROWS = "rows",
|
||||||
APPS = "apps",
|
APPS = "apps",
|
||||||
USERS = "users",
|
USERS = "users",
|
||||||
|
CREATORS = "creators",
|
||||||
USER_GROUPS = "userGroups",
|
USER_GROUPS = "userGroups",
|
||||||
PLUGINS = "plugins",
|
PLUGINS = "plugins",
|
||||||
}
|
}
|
||||||
|
@ -67,6 +68,7 @@ export type StaticQuotas = {
|
||||||
[StaticQuotaName.ROWS]: Quota
|
[StaticQuotaName.ROWS]: Quota
|
||||||
[StaticQuotaName.APPS]: Quota
|
[StaticQuotaName.APPS]: Quota
|
||||||
[StaticQuotaName.USERS]: Quota
|
[StaticQuotaName.USERS]: Quota
|
||||||
|
[StaticQuotaName.CREATORS]: Quota
|
||||||
[StaticQuotaName.USER_GROUPS]: Quota
|
[StaticQuotaName.USER_GROUPS]: Quota
|
||||||
[StaticQuotaName.PLUGINS]: Quota
|
[StaticQuotaName.PLUGINS]: Quota
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue