|
|
@@ -0,0 +1,145 @@
|
|
|
+package cn.reghao.dfs.store.rpc;
|
|
|
+
|
|
|
+import cn.reghao.dfs.api.dto.*;
|
|
|
+import cn.reghao.dfs.api.dto.object.GenerateSignedUrl;
|
|
|
+import cn.reghao.dfs.api.dto.object.GenerateSignedUrlResult;
|
|
|
+import cn.reghao.dfs.api.iface.ObjectService;
|
|
|
+import cn.reghao.dfs.store.db.mapper.FileMetaMapper;
|
|
|
+import cn.reghao.dfs.store.db.mapper.FileTypeMapper;
|
|
|
+import cn.reghao.dfs.store.model.po.FileMeta;
|
|
|
+import cn.reghao.jutil.jdk.converter.DateTimeConverter;
|
|
|
+import cn.reghao.jutil.tool.id.IdGenerator;
|
|
|
+import org.apache.dubbo.config.annotation.DubboService;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author reghao
|
|
|
+ * @date 2023-01-09 15:35:42
|
|
|
+ */
|
|
|
+@DubboService
|
|
|
+@Service
|
|
|
+public class ObjectServiceImpl implements ObjectService {
|
|
|
+ private final FileMetaMapper fileMetaMapper;
|
|
|
+ private final FileTypeMapper fileTypeMapper;
|
|
|
+ private final IdGenerator objectIdGenerator;
|
|
|
+
|
|
|
+ public ObjectServiceImpl(FileMetaMapper fileMetaMapper, FileTypeMapper fileTypeMapper) {
|
|
|
+ this.fileMetaMapper = fileMetaMapper;
|
|
|
+ this.fileTypeMapper = fileTypeMapper;
|
|
|
+ this.objectIdGenerator = new IdGenerator(32, "object-id");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<FileIcon> getFileIcons() {
|
|
|
+ List<FileIcon> list = fileTypeMapper.findAll1();
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public GetObjectsResult list(GetObjects getObjects) {
|
|
|
+ String region = getObjects.getRegion();
|
|
|
+ String bucket = getObjects.getBucket();
|
|
|
+ String prefix = getObjects.getPrefix();
|
|
|
+ String startAfter = getObjects.getMarker();
|
|
|
+ String delimiter = getObjects.getDelimiter();
|
|
|
+ Integer maxKeys = getObjects.getMaxKeys();
|
|
|
+
|
|
|
+ int count = fileMetaMapper.count();
|
|
|
+ List<FileMeta> list;
|
|
|
+ if (startAfter.isBlank()) {
|
|
|
+ list = fileMetaMapper.findAll1(bucket, prefix, maxKeys);
|
|
|
+ } else {
|
|
|
+ list = fileMetaMapper.findAll2(bucket, prefix, startAfter, maxKeys);
|
|
|
+ }
|
|
|
+
|
|
|
+ List<ObjectJson> list1 = list.stream().map(fileMeta -> {
|
|
|
+ ObjectJson objectJson = new ObjectJson();
|
|
|
+ Integer fileTypeId = fileMeta.getFileTypeId();
|
|
|
+ objectJson.setDir(fileTypeId == 1000);
|
|
|
+
|
|
|
+ String objectName = fileMeta.getObjectName();
|
|
|
+ String[] names = objectName.split("/");
|
|
|
+ String name = names[names.length-1];
|
|
|
+ objectJson.setName(name);
|
|
|
+ objectJson.setPath(objectName);
|
|
|
+ long size = fileMeta.getSize();
|
|
|
+ objectJson.setSize(size);
|
|
|
+ objectJson.setFormattedSize(String.valueOf(size));
|
|
|
+ objectJson.setObjectType("Normal");
|
|
|
+ objectJson.setType(fileTypeId);
|
|
|
+ objectJson.setStorageClass("Standard");
|
|
|
+ objectJson.setTimeModified(DateTimeConverter.msTimestamp(fileMeta.getUpdateTime()));
|
|
|
+ return objectJson;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ GetObjectsResult getObjectsResult = new GetObjectsResult();
|
|
|
+ getObjectsResult.setObjectList(list1);
|
|
|
+ getObjectsResult.setBucketName(bucket);
|
|
|
+ getObjectsResult.setDelimiter(delimiter);
|
|
|
+ getObjectsResult.setMaxKeys(maxKeys);
|
|
|
+ getObjectsResult.setObjectSize(0L);
|
|
|
+ getObjectsResult.setTruncated(true);
|
|
|
+ return getObjectsResult;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void createFolder(CreateFolder createFolder) {
|
|
|
+ String objectName = createFolder.getObjectName();
|
|
|
+ List<String> objectNames = new ArrayList<>();
|
|
|
+ String[] names = objectName.split("/");
|
|
|
+ for (int i = 0; i < names.length; i++) {
|
|
|
+ if (i == 0) {
|
|
|
+ objectNames.add(names[i] + "/");
|
|
|
+ } else {
|
|
|
+ String tmp = objectNames.get(i-1) + names[i] + "/";
|
|
|
+ objectNames.add(tmp);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ FileMeta fileMeta;
|
|
|
+ int i = 0;
|
|
|
+ for (; i < objectNames.size(); i++) {
|
|
|
+ fileMeta = fileMetaMapper.findByObjectName(objectNames.get(i));
|
|
|
+ if (fileMeta == null) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ List<FileMeta> list = new ArrayList<>();
|
|
|
+ for (int j = i; j < objectNames.size(); j++) {
|
|
|
+ String objectName1 = objectNames.get(j);
|
|
|
+ String objectId = objectIdGenerator.stringId();
|
|
|
+ String[] names1 = objectName1.split("/");
|
|
|
+ String filename = names1[names1.length-1];
|
|
|
+ list.add(new FileMeta(objectName1, objectId, filename, "tnb"));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!list.isEmpty()) {
|
|
|
+ fileMetaMapper.saveAll(list);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public HeadObjectResult head(HeadObject headObject) {
|
|
|
+ String objectName = headObject.getObjectName();
|
|
|
+ HeadObjectResult headObjectResult = fileMetaMapper.findByObjectName1(objectName);
|
|
|
+ return headObjectResult;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public GenerateSignedUrlResult signedUrl(GenerateSignedUrl generateSignedUrl) {
|
|
|
+ String objectName = generateSignedUrl.getObjectName();
|
|
|
+ String url = String.format("//oss.reghao.cn/object/%s", objectName);
|
|
|
+ // 5 分钟后链接失效
|
|
|
+ long expires = System.currentTimeMillis()/1000 + 300;
|
|
|
+ String ossAccessId = "TMP.3KeSkQJhXm4fZNupmzTEFx8HQ7QobdYnbc4A5do6zvqDnkkHdwyKj2rvJzPCfprxBSfHM6H3tqci21rCnHwWEmVje3PHaA";
|
|
|
+ String signature = "C1NieNpY%2FrmgaHNM2PXTPU3Tshw%3D";
|
|
|
+ String param = String.format("Expires=%s&OSSAccessId=%s&Signature=%s", expires, ossAccessId, signature);
|
|
|
+
|
|
|
+ return new GenerateSignedUrlResult(url, param);
|
|
|
+ }
|
|
|
+}
|