diff --git a/packages/devops-server/package-lock.json b/packages/devops-server/package-lock.json index 2513c695db..b55544d93e 100644 --- a/packages/devops-server/package-lock.json +++ b/packages/devops-server/package-lock.json @@ -6,10 +6,11 @@ "packages": { "": { "name": "laf-devops-server", - "version": "0.4.3", + "version": "0.4.12", "dependencies": { "body-parser": "^1.19.0", "cloud-function-engine": "^0.4.3", + "dayjs": "^1.10.6", "dotenv": "^8.2.0", "express": "^4.17.1", "jsonwebtoken": "^8.5.1", @@ -294,6 +295,11 @@ "node": ">=4.0" } }, + "node_modules/dayjs": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", + "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1436,6 +1442,11 @@ "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==" }, + "dayjs": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", + "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", diff --git a/packages/devops-server/package.json b/packages/devops-server/package.json index 6a3e957dbb..0c47d914a1 100644 --- a/packages/devops-server/package.json +++ b/packages/devops-server/package.json @@ -25,6 +25,7 @@ "dependencies": { "body-parser": "^1.19.0", "cloud-function-engine": "^0.4.3", + "dayjs": "^1.10.6", "dotenv": "^8.2.0", "express": "^4.17.1", "jsonwebtoken": "^8.5.1", diff --git a/packages/devops-server/src/api/function.ts b/packages/devops-server/src/api/function.ts index d15576803d..c8e686bf39 100644 --- a/packages/devops-server/src/api/function.ts +++ b/packages/devops-server/src/api/function.ts @@ -5,6 +5,7 @@ import { compileTs2js } from 'cloud-function-engine/dist/utils' import { CloudFunctionStruct } from "cloud-function-engine" import { ClientSession, ObjectId } from 'mongodb' import * as assert from 'assert' + const db = Globals.sys_db /** @@ -112,7 +113,7 @@ export async function deployFunctions(functions: CloudFunctionStruct[]) { async function _deployOneFunction(func: CloudFunctionStruct, session: ClientSession) { - await _deleteFunctionWithSameNameButNotId(func, session) + await _processFunctionWithSameNameButNotId(func, session) const db = Globals.sys_accessor.db const r = await db.collection(Constants.cn.functions).findOne({ _id: new ObjectId(func._id) }, { session }) @@ -140,15 +141,38 @@ async function _deployOneFunction(func: CloudFunctionStruct, session: ClientSess } /** - * 删除本地 _id 不同,但 name 相同的云函数(若存在) + * 处理本地 _id 不同,但 name 相同的云函数(若存在) * @param func */ -async function _deleteFunctionWithSameNameButNotId(func: CloudFunctionStruct, session: ClientSession) { +async function _processFunctionWithSameNameButNotId(func: CloudFunctionStruct, session: ClientSession) { const db = Globals.sys_accessor.db - await db.collection(Constants.cn.functions).findOneAndDelete({ - _id: { - $ne: new ObjectId(func._id) + + // remove functions + const r = await db.collection(Constants.cn.functions).findOneAndDelete( + { + _id: { + $ne: new ObjectId(func._id) + }, + name: func.name + }, + { session }) + + if (!r.value) { + return + } + + Globals.logger.warn(`delete local func ${r?.value?._id} with same name with (${func._id}:${func.name}) but different id `) + + // remove its triggers if any + const r0 = await db.collection(Constants.cn.triggers).deleteMany( + { + func_id: r?.value?._id?.toString() }, - name: func.name - }, { session }) + { session }) + + if (!r0.deletedCount) { + return + } + + Globals.logger.warn(`delete triggers of func ${func._id} which been deleted`, r0) } \ No newline at end of file diff --git a/packages/devops-server/src/api/trigger.ts b/packages/devops-server/src/api/trigger.ts index 2f5cf4fe3a..c9a56ed1bb 100644 --- a/packages/devops-server/src/api/trigger.ts +++ b/packages/devops-server/src/api/trigger.ts @@ -89,8 +89,15 @@ export async function deployTriggers(triggers: any[]) { } async function _deployOneTrigger(trigger: any, session: ClientSession) { - const db = Globals.sys_accessor.db + + // skip trigger with invalid func_id + const func = await db.collection(Constants.cn.functions).findOne({ _id: new ObjectId(trigger.func_id) }) + if (!func) { + logger.warn(`skip trigger with invalid func_id: ${trigger.func_id}`, trigger) + return + } + const r = await db.collection(Constants.cn.triggers).findOne({ _id: new ObjectId(trigger._id) }, { session }) const data = { @@ -98,7 +105,8 @@ async function _deployOneTrigger(trigger: any, session: ClientSession) { } logger.debug('deploy trigger: ', data, r) - // if exists function + + // if exists trigger if (r) { delete data['_id'] const ret = await db.collection(Constants.cn.triggers).updateOne({ _id: r._id }, { @@ -109,7 +117,7 @@ async function _deployOneTrigger(trigger: any, session: ClientSession) { return } - // if new function + // if new trigger data._id = new ObjectId(data._id) as any const ret = await db.collection(Constants.cn.triggers).insertOne(data as any, { session }) assert(ret.insertedId, `deploy: add trigger ${trigger.name} occurred error`)