diff --git a/packages/devops-server/init/index.js b/packages/devops-server/init/index.js index 9cc72632da..9fea75b343 100644 --- a/packages/devops-server/init/index.js +++ b/packages/devops-server/init/index.js @@ -10,8 +10,8 @@ const { permissions } = require('./sys-permissions') const { FunctionLoader } = require('./func-loader') const { Constants } = require('../dist/constants') const { Globals } = require('../dist/lib/globals') -const { deployFunctions } = require('../dist/api/function') -const { deployAccessPolicy } = require('../dist/api/rules') +const { publishFunctions } = require('../dist/api/function') +const { publishAccessPolicy } = require('../dist/api/rules') const sys_accessor = Globals.sys_accessor @@ -44,10 +44,10 @@ async function main() { await createBuiltinFunctions() // 部署访问策略 - await deployAccessPolicy().then(() => console.log('policy deployed')) + await publishAccessPolicy().then(() => console.log('policy deployed')) // 部署云函数 - await deployFunctions().then(() => console.log('functions deployed')) + await publishFunctions().then(() => console.log('functions deployed')) sys_accessor.close() app_accessor.close() diff --git a/packages/devops-server/init/sys-permissions.js b/packages/devops-server/init/sys-permissions.js index c94968c6ac..e820947b59 100644 --- a/packages/devops-server/init/sys-permissions.js +++ b/packages/devops-server/init/sys-permissions.js @@ -15,13 +15,11 @@ exports.permissions = [ { name: 'rule.read', label: '获取访问规则' }, { name: 'rule.edit', label: '编辑访问规则' }, { name: 'rule.delete', label: '删除访问规则' }, - { name: 'rule.apply', label: '部署访问规则' }, { name: 'function.create', label: '创建云函数' }, { name: 'function.read', label: '获取云函数' }, { name: 'function.edit', label: '编辑云函数' }, { name: 'function.delete', label: '删除云函数' }, - { name: 'function.publish', label: '发布云函数' }, { name: 'function.debug', label: '调试云函数' }, { name: 'function_logs.read', label: '查看云函数日志' }, @@ -35,14 +33,13 @@ exports.permissions = [ { name: 'trigger.read', label: '获取触发器' }, { name: 'trigger.edit', label: '编辑访触发器' }, { name: 'trigger.delete', label: '删除触发器' }, - { name: 'trigger.apply', label: '应用触发器' }, { name: 'database.manage', label: '数据库数据管理'}, { name: 'collections.get', label: 'DBM-获取集合列表'}, { name: 'collections.createIndex', label: 'DBM-创建集合索引'}, { name: 'collections.deleteIndex', label: 'DBM-删除集合索引' }, - - { name: 'deploy.policy', label: '部署数据访问策略'}, - { name: 'deploy.function', label: '部署云函数'} + { name: 'publish.policy', label: '发布数据访问策略'}, + { name: 'publish.function', label: '发布云函数' }, + { name: 'publish.trigger', label: '发布触发器' }, ] diff --git a/packages/devops-server/package.json b/packages/devops-server/package.json index 8f0f9b8597..7dd64931ba 100644 --- a/packages/devops-server/package.json +++ b/packages/devops-server/package.json @@ -34,7 +34,8 @@ "log4js": "^6.3.0", "mongodb": "^4.0.1", "uuid": "^8.3.2", - "validator": "^12.2.0" + "validator": "^12.2.0", + "cloud-function-engine": "^0.0.5" }, "devDependencies": { "@types/dotenv": "^8.2.0", diff --git a/packages/devops-server/src/api/function.ts b/packages/devops-server/src/api/function.ts index abd2e27c52..787e4713db 100644 --- a/packages/devops-server/src/api/function.ts +++ b/packages/devops-server/src/api/function.ts @@ -1,6 +1,7 @@ import { Constants } from "../constants" import { Globals } from "../lib/globals" +import { compileTs2js } from 'cloud-function-engine/dist/utils' const db = Globals.sys_db @@ -39,16 +40,21 @@ export async function getFunctionById(func_id: string) { return r.data } + + /** - * 部署云函数 + * 发布云函数 * 实为将 sys db __functions 集合,复制其数据至 app db 中 */ -export async function deployFunctions() { +export async function publishFunctions() { const logger = Globals.logger const app_accessor = Globals.app_accessor const ret = await Globals.sys_accessor.db.collection('__functions').find().toArray() + // compile + const data = ret.map(fn => compileFunction(fn)) + const session = app_accessor.conn.startSession() try { @@ -56,11 +62,20 @@ export async function deployFunctions() { const _db = app_accessor.db const app_coll = _db.collection(Constants.function_collection) await app_coll.deleteMany({}) - await app_coll.insertMany(ret) + await app_coll.insertMany(data) }) } catch (error) { logger.error(error) } finally { await session.endSession() } -} \ No newline at end of file +} + +/** + * 编译函数 + * @param func + */ +function compileFunction(func: any) { + func.compiledCode = compileTs2js(func.code) + return func +} diff --git a/packages/devops-server/src/api/rules.ts b/packages/devops-server/src/api/rules.ts index 7fc53da113..fd4631c23d 100644 --- a/packages/devops-server/src/api/rules.ts +++ b/packages/devops-server/src/api/rules.ts @@ -33,10 +33,10 @@ export async function getAccessPolicy(category: string): Promise { } /** - * 部署访问策略 + * 发布访问策略 * 实为将 sys_db.__rules 中的表,复制其数据至 app_db 中 */ -export async function deployAccessPolicy() { +export async function publishAccessPolicy() { const logger = Globals.logger const app_accessor = Globals.app_accessor diff --git a/packages/devops-server/src/api/trigger.ts b/packages/devops-server/src/api/trigger.ts index ee2f08e807..eb261c6c6c 100644 --- a/packages/devops-server/src/api/trigger.ts +++ b/packages/devops-server/src/api/trigger.ts @@ -32,10 +32,10 @@ export async function getTriggerById(id: string) { /** - * 部署触发器 + * 发布触发器 * 实为将 sys db __triggers 集合,复制其数据至 app db 中 */ - export async function deployTriggers() { + export async function publishTriggers() { const logger = Globals.logger const app_accessor = Globals.app_accessor diff --git a/packages/devops-server/src/index.ts b/packages/devops-server/src/index.ts index e5a613892d..6dab10b44f 100644 --- a/packages/devops-server/src/index.ts +++ b/packages/devops-server/src/index.ts @@ -4,8 +4,6 @@ import { v4 as uuidv4 } from 'uuid' import Config from './config' import { router } from './router/index' import { Globals } from './lib/globals' -import { deployFunctions } from './api/function' -import { deployTriggers } from './api/trigger' const logger = Globals.logger const server = express() @@ -25,29 +23,4 @@ server.use(function (req, _res, next) { server.use(router) -server.listen(Config.PORT, () => console.log(`listened on ${Config.PORT}`)) - - - - -/** - * 监听云函数、触发器变化 & 部署 - */ -{ - const acc = Globals.sys_accessor - acc.ready.then(() => { - acc.db - .watch() - .on('change', doc => { - const coll = doc.ns.coll - if (coll === '__functions') { - // TODO 此处调试时有问题,客户端保存后,函数被清除,无法获取 - deployFunctions().then(() => logger.debug('__functions changed: deployed')) - } - - if (coll === '__triggers') { - deployTriggers().then(() => logger.debug('__triggers changed: deployed')) - } - }) - }) -} +server.listen(Config.PORT, () => console.log(`listened on ${Config.PORT}`)) \ No newline at end of file diff --git a/packages/devops-server/src/router/deploy/index.ts b/packages/devops-server/src/router/deploy/index.ts deleted file mode 100644 index 80fbca6868..0000000000 --- a/packages/devops-server/src/router/deploy/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import * as express from 'express' -import { checkPermission } from '../../api/permission' -import { deployAccessPolicy } from '../../api/rules' - -export const DeployRouter = express.Router() - -/** - * - */ -DeployRouter.post('/policy', async (req, res) => { - - // 权限验证 - const code = await checkPermission(req['auth']?.uid, 'deploy.policy') - if (code) { - return res.status(code).send() - } - - try { - const r = await deployAccessPolicy() - - return res.send({ - code: 0, - data: r - }) - } catch (error) { - return res.send({ - code: 1, - error: error - }) - } -}) \ No newline at end of file diff --git a/packages/devops-server/src/router/index.ts b/packages/devops-server/src/router/index.ts index e0fa020aa4..135f011517 100644 --- a/packages/devops-server/src/router/index.ts +++ b/packages/devops-server/src/router/index.ts @@ -2,11 +2,11 @@ import { Router } from 'express' import { AdminRouter } from './admin/index' import { DevOpsEntryRouter } from './entry' import { DbmRouter } from './dbm' -import { DeployRouter } from './deploy' +import { PublishRouter } from './publish' export const router = Router() router.use('/admin', DevOpsEntryRouter) router.use('/admin', AdminRouter) router.use('/dbm', DbmRouter) -router.use('/deploy', DeployRouter) \ No newline at end of file +router.use('/publish', PublishRouter) \ No newline at end of file diff --git a/packages/devops-server/src/router/publish/index.ts b/packages/devops-server/src/router/publish/index.ts new file mode 100644 index 0000000000..b9f2723299 --- /dev/null +++ b/packages/devops-server/src/router/publish/index.ts @@ -0,0 +1,86 @@ +import * as express from 'express' +import { publishFunctions } from '../../api/function' +import { checkPermission } from '../../api/permission' +import { publishAccessPolicy } from '../../api/rules' +import { publishTriggers } from '../../api/trigger' + +export const PublishRouter = express.Router() + +/** + * 发布访问策略 + */ +PublishRouter.post('/policy', async (req, res) => { + + // 权限验证 + const code = await checkPermission(req['auth']?.uid, 'publish.policy') + if (code) { + return res.status(code).send() + } + + try { + const r = await publishAccessPolicy() + + return res.send({ + code: 0, + data: r + }) + } catch (error) { + return res.send({ + code: 1, + error: error + }) + } +}) + +/** + * 发布云函数 + */ + PublishRouter.post('/functions', async (req, res) => { + + // 权限验证 + const code = await checkPermission(req['auth']?.uid, 'publish.function') + if (code) { + return res.status(code).send() + } + + try { + const r = await publishFunctions() + + return res.send({ + code: 0, + data: r + }) + } catch (error) { + return res.send({ + code: 1, + error: error + }) + } +}) + + +/** + * 发布触发器 + */ + PublishRouter.post('/triggers', async (req, res) => { + + // 权限验证 + const code = await checkPermission(req['auth']?.uid, 'publish.trigger') + if (code) { + return res.status(code).send() + } + + try { + const r = await publishTriggers() + + return res.send({ + code: 0, + data: r + }) + } catch (error) { + return res.send({ + code: 1, + error: error + }) + } +}) \ No newline at end of file