fallback SMTP configuration for cloud

This commit is contained in:
Martin McKeaveney 2021-09-27 14:57:22 +01:00
parent 97cd3756f7
commit 5b1ae778da
13 changed files with 48 additions and 26 deletions

View File

@ -546,7 +546,7 @@ module External {
},
meta: {
table,
}
},
}
// can't really use response right now
const response = await makeExternalQuery(appId, json)

View File

@ -13,8 +13,6 @@ const { makePartial } = require("../../tests/utilities")
const { cleanInputValues } = require("../automationUtils")
const setup = require("./utilities")
usageQuota.getAPIKey.mockReturnValue({ apiKey: "test" })
describe("Run through some parts of the automations system", () => {
let config = setup.getConfig()

View File

@ -46,7 +46,7 @@ describe("test the create row action", () => {
await setup.runStep(setup.actions.CREATE_ROW.stepId, {
row
})
expect(usageQuota.update).toHaveBeenCalledWith(setup.apiKey, "rows", 1)
expect(usageQuota.update).toHaveBeenCalledWith("rows", 1)
})
})

View File

@ -37,7 +37,7 @@ describe("test the delete row action", () => {
it("check usage quota attempts", async () => {
await setup.runInProd(async () => {
await setup.runStep(setup.actions.DELETE_ROW.stepId, inputs)
expect(usageQuota.update).toHaveBeenCalledWith(setup.apiKey, "rows", -1)
expect(usageQuota.update).toHaveBeenCalledWith("rows", -1)
})
})

View File

@ -1,4 +1,4 @@
import {Table} from "./common";
import { Table } from "./common"
export enum Operation {
CREATE = "CREATE",
@ -139,7 +139,7 @@ export interface QueryJson {
paginate?: PaginationJson
body?: object
meta?: {
table?: Table,
table?: Table
}
extra?: {
idFilter?: SearchFilters

View File

@ -148,7 +148,7 @@ function buildRead(knex: Knex, json: QueryJson, limit: number): KnexQuery {
if (!resource) {
resource = { fields: [] }
}
let selectStatement: string|string[] = "*"
let selectStatement: string | string[] = "*"
// handle select
if (resource.fields && resource.fields.length > 0) {
// select the resources as the format "table.columnName" - this is what is provided

View File

@ -108,7 +108,7 @@ module MySQLModule {
client: any,
query: SqlQuery,
connect: boolean = true
): Promise<any[]|any> {
): Promise<any[] | any> {
// Node MySQL is callback based, so we must wrap our call in a promise
return new Promise((resolve, reject) => {
if (connect) {
@ -252,9 +252,9 @@ module MySQLModule {
json.extra = {
idFilter: {
equal: {
[primaryKey]: results.insertId
[primaryKey]: results.insertId,
},
}
},
}
return json
}

View File

@ -39,7 +39,7 @@ class TestConfiguration {
if (bool) {
env.isDev = () => false
env.isProd = () => true
this.ctx.auth = { apiKey: "test" }
this.ctx.user = { tenantId: "test" }
} else {
env.isDev = () => true
env.isProd = () => false
@ -114,7 +114,7 @@ describe("usageQuota middleware", () => {
await config.executeMiddleware()
expect(usageQuota.update).toHaveBeenCalledWith("test", "rows", 1)
expect(usageQuota.update).toHaveBeenCalledWith("rows", 1)
expect(config.next).toHaveBeenCalled()
})
@ -131,7 +131,7 @@ describe("usageQuota middleware", () => {
])
await config.executeMiddleware()
expect(usageQuota.update).toHaveBeenCalledWith("test", "storage", 10100)
expect(usageQuota.update).toHaveBeenCalledWith("storage", 10100)
expect(config.next).toHaveBeenCalled()
})
})

View File

@ -50,15 +50,15 @@ module.exports = async (ctx, next) => {
}
// update usage for uploads to be the total size
// if (property === usageQuota.Properties.UPLOAD) {
// const files =
// ctx.request.files.file.length > 1
// ? Array.from(ctx.request.files.file)
// : [ctx.request.files.file]
// usage = files.map(file => file.size).reduce((total, size) => total + size)
// }
if (property === usageQuota.Properties.UPLOAD) {
const files =
ctx.request.files.file.length > 1
? Array.from(ctx.request.files.file)
: [ctx.request.files.file]
usage = files.map(file => file.size).reduce((total, size) => total + size)
}
try {
await usageQuota.update(ctx.user.tenantId, property, usage)
await usageQuota.update(property, usage)
return next()
} catch (err) {
ctx.throw(400, err)

View File

@ -12,6 +12,7 @@ exports.Properties = {
USER: "users",
AUTOMATION: "automationRuns",
APPS: "apps",
EMAILS: "emails",
}
/**
@ -28,7 +29,8 @@ exports.update = async (property, usage) => {
try {
const db = getGlobalDB()
const quota = await db.get("usage_quota")
// TODO: check if the quota needs reset
// Check if the quota needs reset
if (Date.now() >= quota.quotaReset) {
quota.quotaReset = getNewQuotaReset()
for (let prop of Object.keys(quota.usageQuota)) {

View File

@ -151,6 +151,7 @@ exports.adminUser = async ctx => {
apps: 0,
users: 0,
views: 0,
emails: 0,
},
usageLimits: {
automationRuns: 1000,
@ -158,6 +159,7 @@ exports.adminUser = async ctx => {
apps: 4,
storage: 1000,
users: 10,
emails: 50,
},
})
// }

View File

@ -33,6 +33,11 @@ module.exports = {
INTERNAL_API_KEY: process.env.INTERNAL_API_KEY,
MULTI_TENANCY: process.env.MULTI_TENANCY,
ACCOUNT_PORTAL_URL: process.env.ACCOUNT_PORTAL_URL,
SMTP_USER: process.env.SMTP_USER,
SMTP_PASSWORD: process.env.SMTP_PASSWORD,
SMTP_HOST: process.env.SMTP_HOST,
SMTP_PORT: process.env.SMTP_PORT,
SMTP_FROM_ADDRESS: process.env.SMTP_FROM_ADDRESS,
_set(key, value) {
process.env[key] = value
module.exports[key] = value

View File

@ -1,4 +1,5 @@
const nodemailer = require("nodemailer")
const env = require("../environment")
const { getScopedConfig } = require("@budibase/auth/db")
const { EmailTemplatePurpose, TemplateTypes, Configs } = require("../constants")
const { getTemplateByPurpose } = require("../constants/templates")
@ -110,7 +111,21 @@ async function getSmtpConfiguration(db, workspaceId = null) {
if (workspaceId) {
params.workspace = workspaceId
}
return getScopedConfig(db, params)
if (!env.SMTP_FALLBACK_ENABLED) {
return getScopedConfig(db, params)
} else {
// Use an SMTP fallback configuration from env variables
return {
port: env.SMTP_PORT,
host: env.SMTP_HOST,
secure: false,
auth: {
user: env.SMTP_USER,
pass: env.SMTP_PASSWORD,
},
}
}
}
/**
@ -118,8 +133,8 @@ async function getSmtpConfiguration(db, workspaceId = null) {
* @return {Promise<boolean>} returns true if there is a configuration that can be used.
*/
exports.isEmailConfigured = async (workspaceId = null) => {
// when "testing" simply return true
if (TEST_MODE) {
// when "testing" or smtp fallback is enabled simply return true
if (TEST_MODE || env.SMTP_FALLBACK_ENABLED) {
return true
}
const db = getGlobalDB()