skyouc
2024-12-21 c9c263dc43ad90f95f24a036cee9e6b47afb596c
uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/check-version/index.js
@@ -1,167 +1,167 @@
'use strict';
exports.main = async (event, context) => {
   /**
    * 检测升级 使用说明
    * 上传包:
    * 1. 根据传参,先检测传参是否完整,appid appVersion wgtVersion 必传
    * 2. 先从数据库取出所有该平台(从上下文读取平台信息,默认 Andriod)的所有线上发行更新
    * 3. 再从所有线上发行更新中取出版本最大的一版。如果可以,尽量先检测wgt的线上发行版更新
    * 4. 使用上步取出的版本包的版本号 和传参 appVersion、wgtVersion 来检测是否有更新,必须同时大于这两项,否则返回暂无更新
    * 5. 如果库中 wgt包 版本大于传参 appVersion,但是不满足 min_uni_version < appVersion,则不会使用wgt更新,会接着判断库中 app包version 是否大于 appVersion
    */
   let {
      appid,
      appVersion,
      wgtVersion,
   } = event;
   const platform_Android = 'Android';
   const platform_iOS = 'iOS';
   const package_app = 'native_app';
   const package_wgt = 'wgt';
   const app_version_db_name = 'opendb-app-versions'
   let platform = platform_Android;
   // 云函数URL化请求
   if (event.headers) {
      let body;
      try {
         if (event.httpMethod.toLocaleLowerCase() === 'get') {
            body = event.queryStringParameters;
         } else {
            body = JSON.parse(event.body);
         }
      } catch (e) {
         return {
            code: 500,
            msg: '请求错误'
         };
      }
      appid = body.appid;
      appVersion = body.appVersion;
      wgtVersion = body.wgtVersion;
      platform = /iPhone|iPad/.test(event.headers) ? platform_iOS : platform_Android;
   } else if (context.OS) {
      platform = context.OS === 'android'
         ? platform_Android
         : context.OS === 'ios'
            ? platform_iOS
            : platform_Android;
   }
   if (appid && appVersion && wgtVersion && platform) {
      const collection = uniCloud.database().collection(app_version_db_name);
      const record = await collection.where({
            appid,
            platform,
            stable_publish: true
         })
         .orderBy('create_date', 'desc')
         .get();
      if (record && record.data && record.data.length > 0) {
         const appVersionInDb = record.data.find(item => item.type === package_app) || {};
         const wgtVersionInDb = record.data.find(item => item.type === package_wgt) || {};
         const hasAppPackage = !!Object.keys(appVersionInDb).length;
         const hasWgtPackage = !!Object.keys(wgtVersionInDb).length;
         // 取两个版本中版本号最大的包,版本一样,使用wgt包
         let stablePublishDb = hasAppPackage
            ? hasWgtPackage
               ? compare(wgtVersionInDb.version, appVersionInDb.version) >= 0
                  ? wgtVersionInDb
                  : appVersionInDb
               : appVersionInDb
            : wgtVersionInDb;
         const {
            version,
            min_uni_version
         } = stablePublishDb;
         // 库中的version必须满足同时大于appVersion和wgtVersion才行,因为上次更新可能是wgt更新
         const appUpdate = compare(version, appVersion) === 1; // app包可用更新
         const wgtUpdate = compare(version, wgtVersion) === 1; // wgt包可用更新
         if (Object.keys(stablePublishDb).length && appUpdate && wgtUpdate) {
            // 判断是否可用wgt更新
            if (min_uni_version && compare(min_uni_version, appVersion) < 1) {
               return {
                  code: 101,
                  message: 'wgt更新',
                  ...stablePublishDb
               };
            } else if (hasAppPackage && compare(appVersionInDb.version, appVersion) === 1) {
               return {
                  code: 102,
                  message: '整包更新',
                  ...appVersionInDb
               };
            }
         }
         return {
            code: 0,
            message: '当前版本已经是最新的,不需要更新'
         };
      }
      return {
         code: -101,
         message: '暂无更新或检查appid是否填写正确'
      };
   }
   return {
      code: -102,
      message: '请检查传参是否填写正确'
   };
};
/**
 * 对比版本号,如需要,请自行修改判断规则
 * 支持比对   ("3.0.0.0.0.1.0.1", "3.0.0.0.0.1")   ("3.0.0.1", "3.0")   ("3.1.1", "3.1.1.1") 之类的
 * @param {Object} v1
 * @param {Object} v2
 * v1 > v2 return 1
 * v1 < v2 return -1
 * v1 == v2 return 0
 */
function compare(v1 = '0', v2 = '0') {
   v1 = String(v1).split('.')
   v2 = String(v2).split('.')
   const minVersionLens = Math.min(v1.length, v2.length);
   let result = 0;
   for (let i = 0; i < minVersionLens; i++) {
      const curV1 = Number(v1[i])
      const curV2 = Number(v2[i])
      if (curV1 > curV2) {
         result = 1
         break;
      } else if(curV1 < curV2) {
         result = -1
         break;
      }
   }
   if (result === 0 && (v1.length !== v2.length)) {
      const v1BiggerThenv2 = v1.length > v2.length;
      const maxLensVersion = v1BiggerThenv2 ? v1 : v2;
      for (let i = minVersionLens; i < maxLensVersion.length; i++) {
         const curVersion = Number(maxLensVersion[i])
         if (curVersion > 0) {
            v1BiggerThenv2 ? result = 1 : result = -1
            break;
         }
      }
   }
   return result;
}
'use strict';
exports.main = async (event, context) => {
   /**
    * 检测升级 使用说明
    * 上传包:
    * 1. 根据传参,先检测传参是否完整,appid appVersion wgtVersion 必传
    * 2. 先从数据库取出所有该平台(从上下文读取平台信息,默认 Andriod)的所有线上发行更新
    * 3. 再从所有线上发行更新中取出版本最大的一版。如果可以,尽量先检测wgt的线上发行版更新
    * 4. 使用上步取出的版本包的版本号 和传参 appVersion、wgtVersion 来检测是否有更新,必须同时大于这两项,否则返回暂无更新
    * 5. 如果库中 wgt包 版本大于传参 appVersion,但是不满足 min_uni_version < appVersion,则不会使用wgt更新,会接着判断库中 app包version 是否大于 appVersion
    */
   let {
      appid,
      appVersion,
      wgtVersion,
   } = event;
   const platform_Android = 'Android';
   const platform_iOS = 'iOS';
   const package_app = 'native_app';
   const package_wgt = 'wgt';
   const app_version_db_name = 'opendb-app-versions'
   let platform = platform_Android;
   // 云函数URL化请求
   if (event.headers) {
      let body;
      try {
         if (event.httpMethod.toLocaleLowerCase() === 'get') {
            body = event.queryStringParameters;
         } else {
            body = JSON.parse(event.body);
         }
      } catch (e) {
         return {
            code: 500,
            msg: '请求错误'
         };
      }
      appid = body.appid;
      appVersion = body.appVersion;
      wgtVersion = body.wgtVersion;
      platform = /iPhone|iPad/.test(event.headers) ? platform_iOS : platform_Android;
   } else if (context.OS) {
      platform = context.OS === 'android'
         ? platform_Android
         : context.OS === 'ios'
            ? platform_iOS
            : platform_Android;
   }
   if (appid && appVersion && wgtVersion && platform) {
      const collection = uniCloud.database().collection(app_version_db_name);
      const record = await collection.where({
            appid,
            platform,
            stable_publish: true
         })
         .orderBy('create_date', 'desc')
         .get();
      if (record && record.data && record.data.length > 0) {
         const appVersionInDb = record.data.find(item => item.type === package_app) || {};
         const wgtVersionInDb = record.data.find(item => item.type === package_wgt) || {};
         const hasAppPackage = !!Object.keys(appVersionInDb).length;
         const hasWgtPackage = !!Object.keys(wgtVersionInDb).length;
         // 取两个版本中版本号最大的包,版本一样,使用wgt包
         let stablePublishDb = hasAppPackage
            ? hasWgtPackage
               ? compare(wgtVersionInDb.version, appVersionInDb.version) >= 0
                  ? wgtVersionInDb
                  : appVersionInDb
               : appVersionInDb
            : wgtVersionInDb;
         const {
            version,
            min_uni_version
         } = stablePublishDb;
         // 库中的version必须满足同时大于appVersion和wgtVersion才行,因为上次更新可能是wgt更新
         const appUpdate = compare(version, appVersion) === 1; // app包可用更新
         const wgtUpdate = compare(version, wgtVersion) === 1; // wgt包可用更新
         if (Object.keys(stablePublishDb).length && appUpdate && wgtUpdate) {
            // 判断是否可用wgt更新
            if (min_uni_version && compare(min_uni_version, appVersion) < 1) {
               return {
                  code: 101,
                  message: 'wgt更新',
                  ...stablePublishDb
               };
            } else if (hasAppPackage && compare(appVersionInDb.version, appVersion) === 1) {
               return {
                  code: 102,
                  message: '整包更新',
                  ...appVersionInDb
               };
            }
         }
         return {
            code: 0,
            message: '当前版本已经是最新的,不需要更新'
         };
      }
      return {
         code: -101,
         message: '暂无更新或检查appid是否填写正确'
      };
   }
   return {
      code: -102,
      message: '请检查传参是否填写正确'
   };
};
/**
 * 对比版本号,如需要,请自行修改判断规则
 * 支持比对   ("3.0.0.0.0.1.0.1", "3.0.0.0.0.1")   ("3.0.0.1", "3.0")   ("3.1.1", "3.1.1.1") 之类的
 * @param {Object} v1
 * @param {Object} v2
 * v1 > v2 return 1
 * v1 < v2 return -1
 * v1 == v2 return 0
 */
function compare(v1 = '0', v2 = '0') {
   v1 = String(v1).split('.')
   v2 = String(v2).split('.')
   const minVersionLens = Math.min(v1.length, v2.length);
   let result = 0;
   for (let i = 0; i < minVersionLens; i++) {
      const curV1 = Number(v1[i])
      const curV2 = Number(v2[i])
      if (curV1 > curV2) {
         result = 1
         break;
      } else if(curV1 < curV2) {
         result = -1
         break;
      }
   }
   if (result === 0 && (v1.length !== v2.length)) {
      const v1BiggerThenv2 = v1.length > v2.length;
      const maxLensVersion = v1BiggerThenv2 ? v1 : v2;
      for (let i = minVersionLens; i < maxLensVersion.length; i++) {
         const curVersion = Number(maxLensVersion[i])
         if (curVersion > 0) {
            v1BiggerThenv2 ? result = 1 : result = -1
            break;
         }
      }
   }
   return result;
}