adding abstraction for config manager

This commit is contained in:
Martin McKeaveney 2021-03-30 10:50:42 +01:00
parent 412f727347
commit e2b26ffa9c
7 changed files with 114 additions and 53 deletions

View File

@ -0,0 +1,35 @@
const PostHog = require("posthog-node")
const path = require("path")
const fs = require("fs")
const os = require("os")
const { BUDIBASE_POSTHOG_URL, BUDIBASE_POSTHOG_TOKEN, AnalyticsEvents } = require("../constants")
const ConfigManager = require("../structures/ConfigManager")
class AnalyticsClient {
constructor() {
this.client = new PostHog(BUDIBASE_POSTHOG_TOKEN, { host: BUDIBASE_POSTHOG_URL })
this.configManager = new ConfigManager()
}
capture(event) {
if (this.manager.config.analyticsDisabled) return
this.client.capture(event)
}
enable() {
this.configManager.removeKey("analyticsDisabled")
this.client.capture({ event: AnalyticsEvents.OptIn, distinctId: "cli" })
}
disable() {
this.client.capture({ event: AnalyticsEvents.OptOut, distinctId: "cli" })
this.configManager.setValue("analyticsDisabled", true)
}
status() {
return this.configManager.config.analyticsDisabled ? "disabled" : "enabled"
}
}
module.exports = AnalyticsClient

View File

@ -1,71 +1,26 @@
const PostHog = require("posthog-node")
const Command = require("../structures/Command") const Command = require("../structures/Command")
const { CommandWords, InitTypes } = require("../constants") const { CommandWords, InitTypes, BUDIBASE_POSTHOG_URL } = require("../constants")
const { lookpath } = require("lookpath") const { lookpath } = require("lookpath")
const { const {
downloadFile,
logErrorToFile,
success, success,
error,
info, info,
parseEnv, parseEnv,
} = require("../utils") } = require("../utils")
const { confirmation } = require("../questions") const { confirmation } = require("../questions")
const fs = require("fs") const fs = require("fs")
// const makeEnv = require("./makeEnv")
const axios = require("axios") const axios = require("axios")
const AnalyticsClient = require("./Client")
const Events = {
OptOut: "opt_out",
OptIn: "opt_in",
}
class AnalyticsClient {
constructor() {
this.client = new PostHog("Oeq9KzIpZYaNsXIvHw5QTZWNpfiG_EOjAOpjTyAiitY", { host: "https://posthog.budi.live" })
}
capture() {
if (!enabled) return
this.client.capture({
event: Events.OptOut
})
}
enable() {
this.disabled = false
}
disable() {
this.disabled = true
}
status() {
return this.disabled ? "disabled" : "enabled"
}
}
class BudibaseConfig {
constructor(config) {
this.config = config
}
write() {
// fs.wri
}
}
const client = new AnalyticsClient() const client = new AnalyticsClient()
async function optOut() { async function optOut() {
client.capture({ event: Events.OptOut })
client.disable()
try { try {
// opt them out // opt them out
client.disable()
console.log(success("Successfully opted out of budibase analytics. You can opt in at any time by running 'budi analytics opt-in'")) console.log(success("Successfully opted out of budibase analytics. You can opt in at any time by running 'budi analytics opt-in'"))
} catch (err) { } catch (err) {
console.log(error("Error opting out of budibase analytics. Please try again later.")) console.log(error("Error opting out of budibase analytics. Please try again later.", err))
} }
} }
@ -73,8 +28,7 @@ async function optIn() {
try { try {
// opt them in // opt them in
client.enable() client.enable()
client.capture({ event: Events.OptIn }) console.log(success("Successfully opted in to budibase analytics. Thank you for helping us make budibase better!"))
console.log(success("Successfully opted in of budibase analytics. Thank you for helping us make budibase better!"))
} catch (err) { } catch (err) {
console.log(error("Error opting in to budibase analytics. Please try again later.")) console.log(error("Error opting in to budibase analytics. Please try again later."))
} }

View File

@ -8,3 +8,13 @@ exports.InitTypes = {
QUICK: "quick", QUICK: "quick",
DIGITAL_OCEAN: "do", DIGITAL_OCEAN: "do",
} }
exports.AnalyticsEvents = {
OptOut: "analytics_opt_out",
OptIn: "analytics_opt_in",
SelfHostInit: "hosting_init"
}
exports.BUDIBASE_POSTHOG_URL = "https://posthog.budi.live"
exports.BUDIBASE_POSTHOG_TOKEN = process.env.BUDIBASE_POSTHOG_TOKEN

View File

@ -1,5 +1,5 @@
const Command = require("../structures/Command") const Command = require("../structures/Command")
const { CommandWords, InitTypes } = require("../constants") const { CommandWords, InitTypes, AnalyticsEvents } = require("../constants")
const { lookpath } = require("lookpath") const { lookpath } = require("lookpath")
const { const {
downloadFile, downloadFile,
@ -13,6 +13,7 @@ const fs = require("fs")
const compose = require("docker-compose") const compose = require("docker-compose")
const makeEnv = require("./makeEnv") const makeEnv = require("./makeEnv")
const axios = require("axios") const axios = require("axios")
const AnalyticsClient = require("../analytics/Client")
const BUDIBASE_SERVICES = ["app-service", "worker-service"] const BUDIBASE_SERVICES = ["app-service", "worker-service"]
const ERROR_FILE = "docker-error.log" const ERROR_FILE = "docker-error.log"
@ -22,6 +23,8 @@ const FILE_URLS = [
] ]
const DO_USER_DATA_URL = "http://169.254.169.254/metadata/v1/user-data" const DO_USER_DATA_URL = "http://169.254.169.254/metadata/v1/user-data"
const client = new AnalyticsClient()
async function downloadFiles() { async function downloadFiles() {
const promises = [] const promises = []
for (let url of FILE_URLS) { for (let url of FILE_URLS) {
@ -70,6 +73,12 @@ async function init(type) {
return return
} }
} }
client.capture({
event: AnalyticsEvents.SelfHostInit,
properties: {
type
}
})
await downloadFiles() await downloadFiles()
const config = isQuick ? makeEnv.QUICK_CONFIG : {} const config = isQuick ? makeEnv.QUICK_CONFIG : {}
if (type === InitTypes.DIGITAL_OCEAN) { if (type === InitTypes.DIGITAL_OCEAN) {

View File

@ -0,0 +1,45 @@
const fs = require("fs")
const path = require("path")
const os = require("os")
const { error } = require("../utils")
class ConfigManager {
constructor() {
this.path = path.join(os.homedir(), ".budibase.json")
if (!fs.existsSync(this.path)) {
fs.writeFileSync(this.path, "{}")
}
}
get config() {
try {
return JSON.parse(fs.readFileSync(this.path, "utf8"))
} catch (err) {
console.log(error(("Error parsing configuration file. Please check your .budibase.json is valid.")))
}
}
set config(json) {
fs.writeFileSync(this.path, JSON.stringify(json))
}
getValue(key) {
return this.config[key]
}
setValue(key, value) {
const updated = {
...this.config,
[key]: value
}
this.config = updated
}
removeKey(key) {
const updated = { ...this.config }
delete updated[key]
this.config = updated
}
}
module.exports = ConfigManager

View File

@ -56,3 +56,11 @@ exports.parseEnv = env => {
} }
return result return result
} }
exports.getConfigValue = (key, value) => {
}
exports.setConfigValue = (key, value) => {
}