chatgpt-plugin/server/modules/setting_view.js

88 lines
No EOL
3.3 KiB
JavaScript

import { UserInfo } from './user_data.js'
import { supportGuoba } from '../../guoba.support.js'
import fs from 'fs'
import path from 'path'
function getAttributeValues(obj, attributeName, results = []) {
if (Array.isArray(obj)) {
obj.forEach(item => getAttributeValues(item, attributeName, results));
} else if (typeof obj === 'object' && obj !== null) {
Object.keys(obj).forEach(key => {
if (key === attributeName) {
results.push(obj[key]);
} else if (typeof obj[key] === 'object') {
getAttributeValues(obj[key], attributeName, results);
}
});
}
return results;
}
async function SettingView(fastify, options) {
// 获取配置视图
fastify.post('/settingView', async (request, reply) => {
const token = request.cookies.token || request.body?.token || 'unknown'
let user = UserInfo(token)
if (!user) {
reply.send({ err: '未登录' })
} else if (user.autho === 'admin') {
const filepath = path.join('plugins/chatgpt-plugin/resources/view', 'setting_view.json')
let configView = JSON.parse(fs.readFileSync(filepath, 'utf8'))
// 从锅巴配置获取额外配置视图
const guoba = supportGuoba()
const guobaConfig = guoba.configInfo.schemas
const viewDataList = getAttributeValues(configView, 'data')
const guobaDataList = getAttributeValues(guobaConfig, 'field')
const otherDataList = guobaDataList.filter(item => !viewDataList.includes(item))
const otherData = guobaConfig.filter(item => otherDataList.includes(item.field))
// 转换视图
if (otherData.length > 0) {
let otherView = []
for (const data of otherData) {
let view = {
'label': data.label,
'placeholder': data.bottomHelpMessage || undefined,
'data': data.field,
}
switch (data.component) {
case 'Input':
view.type = 'text'
break
case 'Switch':
view.type = 'check'
break
case 'InputNumber':
view.type = 'number'
break
case 'InputPassword':
view.type = 'password'
break
case 'InputTextArea':
view.type = 'textarea'
break
case 'Select':
view.type = 'textarea'
view.items = data.componentProps.options
break
default:
continue
}
otherView.push(view)
}
configView.push({
"id": "OtherSettings",
"title": "其他设置",
"view": otherView
})
}
reply.send(configView)
} else {
reply.send({ err: '权限不足' })
}
return reply
})
}
export default SettingView