forked from tsai/budibase
23 changed files with 250 additions and 96 deletions
@ -1,4 +1,5 @@ |
|||||
module.exports = { |
module.exports = { |
||||
...require("./src/db/utils"), |
...require("./src/db/utils"), |
||||
...require("./src/db/constants"), |
...require("./src/db/constants"), |
||||
|
...require("./src/db/views"), |
||||
} |
} |
||||
|
|||||
@ -0,0 +1,14 @@ |
|||||
|
const env = require("../environment") |
||||
|
const { Headers } = require("../constants") |
||||
|
|
||||
|
/** |
||||
|
* API Key only endpoint. |
||||
|
*/ |
||||
|
module.exports = async (ctx, next) => { |
||||
|
const apiKey = ctx.request.headers[Headers.API_KEY] |
||||
|
if (apiKey !== env.INTERNAL_API_KEY) { |
||||
|
ctx.throw(403, "Unauthorized") |
||||
|
} |
||||
|
|
||||
|
return next() |
||||
|
} |
||||
@ -0,0 +1,8 @@ |
|||||
|
const { migrate } = require("../../migrations") |
||||
|
|
||||
|
exports.migrate = async ctx => { |
||||
|
const options = ctx.request.body |
||||
|
// don't await as can take a while, just return
|
||||
|
migrate(options) |
||||
|
ctx.status = 200 |
||||
|
} |
||||
@ -0,0 +1,8 @@ |
|||||
|
const Router = require("@koa/router") |
||||
|
const migrationsController = require("../controllers/migrations") |
||||
|
const router = Router() |
||||
|
const { internalApi } = require("@budibase/backend-core/auth") |
||||
|
|
||||
|
router.post("/api/migrations/run", internalApi, migrationsController.migrate) |
||||
|
|
||||
|
module.exports = router |
||||
@ -0,0 +1,20 @@ |
|||||
|
import { runQuotaMigration } from "./usageQuotas" |
||||
|
import * as syncApps from "./usageQuotas/syncApps" |
||||
|
import * as syncRows from "./usageQuotas/syncRows" |
||||
|
|
||||
|
/** |
||||
|
* Date: |
||||
|
* January 2022 |
||||
|
* |
||||
|
* Description: |
||||
|
* Synchronise the app and row quotas to the state of the db after it was |
||||
|
* discovered that the quota resets were still in place and the row quotas |
||||
|
* weren't being decremented correctly. |
||||
|
*/ |
||||
|
|
||||
|
export const run = async () => { |
||||
|
await runQuotaMigration(async () => { |
||||
|
await syncApps.run() |
||||
|
await syncRows.run() |
||||
|
}) |
||||
|
} |
||||
@ -0,0 +1,8 @@ |
|||||
|
const { useQuotas } = require("../../../utilities/usageQuota") |
||||
|
|
||||
|
export const runQuotaMigration = async (migration: Function) => { |
||||
|
if (!useQuotas()) { |
||||
|
return |
||||
|
} |
||||
|
await migration() |
||||
|
} |
||||
@ -1,9 +1,9 @@ |
|||||
const { getGlobalDB, getTenantId } = require("@budibase/backend-core/tenancy") |
const { getGlobalDB, getTenantId } = require("@budibase/backend-core/tenancy") |
||||
const { getAllApps } = require("@budibase/backend-core/db") |
const { getAllApps } = require("@budibase/backend-core/db") |
||||
const CouchDB = require("../../db") |
import CouchDB from "../../../db" |
||||
const { getUsageQuotaDoc } = require("../../utilities/usageQuota") |
import { getUsageQuotaDoc } from "../../../utilities/usageQuota" |
||||
|
|
||||
exports.run = async () => { |
export const run = async () => { |
||||
const db = getGlobalDB() |
const db = getGlobalDB() |
||||
// get app count
|
// get app count
|
||||
const devApps = await getAllApps(CouchDB, { dev: true }) |
const devApps = await getAllApps(CouchDB, { dev: true }) |
||||
@ -1,14 +1,14 @@ |
|||||
const { getGlobalDB, getTenantId } = require("@budibase/backend-core/tenancy") |
const { getGlobalDB, getTenantId } = require("@budibase/backend-core/tenancy") |
||||
const { getAllApps } = require("@budibase/backend-core/db") |
const { getAllApps } = require("@budibase/backend-core/db") |
||||
const CouchDB = require("../../db") |
import CouchDB from "../../../db" |
||||
const { getUsageQuotaDoc } = require("../../utilities/usageQuota") |
import { getUsageQuotaDoc } from "../../../utilities/usageQuota" |
||||
const { getUniqueRows } = require("../../utilities/usageQuota/rows") |
import { getUniqueRows } from "../../../utilities/usageQuota/rows" |
||||
|
|
||||
exports.run = async () => { |
export const run = async () => { |
||||
const db = getGlobalDB() |
const db = getGlobalDB() |
||||
// get all rows in all apps
|
// get all rows in all apps
|
||||
const allApps = await getAllApps(CouchDB, { all: true }) |
const allApps = await getAllApps(CouchDB, { all: true }) |
||||
const appIds = allApps ? allApps.map(app => app.appId) : [] |
const appIds = allApps ? allApps.map((app: { appId: any }) => app.appId) : [] |
||||
const rows = await getUniqueRows(appIds) |
const rows = await getUniqueRows(appIds) |
||||
const rowCount = rows ? rows.length : 0 |
const rowCount = rows ? rows.length : 0 |
||||
|
|
||||
@ -1,7 +1,7 @@ |
|||||
const { getGlobalDB } = require("@budibase/backend-core/tenancy") |
const { getGlobalDB } = require("@budibase/backend-core/tenancy") |
||||
const TestConfig = require("../../../tests/utilities/TestConfiguration") |
const TestConfig = require("../../../tests/utilities/TestConfiguration") |
||||
const { getUsageQuotaDoc, update, Properties } = require("../../../utilities/usageQuota") |
const { getUsageQuotaDoc, update, Properties } = require("../../../utilities/usageQuota") |
||||
const syncApps = require("../../usageQuotas/syncApps") |
const syncApps = require("../syncApps") |
||||
const env = require("../../../environment") |
const env = require("../../../environment") |
||||
|
|
||||
describe("syncApps", () => { |
describe("syncApps", () => { |
||||
@ -1,7 +1,7 @@ |
|||||
const { getGlobalDB } = require("@budibase/backend-core/tenancy") |
const { getGlobalDB } = require("@budibase/backend-core/tenancy") |
||||
const TestConfig = require("../../../tests/utilities/TestConfiguration") |
const TestConfig = require("../../../tests/utilities/TestConfiguration") |
||||
const { getUsageQuotaDoc, update, Properties } = require("../../../utilities/usageQuota") |
const { getUsageQuotaDoc, update, Properties } = require("../../../utilities/usageQuota") |
||||
const syncRows = require("../../usageQuotas/syncRows") |
const syncRows = require("../syncRows") |
||||
const env = require("../../../environment") |
const env = require("../../../environment") |
||||
|
|
||||
describe("syncRows", () => { |
describe("syncRows", () => { |
||||
@ -0,0 +1,13 @@ |
|||||
|
const { createUserEmailView } = require("@budibase/backend-core/db") |
||||
|
|
||||
|
/** |
||||
|
* Date: |
||||
|
* October 2021 |
||||
|
* |
||||
|
* Description: |
||||
|
* Recreate the user email view to include latest changes i.e. lower casing the email address |
||||
|
*/ |
||||
|
|
||||
|
export const run = async (db: any) => { |
||||
|
await createUserEmailView(db) |
||||
|
} |
||||
@ -0,0 +1,48 @@ |
|||||
|
import CouchDB from "../db" |
||||
|
const { |
||||
|
MIGRATION_TYPES, |
||||
|
runMigrations, |
||||
|
} = require("@budibase/backend-core/migrations") |
||||
|
|
||||
|
// migration functions
|
||||
|
import * as userEmailViewCasing from "./functions/userEmailViewCasing" |
||||
|
import * as quota1 from "./functions/quotas1" |
||||
|
|
||||
|
export interface Migration { |
||||
|
type: string |
||||
|
name: string |
||||
|
fn: Function |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* e.g. |
||||
|
* { |
||||
|
* tenantIds: ['bb'], |
||||
|
* force: { |
||||
|
* global: ['quota_1'] |
||||
|
* } |
||||
|
* } |
||||
|
*/ |
||||
|
export interface MigrationOptions { |
||||
|
tenantIds?: string[] |
||||
|
forced?: { |
||||
|
[type: string]: string[] |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
const MIGRATIONS: Migration[] = [ |
||||
|
{ |
||||
|
type: MIGRATION_TYPES.GLOBAL, |
||||
|
name: "user_email_view_casing", |
||||
|
fn: userEmailViewCasing.run, |
||||
|
}, |
||||
|
{ |
||||
|
type: MIGRATION_TYPES.GLOBAL, |
||||
|
name: "quotas_1", |
||||
|
fn: quota1.run, |
||||
|
}, |
||||
|
] |
||||
|
|
||||
|
export const migrate = async (options?: MigrationOptions) => { |
||||
|
await runMigrations(CouchDB, MIGRATIONS, options) |
||||
|
} |
||||
@ -1,24 +0,0 @@ |
|||||
const { |
|
||||
MIGRATIONS, |
|
||||
MIGRATION_DBS, |
|
||||
migrateIfRequired, |
|
||||
} = require("@budibase/backend-core/migrations") |
|
||||
const { useQuotas } = require("../../utilities/usageQuota") |
|
||||
const syncApps = require("./syncApps") |
|
||||
const syncRows = require("./syncRows") |
|
||||
|
|
||||
exports.run = async () => { |
|
||||
if (!useQuotas()) { |
|
||||
return |
|
||||
} |
|
||||
|
|
||||
// Jan 2022
|
|
||||
await migrateIfRequired( |
|
||||
MIGRATION_DBS.GLOBAL_DB, |
|
||||
MIGRATIONS.QUOTAS_1, |
|
||||
async () => { |
|
||||
await syncApps.run() |
|
||||
await syncRows.run() |
|
||||
} |
|
||||
) |
|
||||
} |
|
||||
Loading…
Reference in new issue