Skip to content

Commit

Permalink
refactor: 统一、重命名所有 devops db 集合名称,增加前缀支持;
Browse files Browse the repository at this point in the history
  • Loading branch information
maslow committed Aug 9, 2021
1 parent 2b49b45 commit 0713921
Show file tree
Hide file tree
Showing 11 changed files with 97 additions and 133 deletions.
18 changes: 2 additions & 16 deletions packages/devops-server/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,19 +56,5 @@ npm start

## TODO

- 【已完成】 部署数据访问策略:写入 app db __deployed__rules, app server 应监听该库之变化(watch)
- 【已完成】 部署云函数:写入 app db __deployed__functions, app-server 运行前直接读取即可
- 【已完成】调试云函数:调用 app server 提供的调试接口,由 devops server 转发,或者发调试令牌直接调
- 【已完成】 部署应用触发器(新增、修改),应监听该库之变化

- 【已完成】考虑使用 mongo watch() 替代 less-api accessor 的数据事件,应用于部署监听和云函数事件(可获取变更数据的完整信息)
- 【已完成】数据管理-集合管理:使用 devops server dbm entry,可具备完整的 app db 管理能力
- 【已完成】将 devops 中表名修改,增加前缀, 如: __admins,以适应用户可能用同一数据库,跑 app & devops server;

- 实现远程部署推送:远程推送源管理,推送云函数(及触发器),推送访问规则
- 远程部署请求管理:查询收到的部署请求,可拒绝,可接受

- 【已完成】考虑以后去除 app server 中的 RBAC admin 相关的代码,转由云函数实现,云函数可初始配置 应用的 $injections getter
- 【已完成】将 app server 中的 admin entry 移至内置云函数中实现【使用了通用 proxy/entry 实现】
- 进行 proxy/entry 访问测试、injector 测试和配置交互
- 测试预置的几个新云函数
- 实现基于 GridFS 的存储器,将内置文件存储器改为 GridFS
- 实现配置额外 npm 包功能
32 changes: 16 additions & 16 deletions packages/devops-server/init/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,18 +64,18 @@ async function createFirstAdmin() {
const username = Config.SYS_ADMIN
const password = hashPassword(Config.SYS_ADMIN_PASSWORD)

const { total } = await db.collection('__admins').count()
const { total } = await db.collection(Constants.cn.admins).count()
if (total > 0) {
console.log('admin already exists')
return
}

await sys_accessor.db.collection('__admins').createIndex('username', { unique: true })
await sys_accessor.db.collection(Constants.cn.admins).createIndex('username', { unique: true })

const { data } = await db.collection('__roles').get()
const { data } = await db.collection(Constants.cn.roles).get()
const roles = data.map(it => it.name)

const r_add = await db.collection('__admins').add({
const r_add = await db.collection(Constants.cn.admins).add({
username,
avatar: "https://static.dingtalk.com/media/lALPDe7szaMXyv3NAr3NApw_668_701.png",
name: 'Admin',
Expand All @@ -85,7 +85,7 @@ async function createFirstAdmin() {
})
assert(r_add.ok, 'add admin occurs error')

await db.collection('__password').add({
await db.collection(Constants.cn.password).add({
uid: r_add.id,
password,
type: 'login',
Expand All @@ -106,14 +106,14 @@ async function createFirstAdmin() {
async function createFirstRole() {
try {

await sys_accessor.db.collection('__roles').createIndex('name', { unique: true })
await sys_accessor.db.collection(Constants.cn.roles).createIndex('name', { unique: true })

const r_perm = await db.collection('__permissions').get()
const r_perm = await db.collection(Constants.cn.permissions).get()
assert(r_perm.ok, 'get permissions failed')

const permissions = r_perm.data.map(it => it.name)

const r_add = await db.collection('__roles').add({
const r_add = await db.collection(Constants.cn.roles).add({
name: 'superadmin',
label: '超级管理员',
description: '系统初始化的超级管理员',
Expand Down Expand Up @@ -141,7 +141,7 @@ async function createFirstRole() {
async function createInitialPermissions() {

// 创建唯一索引
await sys_accessor.db.collection('__permissions').createIndex('name', { unique: true })
await sys_accessor.db.collection(Constants.cn.permissions).createIndex('name', { unique: true })

for (const perm of permissions) {
try {
Expand All @@ -150,7 +150,7 @@ async function createInitialPermissions() {
created_at: Date.now(),
updated_at: Date.now()
}
await db.collection('__permissions').add(data)
await db.collection(Constants.cn.permissions).add(data)
console.log('permissions added: ' + perm.name)

} catch (error) {
Expand All @@ -175,7 +175,7 @@ async function createInitialPermissions() {
async function createInitialPolicy(name, rules, injector) {

// if policy existed, skip it
const { total } = await db.collection('__policies')
const { total } = await db.collection(Constants.cn.policies)
.where({ name: name })
.count()

Expand All @@ -184,10 +184,10 @@ async function createInitialPolicy(name, rules, injector) {
return
}

await sys_accessor.db.collection('__policies').createIndex('name', { unique: true })
await sys_accessor.db.collection(Constants.cn.policies).createIndex('name', { unique: true })

// add policy
await db.collection('__policies').add({
await db.collection(Constants.cn.policies).add({
name: name,
rules: rules,
status: 1,
Expand All @@ -205,7 +205,7 @@ async function createInitialPolicy(name, rules, injector) {
*/
async function createBuiltinFunctions() {
// 创建云函数索引
await sys_accessor.db.collection('__functions').createIndex('name', { unique: true })
await sys_accessor.db.collection(Constants.cn.functions).createIndex('name', { unique: true })


const loader = new FunctionLoader()
Expand All @@ -219,7 +219,7 @@ async function createBuiltinFunctions() {
updated_at: Date.now()
}
delete data['triggers']
const r = await db.collection('__functions').add(data)
const r = await db.collection(Constants.cn.functions).add(data)

if (triggers.length) {
await createTriggers(r.id, triggers)
Expand Down Expand Up @@ -250,7 +250,7 @@ async function createTriggers(func_id, triggers) {
updated_at: Date.now(),
func_id: func_id
}
await db.collection('__triggers').add(data)
await db.collection(Constants.cn.triggers).add(data)
}

console.log(`triggers of func[${func_id}] created`)
Expand Down
17 changes: 0 additions & 17 deletions packages/devops-server/src/api/function-log.ts

This file was deleted.

16 changes: 8 additions & 8 deletions packages/devops-server/src/api/function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const db = Globals.sys_db
* @returns
*/
export async function getFunctionByName(func_name: string) {
const r = await db.collection('__functions')
const r = await db.collection(Constants.cn.functions)
.where({ name: func_name })
.getOne()

Expand All @@ -31,7 +31,7 @@ export async function getFunctionByName(func_name: string) {
*/
export async function getFunctionById(func_id: string) {
// 获取函数
const r = await db.collection('__functions')
const r = await db.collection(Constants.cn.functions)
.where({ _id: func_id })
.getOne()

Expand All @@ -46,13 +46,13 @@ export async function getFunctionById(func_id: string) {

/**
* 发布云函数
* 实为将 sys db __functions 集合,复制其数据至 app db 中
* 实为将 sys db functions 集合,复制其数据至 app db 中
*/
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()
const ret = await Globals.sys_accessor.db.collection(Constants.cn.functions).find().toArray()

// compile
const data = ret.map(fn => compileFunction(fn))
Expand Down Expand Up @@ -115,7 +115,7 @@ async function _deployOneFunction(func: CloudFunctionStruct, session: ClientSess
await _deleteFunctionWithSameNameButNotId(func, session)

const db = Globals.sys_accessor.db
const r = await db.collection('__functions').findOne({ _id: new ObjectId(func._id) }, { session })
const r = await db.collection(Constants.cn.functions).findOne({ _id: new ObjectId(func._id) }, { session })

const data = {
...func
Expand All @@ -124,7 +124,7 @@ async function _deployOneFunction(func: CloudFunctionStruct, session: ClientSess
// if exists function
if (r) {
delete data['_id']
const ret = await db.collection('__functions').updateOne({ _id: r._id }, {
const ret = await db.collection(Constants.cn.functions).updateOne({ _id: r._id }, {
$set: data
}, { session })

Expand All @@ -135,7 +135,7 @@ async function _deployOneFunction(func: CloudFunctionStruct, session: ClientSess
// if new function
data._id = new ObjectId(data._id) as any

const ret = await db.collection('__functions').insertOne(data as any, { session })
const ret = await db.collection(Constants.cn.functions).insertOne(data as any, { session })
assert(ret.insertedId, `deploy: add function ${func.name} occurred error`)
}

Expand All @@ -145,7 +145,7 @@ async function _deployOneFunction(func: CloudFunctionStruct, session: ClientSess
*/
async function _deleteFunctionWithSameNameButNotId(func: CloudFunctionStruct, session: ClientSession) {
const db = Globals.sys_accessor.db
await db.collection('__functions').findOneAndDelete({
await db.collection(Constants.cn.functions).findOneAndDelete({
_id: {
$ne: new ObjectId(func._id)
},
Expand Down
5 changes: 3 additions & 2 deletions packages/devops-server/src/api/permission.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@

import * as assert from 'assert'
import { Constants } from '../constants'
import { Globals } from '../lib/globals'

const db = Globals.sys_db
Expand Down Expand Up @@ -30,14 +31,14 @@ export async function checkPermission(uid: string, permission: string): Promise<
export async function getPermissions(uid: string) {

// 查用户
const { data: admin } = await db.collection('__admins')
const { data: admin } = await db.collection(Constants.cn.admins)
.where({ _id: uid })
.getOne()

assert(admin, 'getPermissions failed')

// 查角色
const { data: roles } = await db.collection('__roles')
const { data: roles } = await db.collection(Constants.cn.roles)
.where({
name: {
$in: admin.roles ?? []
Expand Down
41 changes: 6 additions & 35 deletions packages/devops-server/src/api/rules.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,45 +3,16 @@ import { Constants } from '../constants'
import { Globals } from "../lib/globals"
import { ClientSession, ObjectId } from 'mongodb'

const db = Globals.sys_db
export interface RuleDocument {
category: string,
collection: string,
data: Object
}

/**
* 根据类别获取策略规则
* @param category 策略类别
* @returns
*/
export async function getAccessPolicy(category: string): Promise<any> {
const r = await db.collection('__rules')
.where({ category })
.get()

assert.ok(r.ok && r.data.length, `read rules failed: ${category}`)

const rules = r.data

const ruleMap = {}
for (const rule of rules) {
const key = rule['collection']
ruleMap[key] = JSON.parse(rule['data'])
}

return ruleMap
}

/**
* 发布访问策略
* 实为将 sys_db.__rules 中的表,复制其数据至 app_db 中
* 实为将 sys_db policies 中的文档,复制其数据至 app_db 中
*/
export async function publishAccessPolicy() {
const logger = Globals.logger

const app_accessor = Globals.app_accessor
const ret = await Globals.sys_accessor.db.collection('__policies').find().toArray()
const ret = await Globals.sys_accessor.db.collection(Constants.cn.policies).find().toArray()
const session = app_accessor.conn.startSession()

try {
Expand Down Expand Up @@ -92,7 +63,7 @@ async function _deployOnePolicy(policy: any, session: ClientSession) {
await _deletePolicyWithSameNameButNotId(policy, session)

const db = Globals.sys_accessor.db
const r = await db.collection('__policies').findOne({ _id: new ObjectId(policy._id) }, { session })
const r = await db.collection(Constants.cn.policies).findOne({ _id: new ObjectId(policy._id) }, { session })

const data = {
...policy
Expand All @@ -102,7 +73,7 @@ async function _deployOnePolicy(policy: any, session: ClientSession) {
// if exists
if (r) {
delete data['_id']
const ret = await db.collection('__policies').updateOne({ _id: r._id }, {
const ret = await db.collection(Constants.cn.policies).updateOne({ _id: r._id }, {
$set: data
}, { session })

Expand All @@ -112,7 +83,7 @@ async function _deployOnePolicy(policy: any, session: ClientSession) {

// if new
data._id = new ObjectId(data._id) as any
const ret = await db.collection('__policies').insertOne(data as any, { session })
const ret = await db.collection(Constants.cn.policies).insertOne(data as any, { session })
assert(ret.insertedId, `deploy: add policy ${policy.name} occurred error`)
}

Expand All @@ -122,7 +93,7 @@ async function _deployOnePolicy(policy: any, session: ClientSession) {
*/
async function _deletePolicyWithSameNameButNotId(policy: any, session: ClientSession) {
const db = Globals.sys_accessor.db
await db.collection('__policies').findOneAndDelete({
await db.collection(Constants.cn.policies).findOneAndDelete({
_id: {
$ne: new ObjectId(policy._id)
},
Expand Down
14 changes: 7 additions & 7 deletions packages/devops-server/src/api/trigger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const logger = Globals.logger
* @returns
*/
export async function getTriggers(status = 1) {
const r = await db.collection('__triggers')
const r = await db.collection(Constants.cn.triggers)
.where({ status: status })
.get()

Expand All @@ -26,7 +26,7 @@ export async function getTriggers(status = 1) {
* @returns
*/
export async function getTriggerById(id: string) {
const r = await db.collection('__triggers')
const r = await db.collection(Constants.cn.triggers)
.where({ _id: id })
.getOne()

Expand All @@ -36,13 +36,13 @@ export async function getTriggerById(id: string) {

/**
* 发布触发器
* 实为将 sys db __triggers 集合,复制其数据至 app db 中
* 实为将 sys db triggers 集合,复制其数据至 app db 中
*/
export async function publishTriggers() {
const logger = Globals.logger

const app_accessor = Globals.app_accessor
const ret = await Globals.sys_accessor.db.collection('__triggers').find().toArray()
const ret = await Globals.sys_accessor.db.collection(Constants.cn.triggers).find().toArray()
const session = app_accessor.conn.startSession()

try {
Expand Down Expand Up @@ -91,7 +91,7 @@ export async function deployTriggers(triggers: any[]) {
async function _deployOneTrigger(trigger: any, session: ClientSession) {

const db = Globals.sys_accessor.db
const r = await db.collection('__triggers').findOne({ _id: new ObjectId(trigger._id) }, { session })
const r = await db.collection(Constants.cn.triggers).findOne({ _id: new ObjectId(trigger._id) }, { session })

const data = {
...trigger
Expand All @@ -101,7 +101,7 @@ async function _deployOneTrigger(trigger: any, session: ClientSession) {
// if exists function
if (r) {
delete data['_id']
const ret = await db.collection('__triggers').updateOne({ _id: r._id }, {
const ret = await db.collection(Constants.cn.triggers).updateOne({ _id: r._id }, {
$set: data
}, { session })

Expand All @@ -111,6 +111,6 @@ async function _deployOneTrigger(trigger: any, session: ClientSession) {

// if new function
data._id = new ObjectId(data._id) as any
const ret = await db.collection('__triggers').insertOne(data as any, { session })
const ret = await db.collection(Constants.cn.triggers).insertOne(data as any, { session })
assert(ret.insertedId, `deploy: add trigger ${trigger.name} occurred error`)
}
Loading

0 comments on commit 0713921

Please sign in to comment.