| @@ -5,6 +5,7 @@ import com.google.gson.JsonArray; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | |||||
| /** | /** | ||||
| * 云开发相关接口. | * 云开发相关接口. | ||||
| @@ -32,6 +33,8 @@ public interface WxMaCloudService { | |||||
| String DATABASE_DELETE_URL = "https://api.weixin.qq.com/tcb/databasedelete"; | String DATABASE_DELETE_URL = "https://api.weixin.qq.com/tcb/databasedelete"; | ||||
| String DATABASE_ADD_URL = "https://api.weixin.qq.com/tcb/databaseadd"; | String DATABASE_ADD_URL = "https://api.weixin.qq.com/tcb/databaseadd"; | ||||
| String invokeCloudFunction(String name, String body) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 触发云函数。注意:HTTP API 途径触发云函数不包含用户信息。 | * 触发云函数。注意:HTTP API 途径触发云函数不包含用户信息。 | ||||
| @@ -50,6 +53,12 @@ public interface WxMaCloudService { | |||||
| */ | */ | ||||
| String invokeCloudFunction(String env, String name, String body) throws WxErrorException; | String invokeCloudFunction(String env, String name, String body) throws WxErrorException; | ||||
| List<String> add(String collection, List list) throws WxErrorException; | |||||
| String add(String collection, Object obj) throws WxErrorException; | |||||
| JsonArray databaseAdd(String query) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 数据库插入记录 | * 数据库插入记录 | ||||
| @@ -65,6 +74,10 @@ public interface WxMaCloudService { | |||||
| */ | */ | ||||
| JsonArray databaseAdd(String env, String query) throws WxErrorException; | JsonArray databaseAdd(String env, String query) throws WxErrorException; | ||||
| Integer delete(String collection, String whereJson) throws WxErrorException; | |||||
| int databaseDelete(String query) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 数据库删除记录 | * 数据库删除记录 | ||||
| @@ -80,6 +93,10 @@ public interface WxMaCloudService { | |||||
| */ | */ | ||||
| int databaseDelete(String env, String query) throws WxErrorException; | int databaseDelete(String env, String query) throws WxErrorException; | ||||
| WxCloudDatabaseUpdateResult update(String collection, String whereJson, String updateJson) throws WxErrorException; | |||||
| WxCloudDatabaseUpdateResult databaseUpdate(String query) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 数据库更新记录 | * 数据库更新记录 | ||||
| @@ -95,6 +112,29 @@ public interface WxMaCloudService { | |||||
| */ | */ | ||||
| WxCloudDatabaseUpdateResult databaseUpdate(String env, String query) throws WxErrorException; | WxCloudDatabaseUpdateResult databaseUpdate(String env, String query) throws WxErrorException; | ||||
| /** | |||||
| * db.collection('geo') | |||||
| * .where({ | |||||
| * price: _.gt(10) | |||||
| * }) | |||||
| * .orderBy('_id', 'asc') | |||||
| * .orderBy('price', 'desc') | |||||
| * .skip(1) | |||||
| * .limit(10) | |||||
| * .get() | |||||
| * @param collection | |||||
| * @param whereJson | |||||
| * @param orderBy | |||||
| * @param skip | |||||
| * @param limit | |||||
| * @return | |||||
| * @throws WxErrorException | |||||
| */ | |||||
| WxCloudDatabaseQueryResult query(String collection, String whereJson, Map<String, String> orderBy, | |||||
| Integer skip, Integer limit) throws WxErrorException; | |||||
| WxCloudDatabaseQueryResult databaseQuery(String query) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 数据库查询记录 | * 数据库查询记录 | ||||
| @@ -110,6 +150,8 @@ public interface WxMaCloudService { | |||||
| */ | */ | ||||
| WxCloudDatabaseQueryResult databaseQuery(String env, String query) throws WxErrorException; | WxCloudDatabaseQueryResult databaseQuery(String env, String query) throws WxErrorException; | ||||
| JsonArray databaseAggregate(String query) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 数据库聚合记录 | * 数据库聚合记录 | ||||
| @@ -125,6 +167,10 @@ public interface WxMaCloudService { | |||||
| */ | */ | ||||
| JsonArray databaseAggregate(String env, String query) throws WxErrorException; | JsonArray databaseAggregate(String env, String query) throws WxErrorException; | ||||
| Long count(String collection, String whereJson) throws WxErrorException; | |||||
| Long databaseCount(String query) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 统计集合记录数或统计查询语句对应的结果记录数 | * 统计集合记录数或统计查询语句对应的结果记录数 | ||||
| @@ -140,6 +186,9 @@ public interface WxMaCloudService { | |||||
| */ | */ | ||||
| Long databaseCount(String env, String query) throws WxErrorException; | Long databaseCount(String env, String query) throws WxErrorException; | ||||
| void updateIndex(String collectionName, List<WxCloudDatabaseCreateIndexRequest> createIndexes, | |||||
| List<String> dropIndexNames) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 变更数据库索引 | * 变更数据库索引 | ||||
| @@ -157,11 +206,15 @@ public interface WxMaCloudService { | |||||
| void updateIndex(String env, String collectionName, List<WxCloudDatabaseCreateIndexRequest> createIndexes, | void updateIndex(String env, String collectionName, List<WxCloudDatabaseCreateIndexRequest> createIndexes, | ||||
| List<String> dropIndexNames) throws WxErrorException; | List<String> dropIndexNames) throws WxErrorException; | ||||
| Long databaseMigrateImport(String collectionName, String filePath, int fileType, | |||||
| boolean stopOnError, int conflictMode) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 数据库导入 | * 数据库导入 | ||||
| * | * | ||||
| * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateImport.html | |||||
| * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateImport | |||||
| * .html | |||||
| * 请求地址: POST https://api.weixin.qq.com/tcb/databasemigrateimport?access_token=ACCESS_TOKEN | * 请求地址: POST https://api.weixin.qq.com/tcb/databasemigrateimport?access_token=ACCESS_TOKEN | ||||
| * </pre> | * </pre> | ||||
| * | * | ||||
| @@ -177,11 +230,14 @@ public interface WxMaCloudService { | |||||
| Long databaseMigrateImport(String env, String collectionName, String filePath, int fileType, boolean stopOnError, | Long databaseMigrateImport(String env, String collectionName, String filePath, int fileType, boolean stopOnError, | ||||
| int conflictMode) throws WxErrorException; | int conflictMode) throws WxErrorException; | ||||
| Long databaseMigrateExport(String filePath, int fileType, String query) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 数据库导出 | * 数据库导出 | ||||
| * | * | ||||
| * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateExport.html | |||||
| * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateExport | |||||
| * .html | |||||
| * 请求地址: POST https://api.weixin.qq.com/tcb/databasemigrateexport?access_token=ACCESS_TOKEN | * 请求地址: POST https://api.weixin.qq.com/tcb/databasemigrateexport?access_token=ACCESS_TOKEN | ||||
| * </pre> | * </pre> | ||||
| * | * | ||||
| @@ -194,11 +250,14 @@ public interface WxMaCloudService { | |||||
| */ | */ | ||||
| Long databaseMigrateExport(String env, String filePath, int fileType, String query) throws WxErrorException; | Long databaseMigrateExport(String env, String filePath, int fileType, String query) throws WxErrorException; | ||||
| WxCloudCloudDatabaseMigrateQueryInfoResult databaseMigrateQueryInfo(Long jobId) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 数据库迁移状态查询 | * 数据库迁移状态查询 | ||||
| * | * | ||||
| * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateQueryInfo.html | |||||
| * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database | |||||
| * /databaseMigrateQueryInfo.html | |||||
| * 请求地址:POST https://api.weixin.qq.com/tcb/databasemigratequeryinfo?access_token=ACCESS_TOKEN | * 请求地址:POST https://api.weixin.qq.com/tcb/databasemigratequeryinfo?access_token=ACCESS_TOKEN | ||||
| * </pre> | * </pre> | ||||
| * | * | ||||
| @@ -209,6 +268,8 @@ public interface WxMaCloudService { | |||||
| */ | */ | ||||
| WxCloudCloudDatabaseMigrateQueryInfoResult databaseMigrateQueryInfo(String env, Long jobId) throws WxErrorException; | WxCloudCloudDatabaseMigrateQueryInfoResult databaseMigrateQueryInfo(String env, Long jobId) throws WxErrorException; | ||||
| WxCloudUploadFileResult uploadFile(String path) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 获取文件上传链接 | * 获取文件上传链接 | ||||
| @@ -225,6 +286,8 @@ public interface WxMaCloudService { | |||||
| */ | */ | ||||
| WxCloudUploadFileResult uploadFile(String env, String path) throws WxErrorException; | WxCloudUploadFileResult uploadFile(String env, String path) throws WxErrorException; | ||||
| WxCloudBatchDownloadFileResult batchDownloadFile(String[] fileIds, long[] maxAges) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 获取文件下载链接 | * 获取文件下载链接 | ||||
| @@ -242,6 +305,8 @@ public interface WxMaCloudService { | |||||
| */ | */ | ||||
| WxCloudBatchDownloadFileResult batchDownloadFile(String env, String[] fileIds, long[] maxAges) throws WxErrorException; | WxCloudBatchDownloadFileResult batchDownloadFile(String env, String[] fileIds, long[] maxAges) throws WxErrorException; | ||||
| WxCloudBatchDeleteFileResult batchDeleteFile(String[] fileIds) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 删除文件 | * 删除文件 | ||||
| @@ -272,11 +337,14 @@ public interface WxMaCloudService { | |||||
| */ | */ | ||||
| WxCloudGetQcloudTokenResult getQcloudToken(long lifeSpan) throws WxErrorException; | WxCloudGetQcloudTokenResult getQcloudToken(long lifeSpan) throws WxErrorException; | ||||
| void databaseCollectionAdd(String collectionName) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 新增集合 | * 新增集合 | ||||
| * | * | ||||
| * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionAdd.html | |||||
| * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionAdd | |||||
| * .html | |||||
| * 请求地址:POST https://api.weixin.qq.com/tcb/databasecollectionadd?access_token=ACCESS_TOKEN | * 请求地址:POST https://api.weixin.qq.com/tcb/databasecollectionadd?access_token=ACCESS_TOKEN | ||||
| * </pre> | * </pre> | ||||
| * | * | ||||
| @@ -286,11 +354,14 @@ public interface WxMaCloudService { | |||||
| */ | */ | ||||
| void databaseCollectionAdd(String env, String collectionName) throws WxErrorException; | void databaseCollectionAdd(String env, String collectionName) throws WxErrorException; | ||||
| void databaseCollectionDelete(String collectionName) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 删除集合 | * 删除集合 | ||||
| * | * | ||||
| * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionDelete.html | |||||
| * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database | |||||
| * /databaseCollectionDelete.html | |||||
| * 请求地址:POST https://api.weixin.qq.com/tcb/databasecollectionadd?access_token=ACCESS_TOKEN | * 请求地址:POST https://api.weixin.qq.com/tcb/databasecollectionadd?access_token=ACCESS_TOKEN | ||||
| * </pre> | * </pre> | ||||
| * | * | ||||
| @@ -300,17 +371,20 @@ public interface WxMaCloudService { | |||||
| */ | */ | ||||
| void databaseCollectionDelete(String env, String collectionName) throws WxErrorException; | void databaseCollectionDelete(String env, String collectionName) throws WxErrorException; | ||||
| WxCloudDatabaseCollectionGetResult databaseCollectionGet(Long limit, Long offset) throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 获取特定云环境下集合信息 | * 获取特定云环境下集合信息 | ||||
| * | * | ||||
| * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionGet.html | |||||
| * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionGet | |||||
| * .html | |||||
| * 请求地址:POST https://api.weixin.qq.com/tcb/databasecollectionget?access_token=ACCESS_TOKEN | * 请求地址:POST https://api.weixin.qq.com/tcb/databasecollectionget?access_token=ACCESS_TOKEN | ||||
| * </pre> | * </pre> | ||||
| * | * | ||||
| * @param env 云环境ID | |||||
| * @param limit 获取数量限制,默认值:10 | |||||
| * @param offset 偏移量,默认值:0 | |||||
| * @param env 云环境ID | |||||
| * @param limit 获取数量限制,默认值:10 | |||||
| * @param offset 偏移量,默认值:0 | |||||
| * @return . | * @return . | ||||
| * @throws WxErrorException . | * @throws WxErrorException . | ||||
| */ | */ | ||||
| @@ -3,20 +3,24 @@ package cn.binarywang.wx.miniapp.api.impl; | |||||
| import cn.binarywang.wx.miniapp.api.WxMaCloudService; | import cn.binarywang.wx.miniapp.api.WxMaCloudService; | ||||
| import cn.binarywang.wx.miniapp.api.WxMaService; | import cn.binarywang.wx.miniapp.api.WxMaService; | ||||
| import cn.binarywang.wx.miniapp.bean.cloud.*; | import cn.binarywang.wx.miniapp.bean.cloud.*; | ||||
| import cn.binarywang.wx.miniapp.constant.WxMaConstants; | |||||
| import cn.binarywang.wx.miniapp.util.JoinerUtils; | |||||
| import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; | |||||
| import com.google.common.collect.ImmutableMap; | import com.google.common.collect.ImmutableMap; | ||||
| import com.google.common.collect.Lists; | import com.google.common.collect.Lists; | ||||
| import com.google.gson.JsonArray; | import com.google.gson.JsonArray; | ||||
| import com.google.gson.JsonElement; | |||||
| import com.google.gson.JsonObject; | import com.google.gson.JsonObject; | ||||
| import com.google.gson.JsonParser; | import com.google.gson.JsonParser; | ||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
| import me.chanjar.weixin.common.error.WxError; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| import me.chanjar.weixin.common.util.json.WxGsonBuilder; | import me.chanjar.weixin.common.util.json.WxGsonBuilder; | ||||
| import org.apache.commons.lang3.StringUtils; | |||||
| import java.io.Serializable; | import java.io.Serializable; | ||||
| import java.util.HashMap; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import java.util.*; | |||||
| /** | /** | ||||
| * 云开发相关接口实现类. | * 云开发相关接口实现类. | ||||
| @@ -30,48 +34,225 @@ public class WxMaCloudServiceImpl implements WxMaCloudService { | |||||
| private static final JsonParser JSON_PARSER = new JsonParser(); | private static final JsonParser JSON_PARSER = new JsonParser(); | ||||
| private final WxMaService wxMaService; | private final WxMaService wxMaService; | ||||
| @Override | |||||
| public String invokeCloudFunction(String name, String body) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| return invokeCloudFunction(cloudEnv, name, body); | |||||
| } | |||||
| @Override | @Override | ||||
| public String invokeCloudFunction(String env, String name, String body) throws WxErrorException { | public String invokeCloudFunction(String env, String name, String body) throws WxErrorException { | ||||
| final String response = this.wxMaService.post(String.format(INVOKE_CLOUD_FUNCTION_URL, env, name), body); | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| final String response = this.wxMaService.post(String.format(INVOKE_CLOUD_FUNCTION_URL, cloudEnv, name), body); | |||||
| return JSON_PARSER.parse(response).getAsJsonObject().get("resp_data").getAsString(); | return JSON_PARSER.parse(response).getAsJsonObject().get("resp_data").getAsString(); | ||||
| } | } | ||||
| @Override | |||||
| public List<String> add(String collection, List list) throws WxErrorException { | |||||
| String jsonData = WxMaGsonBuilder.create().toJson(list); | |||||
| String query = JoinerUtils.blankJoiner.join( | |||||
| "db.collection('", collection, "')", | |||||
| ".add({data: ", jsonData, "})"); | |||||
| JsonObject params = new JsonObject(); | |||||
| params.addProperty("env", this.wxMaService.getWxMaConfig().getCloudEnv()); | |||||
| params.addProperty("query", query); | |||||
| String responseContent = wxMaService.post(DATABASE_ADD_URL, params.toString()); | |||||
| JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent); | |||||
| JsonObject jsonObject = tmpJsonElement.getAsJsonObject(); | |||||
| if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) { | |||||
| throw new WxErrorException(WxError.fromJson(responseContent)); | |||||
| } | |||||
| JsonArray idArray = jsonObject.getAsJsonArray("id_list"); | |||||
| List<String> idList = new ArrayList<>(); | |||||
| Iterator<JsonElement> idIterator = idArray.iterator(); | |||||
| while (idIterator.hasNext()) { | |||||
| JsonElement id = idIterator.next(); | |||||
| idList.add(id.getAsString()); | |||||
| } | |||||
| return idList; | |||||
| } | |||||
| @Override | |||||
| public String add(String collection, Object obj) throws WxErrorException { | |||||
| String jsonData = WxMaGsonBuilder.create().toJson(obj); | |||||
| String query = JoinerUtils.blankJoiner.join( | |||||
| "db.collection('", collection, "')", | |||||
| ".add({data: ", jsonData, "})"); | |||||
| JsonObject params = new JsonObject(); | |||||
| params.addProperty("env", this.wxMaService.getWxMaConfig().getCloudEnv()); | |||||
| params.addProperty("query", query); | |||||
| String responseContent = wxMaService.post(DATABASE_ADD_URL, params.toString()); | |||||
| JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent); | |||||
| JsonObject jsonObject = tmpJsonElement.getAsJsonObject(); | |||||
| if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) { | |||||
| throw new WxErrorException(WxError.fromJson(responseContent)); | |||||
| } | |||||
| JsonArray idArray = jsonObject.getAsJsonArray("id_list"); | |||||
| return idArray.getAsString(); | |||||
| } | |||||
| @Override | |||||
| public JsonArray databaseAdd(String query) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| return databaseAdd(cloudEnv, query); | |||||
| } | |||||
| @Override | @Override | ||||
| public JsonArray databaseAdd(String env, String query) throws WxErrorException { | public JsonArray databaseAdd(String env, String query) throws WxErrorException { | ||||
| String response = this.wxMaService.post(DATABASE_ADD_URL, ImmutableMap.of("env", env, "query", query)); | String response = this.wxMaService.post(DATABASE_ADD_URL, ImmutableMap.of("env", env, "query", query)); | ||||
| return JSON_PARSER.parse(response).getAsJsonObject().get("id_list").getAsJsonArray(); | return JSON_PARSER.parse(response).getAsJsonObject().get("id_list").getAsJsonArray(); | ||||
| } | } | ||||
| @Override | |||||
| public Integer delete(String collection, String whereJson) throws WxErrorException { | |||||
| String query = JoinerUtils.blankJoiner.join( | |||||
| "db.collection('", collection, "')", | |||||
| ".where(", whereJson, ").remove()"); | |||||
| JsonObject params = new JsonObject(); | |||||
| params.addProperty("env", this.wxMaService.getWxMaConfig().getCloudEnv()); | |||||
| params.addProperty("query", query); | |||||
| String responseContent = wxMaService.post(DATABASE_DELETE_URL, params.toString()); | |||||
| JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent); | |||||
| JsonObject jsonObject = tmpJsonElement.getAsJsonObject(); | |||||
| if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) { | |||||
| throw new WxErrorException(WxError.fromJson(responseContent)); | |||||
| } | |||||
| Integer deletedNum = jsonObject.get("deleted").getAsInt(); | |||||
| return deletedNum; | |||||
| } | |||||
| @Override | |||||
| public int databaseDelete(String query) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| return databaseDelete(cloudEnv, query); | |||||
| } | |||||
| @Override | @Override | ||||
| public int databaseDelete(String env, String query) throws WxErrorException { | public int databaseDelete(String env, String query) throws WxErrorException { | ||||
| String response = this.wxMaService.post(DATABASE_DELETE_URL, ImmutableMap.of("env", env, "query", query)); | String response = this.wxMaService.post(DATABASE_DELETE_URL, ImmutableMap.of("env", env, "query", query)); | ||||
| return JSON_PARSER.parse(response).getAsJsonObject().get("deleted").getAsInt(); | return JSON_PARSER.parse(response).getAsJsonObject().get("deleted").getAsInt(); | ||||
| } | } | ||||
| @Override | |||||
| public WxCloudDatabaseUpdateResult update(String collection, String whereJson, String updateJson) throws WxErrorException { | |||||
| String query = JoinerUtils.blankJoiner.join( | |||||
| "db.collection('", collection, "')", | |||||
| ".where(", whereJson, ").update({data:", updateJson, " })"); | |||||
| JsonObject params = new JsonObject(); | |||||
| params.addProperty("env", this.wxMaService.getWxMaConfig().getCloudEnv()); | |||||
| params.addProperty("query", query); | |||||
| String responseContent = wxMaService.post(DATABASE_UPDATE_URL, params.toString()); | |||||
| return WxGsonBuilder.create().fromJson(responseContent, WxCloudDatabaseUpdateResult.class); | |||||
| } | |||||
| @Override | |||||
| public WxCloudDatabaseUpdateResult databaseUpdate(String query) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| return databaseUpdate(cloudEnv, query); | |||||
| } | |||||
| @Override | @Override | ||||
| public WxCloudDatabaseUpdateResult databaseUpdate(String env, String query) throws WxErrorException { | public WxCloudDatabaseUpdateResult databaseUpdate(String env, String query) throws WxErrorException { | ||||
| String response = this.wxMaService.post(DATABASE_UPDATE_URL, ImmutableMap.of("env", env, "query", query)); | String response = this.wxMaService.post(DATABASE_UPDATE_URL, ImmutableMap.of("env", env, "query", query)); | ||||
| return WxGsonBuilder.create().fromJson(response, WxCloudDatabaseUpdateResult.class); | return WxGsonBuilder.create().fromJson(response, WxCloudDatabaseUpdateResult.class); | ||||
| } | } | ||||
| @Override | |||||
| public WxCloudDatabaseQueryResult query(String collection, String whereJson, Map<String, String> orderBy, | |||||
| Integer skip, Integer limit) throws WxErrorException { | |||||
| if (StringUtils.isBlank(whereJson)) { | |||||
| whereJson = "{}"; | |||||
| } | |||||
| StringBuilder orderBySb = new StringBuilder(); | |||||
| if (null != orderBy && !orderBy.isEmpty()) { | |||||
| orderBy.entrySet().forEach( | |||||
| e -> orderBySb.append(".orderBy('").append(e.getKey()).append("', '").append(e.getValue()).append("')") | |||||
| ); | |||||
| } | |||||
| if (null == limit) { | |||||
| limit = 100; | |||||
| } | |||||
| if (null == skip) { | |||||
| skip = 0; | |||||
| } | |||||
| String query = JoinerUtils.blankJoiner.join( | |||||
| "db.collection('", collection, "')", | |||||
| ".where(", whereJson, ")", orderBySb.toString(), ".skip(", skip, ").limit(", limit, ").get()"); | |||||
| JsonObject params = new JsonObject(); | |||||
| params.addProperty("env", this.wxMaService.getWxMaConfig().getCloudEnv()); | |||||
| params.addProperty("query", query); | |||||
| String responseContent = wxMaService.post(DATABASE_QUERY_URL, params.toString()); | |||||
| return WxGsonBuilder.create().fromJson(responseContent, WxCloudDatabaseQueryResult.class); | |||||
| } | |||||
| @Override | |||||
| public WxCloudDatabaseQueryResult databaseQuery(String query) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| return databaseQuery(cloudEnv, query); | |||||
| } | |||||
| @Override | @Override | ||||
| public WxCloudDatabaseQueryResult databaseQuery(String env, String query) throws WxErrorException { | public WxCloudDatabaseQueryResult databaseQuery(String env, String query) throws WxErrorException { | ||||
| String response = this.wxMaService.post(DATABASE_QUERY_URL, ImmutableMap.of("env", env, "query", query)); | String response = this.wxMaService.post(DATABASE_QUERY_URL, ImmutableMap.of("env", env, "query", query)); | ||||
| return WxGsonBuilder.create().fromJson(response, WxCloudDatabaseQueryResult.class); | return WxGsonBuilder.create().fromJson(response, WxCloudDatabaseQueryResult.class); | ||||
| } | } | ||||
| @Override | |||||
| public JsonArray databaseAggregate(String query) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| return databaseAggregate(cloudEnv, query); | |||||
| } | |||||
| @Override | @Override | ||||
| public JsonArray databaseAggregate(String env, String query) throws WxErrorException { | public JsonArray databaseAggregate(String env, String query) throws WxErrorException { | ||||
| String response = this.wxMaService.post(DATABASE_AGGREGATE_URL, ImmutableMap.of("env", env, "query", query)); | String response = this.wxMaService.post(DATABASE_AGGREGATE_URL, ImmutableMap.of("env", env, "query", query)); | ||||
| return JSON_PARSER.parse(response).getAsJsonObject().get("data").getAsJsonArray(); | return JSON_PARSER.parse(response).getAsJsonObject().get("data").getAsJsonArray(); | ||||
| } | } | ||||
| @Override | |||||
| public Long count(String collection, String whereJson) throws WxErrorException { | |||||
| String query = JoinerUtils.blankJoiner.join( | |||||
| "db.collection('", collection, "')", | |||||
| ".where(", whereJson, ").count()"); | |||||
| JsonObject params = new JsonObject(); | |||||
| params.addProperty("env", this.wxMaService.getWxMaConfig().getCloudEnv()); | |||||
| params.addProperty("query", query); | |||||
| String responseContent = wxMaService.post(DATABASE_COUNT_URL, params.toString()); | |||||
| return JSON_PARSER.parse(responseContent).getAsJsonObject().get("count").getAsLong(); | |||||
| } | |||||
| @Override | |||||
| public Long databaseCount(String query) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| return databaseCount(cloudEnv, query); | |||||
| } | |||||
| @Override | @Override | ||||
| public Long databaseCount(String env, String query) throws WxErrorException { | public Long databaseCount(String env, String query) throws WxErrorException { | ||||
| String response = this.wxMaService.post(DATABASE_COUNT_URL, ImmutableMap.of("env", env, "query", query)); | String response = this.wxMaService.post(DATABASE_COUNT_URL, ImmutableMap.of("env", env, "query", query)); | ||||
| return JSON_PARSER.parse(response).getAsJsonObject().get("count").getAsLong(); | return JSON_PARSER.parse(response).getAsJsonObject().get("count").getAsLong(); | ||||
| } | } | ||||
| @Override | |||||
| public void updateIndex(String collectionName, List<WxCloudDatabaseCreateIndexRequest> createIndexes, | |||||
| List<String> dropIndexNames) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| updateIndex(cloudEnv, collectionName, createIndexes, dropIndexNames); | |||||
| } | |||||
| @Override | @Override | ||||
| public void updateIndex(String env, String collectionName, List<WxCloudDatabaseCreateIndexRequest> createIndexes, | public void updateIndex(String env, String collectionName, List<WxCloudDatabaseCreateIndexRequest> createIndexes, | ||||
| List<String> dropIndexNames) throws WxErrorException { | List<String> dropIndexNames) throws WxErrorException { | ||||
| @@ -86,6 +267,13 @@ public class WxMaCloudServiceImpl implements WxMaCloudService { | |||||
| "collection_name", collectionName, "create_indexes", createIndexes, "drop_indexes", dropIndexes)); | "collection_name", collectionName, "create_indexes", createIndexes, "drop_indexes", dropIndexes)); | ||||
| } | } | ||||
| @Override | |||||
| public Long databaseMigrateImport(String collectionName, String filePath, int fileType, | |||||
| boolean stopOnError, int conflictMode) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| return databaseMigrateImport(cloudEnv, collectionName, filePath, fileType, stopOnError, conflictMode); | |||||
| } | |||||
| @Override | @Override | ||||
| public Long databaseMigrateImport(String env, String collectionName, String filePath, int fileType, | public Long databaseMigrateImport(String env, String collectionName, String filePath, int fileType, | ||||
| boolean stopOnError, int conflictMode) throws WxErrorException { | boolean stopOnError, int conflictMode) throws WxErrorException { | ||||
| @@ -101,6 +289,12 @@ public class WxMaCloudServiceImpl implements WxMaCloudService { | |||||
| return JSON_PARSER.parse(response).getAsJsonObject().get("job_id").getAsLong(); | return JSON_PARSER.parse(response).getAsJsonObject().get("job_id").getAsLong(); | ||||
| } | } | ||||
| @Override | |||||
| public Long databaseMigrateExport(String filePath, int fileType, String query) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| return databaseMigrateExport(cloudEnv, filePath, fileType, query); | |||||
| } | |||||
| @Override | @Override | ||||
| public Long databaseMigrateExport(String env, String filePath, int fileType, String query) throws WxErrorException { | public Long databaseMigrateExport(String env, String filePath, int fileType, String query) throws WxErrorException { | ||||
| JsonObject params = new JsonObject(); | JsonObject params = new JsonObject(); | ||||
| @@ -113,18 +307,37 @@ public class WxMaCloudServiceImpl implements WxMaCloudService { | |||||
| return JSON_PARSER.parse(response).getAsJsonObject().get("job_id").getAsLong(); | return JSON_PARSER.parse(response).getAsJsonObject().get("job_id").getAsLong(); | ||||
| } | } | ||||
| @Override | |||||
| public WxCloudCloudDatabaseMigrateQueryInfoResult databaseMigrateQueryInfo(Long jobId) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| return databaseMigrateQueryInfo(cloudEnv, jobId); | |||||
| } | |||||
| @Override | @Override | ||||
| public WxCloudCloudDatabaseMigrateQueryInfoResult databaseMigrateQueryInfo(String env, Long jobId) throws WxErrorException { | public WxCloudCloudDatabaseMigrateQueryInfoResult databaseMigrateQueryInfo(String env, Long jobId) throws WxErrorException { | ||||
| String response = this.wxMaService.post(DATABASE_MIGRATE_QUERY_INFO_URL, ImmutableMap.of("env", env, "job_id", jobId)); | |||||
| String response = this.wxMaService.post(DATABASE_MIGRATE_QUERY_INFO_URL, ImmutableMap.of("env", env, "job_id", | |||||
| jobId)); | |||||
| return WxGsonBuilder.create().fromJson(response, WxCloudCloudDatabaseMigrateQueryInfoResult.class); | return WxGsonBuilder.create().fromJson(response, WxCloudCloudDatabaseMigrateQueryInfoResult.class); | ||||
| } | } | ||||
| @Override | |||||
| public WxCloudUploadFileResult uploadFile(String path) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| return uploadFile(cloudEnv, path); | |||||
| } | |||||
| @Override | @Override | ||||
| public WxCloudUploadFileResult uploadFile(String env, String path) throws WxErrorException { | public WxCloudUploadFileResult uploadFile(String env, String path) throws WxErrorException { | ||||
| String response = this.wxMaService.post(UPLOAD_FILE_URL, ImmutableMap.of("env", env, "path", path)); | String response = this.wxMaService.post(UPLOAD_FILE_URL, ImmutableMap.of("env", env, "path", path)); | ||||
| return WxGsonBuilder.create().fromJson(response, WxCloudUploadFileResult.class); | return WxGsonBuilder.create().fromJson(response, WxCloudUploadFileResult.class); | ||||
| } | } | ||||
| @Override | |||||
| public WxCloudBatchDownloadFileResult batchDownloadFile(String[] fileIds, long[] maxAges) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| return batchDownloadFile(cloudEnv, fileIds, maxAges); | |||||
| } | |||||
| @Override | @Override | ||||
| public WxCloudBatchDownloadFileResult batchDownloadFile(String env, String[] fileIds, long[] maxAges) throws WxErrorException { | public WxCloudBatchDownloadFileResult batchDownloadFile(String env, String[] fileIds, long[] maxAges) throws WxErrorException { | ||||
| List<Map<String, Serializable>> fileList = Lists.newArrayList(); | List<Map<String, Serializable>> fileList = Lists.newArrayList(); | ||||
| @@ -137,6 +350,12 @@ public class WxMaCloudServiceImpl implements WxMaCloudService { | |||||
| return WxGsonBuilder.create().fromJson(response, WxCloudBatchDownloadFileResult.class); | return WxGsonBuilder.create().fromJson(response, WxCloudBatchDownloadFileResult.class); | ||||
| } | } | ||||
| @Override | |||||
| public WxCloudBatchDeleteFileResult batchDeleteFile(String[] fileIds) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| return batchDeleteFile(cloudEnv, fileIds); | |||||
| } | |||||
| @Override | @Override | ||||
| public WxCloudBatchDeleteFileResult batchDeleteFile(String env, String[] fileIds) throws WxErrorException { | public WxCloudBatchDeleteFileResult batchDeleteFile(String env, String[] fileIds) throws WxErrorException { | ||||
| String response = this.wxMaService.post(BATCH_DELETE_FILE_URL, ImmutableMap.of("env", env, "fileid_list", fileIds)); | String response = this.wxMaService.post(BATCH_DELETE_FILE_URL, ImmutableMap.of("env", env, "fileid_list", fileIds)); | ||||
| @@ -149,14 +368,33 @@ public class WxMaCloudServiceImpl implements WxMaCloudService { | |||||
| return WxGsonBuilder.create().fromJson(response, WxCloudGetQcloudTokenResult.class); | return WxGsonBuilder.create().fromJson(response, WxCloudGetQcloudTokenResult.class); | ||||
| } | } | ||||
| @Override | |||||
| public void databaseCollectionAdd(String collectionName) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| databaseCollectionAdd(cloudEnv, collectionName); | |||||
| } | |||||
| @Override | @Override | ||||
| public void databaseCollectionAdd(String env, String collectionName) throws WxErrorException { | public void databaseCollectionAdd(String env, String collectionName) throws WxErrorException { | ||||
| this.wxMaService.post(DATABASE_COLLECTION_ADD_URL, ImmutableMap.of("env", env, "collection_name", collectionName)); | this.wxMaService.post(DATABASE_COLLECTION_ADD_URL, ImmutableMap.of("env", env, "collection_name", collectionName)); | ||||
| } | } | ||||
| @Override | |||||
| public void databaseCollectionDelete(String collectionName) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| databaseCollectionDelete(cloudEnv, collectionName); | |||||
| } | |||||
| @Override | @Override | ||||
| public void databaseCollectionDelete(String env, String collectionName) throws WxErrorException { | public void databaseCollectionDelete(String env, String collectionName) throws WxErrorException { | ||||
| this.wxMaService.post(DATABASE_COLLECTION_DELETE_URL, ImmutableMap.of("env", env, "collection_name", collectionName)); | |||||
| this.wxMaService.post(DATABASE_COLLECTION_DELETE_URL, ImmutableMap.of("env", env, "collection_name", | |||||
| collectionName)); | |||||
| } | |||||
| @Override | |||||
| public WxCloudDatabaseCollectionGetResult databaseCollectionGet(Long limit, Long offset) throws WxErrorException { | |||||
| String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv(); | |||||
| return databaseCollectionGet(cloudEnv, limit, offset); | |||||
| } | } | ||||
| @Override | @Override | ||||
| @@ -174,5 +412,4 @@ public class WxMaCloudServiceImpl implements WxMaCloudService { | |||||
| String response = this.wxMaService.post(DATABASE_COLLECTION_GET_URL, params); | String response = this.wxMaService.post(DATABASE_COLLECTION_GET_URL, params); | ||||
| return WxGsonBuilder.create().fromJson(response, WxCloudDatabaseCollectionGetResult.class); | return WxGsonBuilder.create().fromJson(response, WxCloudDatabaseCollectionGetResult.class); | ||||
| } | } | ||||
| } | } | ||||
| @@ -87,6 +87,10 @@ public interface WxMaConfig { | |||||
| String getAesKey(); | String getAesKey(); | ||||
| String getOriginalId(); | |||||
| String getCloudEnv(); | |||||
| String getMsgDataFormat(); | String getMsgDataFormat(); | ||||
| long getExpiresTime(); | long getExpiresTime(); | ||||
| @@ -1,51 +1,53 @@ | |||||
| package cn.binarywang.wx.miniapp.config.impl; | package cn.binarywang.wx.miniapp.config.impl; | ||||
| import java.io.File; | |||||
| import java.util.concurrent.locks.Lock; | |||||
| import java.util.concurrent.locks.ReentrantLock; | |||||
| import cn.binarywang.wx.miniapp.config.WxMaConfig; | import cn.binarywang.wx.miniapp.config.WxMaConfig; | ||||
| import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; | import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; | ||||
| import me.chanjar.weixin.common.bean.WxAccessToken; | import me.chanjar.weixin.common.bean.WxAccessToken; | ||||
| import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; | import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; | ||||
| import java.io.File; | |||||
| import java.util.concurrent.locks.Lock; | |||||
| import java.util.concurrent.locks.ReentrantLock; | |||||
| /** | /** | ||||
| * 基于内存的微信配置provider,在实际生产环境中应该将这些配置持久化 | * 基于内存的微信配置provider,在实际生产环境中应该将这些配置持久化 | ||||
| * | * | ||||
| * @author <a href="https://github.com/binarywang">Binary Wang</a> | * @author <a href="https://github.com/binarywang">Binary Wang</a> | ||||
| */ | */ | ||||
| public class WxMaDefaultConfigImpl implements WxMaConfig { | public class WxMaDefaultConfigImpl implements WxMaConfig { | ||||
| private volatile String msgDataFormat; | |||||
| protected volatile String appid; | protected volatile String appid; | ||||
| private volatile String secret; | |||||
| protected volatile String token; | protected volatile String token; | ||||
| /** | |||||
| * 小程序原始ID | |||||
| */ | |||||
| protected volatile String originalId; | |||||
| protected Lock accessTokenLock = new ReentrantLock(); | |||||
| /** | |||||
| * 临时文件目录. | |||||
| */ | |||||
| protected volatile File tmpDirFile; | |||||
| private volatile String msgDataFormat; | |||||
| private volatile String secret; | |||||
| private volatile String accessToken; | private volatile String accessToken; | ||||
| private volatile String aesKey; | private volatile String aesKey; | ||||
| private volatile long expiresTime; | private volatile long expiresTime; | ||||
| /** | |||||
| * 云环境ID | |||||
| */ | |||||
| private volatile String cloudEnv; | |||||
| private volatile String httpProxyHost; | private volatile String httpProxyHost; | ||||
| private volatile int httpProxyPort; | private volatile int httpProxyPort; | ||||
| private volatile String httpProxyUsername; | private volatile String httpProxyUsername; | ||||
| private volatile String httpProxyPassword; | private volatile String httpProxyPassword; | ||||
| private volatile String jsapiTicket; | private volatile String jsapiTicket; | ||||
| private volatile long jsapiTicketExpiresTime; | private volatile long jsapiTicketExpiresTime; | ||||
| /** | /** | ||||
| * 微信卡券的ticket单独缓存. | * 微信卡券的ticket单独缓存. | ||||
| */ | */ | ||||
| private volatile String cardApiTicket; | private volatile String cardApiTicket; | ||||
| private volatile long cardApiTicketExpiresTime; | private volatile long cardApiTicketExpiresTime; | ||||
| protected Lock accessTokenLock = new ReentrantLock(); | |||||
| private Lock jsapiTicketLock = new ReentrantLock(); | private Lock jsapiTicketLock = new ReentrantLock(); | ||||
| private Lock cardApiTicketLock = new ReentrantLock(); | private Lock cardApiTicketLock = new ReentrantLock(); | ||||
| /** | |||||
| * 临时文件目录. | |||||
| */ | |||||
| protected volatile File tmpDirFile; | |||||
| private volatile ApacheHttpClientBuilder apacheHttpClientBuilder; | private volatile ApacheHttpClientBuilder apacheHttpClientBuilder; | ||||
| /** | /** | ||||
| @@ -190,6 +192,24 @@ public class WxMaDefaultConfigImpl implements WxMaConfig { | |||||
| this.aesKey = aesKey; | this.aesKey = aesKey; | ||||
| } | } | ||||
| @Override | |||||
| public String getOriginalId() { | |||||
| return originalId; | |||||
| } | |||||
| public void setOriginalId(String originalId) { | |||||
| this.originalId = originalId; | |||||
| } | |||||
| @Override | |||||
| public String getCloudEnv() { | |||||
| return this.cloudEnv; | |||||
| } | |||||
| public void setCloudEnv(String cloudEnv) { | |||||
| this.cloudEnv = cloudEnv; | |||||
| } | |||||
| @Override | @Override | ||||
| public String getMsgDataFormat() { | public String getMsgDataFormat() { | ||||
| return this.msgDataFormat; | return this.msgDataFormat; | ||||
| @@ -0,0 +1,253 @@ | |||||
| /** | |||||
| * Copyright (c) 2019,sunnybs. | |||||
| * All Rights Reserved. | |||||
| * <p> | |||||
| * Project Name:yigou | |||||
| */ | |||||
| package cn.binarywang.wx.miniapp.util; | |||||
| import com.google.common.base.Joiner; | |||||
| /** | |||||
| * ClassName: JoinerUtils <br/> | |||||
| * Description: 字符串连接器 <br/> | |||||
| * Date: 2019年10月18日 下午1:42:59 <br/> | |||||
| * | |||||
| * @author <a href="https://gitee.com/esunego_hunan/weixin-java-tools">wsp</a> | |||||
| */ | |||||
| public class JoinerUtils { | |||||
| private static final String NULL = "null"; | |||||
| /** | |||||
| * <p> | |||||
| * 空白连接器,忽略null | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.blankJoiner.join("a", "b", "c"); | |||||
| * <b>result : </b>abc | |||||
| * | |||||
| * JoinerUtils.blankJoiner.join("a", null, "c"); | |||||
| * <b>result : </b>ac | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner blankJoiner = Joiner.on("").skipNulls(); | |||||
| /** | |||||
| * <p> | |||||
| * 空白连接器 | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.blankJoinerWithNull.join("a", "b", "c"); | |||||
| * <b>result : </b>abc | |||||
| * | |||||
| * JoinerUtils.blankJoinerWithNull.join("a", null, "c"); | |||||
| * <b>result : </b>anullc | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner blankJoinerWithNull = Joiner.on("").useForNull(NULL); | |||||
| /** | |||||
| * <p> | |||||
| * 空格连接器,忽略null | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.spaceJoiner.join("a", "b", "c"); | |||||
| * <b>result : </b>a b c | |||||
| * | |||||
| * JoinerUtils.spaceJoiner.join("a", null, "c"); | |||||
| * <b>result : </b>a c | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner spaceJoiner = Joiner.on(" ").skipNulls(); | |||||
| /** | |||||
| * <p> | |||||
| * 空格连接器 | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.spaceJoinerWithNull.join("a", "b", "c"); | |||||
| * <b>result : </b>a b c | |||||
| * | |||||
| * JoinerUtils.spaceJoinerWithNull.join("a", null, "c"); | |||||
| * <b>result : </b>a null c | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner spaceJoinerWithNull = Joiner.on(" ").useForNull(NULL); | |||||
| /** | |||||
| * <p> | |||||
| * 逗号分隔符连接器,忽略null | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.commaJoiner.join("a", "b", "c"); | |||||
| * <b>result : </b>a,b,c | |||||
| * | |||||
| * JoinerUtils.commaJoiner.join("a", null, "c"); | |||||
| * <b>result : </b>a,c | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner commaJoiner = Joiner.on(",").skipNulls(); | |||||
| /** | |||||
| * <p> | |||||
| * 逗号分隔符连接器 | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.commaJoinerWithNull.join("a", "b", "c"); | |||||
| * <b>result : </b>a,b,c | |||||
| * | |||||
| * JoinerUtils.commaJoinerWithNull.join("a", null, "c"); | |||||
| * <b>result : </b>a,null,c | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner commaJoinerWithNull = Joiner.on(",").useForNull(NULL); | |||||
| /** | |||||
| * <p> | |||||
| * 等号分隔符连接器,忽略null | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.equalJoiner.join("a", "b", "c"); | |||||
| * <b>result : </b>a=b=c | |||||
| * | |||||
| * JoinerUtils.equalJoiner.join("a", null, "c"); | |||||
| * <b>result : </b>a=c | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner equalJoiner = Joiner.on("=").skipNulls(); | |||||
| /** | |||||
| * <p> | |||||
| * 等号分隔符连接器 | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.equalJoinerWithNull.join("a", "b", "c"); | |||||
| * <b>result : </b>a=b=c | |||||
| * | |||||
| * JoinerUtils.equalJoinerWithNull.join("a", null, "c"); | |||||
| * <b>result : </b>a=null=c | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner equalJoinerWithNull = Joiner.on("=").useForNull(NULL); | |||||
| /** | |||||
| * <p> | |||||
| * 竖线分隔符连接器,忽略null | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.vLineJoiner.join("a", "b", "c"); | |||||
| * <b>result : </b>a|b|c | |||||
| * | |||||
| * JoinerUtils.vLineJoiner.join("a", null, "c"); | |||||
| * <b>result : </b>a|c | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner vLineJoiner = Joiner.on("|").skipNulls(); | |||||
| /** | |||||
| * <p> | |||||
| * 竖线分隔符连接器 | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.vLineJoinerWithNull.join("a", "b", "c"); | |||||
| * <b>result : </b>a|b|c | |||||
| * | |||||
| * JoinerUtils.vLineJoinerWithNull.join("a", null, "c"); | |||||
| * <b>result : </b>a|null|c | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner vLineJoinerWithNull = Joiner.on("|").useForNull(NULL); | |||||
| /** | |||||
| * <p> | |||||
| * 中横线分隔符连接器,忽略null | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.hLineJoiner.join("a", "b", "c"); | |||||
| * <b>result : </b>a-b-c | |||||
| * | |||||
| * JoinerUtils.hLineJoiner.join("a", null, "c"); | |||||
| * <b>result : </b>a-c | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner hLineJoiner = Joiner.on("-").skipNulls(); | |||||
| /** | |||||
| * <p> | |||||
| * 中横线分隔符连接器 | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.hLineJoinerWithNull.join("a", "b", "c"); | |||||
| * <b>result : </b>a-b-c | |||||
| * | |||||
| * JoinerUtils.hLineJoinerWithNull.join("a", null, "c"); | |||||
| * <b>result : </b>a-null-c | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner hLineJoinerWithNull = Joiner.on("-").useForNull(NULL); | |||||
| /** | |||||
| * <p> | |||||
| * 下划线分隔符连接器,忽略null | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.underlineJoiner.join("a", "b", "c"); | |||||
| * <b>result : </b>a_b_c | |||||
| * | |||||
| * JoinerUtils.underlineJoiner.join("a", null, "c"); | |||||
| * <b>result : </b>a_c | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner underlineJoiner = Joiner.on("_").skipNulls(); | |||||
| /** | |||||
| * <p> | |||||
| * 下划线分隔符连接器 | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.underlineJoinerWithNull.join("a", "b", "c"); | |||||
| * <b>result : </b>a_b_c | |||||
| * | |||||
| * JoinerUtils.underlineJoinerWithNull.join("a", null, "c"); | |||||
| * <b>result : </b>a_null_c | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner underlineJoinerWithNull = Joiner.on("_").useForNull(NULL); | |||||
| /** | |||||
| * <p> | |||||
| * 斜线分隔符连接器,忽略null | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.pathJoiner.join("a", "b", "c"); | |||||
| * <b>result : </b>a/b/c | |||||
| * | |||||
| * JoinerUtils.pathJoiner.join("a", null, "c"); | |||||
| * <b>result : </b>a/c | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner pathJoiner = Joiner.on("/").skipNulls(); | |||||
| /** | |||||
| * <p> | |||||
| * 斜线分隔符连接器 | |||||
| * </p> | |||||
| * | |||||
| * <pre> | |||||
| * JoinerUtils.pathJoinerWithNull.join("a", "b", "c"); | |||||
| * <b>result : </b>a/b/c | |||||
| * | |||||
| * JoinerUtils.pathJoinerWithNull.join("a", null, "c"); | |||||
| * <b>result : </b>a/null/c | |||||
| * </pre> | |||||
| */ | |||||
| public static final Joiner pathJoinerWithNull = Joiner.on("/").useForNull(NULL); | |||||
| } | |||||
| @@ -3,13 +3,19 @@ package cn.binarywang.wx.miniapp.api.impl; | |||||
| import cn.binarywang.wx.miniapp.api.WxMaService; | import cn.binarywang.wx.miniapp.api.WxMaService; | ||||
| import cn.binarywang.wx.miniapp.bean.cloud.*; | import cn.binarywang.wx.miniapp.bean.cloud.*; | ||||
| import cn.binarywang.wx.miniapp.test.ApiTestModule; | import cn.binarywang.wx.miniapp.test.ApiTestModule; | ||||
| import com.google.common.collect.ImmutableSortedMap; | |||||
| import com.google.common.collect.Lists; | import com.google.common.collect.Lists; | ||||
| import com.google.common.collect.Ordering; | |||||
| import com.google.gson.JsonArray; | import com.google.gson.JsonArray; | ||||
| import com.google.inject.Inject; | import com.google.inject.Inject; | ||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| import org.testng.annotations.BeforeTest; | |||||
| import org.testng.annotations.Guice; | import org.testng.annotations.Guice; | ||||
| import org.testng.annotations.Test; | import org.testng.annotations.Test; | ||||
| import java.math.BigDecimal; | |||||
| import java.util.*; | |||||
| import static org.assertj.core.api.Assertions.assertThat; | import static org.assertj.core.api.Assertions.assertThat; | ||||
| /** | /** | ||||
| @@ -20,18 +26,89 @@ import static org.assertj.core.api.Assertions.assertThat; | |||||
| */ | */ | ||||
| @Guice(modules = ApiTestModule.class) | @Guice(modules = ApiTestModule.class) | ||||
| public class WxMaCloudServiceImplTest { | public class WxMaCloudServiceImplTest { | ||||
| private static final String COLLECTION = "geo"; | |||||
| @Inject | @Inject | ||||
| private WxMaService wxMaService; | private WxMaService wxMaService; | ||||
| @BeforeTest | |||||
| public void before() { | |||||
| /** | |||||
| * 用以解决:javax.net.ssl.SSLHandshakeException: PKIX path building failed | |||||
| * 参考:https://www.cnblogs.com/cloudapps/p/5022544.html | |||||
| */ | |||||
| String mpCert = ClassLoader.getSystemResource("wx-mp-jssecacerts").getPath(); | |||||
| String maCert = ClassLoader.getSystemResource("wx-ma-jssecacerts").getPath(); | |||||
| System.setProperty("javax.net.ssl.trustStore", mpCert + "," + maCert); | |||||
| String property = System.getProperty("javax.net.ssl.trustStore"); | |||||
| System.out.println("javax.net.ssl.trustStore=" + property); | |||||
| } | |||||
| @Test | @Test | ||||
| public void testInvokeCloudFunction() throws WxErrorException { | public void testInvokeCloudFunction() throws WxErrorException { | ||||
| final String result = this.wxMaService.getCloudService().invokeCloudFunction("rcn", "login", "{}"); | |||||
| final String result = this.wxMaService.getCloudService().invokeCloudFunction("login", "{}"); | |||||
| assertThat(result).isNotNull(); | assertThat(result).isNotNull(); | ||||
| } | } | ||||
| @Test | |||||
| public void testAddList() throws WxErrorException { | |||||
| List<Map> stuList = new ArrayList<>(); | |||||
| Map<String, Object> product1 = new HashMap<>(); | |||||
| product1.put("description", "item1"); | |||||
| product1.put("price", BigDecimal.valueOf(1.2)); | |||||
| product1.put("due", new Date()); | |||||
| /** | |||||
| * 等价于new db.Geo.Point(113, 23) | |||||
| * 参见:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/geo/Geo.Point.html | |||||
| */ | |||||
| Map<String, Object> point = new HashMap<>(); | |||||
| point.put("type", "Point"); | |||||
| point.put("coordinates", new Integer[]{113, 23}); | |||||
| Map<String, Object> product2 = new HashMap<>(); | |||||
| product2.put("tags", new String[]{"cloud", "database"}); | |||||
| product2.put("location", point); | |||||
| product2.put("done", false); | |||||
| stuList.add(product1); | |||||
| stuList.add(product2); | |||||
| List<String> idList = this.wxMaService.getCloudService().add(COLLECTION, stuList); | |||||
| System.out.println(idList.size()); | |||||
| assertThat(idList).isNotEmpty(); | |||||
| } | |||||
| @Test | |||||
| public void testAddObject() throws WxErrorException { | |||||
| /** | |||||
| * 等价于new db.Geo.Point(113, 23) | |||||
| * 参见:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/geo/Geo.Point.html | |||||
| */ | |||||
| Map<String, Object> point = new HashMap<>(); | |||||
| point.put("type", "Point"); | |||||
| point.put("coordinates", new Integer[]{113, 23}); | |||||
| Map<String, Object> product = new HashMap<>(); | |||||
| product.put("description", "item1"); | |||||
| product.put("price", BigDecimal.valueOf(1.2)); | |||||
| product.put("due", new Date()); | |||||
| product.put("tags", new String[]{"cloud", "database"}); | |||||
| product.put("location", point); | |||||
| product.put("done", false); | |||||
| String id = this.wxMaService.getCloudService().add(COLLECTION, product); | |||||
| System.out.println(id); | |||||
| assertThat(id).isNotBlank(); | |||||
| } | |||||
| @Test | @Test | ||||
| public void testDatabaseAdd() throws WxErrorException { | public void testDatabaseAdd() throws WxErrorException { | ||||
| JsonArray array = this.wxMaService.getCloudService().databaseAdd("rcn", "db.collection(\"geo\").add({\n" + | |||||
| JsonArray array = this.wxMaService.getCloudService().databaseAdd("db.collection(\"geo\").add({\n" + | |||||
| " data: [{\n" + | " data: [{\n" + | ||||
| " description: \"item1\",\n" + | " description: \"item1\",\n" + | ||||
| " due:\n" + | " due:\n" + | ||||
| @@ -63,16 +140,59 @@ public class WxMaCloudServiceImplTest { | |||||
| assertThat(array).isNotEmpty(); | assertThat(array).isNotEmpty(); | ||||
| } | } | ||||
| @Test | |||||
| public void testDelete() throws WxErrorException { | |||||
| StringBuilder whereParamSb = new StringBuilder(); | |||||
| whereParamSb.append("{") | |||||
| // 等于 | |||||
| .append("_id: _.eq('79a2c43f5e7e9e8e001a120e494d51b8'),") | |||||
| // in | |||||
| .append("age: _.in([0, 1, 2, 3]),") | |||||
| // 小于 | |||||
| .append("due: _.lt('Mar 29, 2020 8:47:07 AM'),") | |||||
| // 存在属性 | |||||
| .append("price: _.exists(true)") | |||||
| .append("}"); | |||||
| final int result = this.wxMaService.getCloudService().delete( | |||||
| COLLECTION, whereParamSb.toString()); | |||||
| assertThat(result).isEqualTo(0); | |||||
| } | |||||
| @Test | @Test | ||||
| public void testDatabaseDelete() throws WxErrorException { | public void testDatabaseDelete() throws WxErrorException { | ||||
| final int result = this.wxMaService.getCloudService().databaseDelete("rcn", | |||||
| final int result = this.wxMaService.getCloudService().databaseDelete( | |||||
| "db.collection(\"geo\").doc(\"056120a7-c89e-4616-95bf-dfc9a11daa3b\").remove()"); | "db.collection(\"geo\").doc(\"056120a7-c89e-4616-95bf-dfc9a11daa3b\").remove()"); | ||||
| assertThat(result).isEqualTo(0); | assertThat(result).isEqualTo(0); | ||||
| } | } | ||||
| @Test | |||||
| public void testUpdate() throws WxErrorException { | |||||
| StringBuilder whereParamSb = new StringBuilder(); | |||||
| whereParamSb.append("{") | |||||
| // in | |||||
| .append("age: _.in([0, 1, 2, 3]),") | |||||
| // 小于 | |||||
| .append("due: _.lt('Mar 29, 2020 8:47:07 AM'),") | |||||
| // 存在属性 | |||||
| .append("price: _.exists(true)") | |||||
| .append("}"); | |||||
| StringBuilder updateSb = new StringBuilder(); | |||||
| updateSb.append("{age: _.inc(1)}"); | |||||
| final WxCloudDatabaseUpdateResult result = this.wxMaService.getCloudService().update(COLLECTION, | |||||
| whereParamSb.toString(), updateSb.toString()); | |||||
| assertThat(result).isNotNull(); | |||||
| assertThat(result.getMatched()).isGreaterThan(0); | |||||
| assertThat(result.getId()).isEmpty(); | |||||
| assertThat(result.getModified()).isGreaterThan(0); | |||||
| } | |||||
| @Test | @Test | ||||
| public void testDatabaseUpdate() throws WxErrorException { | public void testDatabaseUpdate() throws WxErrorException { | ||||
| final WxCloudDatabaseUpdateResult result = this.wxMaService.getCloudService().databaseUpdate("rcn", | |||||
| final WxCloudDatabaseUpdateResult result = this.wxMaService.getCloudService().databaseUpdate( | |||||
| "db.collection(\"geo\").where({description:\"item1\"}).update({data:{age: _.inc(1)}})"); | "db.collection(\"geo\").where({description:\"item1\"}).update({data:{age: _.inc(1)}})"); | ||||
| assertThat(result).isNotNull(); | assertThat(result).isNotNull(); | ||||
| assertThat(result.getMatched()).isGreaterThan(0); | assertThat(result.getMatched()).isGreaterThan(0); | ||||
| @@ -80,9 +200,43 @@ public class WxMaCloudServiceImplTest { | |||||
| assertThat(result.getModified()).isGreaterThan(0); | assertThat(result.getModified()).isGreaterThan(0); | ||||
| } | } | ||||
| @Test | |||||
| public void testQuery() throws WxErrorException { | |||||
| StringBuilder whereParamSb = new StringBuilder(); | |||||
| whereParamSb.append("{") | |||||
| // in | |||||
| .append("age: _.in([0, 1, 2, 3]),") | |||||
| // 小于 | |||||
| .append("due: _.lt('Mar 29, 2020 8:47:07 AM'),") | |||||
| // 存在属性 | |||||
| .append("price: _.exists(true)") | |||||
| .append("}"); | |||||
| // // Hutool创建有序map,返回LinkedHashMap | |||||
| // Map<String, Integer> map2 = MapUtil.newHashMap(true); | |||||
| // map2.put("_id", "asc"); | |||||
| // map2.put("price", "desc"); | |||||
| // 有序map | |||||
| ImmutableSortedMap<String, String> orderBy = new ImmutableSortedMap | |||||
| .Builder<String, String>(Ordering.natural()) | |||||
| .put("_id", "asc") | |||||
| .put("price", "desc") | |||||
| .build(); | |||||
| final WxCloudDatabaseQueryResult result = this.wxMaService.getCloudService().query(COLLECTION, | |||||
| whereParamSb.toString(), orderBy, 20, 20); | |||||
| assertThat(result).isNotNull(); | |||||
| assertThat(result.getPager()).isNotNull(); | |||||
| assertThat(result.getPager().getLimit()).isEqualTo(10); | |||||
| assertThat(result.getPager().getOffset()).isEqualTo(1); | |||||
| assertThat(result.getPager().getTotal()).isGreaterThan(0); | |||||
| assertThat(result.getData().length).isGreaterThan(0); | |||||
| } | |||||
| @Test | @Test | ||||
| public void testDatabaseQuery() throws WxErrorException { | public void testDatabaseQuery() throws WxErrorException { | ||||
| final WxCloudDatabaseQueryResult result = this.wxMaService.getCloudService().databaseQuery("rcn", | |||||
| final WxCloudDatabaseQueryResult result = this.wxMaService.getCloudService().databaseQuery( | |||||
| "db.collection(\"geo\").where({done:false}).limit(10).skip(1).get()"); | "db.collection(\"geo\").where({done:false}).limit(10).skip(1).get()"); | ||||
| assertThat(result).isNotNull(); | assertThat(result).isNotNull(); | ||||
| assertThat(result.getPager()).isNotNull(); | assertThat(result.getPager()).isNotNull(); | ||||
| @@ -94,21 +248,36 @@ public class WxMaCloudServiceImplTest { | |||||
| @Test | @Test | ||||
| public void testDatabaseAggregate() throws WxErrorException { | public void testDatabaseAggregate() throws WxErrorException { | ||||
| final JsonArray result = this.wxMaService.getCloudService().databaseAggregate("rcn", | |||||
| final JsonArray result = this.wxMaService.getCloudService().databaseAggregate( | |||||
| "db.collection(\"geo\").aggregate().match({tags:\"cloud\"}).limit(10).end()"); | "db.collection(\"geo\").aggregate().match({tags:\"cloud\"}).limit(10).end()"); | ||||
| assertThat(result).isNotNull(); | assertThat(result).isNotNull(); | ||||
| } | } | ||||
| @Test | |||||
| public void testCount() throws WxErrorException { | |||||
| StringBuilder whereParamSb = new StringBuilder(); | |||||
| whereParamSb.append("{") | |||||
| // in | |||||
| .append("age: _.in([0, 1, 2, 3]),") | |||||
| // 小于 | |||||
| .append("due: _.lt('Mar 29, 2020 8:47:07 AM'),") | |||||
| // 存在属性 | |||||
| .append("price: _.exists(true)") | |||||
| .append("}"); | |||||
| final Long result = this.wxMaService.getCloudService().count(COLLECTION, whereParamSb.toString()); | |||||
| assertThat(result).isGreaterThan(0); | |||||
| } | |||||
| @Test | @Test | ||||
| public void testDatabaseCount() throws WxErrorException { | public void testDatabaseCount() throws WxErrorException { | ||||
| final Long result = this.wxMaService.getCloudService().databaseCount("rcn", | |||||
| final Long result = this.wxMaService.getCloudService().databaseCount( | |||||
| "db.collection(\"geo\").where({done:false}).count()"); | "db.collection(\"geo\").where({done:false}).count()"); | ||||
| assertThat(result).isGreaterThan(0); | assertThat(result).isGreaterThan(0); | ||||
| } | } | ||||
| @Test | @Test | ||||
| public void testUpdateIndex() throws WxErrorException { | public void testUpdateIndex() throws WxErrorException { | ||||
| this.wxMaService.getCloudService().updateIndex("rcn", "geo", | |||||
| this.wxMaService.getCloudService().updateIndex(COLLECTION, | |||||
| Lists.newArrayList(new WxCloudDatabaseCreateIndexRequest() | Lists.newArrayList(new WxCloudDatabaseCreateIndexRequest() | ||||
| .setName("drop_index") | .setName("drop_index") | ||||
| .setUnique(true) | .setUnique(true) | ||||
| @@ -119,15 +288,16 @@ public class WxMaCloudServiceImplTest { | |||||
| @Test | @Test | ||||
| public void testDatabaseMigrateImport() throws WxErrorException { | public void testDatabaseMigrateImport() throws WxErrorException { | ||||
| final Long result = this.wxMaService.getCloudService().databaseMigrateImport("rcn", "geo", "test.json", | |||||
| final Long result = this.wxMaService.getCloudService().databaseMigrateImport(COLLECTION, "test.json", | |||||
| 1, true, 1); | 1, true, 1); | ||||
| assertThat(result).isGreaterThan(0); | assertThat(result).isGreaterThan(0); | ||||
| } | } | ||||
| @Test | @Test | ||||
| public void testDatabaseMigrateExport() throws WxErrorException { | public void testDatabaseMigrateExport() throws WxErrorException { | ||||
| final Long result = this.wxMaService.getCloudService().databaseMigrateExport("rcn", "test.json", 1, | |||||
| "const Point = db.Geo.Point;db.collection('geo').where({age: _.gt(1)}).limit(10).skip(1).orderBy('age','asc').orderBy('name', 'desc')" + | |||||
| final Long result = this.wxMaService.getCloudService().databaseMigrateExport("test.json", 1, | |||||
| "const Point = db.Geo.Point;db.collection('geo').where({age: _.gt(1)}).limit(10).skip(1).orderBy('age','asc')" + | |||||
| ".orderBy('name', 'desc')" + | |||||
| ".field({ name: true }).get()"); | ".field({ name: true }).get()"); | ||||
| assertThat(result).isGreaterThan(0); | assertThat(result).isGreaterThan(0); | ||||
| } | } | ||||
| @@ -135,14 +305,15 @@ public class WxMaCloudServiceImplTest { | |||||
| @Test | @Test | ||||
| public void testDatabaseMigrateQueryInfo() throws WxErrorException { | public void testDatabaseMigrateQueryInfo() throws WxErrorException { | ||||
| final WxCloudCloudDatabaseMigrateQueryInfoResult result = this.wxMaService.getCloudService() | final WxCloudCloudDatabaseMigrateQueryInfoResult result = this.wxMaService.getCloudService() | ||||
| .databaseMigrateQueryInfo("rcn", 476629L); | |||||
| .databaseMigrateQueryInfo(476629L); | |||||
| assertThat(result).isNotNull(); | assertThat(result).isNotNull(); | ||||
| System.out.println(result.getFileUrl()); | System.out.println(result.getFileUrl()); | ||||
| } | } | ||||
| @Test | @Test | ||||
| public void testUploadFile() throws WxErrorException { | public void testUploadFile() throws WxErrorException { | ||||
| final WxCloudUploadFileResult result = this.wxMaService.getCloudService().uploadFile("rcn", "E:\\MyDocs\\Desktop\\test.json"); | |||||
| final WxCloudUploadFileResult result = this.wxMaService.getCloudService().uploadFile("E:\\MyDocs\\Desktop" + | |||||
| "\\test.json"); | |||||
| assertThat(result).isNotNull(); | assertThat(result).isNotNull(); | ||||
| assertThat(result.getAuthorization()).isNotNull(); | assertThat(result.getAuthorization()).isNotNull(); | ||||
| @@ -155,8 +326,9 @@ public class WxMaCloudServiceImplTest { | |||||
| @Test | @Test | ||||
| public void testBatchDownloadFile() throws WxErrorException { | public void testBatchDownloadFile() throws WxErrorException { | ||||
| final WxCloudBatchDownloadFileResult result = this.wxMaService.getCloudService().batchDownloadFile("rcn", | |||||
| new String[]{"cloud://rcn.7263-rcn-1258788140/Snipaste_2019-11-13_00-21-27.png", "cloud://rcn.7263-rcn-1258788140/avatar.jpg"}, | |||||
| final WxCloudBatchDownloadFileResult result = this.wxMaService.getCloudService().batchDownloadFile( | |||||
| new String[]{"cloud://rcn.7263-rcn-1258788140/Snipaste_2019-11-13_00-21-27.png", "cloud://rcn" + | |||||
| ".7263-rcn-1258788140/avatar.jpg"}, | |||||
| new long[]{7200, 6800}); | new long[]{7200, 6800}); | ||||
| assertThat(result).isNotNull(); | assertThat(result).isNotNull(); | ||||
| @@ -171,7 +343,7 @@ public class WxMaCloudServiceImplTest { | |||||
| @Test | @Test | ||||
| public void testBatchDeleteFile() throws WxErrorException { | public void testBatchDeleteFile() throws WxErrorException { | ||||
| final WxCloudBatchDeleteFileResult result = this.wxMaService.getCloudService().batchDeleteFile("rcn", | |||||
| final WxCloudBatchDeleteFileResult result = this.wxMaService.getCloudService().batchDeleteFile( | |||||
| new String[]{"cloud://rcn.7263-rcn-1258788140/test.json"}); | new String[]{"cloud://rcn.7263-rcn-1258788140/test.json"}); | ||||
| assertThat(result).isNotNull(); | assertThat(result).isNotNull(); | ||||
| @@ -195,18 +367,19 @@ public class WxMaCloudServiceImplTest { | |||||
| @Test | @Test | ||||
| public void testDatabaseCollectionAdd() throws WxErrorException { | public void testDatabaseCollectionAdd() throws WxErrorException { | ||||
| this.wxMaService.getCloudService().databaseCollectionAdd("rcn","test_add_collection"); | |||||
| this.wxMaService.getCloudService().databaseCollectionAdd("test_add_collection"); | |||||
| } | } | ||||
| @Test | @Test | ||||
| public void testDatabaseCollectionDelete() throws WxErrorException { | public void testDatabaseCollectionDelete() throws WxErrorException { | ||||
| this.wxMaService.getCloudService().databaseCollectionAdd("rcn","test_delete_collection"); | |||||
| this.wxMaService.getCloudService().databaseCollectionDelete("rcn","test_delete_collection"); | |||||
| this.wxMaService.getCloudService().databaseCollectionAdd("test_delete_collection"); | |||||
| this.wxMaService.getCloudService().databaseCollectionDelete("test_delete_collection"); | |||||
| } | } | ||||
| @Test | @Test | ||||
| public void testDatabaseCollectionGet() throws WxErrorException { | public void testDatabaseCollectionGet() throws WxErrorException { | ||||
| final WxCloudDatabaseCollectionGetResult result = this.wxMaService.getCloudService().databaseCollectionGet("rcn", null, null); | |||||
| final WxCloudDatabaseCollectionGetResult result = this.wxMaService.getCloudService().databaseCollectionGet( | |||||
| null, null); | |||||
| assertThat(result).isNotNull(); | assertThat(result).isNotNull(); | ||||
| assertThat(result.getPager()).isNotNull(); | assertThat(result.getPager()).isNotNull(); | ||||
| @@ -4,6 +4,7 @@ | |||||
| <secret>secret</secret> | <secret>secret</secret> | ||||
| <token>Token</token> | <token>Token</token> | ||||
| <aesKey>EncodingAESKey</aesKey> | <aesKey>EncodingAESKey</aesKey> | ||||
| <cloudEnv>云环境</cloudEnv> | |||||
| <accessToken>可以不填写</accessToken> | <accessToken>可以不填写</accessToken> | ||||
| <expiresTime>可以不填写</expiresTime> | <expiresTime>可以不填写</expiresTime> | ||||
| <openid>某个用户的openId</openid> | <openid>某个用户的openId</openid> | ||||
| @@ -46,7 +46,6 @@ public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { | |||||
| private Map<String, Token> cardApiTickets = new ConcurrentHashMap<>(); | private Map<String, Token> cardApiTickets = new ConcurrentHashMap<>(); | ||||
| @Override | @Override | ||||
| public boolean isComponentAccessTokenExpired() { | public boolean isComponentAccessTokenExpired() { | ||||
| return System.currentTimeMillis() > componentExpiresTime; | return System.currentTimeMillis() > componentExpiresTime; | ||||
| @@ -79,7 +78,8 @@ public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void setWxOpenInfo(String componentAppId, String componentAppSecret, String componentToken, String componentAesKey) { | |||||
| public void setWxOpenInfo(String componentAppId, String componentAppSecret, String componentToken, | |||||
| String componentAesKey) { | |||||
| setComponentAppId(componentAppId); | setComponentAppId(componentAppId); | ||||
| setComponentAppSecret(componentAppSecret); | setComponentAppSecret(componentAppSecret); | ||||
| setComponentToken(componentToken); | setComponentToken(componentToken); | ||||
| @@ -146,7 +146,8 @@ public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { | |||||
| @Override | @Override | ||||
| public void updateAuthorizerAccessToken(String appId, WxOpenAuthorizerAccessToken authorizerAccessToken) { | public void updateAuthorizerAccessToken(String appId, WxOpenAuthorizerAccessToken authorizerAccessToken) { | ||||
| updateAuthorizerAccessToken(appId, authorizerAccessToken.getAuthorizerAccessToken(), authorizerAccessToken.getExpiresIn()); | |||||
| updateAuthorizerAccessToken(appId, authorizerAccessToken.getAuthorizerAccessToken(), | |||||
| authorizerAccessToken.getExpiresIn()); | |||||
| } | } | ||||
| @Override | @Override | ||||
| @@ -202,6 +203,14 @@ public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { | |||||
| private static class WxOpenInnerConfigStorage implements WxMpConfigStorage, WxMaConfig { | private static class WxOpenInnerConfigStorage implements WxMpConfigStorage, WxMaConfig { | ||||
| private WxOpenConfigStorage wxOpenConfigStorage; | private WxOpenConfigStorage wxOpenConfigStorage; | ||||
| private String appId; | private String appId; | ||||
| /** | |||||
| * 小程序原始ID | |||||
| */ | |||||
| private volatile String originalId; | |||||
| /** | |||||
| * 云环境ID | |||||
| */ | |||||
| private volatile String cloudEnv; | |||||
| private Lock accessTokenLock = new ReentrantLock(); | private Lock accessTokenLock = new ReentrantLock(); | ||||
| private Lock jsapiTicketLock = new ReentrantLock(); | private Lock jsapiTicketLock = new ReentrantLock(); | ||||
| private Lock cardApiTicketLock = new ReentrantLock(); | private Lock cardApiTicketLock = new ReentrantLock(); | ||||
| @@ -325,6 +334,24 @@ public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { | |||||
| return this.appId; | return this.appId; | ||||
| } | } | ||||
| @Override | |||||
| public String getOriginalId() { | |||||
| return originalId; | |||||
| } | |||||
| public void setOriginalId(String originalId) { | |||||
| this.originalId = originalId; | |||||
| } | |||||
| @Override | |||||
| public String getCloudEnv() { | |||||
| return this.cloudEnv; | |||||
| } | |||||
| public void setCloudEnv(String cloudEnv) { | |||||
| this.cloudEnv = cloudEnv; | |||||
| } | |||||
| @Override | @Override | ||||
| public void expireAccessToken() { | public void expireAccessToken() { | ||||
| wxOpenConfigStorage.expireAuthorizerAccessToken(appId); | wxOpenConfigStorage.expireAuthorizerAccessToken(appId); | ||||