123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- import { Model } from 'objection'
- import fs from 'node:fs/promises'
- import path from 'node:path'
- import { defaultTo, find, forOwn, isBoolean, replace, sortBy } from 'lodash-es'
- import yaml from 'js-yaml'
- import { parseModuleProps } from '../helpers/common.mjs'
- /**
- * CommentProvider model
- */
- export class CommentProvider extends Model {
- static get tableName() { return 'commentProviders' }
- static get idColumn() { return 'key' }
- static get jsonSchema () {
- return {
- type: 'object',
- required: ['key', 'isEnabled'],
- properties: {
- key: {type: 'string'},
- isEnabled: {type: 'boolean'}
- }
- }
- }
- static get jsonAttributes() {
- return ['config']
- }
- static async getProvider(key) {
- return WIKI.db.commentProviders.query().findOne({ key })
- }
- static async getProviders(isEnabled) {
- const providers = await WIKI.db.commentProviders.query().where(isBoolean(isEnabled) ? { isEnabled } : {})
- return sortBy(providers, ['module'])
- }
- static async refreshProvidersFromDisk() {
- try {
- // -> Fetch definitions from disk
- const commentsDirs = await fs.readdir(path.join(WIKI.SERVERPATH, 'modules/comments'))
- WIKI.data.commentProviders = []
- for (const dir of commentsDirs) {
- const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/comments', dir, 'definition.yml'), 'utf8')
- const defParsed = yaml.load(def)
- defParsed.key = dir
- defParsed.props = parseModuleProps(defParsed.props)
- WIKI.data.commentProviders.push(defParsed)
- WIKI.logger.debug(`Loaded comments provider module definition ${dir}: [ OK ]`)
- }
- WIKI.logger.info(`Loaded ${WIKI.data.commentProviders.length} comments providers module definitions: [ OK ]`)
- } catch (err) {
- WIKI.logger.error(`Failed to scan or load comments providers: [ FAILED ]`)
- WIKI.logger.error(err)
- }
- }
- static async initProvider() {
- const commentProvider = await WIKI.db.commentProviders.query().findOne('isEnabled', true)
- if (commentProvider) {
- WIKI.data.commentProvider = {
- ...find(WIKI.data.commentProviders, ['key', commentProvider.module]),
- head: '',
- bodyStart: '',
- bodyEnd: '',
- main: '<comments></comments>'
- }
- if (WIKI.data.commentProvider.codeTemplate) {
- const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/comments', commentProvider.key, 'code.yml'), 'utf8')
- let code = yaml.safeLoad(def)
- code.head = defaultTo(code.head, '')
- code.body = defaultTo(code.body, '')
- code.main = defaultTo(code.main, '')
- forOwn(commentProvider.config, (value, key) => {
- code.head = replace(code.head, new RegExp(`{{${key}}}`, 'g'), value)
- code.body = replace(code.body, new RegExp(`{{${key}}}`, 'g'), value)
- code.main = replace(code.main, new RegExp(`{{${key}}}`, 'g'), value)
- })
- WIKI.data.commentProvider.head = code.head
- WIKI.data.commentProvider.body = code.body
- WIKI.data.commentProvider.main = code.main
- } else {
- WIKI.data.commentProvider = {
- ...WIKI.data.commentProvider,
- ...(await import(`../modules/comments/${commentProvider.key}/comment.mjs`)),
- config: commentProvider.config
- }
- await WIKI.data.commentProvider.init()
- }
- WIKI.data.commentProvider.config = commentProvider.config
- }
- }
- }
|