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 294c085..4d9ecbb 100644 --- a/src/main/java/im/zhaojun/zfile/model/constant/StorageConfigConstant.java +++ b/src/main/java/im/zhaojun/zfile/model/constant/StorageConfigConstant.java @@ -33,6 +33,8 @@ public class StorageConfigConstant { public static final String REFRESH_TOKEN_KEY = "refreshToken"; + public static final String SHAREPOINT_SITE_ID = "siteId"; + 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/StorageStrategyConfig.java b/src/main/java/im/zhaojun/zfile/model/dto/StorageStrategyConfig.java index 6801377..c3c0524 100644 --- a/src/main/java/im/zhaojun/zfile/model/dto/StorageStrategyConfig.java +++ b/src/main/java/im/zhaojun/zfile/model/dto/StorageStrategyConfig.java @@ -40,4 +40,5 @@ public class StorageStrategyConfig { private String basePath; + private String siteId; } \ No newline at end of file diff --git a/src/main/java/im/zhaojun/zfile/model/enums/StorageTypeEnum.java b/src/main/java/im/zhaojun/zfile/model/enums/StorageTypeEnum.java index ee3da78..b37dabe 100644 --- a/src/main/java/im/zhaojun/zfile/model/enums/StorageTypeEnum.java +++ b/src/main/java/im/zhaojun/zfile/model/enums/StorageTypeEnum.java @@ -25,6 +25,8 @@ public enum StorageTypeEnum { S3("s3", "S3通用协议"), ONE_DRIVE("onedrive", "OneDrive"), ONE_DRIVE_CHINA("onedrive-china", "OneDrive 世纪互联"), + SHAREPOINT_DRIVE("sharepoint", "SharePoint"), + SHAREPOINT_DRIVE_CHINA("sharepoint-china", "SharePoint 世纪互联"), QINIU("qiniu", "七牛云 KODO"); private String key; diff --git a/src/main/java/im/zhaojun/zfile/service/base/AbstractOneDriveServiceBase.java b/src/main/java/im/zhaojun/zfile/service/base/AbstractOneDriveServiceBase.java index c39488c..104c94a 100644 --- a/src/main/java/im/zhaojun/zfile/service/base/AbstractOneDriveServiceBase.java +++ b/src/main/java/im/zhaojun/zfile/service/base/AbstractOneDriveServiceBase.java @@ -1,260 +1,26 @@ package im.zhaojun.zfile.service.base; -import cn.hutool.core.util.URLUtil; -import cn.hutool.http.HttpRequest; -import cn.hutool.http.HttpResponse; -import cn.hutool.http.HttpUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import im.zhaojun.zfile.model.constant.StorageConfigConstant; -import im.zhaojun.zfile.model.constant.ZFileConstant; -import im.zhaojun.zfile.model.dto.FileItemDTO; import im.zhaojun.zfile.model.entity.StorageConfig; -import im.zhaojun.zfile.model.enums.FileTypeEnum; -import im.zhaojun.zfile.model.support.OneDriveToken; -import im.zhaojun.zfile.repository.StorageConfigRepository; -import im.zhaojun.zfile.service.StorageConfigService; -import im.zhaojun.zfile.util.StringUtils; import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Lazy; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.RestTemplate; -import javax.annotation.Resource; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.List; /** * @author Zhao Jun */ @Slf4j -public abstract class AbstractOneDriveServiceBase extends AbstractBaseFileService { - - protected static final String DRIVER_INFO_URL = "https://{graphEndPoint}/v1.0/me/drives"; - - protected static final String DRIVER_ROOT_URL = "https://{graphEndPoint}/v1.0/me/drive/root/children"; - - protected static final String DRIVER_ITEMS_URL = "https://{graphEndPoint}/v1.0/me/drive/root:{path}:/children"; - - protected static final String DRIVER_ITEM_URL = "https://{graphEndPoint}/v1.0/me/drive/root:{path}"; - - protected static final String AUTHENTICATE_URL = "https://{authenticateEndPoint}/common/oauth2/v2.0/token"; - - private static final String ONE_DRIVE_FILE_FLAG = "file"; - - @Resource - @Lazy - private RestTemplate oneDriveRestTemplate; - - @Resource - private StorageConfigRepository storageConfigRepository; - - @Resource - private StorageConfigService storageConfigService; - - /** - * 根据 RefreshToken 刷新 AccessToken, 返回刷新后的 Token. - * - * @return 刷新后的 Token - */ - public OneDriveToken getRefreshToken() { - StorageConfig refreshStorageConfig = - storageConfigRepository.findByDriveIdAndKey(driveId, StorageConfigConstant.REFRESH_TOKEN_KEY); - - String param = "client_id=" + getClientId() + - "&redirect_uri=" + getRedirectUri() + - "&client_secret=" + getClientSecret() + - "&refresh_token=" + refreshStorageConfig.getValue() + - "&grant_type=refresh_token"; - - String fullAuthenticateUrl = AUTHENTICATE_URL.replace("{authenticateEndPoint}", getAuthenticateEndPoint()); - HttpRequest post = HttpUtil.createPost(fullAuthenticateUrl); - - post.body(param, "application/x-www-form-urlencoded"); - HttpResponse response = post.execute(); - return JSONObject.parseObject(response.body(), OneDriveToken.class); - } - - /** - * OAuth2 协议中, 根据 code 换取 access_token 和 refresh_token. - * - * @param code - * 代码 - * - * @return 获取的 Token 信息. - */ - public OneDriveToken getToken(String code) { - String param = "client_id=" + getClientId() + - "&redirect_uri=" + getRedirectUri() + - "&client_secret=" + getClientSecret() + - "&code=" + code + - "&scope=" + getScope() + - "&grant_type=authorization_code"; - - String fullAuthenticateUrl = AUTHENTICATE_URL.replace("{authenticateEndPoint}", getAuthenticateEndPoint()); - HttpRequest post = HttpUtil.createPost(fullAuthenticateUrl); - - post.body(param, "application/x-www-form-urlencoded"); - HttpResponse response = post.execute(); - return JSONObject.parseObject(response.body(), OneDriveToken.class); - } +public abstract class AbstractOneDriveServiceBase extends MicrosoftDriveServiceBase { @Override - public List fileList(String path) { - path = StringUtils.removeFirstSeparator(path); - String fullPath = StringUtils.getFullPath(basePath, path); - - List result = new ArrayList<>(); - String nextLink = null; - - do { - - String requestUrl; - - if (nextLink != null) { - nextLink = nextLink.replace("+", "%2B"); - requestUrl = URLUtil.decode(nextLink); - }else if (ZFileConstant.PATH_SEPARATOR.equalsIgnoreCase(fullPath) || "".equalsIgnoreCase(fullPath)) { - requestUrl = DRIVER_ROOT_URL; - } else { - requestUrl = DRIVER_ITEMS_URL; - } - fullPath = StringUtils.removeLastSeparator(fullPath); - - JSONObject root; - - HttpHeaders headers = new HttpHeaders(); - headers.set("driveId", driveId.toString()); - HttpEntity entity = new HttpEntity<>(headers); - - try { - root = oneDriveRestTemplate.exchange(requestUrl, HttpMethod.GET, entity, JSONObject.class, getGraphEndPoint(), fullPath).getBody(); - } catch (HttpClientErrorException e) { - log.debug("调用 OneDrive 时出现了网络异常, 已尝试重新刷新 token 后再试.", e); - refreshOneDriveToken(); - root = oneDriveRestTemplate.exchange(requestUrl, HttpMethod.GET, entity, JSONObject.class, getGraphEndPoint(), fullPath).getBody(); - } - - if (root == null) { - return Collections.emptyList(); - } - - nextLink = root.getString("@odata.nextLink"); - - JSONArray fileList = root.getJSONArray("value"); - - for (int i = 0; i < fileList.size(); i++) { - - FileItemDTO fileItemDTO = new FileItemDTO(); - JSONObject fileItem = fileList.getJSONObject(i); - fileItemDTO.setName(fileItem.getString("name")); - fileItemDTO.setSize(fileItem.getLong("size")); - fileItemDTO.setTime(fileItem.getDate("lastModifiedDateTime")); - - if (fileItem.containsKey("file")) { - fileItemDTO.setUrl(fileItem.getString("@microsoft.graph.downloadUrl")); - fileItemDTO.setType(FileTypeEnum.FILE); - } else { - fileItemDTO.setType(FileTypeEnum.FOLDER); - } - - fileItemDTO.setPath(path); - result.add(fileItemDTO); - } - } while (nextLink != null); - - return result; + public String getType() { + return "me"; } + @Override - public FileItemDTO getFileItem(String path) { - - String fullPath = StringUtils.getFullPath(basePath, path); - - HttpHeaders headers = new HttpHeaders(); - headers.set("driveId", driveId.toString()); - HttpEntity entity = new HttpEntity<>(headers); - - JSONObject fileItem = oneDriveRestTemplate.exchange(DRIVER_ITEM_URL, HttpMethod.GET, entity, JSONObject.class, getGraphEndPoint(), fullPath).getBody(); - - if (fileItem == null) { - return null; - } - - FileItemDTO fileItemDTO = new FileItemDTO(); - fileItemDTO.setName(fileItem.getString("name")); - fileItemDTO.setSize(fileItem.getLong("size")); - fileItemDTO.setTime(fileItem.getDate("lastModifiedDateTime")); - - if (fileItem.containsKey(ONE_DRIVE_FILE_FLAG)) { - fileItemDTO.setUrl(fileItem.getString("@microsoft.graph.downloadUrl")); - fileItemDTO.setType(FileTypeEnum.FILE); - } else { - fileItemDTO.setType(FileTypeEnum.FOLDER); - } - - fileItemDTO.setPath(path); - return fileItemDTO; - } - - - /** - * 获取 GraphEndPoint, 对于不同版本的 OneDrive, 此地址会不同. - * @return Graph 连接点 - */ - public abstract String getGraphEndPoint(); - - - /** - * 获取 AuthenticateEndPoint, 对于不同版本的 OneDrive, 此地址会不同. - * @return Authenticate 连接点 - */ - public abstract String getAuthenticateEndPoint(); - - /** - * 获取 Client ID. - * @return Client Id - */ - public abstract String getClientId(); - - /** - * 获取重定向地址. - * @return 重定向地址 - */ - public abstract String getRedirectUri(); - - /** - * 获取 Client Secret 密钥. - * @return Client Secret 密钥. - */ - public abstract String getClientSecret(); - - /** - * 获取 API Scope. - * @return Scope - */ - public abstract String getScope(); - - public void refreshOneDriveToken() { - OneDriveToken refreshToken = getRefreshToken(); - - if (refreshToken.getAccessToken() == null || refreshToken.getRefreshToken() == null) { - return; - } - - StorageConfig accessTokenConfig = - storageConfigService.findByDriveIdAndKey(driveId, StorageConfigConstant.ACCESS_TOKEN_KEY); - StorageConfig refreshTokenConfig = - storageConfigService.findByDriveIdAndKey(driveId, StorageConfigConstant.REFRESH_TOKEN_KEY); - accessTokenConfig.setValue(refreshToken.getAccessToken()); - refreshTokenConfig.setValue(refreshToken.getRefreshToken()); - - storageConfigService.updateStorageConfig(Arrays.asList(accessTokenConfig, refreshTokenConfig)); + public String getDownloadUrl(String path) { + return null; } @Override @@ -265,5 +31,4 @@ public abstract class AbstractOneDriveServiceBase extends AbstractBaseFileServic add(new StorageConfig("basePath", "基路径")); }}; } - } \ 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 new file mode 100644 index 0000000..5b98bd8 --- /dev/null +++ b/src/main/java/im/zhaojun/zfile/service/base/AbstractSharePointServiceBase.java @@ -0,0 +1,31 @@ +package im.zhaojun.zfile.service.base; + +import im.zhaojun.zfile.model.entity.StorageConfig; + +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractSharePointServiceBase extends MicrosoftDriveServiceBase { + + protected String siteId; + + @Override + public String getType() { + return "sites/" + siteId; + } + + @Override + public String getDownloadUrl(String path) { + return null; + } + + @Override + public List storageStrategyConfigList() { + return new ArrayList() {{ + add(new StorageConfig("accessToken", "访问令牌")); + add(new StorageConfig("refreshToken", "刷新令牌")); + add(new StorageConfig("basePath", "基路径")); + add(new StorageConfig("siteId", "SiteId")); + }}; + } +} diff --git a/src/main/java/im/zhaojun/zfile/service/base/MicrosoftDriveServiceBase.java b/src/main/java/im/zhaojun/zfile/service/base/MicrosoftDriveServiceBase.java new file mode 100644 index 0000000..433e094 --- /dev/null +++ b/src/main/java/im/zhaojun/zfile/service/base/MicrosoftDriveServiceBase.java @@ -0,0 +1,261 @@ +package im.zhaojun.zfile.service.base; + +import cn.hutool.core.util.URLUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import im.zhaojun.zfile.model.constant.StorageConfigConstant; +import im.zhaojun.zfile.model.constant.ZFileConstant; +import im.zhaojun.zfile.model.dto.FileItemDTO; +import im.zhaojun.zfile.model.entity.StorageConfig; +import im.zhaojun.zfile.model.enums.FileTypeEnum; +import im.zhaojun.zfile.model.support.OneDriveToken; +import im.zhaojun.zfile.repository.StorageConfigRepository; +import im.zhaojun.zfile.service.StorageConfigService; +import im.zhaojun.zfile.util.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +@Slf4j +public abstract class MicrosoftDriveServiceBase extends AbstractBaseFileService { + + protected static final String DRIVER_ROOT_URL = "https://{graphEndPoint}/v1.0/{type}/drive/root/children"; + + protected static final String DRIVER_ITEMS_URL = "https://{graphEndPoint}/v1.0/{type}/drive/root:{path}:/children"; + + protected static final String DRIVER_ITEM_URL = "https://{graphEndPoint}/v1.0/{type}/drive/root:{path}"; + + protected static final String AUTHENTICATE_URL = "https://{authenticateEndPoint}/common/oauth2/v2.0/token"; + + private static final String ONE_DRIVE_FILE_FLAG = "file"; + + @Resource + @Lazy + private RestTemplate oneDriveRestTemplate; + + @Resource + private StorageConfigRepository storageConfigRepository; + + @Resource + private StorageConfigService storageConfigService; + + /** + * 根据 RefreshToken 刷新 AccessToken, 返回刷新后的 Token. + * + * @return 刷新后的 Token + */ + public OneDriveToken getRefreshToken() { + StorageConfig refreshStorageConfig = + storageConfigRepository.findByDriveIdAndKey(driveId, StorageConfigConstant.REFRESH_TOKEN_KEY); + + String param = "client_id=" + getClientId() + + "&redirect_uri=" + getRedirectUri() + + "&client_secret=" + getClientSecret() + + "&refresh_token=" + refreshStorageConfig.getValue() + + "&grant_type=refresh_token"; + + String fullAuthenticateUrl = AUTHENTICATE_URL.replace("{authenticateEndPoint}", getAuthenticateEndPoint()); + HttpRequest post = HttpUtil.createPost(fullAuthenticateUrl); + + post.body(param, "application/x-www-form-urlencoded"); + HttpResponse response = post.execute(); + return JSONObject.parseObject(response.body(), OneDriveToken.class); + } + + /** + * OAuth2 协议中, 根据 code 换取 access_token 和 refresh_token. + * + * @param code + * 代码 + * + * @return 获取的 Token 信息. + */ + public OneDriveToken getToken(String code) { + String param = "client_id=" + getClientId() + + "&redirect_uri=" + getRedirectUri() + + "&client_secret=" + getClientSecret() + + "&code=" + code + + "&scope=" + getScope() + + "&grant_type=authorization_code"; + + String fullAuthenticateUrl = AUTHENTICATE_URL.replace("{authenticateEndPoint}", getAuthenticateEndPoint()); + HttpRequest post = HttpUtil.createPost(fullAuthenticateUrl); + + post.body(param, "application/x-www-form-urlencoded"); + HttpResponse response = post.execute(); + return JSONObject.parseObject(response.body(), OneDriveToken.class); + } + + @Override + public List fileList(String path) { + path = StringUtils.removeFirstSeparator(path); + String fullPath = StringUtils.getFullPath(basePath, path); + + List result = new ArrayList<>(); + String nextLink = null; + + do { + + String requestUrl; + + if (nextLink != null) { + nextLink = nextLink.replace("+", "%2B"); + requestUrl = URLUtil.decode(nextLink); + }else if (ZFileConstant.PATH_SEPARATOR.equalsIgnoreCase(fullPath) || "".equalsIgnoreCase(fullPath)) { + requestUrl = DRIVER_ROOT_URL; + } else { + requestUrl = DRIVER_ITEMS_URL; + } + fullPath = StringUtils.removeLastSeparator(fullPath); + + JSONObject root; + + HttpHeaders headers = new HttpHeaders(); + headers.set("driveId", driveId.toString()); + HttpEntity entity = new HttpEntity<>(headers); + + try { + root = oneDriveRestTemplate.exchange(requestUrl, HttpMethod.GET, entity, JSONObject.class, getGraphEndPoint(), getType(), fullPath).getBody(); + } catch (HttpClientErrorException e) { + log.debug("调用 OneDrive 时出现了网络异常, 已尝试重新刷新 token 后再试.", e); + refreshOneDriveToken(); + root = oneDriveRestTemplate.exchange(requestUrl, HttpMethod.GET, entity, JSONObject.class, getGraphEndPoint(), getType(), fullPath).getBody(); + } + + if (root == null) { + return Collections.emptyList(); + } + + nextLink = root.getString("@odata.nextLink"); + + JSONArray fileList = root.getJSONArray("value"); + + for (int i = 0; i < fileList.size(); i++) { + + FileItemDTO fileItemDTO = new FileItemDTO(); + JSONObject fileItem = fileList.getJSONObject(i); + fileItemDTO.setName(fileItem.getString("name")); + fileItemDTO.setSize(fileItem.getLong("size")); + fileItemDTO.setTime(fileItem.getDate("lastModifiedDateTime")); + + if (fileItem.containsKey("file")) { + fileItemDTO.setUrl(fileItem.getString("@microsoft.graph.downloadUrl")); + fileItemDTO.setType(FileTypeEnum.FILE); + } else { + fileItemDTO.setType(FileTypeEnum.FOLDER); + } + + fileItemDTO.setPath(path); + result.add(fileItemDTO); + } + } while (nextLink != null); + + return result; + } + + @Override + public FileItemDTO getFileItem(String path) { + + String fullPath = StringUtils.getFullPath(basePath, path); + + HttpHeaders headers = new HttpHeaders(); + headers.set("driveId", driveId.toString()); + HttpEntity entity = new HttpEntity<>(headers); + + JSONObject fileItem = oneDriveRestTemplate.exchange(DRIVER_ITEM_URL, HttpMethod.GET, entity, JSONObject.class, getGraphEndPoint(), getType(), fullPath).getBody(); + + if (fileItem == null) { + return null; + } + + FileItemDTO fileItemDTO = new FileItemDTO(); + fileItemDTO.setName(fileItem.getString("name")); + fileItemDTO.setSize(fileItem.getLong("size")); + fileItemDTO.setTime(fileItem.getDate("lastModifiedDateTime")); + + if (fileItem.containsKey(ONE_DRIVE_FILE_FLAG)) { + fileItemDTO.setUrl(fileItem.getString("@microsoft.graph.downloadUrl")); + fileItemDTO.setType(FileTypeEnum.FILE); + } else { + fileItemDTO.setType(FileTypeEnum.FOLDER); + } + + fileItemDTO.setPath(path); + return fileItemDTO; + } + + + /** + * 获取存储类型, 对于 OneDrive 或 SharePoint, 此地址会不同. + * @return Graph 连接点 + */ + public abstract String getType(); + + /** + * 获取 GraphEndPoint, 对于不同版本的 OneDrive, 此地址会不同. + * @return Graph 连接点 + */ + public abstract String getGraphEndPoint(); + + + /** + * 获取 AuthenticateEndPoint, 对于不同版本的 OneDrive, 此地址会不同. + * @return Authenticate 连接点 + */ + public abstract String getAuthenticateEndPoint(); + + /** + * 获取 Client ID. + * @return Client Id + */ + public abstract String getClientId(); + + /** + * 获取重定向地址. + * @return 重定向地址 + */ + public abstract String getRedirectUri(); + + /** + * 获取 Client Secret 密钥. + * @return Client Secret 密钥. + */ + public abstract String getClientSecret(); + + /** + * 获取 API Scope. + * @return Scope + */ + public abstract String getScope(); + + public void refreshOneDriveToken() { + OneDriveToken refreshToken = getRefreshToken(); + + if (refreshToken.getAccessToken() == null || refreshToken.getRefreshToken() == null) { + return; + } + + StorageConfig accessTokenConfig = + storageConfigService.findByDriveIdAndKey(driveId, StorageConfigConstant.ACCESS_TOKEN_KEY); + StorageConfig refreshTokenConfig = + storageConfigService.findByDriveIdAndKey(driveId, StorageConfigConstant.REFRESH_TOKEN_KEY); + accessTokenConfig.setValue(refreshToken.getAccessToken()); + refreshTokenConfig.setValue(refreshToken.getRefreshToken()); + + storageConfigService.updateStorageConfig(Arrays.asList(accessTokenConfig, refreshTokenConfig)); + } + +} diff --git a/src/main/java/im/zhaojun/zfile/service/impl/LocalServiceImpl.java b/src/main/java/im/zhaojun/zfile/service/impl/LocalServiceImpl.java index 344019d..74d2827 100644 --- a/src/main/java/im/zhaojun/zfile/service/impl/LocalServiceImpl.java +++ b/src/main/java/im/zhaojun/zfile/service/impl/LocalServiceImpl.java @@ -123,7 +123,7 @@ public class LocalServiceImpl extends AbstractBaseFileService implements BaseFil @Override public FileItemDTO getFileItem(String path) { - String fullPath = StringUtils.concatPath(filePath, path); + String fullPath = filePath + path; File file = new File(fullPath); diff --git a/src/main/java/im/zhaojun/zfile/service/impl/OneDriveChinaServiceImpl.java b/src/main/java/im/zhaojun/zfile/service/impl/OneDriveChinaServiceImpl.java index 0edf2ad..eb18af9 100644 --- a/src/main/java/im/zhaojun/zfile/service/impl/OneDriveChinaServiceImpl.java +++ b/src/main/java/im/zhaojun/zfile/service/impl/OneDriveChinaServiceImpl.java @@ -58,11 +58,6 @@ public class OneDriveChinaServiceImpl extends AbstractOneDriveServiceBase implem } } - @Override - public String getDownloadUrl(String path) { - return null; - } - @Override public StorageTypeEnum getStorageTypeEnum() { return StorageTypeEnum.ONE_DRIVE_CHINA; diff --git a/src/main/java/im/zhaojun/zfile/service/impl/OneDriveServiceImpl.java b/src/main/java/im/zhaojun/zfile/service/impl/OneDriveServiceImpl.java index 85db90e..08445d1 100644 --- a/src/main/java/im/zhaojun/zfile/service/impl/OneDriveServiceImpl.java +++ b/src/main/java/im/zhaojun/zfile/service/impl/OneDriveServiceImpl.java @@ -58,11 +58,6 @@ public class OneDriveServiceImpl extends AbstractOneDriveServiceBase implements } } - @Override - public String getDownloadUrl(String path) { - return null; - } - @Override public StorageTypeEnum getStorageTypeEnum() { return StorageTypeEnum.ONE_DRIVE; diff --git a/src/main/java/im/zhaojun/zfile/service/impl/SharePointChinaServiceImpl.java b/src/main/java/im/zhaojun/zfile/service/impl/SharePointChinaServiceImpl.java new file mode 100644 index 0000000..8aa8721 --- /dev/null +++ b/src/main/java/im/zhaojun/zfile/service/impl/SharePointChinaServiceImpl.java @@ -0,0 +1,97 @@ +package im.zhaojun.zfile.service.impl; + +import im.zhaojun.zfile.model.constant.StorageConfigConstant; +import im.zhaojun.zfile.model.entity.StorageConfig; +import im.zhaojun.zfile.model.enums.StorageTypeEnum; +import im.zhaojun.zfile.service.StorageConfigService; +import im.zhaojun.zfile.service.base.AbstractSharePointServiceBase; +import im.zhaojun.zfile.service.base.BaseFileService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * @author zhaojun + */ +@Service +@Slf4j +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class SharePointChinaServiceImpl extends AbstractSharePointServiceBase implements BaseFileService { + + @Resource + private StorageConfigService storageConfigService; + + @Value("${zfile.onedrive-china.clientId}") + private String clientId; + + @Value("${zfile.onedrive-china.redirectUri}") + private String redirectUri; + + @Value("${zfile.onedrive-china.clientSecret}") + private String clientSecret; + + @Value("${zfile.onedrive-china.scope}") + private String scope; + + @Override + public void init(Integer driveId) { + this.driveId = driveId; + Map stringStorageConfigMap = + storageConfigService.selectStorageConfigMapByDriveId(driveId); + String accessToken = stringStorageConfigMap.get(StorageConfigConstant.ACCESS_TOKEN_KEY).getValue(); + String refreshToken = stringStorageConfigMap.get(StorageConfigConstant.REFRESH_TOKEN_KEY).getValue(); + super.siteId = stringStorageConfigMap.get(StorageConfigConstant.SHAREPOINT_SITE_ID).getValue(); + super.basePath = stringStorageConfigMap.get(StorageConfigConstant.BASE_PATH).getValue(); + + if (StringUtils.isEmpty(accessToken) || StringUtils.isEmpty(refreshToken)) { + log.debug("初始化存储策略 [{}] 失败: 参数不完整", getStorageTypeEnum().getDescription()); + isInitialized = false; + } else { + refreshOneDriveToken(); + testConnection(); + isInitialized = true; + } + } + + @Override + public StorageTypeEnum getStorageTypeEnum() { + return StorageTypeEnum.SHAREPOINT_DRIVE_CHINA; + } + + @Override + public String getGraphEndPoint() { + return "microsoftgraph.chinacloudapi.cn"; + } + + @Override + public String getAuthenticateEndPoint() { + return "login.partner.microsoftonline.cn"; + } + + @Override + public String getClientId() { + return clientId; + } + + @Override + public String getRedirectUri() { + return redirectUri; + } + + @Override + public String getClientSecret() { + return clientSecret; + } + + @Override + public String getScope() { + return scope; + } + +} \ No newline at end of file diff --git a/src/main/java/im/zhaojun/zfile/service/impl/SharePointServiceImpl.java b/src/main/java/im/zhaojun/zfile/service/impl/SharePointServiceImpl.java new file mode 100644 index 0000000..3ef8a7a --- /dev/null +++ b/src/main/java/im/zhaojun/zfile/service/impl/SharePointServiceImpl.java @@ -0,0 +1,97 @@ +package im.zhaojun.zfile.service.impl; + +import im.zhaojun.zfile.model.constant.StorageConfigConstant; +import im.zhaojun.zfile.model.entity.StorageConfig; +import im.zhaojun.zfile.model.enums.StorageTypeEnum; +import im.zhaojun.zfile.service.StorageConfigService; +import im.zhaojun.zfile.service.base.AbstractSharePointServiceBase; +import im.zhaojun.zfile.service.base.BaseFileService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * @author zhaojun + */ +@Service +@Slf4j +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class SharePointServiceImpl extends AbstractSharePointServiceBase implements BaseFileService { + + @Resource + private StorageConfigService storageConfigService; + + @Value("${zfile.onedrive.clientId}") + protected String clientId; + + @Value("${zfile.onedrive.redirectUri}") + protected String redirectUri; + + @Value("${zfile.onedrive.clientSecret}") + protected String clientSecret; + + @Value("${zfile.onedrive.scope}") + protected String scope; + + @Override + public void init(Integer driveId) { + this.driveId = driveId; + Map stringStorageConfigMap = + storageConfigService.selectStorageConfigMapByDriveId(driveId); + String accessToken = stringStorageConfigMap.get(StorageConfigConstant.ACCESS_TOKEN_KEY).getValue(); + String refreshToken = stringStorageConfigMap.get(StorageConfigConstant.REFRESH_TOKEN_KEY).getValue(); + super.siteId = stringStorageConfigMap.get(StorageConfigConstant.SHAREPOINT_SITE_ID).getValue(); + super.basePath = stringStorageConfigMap.get(StorageConfigConstant.BASE_PATH).getValue(); + + if (StringUtils.isEmpty(accessToken) || StringUtils.isEmpty(refreshToken)) { + log.debug("初始化存储策略 [{}] 失败: 参数不完整", getStorageTypeEnum().getDescription()); + isInitialized = false; + } else { + refreshOneDriveToken(); + testConnection(); + isInitialized = true; + } + } + + @Override + public StorageTypeEnum getStorageTypeEnum() { + return StorageTypeEnum.SHAREPOINT_DRIVE; + } + + @Override + public String getGraphEndPoint() { + return "graph.microsoft.com"; + } + + @Override + public String getAuthenticateEndPoint() { + return "login.microsoftonline.com"; + } + + @Override + public String getClientId() { + return clientId; + } + + @Override + public String getRedirectUri() { + return redirectUri; + } + + @Override + public String getClientSecret() { + return clientSecret; + } + + @Override + public String getScope() { + return scope; + } + +} \ No newline at end of file