|
|
@@ -0,0 +1,247 @@
|
|
|
+package cn.reghao.oss.mgr.rpc;
|
|
|
+
|
|
|
+import cn.reghao.oss.api.constant.ObjectAction;
|
|
|
+import cn.reghao.oss.api.constant.ObjectScope;
|
|
|
+import cn.reghao.oss.api.constant.ObjectType;
|
|
|
+import cn.reghao.oss.api.dto.*;
|
|
|
+import cn.reghao.oss.api.dto.media.ImageInfo;
|
|
|
+import cn.reghao.oss.api.dto.media.VideoInfo;
|
|
|
+import cn.reghao.oss.api.iface.ConsoleService;
|
|
|
+import cn.reghao.oss.api.iface.StoreService;
|
|
|
+import cn.reghao.oss.api.util.JwtUtils;
|
|
|
+import cn.reghao.oss.mgr.config.UserContext;
|
|
|
+import cn.reghao.oss.mgr.db.mapper.DataBlockMapper;
|
|
|
+import cn.reghao.oss.mgr.db.mapper.FileMetaMapper;
|
|
|
+import cn.reghao.oss.mgr.db.mapper.UploadTaskMapper;
|
|
|
+import cn.reghao.oss.mgr.db.repository.ObjectRepository;
|
|
|
+import cn.reghao.oss.mgr.model.po.*;
|
|
|
+import cn.reghao.oss.mgr.service.StoreConfigService;
|
|
|
+import cn.reghao.oss.mgr.service.StoreNodeService;
|
|
|
+import cn.reghao.oss.mgr.service.UploadChannelService;
|
|
|
+import cn.reghao.oss.mgr.service.UserNodeService;
|
|
|
+import cn.reghao.oss.mgr.util.StringUtil;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.dubbo.config.annotation.DubboService;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author reghao
|
|
|
+ * @date 2024-07-02 10:58:51
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@DubboService
|
|
|
+@Service
|
|
|
+public class ConsoleServiceImpl implements ConsoleService {
|
|
|
+ private final StoreNodeService storeNodeService;
|
|
|
+ private final ObjectRepository objectRepository;
|
|
|
+ private final UploadChannelService uploadChannelService;
|
|
|
+ private final UserNodeService userNodeService;
|
|
|
+ private final StoreConfigService storeConfigService;
|
|
|
+ private final RpcService rpcService;
|
|
|
+ private final UploadTaskMapper uploadTaskMapper;
|
|
|
+ private final FileMetaMapper fileMetaMapper;
|
|
|
+ private final DataBlockMapper dataBlockMapper;
|
|
|
+
|
|
|
+ public ConsoleServiceImpl(StoreNodeService storeNodeService, ObjectRepository objectRepository,
|
|
|
+ UploadChannelService uploadChannelService, UserNodeService userNodeService,
|
|
|
+ StoreConfigService storeConfigService, RpcService rpcService,
|
|
|
+ UploadTaskMapper uploadTaskMapper, FileMetaMapper fileMetaMapper,
|
|
|
+ DataBlockMapper dataBlockMapper) {
|
|
|
+ this.storeNodeService = storeNodeService;
|
|
|
+ this.objectRepository = objectRepository;
|
|
|
+ this.uploadChannelService = uploadChannelService;
|
|
|
+ this.userNodeService = userNodeService;
|
|
|
+ this.storeConfigService = storeConfigService;
|
|
|
+ this.rpcService = rpcService;
|
|
|
+ this.uploadTaskMapper = uploadTaskMapper;
|
|
|
+ this.fileMetaMapper = fileMetaMapper;
|
|
|
+ this.dataBlockMapper = dataBlockMapper;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void registerNode(StoreNodeDto storeNodeDto) {
|
|
|
+ storeNodeService.addOrUpdate(storeNodeDto);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public NodeProperties getNodeProperties(String domain) {
|
|
|
+ UserNode userNode = userNodeService.getUserNodeByDomain(domain);
|
|
|
+ if (userNode != null) {
|
|
|
+ String secretKey = userNode.getDomain();
|
|
|
+ String referer = userNode.getReferer();
|
|
|
+ long owner = userNode.getCreateBy();
|
|
|
+ return new NodeProperties(domain, secretKey, referer, (int) owner);
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ObjectChannel getChannelByCode(int owner, int channelCode) {
|
|
|
+ return uploadChannelService.getObjectChannelByChannelCode(channelCode, owner);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Integer getChannelCodeByUrl(int owner, String url) {
|
|
|
+ List<UploadChannel> uploadChannels = uploadChannelService.getUploadChannelsByCreateBy(owner);
|
|
|
+ String url1 = url.replace("//", "");
|
|
|
+ int idx = url1.indexOf("/");
|
|
|
+ String objectName = url1.substring(idx+1);
|
|
|
+ for (UploadChannel uploadChannel : uploadChannels) {
|
|
|
+ if (objectName.startsWith(uploadChannel.getPrefix())) {
|
|
|
+ return uploadChannel.getChannelCode();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ServerInfo getUploadStore(int channelCode) {
|
|
|
+ long ossUser = storeConfigService.getLocalOssUser();
|
|
|
+ UploadChannel uploadChannel = uploadChannelService.getByChannelCodeAndCreateBy(channelCode, ossUser);
|
|
|
+ if (uploadChannel == null) {
|
|
|
+ String errMsg = String.format("channelCode %s not exist", channelCode);
|
|
|
+ log.error("{}", errMsg);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ UserNode userNode = userNodeService.getUserNode(uploadChannel.getUserNodeId());
|
|
|
+ if (userNode == null) {
|
|
|
+ String errMsg = String.format("channel_code %s not associate with any store_node", uploadChannel.getId());
|
|
|
+ log.error("{}", errMsg);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ String protocol = userNode.getProtocol();
|
|
|
+ String domain = userNode.getDomain();
|
|
|
+ String ossUrl = String.format("%s://%s", protocol, domain);
|
|
|
+ long maxSize = uploadChannel.getMaxSize();
|
|
|
+ long loginUser = UserContext.getUserId();
|
|
|
+ String channelPrefix = uploadChannel.getPrefix();
|
|
|
+ //String contentType = uploadChannel.getFileType();
|
|
|
+ // token 1h 后过期
|
|
|
+ long expireAt = System.currentTimeMillis() + 3600_000L;
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("action", ObjectAction.upload.name());
|
|
|
+ map.put("uploadBy", loginUser);
|
|
|
+ map.put("expireAt", expireAt);
|
|
|
+ map.put("channelPrefix", channelPrefix);
|
|
|
+ //map.put("contentType", contentType);
|
|
|
+ map.put("maxSize", maxSize);
|
|
|
+ String uploadToken = JwtUtils.createToken(map, expireAt);
|
|
|
+ return new ServerInfo(ossUrl, channelCode, maxSize, uploadToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean checkExists(String sha256sum) {
|
|
|
+ log.info("检查文件是否存在...");
|
|
|
+ return objectRepository.getBySha256sum(sha256sum) != null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void bindOnly(ObjectBindDTO objectBindDTO) {
|
|
|
+ String sha256sum = objectBindDTO.getSha256sum();
|
|
|
+ String objectId = objectBindDTO.getObjectId();
|
|
|
+ String objectName = objectBindDTO.getObjectName();
|
|
|
+ String filename = objectBindDTO.getFilename();
|
|
|
+ log.info("添加已存在的文件...");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void registerAndBind(OssUploadResultDTO dto) {
|
|
|
+ log.info("添加新文件...");
|
|
|
+
|
|
|
+ FileMeta fileMeta = new FileMeta(dto);
|
|
|
+ DataBlock dataBlock = new DataBlock(dto);
|
|
|
+ log.info("registry new object with sha256sum -> {}", dto.getSha256sum());
|
|
|
+ objectRepository.saveObject(fileMeta, List.of(dataBlock));
|
|
|
+ }
|
|
|
+
|
|
|
+ public ObjectMeta getObjectMeta(String httpHost, String objectName) {
|
|
|
+ UserNode userNode = userNodeService.getUserNodeByDomain(httpHost);
|
|
|
+ long uploadBy = userNode.getCreateBy();
|
|
|
+ ObjectMeta result = objectRepository.getObjectMetaByName(objectName, uploadBy);
|
|
|
+ //log.info("Object Instance: {}, Name: {}", System.identityHashCode(result), result.getObjectName());
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean validateMultipart(UploadedFile uploadedFile) {
|
|
|
+ String uploadId = uploadedFile.getUploadId();
|
|
|
+ String sha256sum = uploadedFile.getSha256sum();
|
|
|
+ UploadTask uploadTask = uploadTaskMapper.findByUploadId(uploadId);
|
|
|
+ if (uploadTask == null || !uploadTask.getSha256sum().equals(sha256sum)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ String filename = uploadedFile.getFilename();
|
|
|
+ String suffix = StringUtil.getSuffix(filename);
|
|
|
+ String channelPrefix = uploadedFile.getChannelPrefix();
|
|
|
+ String objectName = String.format("%s%s.%s", channelPrefix, uploadId, suffix);
|
|
|
+
|
|
|
+ String contentType = uploadedFile.getContentType();
|
|
|
+ int fileType = ObjectType.Image.getValue();
|
|
|
+ if (contentType.startsWith("video")) {
|
|
|
+ fileType = ObjectType.Video.getValue();
|
|
|
+ } else if (contentType.startsWith("audio")) {
|
|
|
+ fileType = ObjectType.Audio.getValue();
|
|
|
+ } else if (contentType.startsWith("text")) {
|
|
|
+ fileType = ObjectType.Text.getValue();
|
|
|
+ } else if (contentType.startsWith("application")) {
|
|
|
+ fileType = ObjectType.Other.getValue();
|
|
|
+ } else {
|
|
|
+ fileType = ObjectType.Any.getValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ FileMeta fileMeta = new FileMeta(uploadTask, uploadedFile, objectName, fileType);
|
|
|
+ DataBlock dataBlock = new DataBlock(uploadedFile);
|
|
|
+ objectRepository.saveObject(fileMeta, List.of(dataBlock));
|
|
|
+ uploadTaskMapper.updateSetUploaded(uploadId);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void updatePath(String sha256sum, String path) {
|
|
|
+ dataBlockMapper.updatePath(sha256sum, path);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteObject(String objectId) {
|
|
|
+ DataBlock dataBlock = dataBlockMapper.findByObjectId(objectId);
|
|
|
+ String hostPort = dataBlock.getHostPort();
|
|
|
+
|
|
|
+ StoreService storeService = rpcService.getStoreService(hostPort);
|
|
|
+ storeService.deleteFile(dataBlock.getAbsolutePath());
|
|
|
+
|
|
|
+ objectRepository.deleteObject(objectId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setObjectScope(String objectId, int scope) {
|
|
|
+ ObjectScope objectScope = ObjectScope.getByCode(scope);
|
|
|
+ fileMetaMapper.updateScopeByObjectId(objectId, objectScope.getCode());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ObjectInfo getObjectInfo(String objectId) {
|
|
|
+ return objectRepository.getObjectInfo(objectId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public VideoInfo getVideoInfo(String objectId) {
|
|
|
+ DataBlock dataBlock = dataBlockMapper.findByObjectId(objectId);
|
|
|
+ String hostPort = dataBlock.getHostPort();
|
|
|
+ StoreService storeService = rpcService.getStoreService(hostPort);
|
|
|
+
|
|
|
+ VideoInfo videoInfo = storeService.getVideoInfo(dataBlock.getAbsolutePath());
|
|
|
+ return videoInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ImageInfo getImageInfo(String objectId) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+}
|