From 1833b23d8423a3aecafbc4cdfb4eda53d397b5a1 Mon Sep 17 00:00:00 2001 From: zhaojun1998 Date: Mon, 1 Feb 2021 23:11:49 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E6=96=B0=E5=A2=9E=20sharepoint=20?= =?UTF-8?q?=E5=8F=8A=E8=87=AA=E5=8A=A9=E8=8E=B7=E5=8F=96=20siteId=20?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onedrive/SharePointHelperController.java | 125 ++++++++++++++++++ .../model/constant/StorageConfigConstant.java | 2 + .../zfile/model/dto/SharePointInfoVO.java | 18 +++ .../model/dto/StorageStrategyConfig.java | 5 + .../base/AbstractSharePointServiceBase.java | 2 + 5 files changed, 152 insertions(+) create mode 100644 src/main/java/im/zhaojun/zfile/controller/onedrive/SharePointHelperController.java create mode 100644 src/main/java/im/zhaojun/zfile/model/dto/SharePointInfoVO.java diff --git a/src/main/java/im/zhaojun/zfile/controller/onedrive/SharePointHelperController.java b/src/main/java/im/zhaojun/zfile/controller/onedrive/SharePointHelperController.java new file mode 100644 index 0000000..46d42cc --- /dev/null +++ b/src/main/java/im/zhaojun/zfile/controller/onedrive/SharePointHelperController.java @@ -0,0 +1,125 @@ +package im.zhaojun.zfile.controller.onedrive; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; +import im.zhaojun.zfile.model.dto.SharePointInfoVO; +import im.zhaojun.zfile.model.support.ResultBean; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.HashMap; +import java.util.Objects; + +/** + * @author zhaojun + * SharePoint 工具类 + */ +@Controller +@RequestMapping("/sharepoint") +public class SharePointHelperController { + + + /** + * 根据 AccessToken 获取域名前缀 + */ + @PostMapping("/getDomainPrefix") + @ResponseBody + public ResultBean getDomainPrefix(@RequestBody SharePointInfoVO sharePointInfoVO) { + + String host = ""; + + // 判断是标准版还是世纪互联版 + if (Objects.equals(sharePointInfoVO.getType(), "Standard")) { + host = "graph.microsoft.com"; + } else if (Objects.equals(sharePointInfoVO.getType(), "China")) { + host = "microsoftgraph.chinacloudapi.cn"; + } + + // 请求 URL + String requestUrl = StrUtil.format("https://{}/v1.0/sites/root", host); + + // 构建请求认证 Token 信息 + String tokenValue = String.format("%s %s", "Bearer", sharePointInfoVO.getAccessToken()); + HashMap headers = new HashMap<>(); + headers.put("Authorization", tokenValue); + + // 请求接口 + HttpRequest getRequest = HttpUtil.createGet(requestUrl); + HttpResponse execute = getRequest.addHeaders(headers).execute(); + String body = execute.body(); + if (execute.getStatus() != HttpStatus.OK.value()) { + return ResultBean.error(body); + } + + // 解析前缀 + JSONObject jsonObject = JSONObject.parseObject(body); + String hostname = jsonObject.getJSONObject("siteCollection").getString("hostname"); + String domainPrefix = StrUtil.subBefore(hostname, ".sharepoint", false); + return ResultBean.successData(domainPrefix); + } + + @PostMapping("/getSiteId") + @ResponseBody + public ResultBean getSiteId(@RequestBody SharePointInfoVO sharePointInfoVO) { + + // 判断必填参数 + if (sharePointInfoVO == null || sharePointInfoVO.getAccessToken() == null || sharePointInfoVO.getSiteName() == null) { + return ResultBean.error("参数不全"); + } + + String host = ""; + + // 判断是标准版还是世纪互联版 + if (Objects.equals(sharePointInfoVO.getType(), "Standard")) { + host = "graph.microsoft.com"; + sharePointInfoVO.setDomainType("com"); + } else if (Objects.equals(sharePointInfoVO.getType(), "China")) { + host = "microsoftgraph.chinacloudapi.cn"; + sharePointInfoVO.setDomainType("cn"); + } else { + return ResultBean.error("参数不全"); + } + + // 构建请求认证 Token 信息 + String tokenValue = String.format("%s %s", "Bearer", sharePointInfoVO.getAccessToken()); + HashMap authorizationHeaders = new HashMap<>(); + authorizationHeaders.put("Authorization", tokenValue); + + + // 如果没有域名前缀, 则先获取 + if (sharePointInfoVO.getDomainPrefix() == null || sharePointInfoVO.getDomainType() == null) { + String requestUrl = StrUtil.format("https://{}/v1.0/sites/root", host); + HttpRequest getRequest = HttpUtil.createGet(requestUrl); + HttpResponse execute = getRequest.addHeaders(authorizationHeaders).execute(); + String body = execute.body(); + if (execute.getStatus() != HttpStatus.OK.value()) { + return ResultBean.error(body); + } + JSONObject jsonObject = JSONObject.parseObject(body); + String hostname = jsonObject.getJSONObject("siteCollection").getString("hostname"); + String domainPrefix = StrUtil.subBefore(hostname, ".sharepoint", false); + sharePointInfoVO.setDomainPrefix(domainPrefix); + } + + // 请求接口 + String requestUrl = StrUtil.format("https://{}/v1.0/sites/{}.sharepoint.{}:/{}", host, sharePointInfoVO.getDomainPrefix(), sharePointInfoVO.getDomainType(), sharePointInfoVO.getSiteName()); + HttpRequest getRequest = HttpUtil.createGet(requestUrl); + HttpResponse execute = getRequest.addHeaders(authorizationHeaders).execute(); + String body = execute.body(); + + // 解析数据 + if (execute.getStatus() != HttpStatus.OK.value()) { + return ResultBean.error(body); + } + JSONObject jsonObject = JSONObject.parseObject(body); + return ResultBean.successData(jsonObject.getString("id")); + } + +} diff --git a/src/main/java/im/zhaojun/zfile/model/constant/StorageConfigConstant.java b/src/main/java/im/zhaojun/zfile/model/constant/StorageConfigConstant.java index 4d9ecbb..5fe5084 100644 --- a/src/main/java/im/zhaojun/zfile/model/constant/StorageConfigConstant.java +++ b/src/main/java/im/zhaojun/zfile/model/constant/StorageConfigConstant.java @@ -35,6 +35,8 @@ public class StorageConfigConstant { public static final String SHAREPOINT_SITE_ID = "siteId"; + public static final String SHAREPOINT_SITE_NAME = "siteName"; + public static final String PATH_STYLE = "pathStyle"; public static final String IS_PRIVATE = "isPrivate"; diff --git a/src/main/java/im/zhaojun/zfile/model/dto/SharePointInfoVO.java b/src/main/java/im/zhaojun/zfile/model/dto/SharePointInfoVO.java new file mode 100644 index 0000000..5e0ca72 --- /dev/null +++ b/src/main/java/im/zhaojun/zfile/model/dto/SharePointInfoVO.java @@ -0,0 +1,18 @@ +package im.zhaojun.zfile.model.dto; + +import lombok.Data; + +@Data +public class SharePointInfoVO { + + private String type; + + private String accessToken; + + private String domainPrefix; + + private String siteName; + + private String domainType; + +} \ No newline at end of file diff --git a/src/main/java/im/zhaojun/zfile/model/dto/StorageStrategyConfig.java b/src/main/java/im/zhaojun/zfile/model/dto/StorageStrategyConfig.java index c3c0524..8a588f5 100644 --- a/src/main/java/im/zhaojun/zfile/model/dto/StorageStrategyConfig.java +++ b/src/main/java/im/zhaojun/zfile/model/dto/StorageStrategyConfig.java @@ -41,4 +41,9 @@ public class StorageStrategyConfig { private String basePath; private String siteId; + + private String siteName; + + private String siteType; + } \ No newline at end of file diff --git a/src/main/java/im/zhaojun/zfile/service/base/AbstractSharePointServiceBase.java b/src/main/java/im/zhaojun/zfile/service/base/AbstractSharePointServiceBase.java index 5b98bd8..7ef6665 100644 --- a/src/main/java/im/zhaojun/zfile/service/base/AbstractSharePointServiceBase.java +++ b/src/main/java/im/zhaojun/zfile/service/base/AbstractSharePointServiceBase.java @@ -25,7 +25,9 @@ public abstract class AbstractSharePointServiceBase extends MicrosoftDriveServic add(new StorageConfig("accessToken", "访问令牌")); add(new StorageConfig("refreshToken", "刷新令牌")); add(new StorageConfig("basePath", "基路径")); + add(new StorageConfig("siteName", "站点名称")); add(new StorageConfig("siteId", "SiteId")); + add(new StorageConfig("siteType", "siteType")); }}; } }