114 lines
2.8 KiB
JavaScript
114 lines
2.8 KiB
JavaScript
const _ = require('lodash/fp')
|
|
const db = require('./db')
|
|
|
|
const NEW_SETTINGS_LOADER_SCHEMA_VERSION = 2
|
|
|
|
function saveAccounts (accountsToSave) {
|
|
const sql = `update user_config set data = $2, valid = $3, schema_version = $4 where type = $1;
|
|
insert into user_config (type, data, valid, schema_version)
|
|
select $1, $2, $3, $4 where $1 not in (select type from user_config)`
|
|
|
|
return loadAccounts()
|
|
.then(currentAccounts => {
|
|
const newAccounts = _.assign(currentAccounts, accountsToSave)
|
|
return db.none(sql, ['accounts', { accounts: newAccounts }, true, NEW_SETTINGS_LOADER_SCHEMA_VERSION])
|
|
})
|
|
}
|
|
|
|
function loadAccounts () {
|
|
const sql = `select data
|
|
from user_config
|
|
where type=$1
|
|
and schema_version=$2
|
|
and valid
|
|
order by id desc
|
|
limit 1`
|
|
|
|
return db.oneOrNone(sql, ['accounts', NEW_SETTINGS_LOADER_SCHEMA_VERSION])
|
|
.then(row => row ? row.data.accounts : null)
|
|
}
|
|
|
|
function saveConfig (config) {
|
|
const sql = 'insert into user_config (type, data, valid, schema_version) values ($1, $2, $3, $4)'
|
|
|
|
return loadLatestConfigOrNone()
|
|
.then(currentConfig => {
|
|
const newConfig = _.assign(currentConfig, config)
|
|
return db.none(sql, ['config', { config: newConfig }, true, NEW_SETTINGS_LOADER_SCHEMA_VERSION])
|
|
})
|
|
}
|
|
|
|
function loadLatest () {
|
|
return Promise.all([loadLatestConfigOrNone(), loadAccounts()])
|
|
.then(([config, accounts]) => ({
|
|
config,
|
|
accounts
|
|
}))
|
|
}
|
|
|
|
function loadLatestConfig () {
|
|
const sql = `select data
|
|
from user_config
|
|
where type=$1
|
|
and schema_version=$2
|
|
and valid
|
|
order by id desc
|
|
limit 1`
|
|
|
|
return db.one(sql, ['config', NEW_SETTINGS_LOADER_SCHEMA_VERSION])
|
|
.then(row => row ? row.data.config : {})
|
|
.catch(err => {
|
|
throw err
|
|
})
|
|
}
|
|
|
|
function loadLatestConfigOrNone () {
|
|
const sql = `select data
|
|
from user_config
|
|
where type=$1
|
|
and schema_version=$2
|
|
order by id desc
|
|
limit 1`
|
|
|
|
return db.oneOrNone(sql, ['config', NEW_SETTINGS_LOADER_SCHEMA_VERSION])
|
|
.then(row => row ? row.data.config : {})
|
|
}
|
|
|
|
function loadConfig (versionId) {
|
|
const sql = `select data
|
|
from user_config
|
|
where id=$1
|
|
and type=$2
|
|
and schema_version=$3
|
|
and valid`
|
|
|
|
return db.one(sql, [versionId, 'config', NEW_SETTINGS_LOADER_SCHEMA_VERSION])
|
|
.then(row => row.data.config)
|
|
.catch(err => {
|
|
if (err.name === 'QueryResultError') {
|
|
throw new Error('No such config version: ' + versionId)
|
|
}
|
|
|
|
throw err
|
|
})
|
|
}
|
|
|
|
function load (versionId) {
|
|
if (!versionId) Promise.reject('versionId is required')
|
|
|
|
return Promise.all([loadConfig(versionId), loadAccounts()])
|
|
.then(([config, accounts]) => ({
|
|
config,
|
|
accounts
|
|
}))
|
|
}
|
|
|
|
module.exports = {
|
|
saveConfig,
|
|
saveAccounts,
|
|
loadAccounts,
|
|
loadLatest,
|
|
loadLatestConfig,
|
|
loadLatestConfigOrNone,
|
|
load
|
|
}
|