commentProviders.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. const Model = require('objection').Model
  2. const fs = require('fs-extra')
  3. const path = require('path')
  4. const _ = require('lodash')
  5. const yaml = require('js-yaml')
  6. const commonHelper = require('../helpers/common')
  7. /* global WIKI */
  8. /**
  9. * CommentProvider model
  10. */
  11. module.exports = class CommentProvider extends Model {
  12. static get tableName() { return 'commentProviders' }
  13. static get idColumn() { return 'key' }
  14. static get jsonSchema () {
  15. return {
  16. type: 'object',
  17. required: ['key', 'isEnabled'],
  18. properties: {
  19. key: {type: 'string'},
  20. isEnabled: {type: 'boolean'}
  21. }
  22. }
  23. }
  24. static get jsonAttributes() {
  25. return ['config']
  26. }
  27. static async getProvider(key) {
  28. return WIKI.models.commentProviders.query().findOne({ key })
  29. }
  30. static async getProviders(isEnabled) {
  31. const providers = await WIKI.models.commentProviders.query().where(_.isBoolean(isEnabled) ? { isEnabled } : {})
  32. return _.sortBy(providers, ['key'])
  33. }
  34. static async refreshProvidersFromDisk() {
  35. let trx
  36. try {
  37. const dbProviders = await WIKI.models.commentProviders.query()
  38. // -> Fetch definitions from disk
  39. const authDirs = await fs.readdir(path.join(WIKI.SERVERPATH, 'modules/comments'))
  40. let diskProviders = []
  41. for (let dir of authDirs) {
  42. const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/comments', dir, 'definition.yml'), 'utf8')
  43. diskProviders.push(yaml.safeLoad(def))
  44. }
  45. WIKI.data.commentProviders = diskProviders.map(engine => ({
  46. ...engine,
  47. props: commonHelper.parseModuleProps(engine.props)
  48. }))
  49. let newProviders = []
  50. for (let engine of WIKI.data.commentProviders) {
  51. if (!_.some(dbProviders, ['key', engine.key])) {
  52. newProviders.push({
  53. key: engine.key,
  54. isEnabled: engine.key === 'default',
  55. config: _.transform(engine.props, (result, value, key) => {
  56. _.set(result, key, value.default)
  57. return result
  58. }, {})
  59. })
  60. } else {
  61. const engineConfig = _.get(_.find(dbProviders, ['key', engine.key]), 'config', {})
  62. await WIKI.models.commentProviders.query().patch({
  63. config: _.transform(engine.props, (result, value, key) => {
  64. if (!_.has(result, key)) {
  65. _.set(result, key, value.default)
  66. }
  67. return result
  68. }, engineConfig)
  69. }).where('key', engine.key)
  70. }
  71. }
  72. if (newProviders.length > 0) {
  73. trx = await WIKI.models.Objection.transaction.start(WIKI.models.knex)
  74. for (let engine of newProviders) {
  75. await WIKI.models.commentProviders.query(trx).insert(engine)
  76. }
  77. await trx.commit()
  78. WIKI.logger.info(`Loaded ${newProviders.length} new comment providers: [ OK ]`)
  79. } else {
  80. WIKI.logger.info(`No new comment providers found: [ SKIPPED ]`)
  81. }
  82. } catch (err) {
  83. WIKI.logger.error(`Failed to scan or load new comment providers: [ FAILED ]`)
  84. WIKI.logger.error(err)
  85. if (trx) {
  86. trx.rollback()
  87. }
  88. }
  89. }
  90. }