|
@@ -0,0 +1,205 @@
|
|
|
+package com.malk.service.teambition.impl;
|
|
|
+
|
|
|
+import com.auth0.jwt.algorithms.Algorithm;
|
|
|
+import com.malk.server.teambition.TBConf;
|
|
|
+import com.malk.server.teambition.TBR;
|
|
|
+import com.malk.service.teambition.TBClient;
|
|
|
+import com.malk.utils.UtilHttp;
|
|
|
+import com.malk.utils.UtilMap;
|
|
|
+import com.malk.utils.UtilToken;
|
|
|
+import lombok.Synchronized;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class TBClientImpl implements TBClient {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private TBConf tbConf;
|
|
|
+
|
|
|
+ private static final Long EXPIRES_IN = 2 * 3600 * 1000L;
|
|
|
+ private static final String TOKEN_APP_ID = "_appId";
|
|
|
+
|
|
|
+ // 获取访问授权
|
|
|
+ @Synchronized
|
|
|
+ private String getAccessToken() {
|
|
|
+ String accessToken = UtilToken.get("invalid-token-teambition");
|
|
|
+ if (StringUtils.isNotBlank(accessToken)) return accessToken;
|
|
|
+ Algorithm algorithm = Algorithm.HMAC256(tbConf.getAppSecret());
|
|
|
+ long timestamp = System.currentTimeMillis();
|
|
|
+ Date issuedAt = new Date(timestamp);
|
|
|
+ Date expiresAt = new Date(timestamp + EXPIRES_IN);
|
|
|
+ accessToken = com.auth0.jwt.JWT.create()
|
|
|
+ .withClaim(TOKEN_APP_ID, tbConf.getAppID())
|
|
|
+ .withIssuedAt(issuedAt)
|
|
|
+ .withExpiresAt(expiresAt)
|
|
|
+ .sign(algorithm);
|
|
|
+ log.info("响应token, {}", accessToken);
|
|
|
+ // token失效自动重置: TB传递过期时间2h, 重复调用就会刷新
|
|
|
+ UtilToken.put("invalid-token-teambition", accessToken, EXPIRES_IN);
|
|
|
+ return accessToken;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化参数: 加载token
|
|
|
+ private Map<String, String> initHeaderToken() {
|
|
|
+ Map header = new HashMap();
|
|
|
+ header.put("Authorization", getAccessToken());
|
|
|
+ header.put("X-Tenant-Id", tbConf.getTenantId());
|
|
|
+ header.put("X-Tenant-Type", TBConf.TENANT_TYPE);
|
|
|
+ return header;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 操作者ID: 若是查询, 以操作人视角作为权限
|
|
|
+ private Map<String, String> initHeaderToken(String operatorId) {
|
|
|
+ Map header = initHeaderToken();
|
|
|
+ header.put("x-operator-id", operatorId);
|
|
|
+ return header;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 加载token, 老版本接口
|
|
|
+ private Map<String, String> initHeaderToken_Bearer() {
|
|
|
+ Map header = initHeaderToken();
|
|
|
+ header.put("Authorization", "Bearer " + header.get("Authorization"));
|
|
|
+ return header;
|
|
|
+ }
|
|
|
+
|
|
|
+// // 操作者ID: 若是查询, 以操作人视角作为权限
|
|
|
+// private Map<String, String> initHeaderToken_Bearer(String operatorId) {
|
|
|
+// Map header = initHeaderToken_Bearer();
|
|
|
+// header.put("x-operator-id", operatorId);
|
|
|
+// return header;
|
|
|
+// }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map> templateSearch(String ptIds, String q) {
|
|
|
+ Map param = new HashMap();
|
|
|
+ param.put("ptIds", ptIds);
|
|
|
+ param.put("q", q);
|
|
|
+ param.put("organizationId", TBConf.TENANT_TYPE);
|
|
|
+ TBR r = (TBR) UtilHttp.doGet(tbConf.getApiHost() + "/v3/project-template/search", initHeaderToken(), param, TBR.class);
|
|
|
+ return (List<Map>) r.getResult();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map projectCreate(String name, String operatorId) {
|
|
|
+ Map param = new HashMap();
|
|
|
+ param.put("organizationId", TBConf.TENANT_TYPE);
|
|
|
+ Map body = new HashMap();
|
|
|
+ body.put("name", name);
|
|
|
+ TBR tbr = (TBR) UtilHttp.doPost(tbConf.getApiHost() + "/v3/project/create", initHeaderToken(operatorId), param, body, TBR.class);
|
|
|
+ return (Map) tbr.getResult();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map projectCreateWithTemplate(String name, String templateId, String operatorId) {
|
|
|
+ Map param = new HashMap();
|
|
|
+ param.put("organizationId", TBConf.TENANT_TYPE);
|
|
|
+ Map body = new HashMap();
|
|
|
+ body.put("name", name);
|
|
|
+ body.put("templateId", templateId);
|
|
|
+ TBR tbr = (TBR) UtilHttp.doPost(tbConf.getApiHost() + "/v3/project/create-from-template", initHeaderToken(operatorId), param, body, TBR.class);
|
|
|
+ return (Map) tbr.getResult();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map> projectDetail(String projectIds, String name, String sourceId) {
|
|
|
+ Map param = new HashMap();
|
|
|
+ param.put("projectIds", projectIds);
|
|
|
+ param.put("name", name);
|
|
|
+ if (StringUtils.isNotBlank(sourceId)) param.put("sourceId", sourceId);
|
|
|
+ TBR tbr = (TBR) UtilHttp.doGet(tbConf.getApiHost() + "/v3/project/query", initHeaderToken(), param, TBR.class);
|
|
|
+ return (List<Map>) tbr.getResult();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map projectUpdate(String projectId, Map<String, String> data, String operatorId) {
|
|
|
+ TBR tbr = (TBR) UtilHttp.doPut(tbConf.getApiHost() + "/v3/project/" + projectId, initHeaderToken(operatorId), data, TBR.class);
|
|
|
+ return (Map) tbr.getResult();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map> userSearch(String query) {
|
|
|
+ Map param = new HashMap();
|
|
|
+ param.put("orgId", tbConf.getTenantId());
|
|
|
+ param.put("query", query);
|
|
|
+ param.put("pageSize", TBConf.PAGE_SIZE_LIMIT);
|
|
|
+ TBR tbr = (TBR) UtilHttp.doGet(tbConf.getApiHost() + "/org/member/search", initHeaderToken_Bearer(), param, TBR.class);
|
|
|
+ return (List<Map>) tbr.getResult();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map> idMapQuery(String tbId, String refer, String refId) {
|
|
|
+ Map param = UtilMap.map("tbId, refer, refId", tbId, refer, refId);
|
|
|
+ TBR tbr = (TBR) UtilHttp.doGet(tbConf.getApiHost() + "/idmap/query", initHeaderToken_Bearer(), param, TBR.class);
|
|
|
+ return (List<Map>) tbr.getResult();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map updateUser(String operatorId, List<Map> members) {
|
|
|
+ Map body = new HashMap();
|
|
|
+ body.put("operatorId", operatorId);
|
|
|
+ body.put("orgId", tbConf.getTenantId());
|
|
|
+ body.put("members", members);
|
|
|
+ TBR tbr = (TBR) UtilHttp.doPut(tbConf.getApiHost() + "/org/member/update", initHeaderToken_Bearer(), body, TBR.class);
|
|
|
+ return (Map) tbr.getResult();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map> createProjectMember(List<String> userIds, String projectId, String operatorId) {
|
|
|
+ Map body = new HashMap();
|
|
|
+ body.put("userIds", userIds);
|
|
|
+ TBR tbr = (TBR) UtilHttp.doPost(tbConf.getApiHost() + "/v3/project/".concat(projectId).concat("/member/create"), initHeaderToken(operatorId), body, TBR.class);
|
|
|
+ return (List<Map>) tbr.getResult();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map> updateProjectMember(List<String> userIds, List<String> roleIds, String projectId) {
|
|
|
+ Map body = new HashMap();
|
|
|
+ body.put("userIds", userIds);
|
|
|
+ body.put("roleIds", roleIds);
|
|
|
+ TBR tbr = (TBR) UtilHttp.doPost(tbConf.getApiHost() + "/v3/project/".concat(projectId).concat("/member/role/assign"), initHeaderToken(), body, TBR.class);
|
|
|
+ return (List<Map>) tbr.getResult();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map> queryProjectRoles(String projectId) {
|
|
|
+ TBR tbr = (TBR) UtilHttp.doGet(tbConf.getApiHost() + "/v3/project/" + projectId + "/role", initHeaderToken(), null, TBR.class);
|
|
|
+ return (List<Map>) tbr.getResult();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map> queryTaskDetail(String taskId, String shortIds, String parentTaskId) {
|
|
|
+ Map param = UtilMap.mapNotNull("taskId, shortIds, parentTaskId", taskId, shortIds, parentTaskId);
|
|
|
+ TBR tbr = (TBR) UtilHttp.doGet(tbConf.getApiHost() + "/v3/task/query", initHeaderToken(), param, TBR.class);
|
|
|
+ return (List<Map>) tbr.getResult();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map updateTaskDueDate(String taskId, String dueDate, String operatorId) {
|
|
|
+ Map body = new HashMap();
|
|
|
+ body.put("dueDate", dueDate);
|
|
|
+ TBR tbr = (TBR) UtilHttp.doPut(tbConf.getApiHost() + "/v3/task/" + taskId + "/dueDate", initHeaderToken(operatorId), body, TBR.class);
|
|
|
+ return (Map) tbr.getResult();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map updateTaskCustomField(String taskId, String operatorId, Map body) {
|
|
|
+ TBR tbr = (TBR) UtilHttp.doPost(tbConf.getApiHost() + "/v3/task/" + taskId + "/customfield/update", initHeaderToken(operatorId), body, TBR.class);
|
|
|
+ return (Map) tbr.getResult();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map updateTaskFlowStatus(String taskId, String operatorId, String taskflowstatusId, String tfsUpdateNote) {
|
|
|
+ Map body = UtilMap.map("taskflowstatusId, tfsUpdateNote", taskflowstatusId, tfsUpdateNote);
|
|
|
+ TBR tbr = (TBR) UtilHttp.doPut(tbConf.getApiHost() + "/v3/task/" + taskId + "/taskflowstatus", initHeaderToken(operatorId), body, TBR.class);
|
|
|
+ return (Map) tbr.getResult();
|
|
|
+ }
|
|
|
+}
|