budibase/packages/server/src/utilities/redis.js

63 lines
1.7 KiB
JavaScript
Raw Normal View History

const { Client, utils } = require("@budibase/auth/redis")
const { getGlobalIDFromUserMetadataID } = require("../db/utils")
2021-05-12 18:37:09 +02:00
const APP_DEV_LOCK_SECONDS = 600
let devAppClient, debounceClient
2021-05-12 18:37:09 +02:00
// we init this as we want to keep the connection open all the time
// reduces the performance hit
exports.init = async () => {
devAppClient = await new Client(utils.Databases.DEV_LOCKS).init()
2021-05-21 15:38:58 +02:00
debounceClient = await new Client(utils.Databases.DEBOUNCE).init()
2021-05-12 18:37:09 +02:00
}
exports.doesUserHaveLock = async (devAppId, user) => {
2021-05-12 18:37:09 +02:00
const value = await devAppClient.get(devAppId)
if (!value) {
return true
}
// make sure both IDs are global
const expected = getGlobalIDFromUserMetadataID(value._id)
const userId = getGlobalIDFromUserMetadataID(user._id)
return expected === userId
2021-05-12 18:37:09 +02:00
}
exports.getAllLocks = async () => {
const locks = await devAppClient.scan()
return locks.map(lock => ({
appId: lock.key,
user: lock.value,
}))
}
exports.updateLock = async (devAppId, user) => {
// make sure always global user ID
const globalId = getGlobalIDFromUserMetadataID(user._id)
const inputUser = {
...user,
userId: globalId,
_id: globalId,
}
await devAppClient.store(devAppId, inputUser, APP_DEV_LOCK_SECONDS)
2021-05-12 18:37:09 +02:00
}
exports.clearLock = async (devAppId, user) => {
2021-05-12 18:37:09 +02:00
const value = await devAppClient.get(devAppId)
if (!value) {
return
}
const userId = getGlobalIDFromUserMetadataID(user._id)
2021-05-13 15:24:55 +02:00
if (value._id !== userId) {
2021-05-12 18:37:09 +02:00
throw "User does not hold lock, cannot clear it."
}
await devAppClient.delete(devAppId)
2021-05-12 18:37:09 +02:00
}
exports.checkDebounce = async id => {
return debounceClient.get(id)
}
exports.setDebounce = async (id, seconds) => {
await debounceClient.store(id, "debouncing", seconds)
}