ConfigApi.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. Copyright (C) 2019 Cloudbase Solutions SRL
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU Affero General Public License as
  5. published by the Free Software Foundation, either version 3 of the
  6. License, or (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Affero General Public License for more details.
  11. You should have received a copy of the GNU Affero General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. // @flow
  15. import path from 'path'
  16. import fs from 'fs'
  17. import requireWithoutCache from 'require-without-cache'
  18. import type { Config, Services } from '../../src/types/Config'
  19. const getBaseUrl = () => {
  20. let BASE_URL = process.env.CORIOLIS_URL || ''
  21. return BASE_URL.trim().replace(/\/$/, '')
  22. }
  23. const setDefaultServicesUrls = (config: Config): Config => {
  24. Object.keys(config.servicesUrls).forEach(key => {
  25. config.servicesUrls[key] = config.servicesUrls[key].replace('{BASE_URL}', getBaseUrl())
  26. })
  27. return config
  28. }
  29. const modServicesUrls = (config: Config, servicesMod: Services): Services => {
  30. let services: Services = { ...config.servicesUrls }
  31. Object.keys(services).forEach(key => {
  32. services[key] = (servicesMod[key] ? servicesMod[key] : services[key])
  33. .replace('{BASE_URL}', getBaseUrl())
  34. })
  35. return services
  36. }
  37. export default (router: express$Router) => {
  38. // $FlowIgnore
  39. router.get('/config', (req, res) => {
  40. let configPath = path.join(__dirname, '../../config.js')
  41. let config: Config = requireWithoutCache(configPath, require).config
  42. let modJsonPath: ?string = process.env.MOD_JSON
  43. if (!modJsonPath) {
  44. setDefaultServicesUrls(config)
  45. res.send(config)
  46. return
  47. }
  48. try {
  49. let jsonContent = fs.readFileSync(modJsonPath)
  50. let configMod = JSON.parse(jsonContent).config
  51. Object.keys(configMod).forEach(key => {
  52. if (key === 'servicesUrls') {
  53. config[key] = modServicesUrls(config, configMod[key])
  54. } else {
  55. config[key] = configMod[key]
  56. }
  57. })
  58. res.send(config)
  59. } catch (err) {
  60. console.error(err)
  61. res.status(400).json({ error: { message: 'Invalid MOD_JSON file' } })
  62. }
  63. })
  64. }