ソースを参照

大改动, FileMeta 的 objectName 字段联合 uploadBy 字段作为唯一约束

reghao 1 年間 前
コミット
4fb2e30317

+ 6 - 18
oss-api/src/main/java/cn/reghao/oss/api/dto/NodeProperties.java

@@ -1,33 +1,21 @@
 package cn.reghao.oss.api.dto;
 
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
 import java.io.Serializable;
 
 /**
  * @author reghao
  * @date 2024-03-01 09:22:17
  */
+@AllArgsConstructor
+@Getter
 public class NodeProperties implements Serializable {
     private static final long serialVersionUID = 1L;
 
     private String domain;
     private String secretKey;
     private String referer;
-
-    public NodeProperties(String domain, String secretKey, String referer) {
-        this.domain = domain;
-        this.secretKey = secretKey;
-        this.referer = referer;
-    }
-
-    public String getDomain() {
-        return domain;
-    }
-
-    public String getSecretKey() {
-        return secretKey;
-    }
-
-    public String getReferer() {
-        return referer;
-    }
+    private int owner;
 }

+ 1 - 5
oss-api/src/main/java/cn/reghao/oss/api/dto/ObjectChannel.java

@@ -15,14 +15,10 @@ public class ObjectChannel implements Serializable {
     private static final long serialVersionUID = 1L;
 
     private Integer id;
-    @Deprecated
-    private Integer channelId;
-    //private Integer channelCode;
+    private Integer channelCode;
     private String prefix;
     private Long maxSize;
-    @Deprecated
     private Integer fileType;
-    //private Integer objectType;
     private Boolean seturl;
     private Integer scope;
     private String domain;

+ 5 - 4
oss-api/src/main/java/cn/reghao/oss/api/iface/StoreService.java

@@ -19,14 +19,15 @@ import java.util.List;
  * @date 2023-08-01 14:51:50
  */
 public interface StoreService {
-    void createChannel(int owner, String channelPrefix, int scope);
-    int countChannelObjects(String channelPrefix, int owner);
     List<DiskVolume> getDiskVolumes();
     String getUploadToken(int channelCode, int owner, int expire);
 
+    void createChannel(int owner, String channelPrefix, int scope);
+    int countChannelObjects(String channelPrefix, int owner);
+
     void setObjectScope(String objectId, int scope);
     void deleteByObjectId(String objectId);
-    void deleteByObjectName(String objectName);
+    void deleteByObjectName(String objectName, int owner);
     ObjectInfo getObjectInfo(String objectId);
     String getSignedUrl(String domain, int owner, String objectId, int expire);
 
@@ -35,5 +36,5 @@ public interface StoreService {
     ConvertedImageInfo getWebpInfo(String objectId);
     AudioInfo getAudioInfo(String objectId);
 
-    PageList<FileInfo> getByPrefix(String objectName, int pn, int ps);
+    PageList<FileInfo> getByPrefix(int owner, String objectName, int pn, int ps);
 }

+ 5 - 6
oss-store/src/main/java/cn/reghao/oss/store/config/SpringLifecycle.java

@@ -2,9 +2,9 @@ package cn.reghao.oss.store.config;
 
 import cn.reghao.oss.api.dto.StoreNodeDto;
 import cn.reghao.oss.api.dto.disk.DiskVolume;
+import cn.reghao.oss.api.iface.ConsoleService;
 import cn.reghao.oss.api.iface.StoreService;
 import cn.reghao.oss.store.config.props.SpringProperties;
-import cn.reghao.oss.store.service.StoreLocalService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.boot.ApplicationArguments;
@@ -22,13 +22,12 @@ import java.util.List;
 public class SpringLifecycle implements ApplicationRunner, DisposableBean {
     private final SpringProperties springProperties;
     private final StoreService storeService;
-    private final StoreLocalService storeLocalService;
+    private final ConsoleService consoleService;
 
-    public SpringLifecycle(SpringProperties springProperties, StoreService storeService,
-                           StoreLocalService storeLocalService) {
+    public SpringLifecycle(SpringProperties springProperties, StoreService storeService, ConsoleService consoleService) {
         this.springProperties = springProperties;
         this.storeService = storeService;
-        this.storeLocalService = storeLocalService;
+        this.consoleService = consoleService;
     }
 
     @Override
@@ -43,7 +42,7 @@ public class SpringLifecycle implements ApplicationRunner, DisposableBean {
         int rpcPort = springProperties.getRpcPort();
         List<DiskVolume> diskVolumeList = storeService.getDiskVolumes();
         StoreNodeDto storeNodeDto = new StoreNodeDto(nodeAddr, httpPort, rpcPort, diskVolumeList);
-        storeLocalService.register(storeNodeDto);
+        consoleService.registerNode(storeNodeDto);
         log.info("StoreNode 已注册到 oss-console...");
     }
 

+ 1 - 9
oss-store/src/main/java/cn/reghao/oss/store/config/inerceptor/AccessLogInterceptor.java

@@ -1,8 +1,6 @@
 package cn.reghao.oss.store.config.inerceptor;
 
 import cn.reghao.jutil.web.ServletUtil;
-import cn.reghao.oss.api.dto.NodeProperties;
-import cn.reghao.oss.store.service.StoreLocalService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
@@ -21,12 +19,6 @@ import javax.servlet.http.HttpServletResponse;
 @Slf4j
 @Component
 public class AccessLogInterceptor implements HandlerInterceptor {
-    private final StoreLocalService storeLocalService;
-
-    public AccessLogInterceptor(StoreLocalService storeLocalService) {
-        this.storeLocalService = storeLocalService;
-    }
-
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         String uri = request.getRequestURI();
@@ -45,7 +37,7 @@ public class AccessLogInterceptor implements HandlerInterceptor {
 
         /*String host = ServletUtil.getHeader("host");
         String referFrom = null;
-        NodeProperties nodeProperties = storeLocalService.getNodeProperties(host);
+        NodeProperties nodeProperties = consoleService.getNodeProperties(host);
         if (nodeProperties != null) {
             referFrom = nodeProperties.getReferer();
         }

+ 9 - 7
oss-store/src/main/java/cn/reghao/oss/store/controller/ObjectGetController.java

@@ -5,9 +5,9 @@ import cn.reghao.oss.api.constant.ChannelAction;
 import cn.reghao.oss.api.constant.ObjectScope;
 import cn.reghao.oss.api.dto.ObjectChannel;
 import cn.reghao.oss.api.dto.ObjectMeta;
+import cn.reghao.oss.api.iface.ConsoleService;
 import cn.reghao.oss.store.db.repository.ObjectRepository;
 import cn.reghao.oss.store.service.GetObjectService;
-import cn.reghao.oss.store.service.StoreLocalService;
 import cn.reghao.oss.api.util.JwtUtil;
 import cn.reghao.oss.store.util.ObjectUtil;
 import cn.reghao.oss.store.util.SignatureUtil;
@@ -29,14 +29,14 @@ import java.io.IOException;
 public class ObjectGetController {
     private final GetObjectService getObjectService;
     private final ObjectRepository objectRepository;
-    private final StoreLocalService storeLocalService;
+    private final ConsoleService consoleService;
     private final Cache<String, String> cache;
 
-    public ObjectGetController(GetObjectService getObjectService, ObjectRepository objectRepository, 
-                               StoreLocalService storeLocalService, Cache<String, String> cache) {
+    public ObjectGetController(GetObjectService getObjectService, ObjectRepository objectRepository,
+                               ConsoleService consoleService, Cache<String, String> cache) {
         this.getObjectService = getObjectService;
         this.objectRepository = objectRepository;
-        this.storeLocalService = storeLocalService;
+        this.consoleService = consoleService;
         this.cache = cache;
     }
 
@@ -59,7 +59,9 @@ public class ObjectGetController {
                           @RequestParam(value = "sign", required = false) String sign,
                           @RequestParam(value = "client", required = false) String client) throws IOException {
         String objectName = ObjectUtil.getObjectName();
-        ObjectMeta objectMeta = objectRepository.getObjectMetaByName(objectName);
+        String domain = ServletUtil.getHeader("host");
+        int owner = consoleService.getNodeProperties(domain).getOwner();
+        ObjectMeta objectMeta = objectRepository.getObjectMetaByName(objectName, owner);
         if (objectMeta == null) {
             getObjectService.writeResponse(HttpServletResponse.SC_NOT_FOUND);
             return;
@@ -93,7 +95,7 @@ public class ObjectGetController {
         OssPayload ossPayload = JwtUtil.getOssPayload(token, secretKey);
         int loginUser = ossPayload.getUserId();
         int channelId = ossPayload.getChannelId();
-        ObjectChannel objectChannel = storeLocalService.getChannelById(loginUser, channelId);
+        ObjectChannel objectChannel = consoleService.getChannelById(loginUser, channelId);
         if (objectChannel == null) {
             String payload = String.format("channel_id %s not exist", channelId);
             getObjectService.writeResponse(HttpServletResponse.SC_FORBIDDEN, payload);

+ 5 - 4
oss-store/src/main/java/cn/reghao/oss/store/controller/ObjectUploadController.java

@@ -1,6 +1,7 @@
 package cn.reghao.oss.store.controller;
 
 import cn.reghao.oss.api.dto.ObjectChannel;
+import cn.reghao.oss.api.iface.ConsoleService;
 import cn.reghao.oss.api.util.AuthContext;
 import cn.reghao.oss.store.model.vo.ObjectProp;
 import cn.reghao.oss.store.model.vo.ObjectResult;
@@ -36,17 +37,17 @@ public class ObjectUploadController {
     private final FileStoreService fileStoreService;
     private final ObjectNameService objectNameService;
     private final PutObjectService putObjectService;
-    private final StoreLocalService storeLocalService;
+    private final ConsoleService consoleService;
     private final Cache<String, String> cache;
 
     public ObjectUploadController(ChannelValidateService channelValidateService, FileStoreService fileStoreService,
                                   ObjectNameService objectNameService, PutObjectService putObjectService,
-                                  StoreLocalService storeLocalService, Cache<String, String> cache) {
+                                  ConsoleService consoleService, Cache<String, String> cache) {
         this.channelValidateService = channelValidateService;
         this.fileStoreService = fileStoreService;
         this.objectNameService = objectNameService;
         this.putObjectService = putObjectService;
-        this.storeLocalService = storeLocalService;
+        this.consoleService = consoleService;
         this.cache = cache;
     }
 
@@ -82,7 +83,7 @@ public class ObjectUploadController {
         }
 
         int loginUser = ossPayload.getUserId();
-        ObjectChannel objectChannel = storeLocalService.getChannelById(loginUser, channelId);
+        ObjectChannel objectChannel = consoleService.getChannelById(loginUser, channelId);
         if (objectChannel == null) {
             String errMsg = String.format("channel validate failed, channel %s not exist", channelId);
             return ResponseEntity.status(HttpStatus.FORBIDDEN)

+ 3 - 6
oss-store/src/main/java/cn/reghao/oss/store/db/mapper/FileMetaMapper.java

@@ -19,15 +19,12 @@ public interface FileMetaMapper extends BaseMapper<FileMeta> {
     void updateScopeByObjectName(@Param("scope") int scope, @Param("objectName") String objectName);
     void updateSetDelete(String objectId);
 
-    int countByObjectNamePrefix(@Param("objectName") String objectName, @Param("uploadBy") int uploadBy);
     FileMeta findBySha256sum(String sha256sum);
-    FileMeta findByObjectName(String objectName);
+    FileMeta findByObjectName(@Param("objectName") String objectName, @Param("owner") int owner);
     FileMeta findByObjectId(String objectId);
     List<FileMeta> findByContentId(String contentId);
-    ObjectMeta findObjectMeta(String objectName);
-    ObjectMeta findObjectMetaById(String objectName);
-    List<FileInfo> findByPid(@Param("pid") String pid, @Param("pageSize") int pageSize, @Param("nextId") String nextId);
-
+    ObjectMeta findObjectMetaByName(@Param("objectName") String objectName, @Param("owner") int owner);
+    ObjectMeta findObjectMetaById(String objectId);
     int countByPid(String pid);
     List<FileInfo> findPidByPage(Page page, @Param("pid") String pid);
 

+ 9 - 20
oss-store/src/main/java/cn/reghao/oss/store/db/repository/ObjectRepository.java

@@ -2,6 +2,7 @@ package cn.reghao.oss.store.db.repository;
 
 import cn.reghao.jutil.jdk.db.Page;
 import cn.reghao.oss.api.dto.FileInfo;
+import cn.reghao.oss.api.iface.ConsoleService;
 import cn.reghao.oss.store.db.mapper.DataBlockMapper;
 import cn.reghao.oss.store.db.mapper.FileMetaMapper;
 import cn.reghao.oss.store.model.po.DataBlock;
@@ -10,7 +11,6 @@ import cn.reghao.oss.api.dto.ObjectMeta;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
 import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -28,6 +28,7 @@ import java.util.stream.Collectors;
 public class ObjectRepository {
     private final FileMetaMapper fileMetaMapper;
     private final DataBlockMapper dataBlockMapper;
+    private ConsoleService consoleService;
 
     public ObjectRepository(FileMetaMapper fileMetaMapper, DataBlockMapper dataBlockMapper) {
         this.fileMetaMapper = fileMetaMapper;
@@ -76,12 +77,8 @@ public class ObjectRepository {
         dataBlockMapper.delete(dataBlock);
     }
 
-    public int countByObjectNamePrefix(String objectName, int uploadBy) {
-        return fileMetaMapper.countByObjectNamePrefix(objectName, uploadBy);
-    }
-
-    public FileMeta getByObjectName(String objectName) {
-        return fileMetaMapper.findByObjectName(objectName);
+    public FileMeta getByObjectName(String objectName, int owner) {
+        return fileMetaMapper.findByObjectName(objectName, owner);
     }
 
     public FileMeta getByObjectId(String objectId) {
@@ -92,10 +89,11 @@ public class ObjectRepository {
         return fileMetaMapper.findBySha256sum(sha256sum);
     }
 
-    @Cacheable(cacheNames = "oss:store:objectMeta", key = "#objectName", unless = "#result == null")
-    public ObjectMeta getObjectMetaByName(String objectName) {
+    //@Cacheable(cacheNames = "oss:store:objectMeta", key = "#objectName", unless = "#result == null")
+    public ObjectMeta getObjectMetaByName(String objectName, int owner) {
         log.info("cache miss {}", objectName);
-        ObjectMeta objectMeta = fileMetaMapper.findObjectMeta(objectName);
+        FileMeta fileMeta = fileMetaMapper.findByObjectName(objectName, owner);
+        ObjectMeta objectMeta = fileMetaMapper.findObjectMetaByName(objectName, owner);
         return objectMeta;
     }
 
@@ -113,16 +111,7 @@ public class ObjectRepository {
         return list;
     }
 
-    public List<FileInfo> getFiles(String pid, int pageSize, String nextObjectId) {
-        List<FileInfo> list = fileMetaMapper.findByPid(pid, pageSize, nextObjectId);
-        if (!list.isEmpty()) {
-            list.get(list.size()-1);
-        }
-
-        return fileMetaMapper.findByPid(pid, pageSize, nextObjectId);
-    }
-
-    public List<FileInfo> getFiles(int pageNumber, int pageSize) {
+    List<FileInfo> getObjects() {
         String bucket = "";
         String prefix = "image/i/";
         String startAfter = "image/cover/";

+ 30 - 41
oss-store/src/main/java/cn/reghao/oss/store/rpc/StoreServiceImpl.java

@@ -13,6 +13,7 @@ import cn.reghao.oss.api.dto.media.VideoInfo;
 import cn.reghao.oss.api.util.JwtUtil;
 import cn.reghao.oss.store.db.repository.ObjectRepository;
 import cn.reghao.oss.store.model.po.FileMeta;
+import cn.reghao.oss.api.dto.ObjectMeta;
 import cn.reghao.oss.store.service.DiskService;
 import cn.reghao.oss.store.service.FileStoreService;
 import cn.reghao.oss.store.service.ObjectNameService;
@@ -23,8 +24,6 @@ import com.github.benmanes.caffeine.cache.Cache;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.stereotype.Service;
 
-import java.time.LocalDateTime;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -39,8 +38,6 @@ import java.util.stream.Collectors;
 @DubboService
 @Service
 public class StoreServiceImpl implements StoreService {
-    private final LocalDateTime epoch = LocalDateTime.parse("1970-01-01T08:00");
-
     private final ObjectNameService objectNameService;
     private final FileStoreService fileStoreService;
     private final ObjectRepository objectRepository;
@@ -62,20 +59,6 @@ public class StoreServiceImpl implements StoreService {
         this.diskService = diskService;
     }
 
-    @Override
-    public void createChannel(int owner, String channelPrefix, int scope) {
-        ObjectScope objectScope = ObjectScope.getByCode(scope);
-        if (objectScope == null) {
-        }
-        objectNameService.createParentDirs(owner, channelPrefix, scope);
-    }
-
-    @Override
-    public int countChannelObjects(String channelPrefix, int owner) {
-        int total = objectRepository.countByObjectNamePrefix(channelPrefix, owner);
-        return total;
-    }
-
     @Override
     public List<DiskVolume> getDiskVolumes() {
         Map<String, DiskVolume> map = diskService.getFileStore().stream()
@@ -103,6 +86,25 @@ public class StoreServiceImpl implements StoreService {
         return uploadToken;
     }
 
+    @Override
+    public void createChannel(int owner, String channelPrefix, int scope) {
+        ObjectScope objectScope = ObjectScope.getByCode(scope);
+        if (objectScope == null) {
+        }
+        objectNameService.createParentDirs(owner, channelPrefix, scope);
+    }
+
+    @Override
+    public int countChannelObjects(String channelPrefix, int owner) {
+        FileMeta fileMeta = objectRepository.getByObjectName(channelPrefix, owner);
+        int total = 0;
+        if (fileMeta != null) {
+            total = objectRepository.countByPid(fileMeta.getPid());
+        }
+
+        return total;
+    }
+
     @Override
     public void setObjectScope(String objectId, int scope) {
         FileMeta fileMeta = objectRepository.getByObjectId(objectId);
@@ -112,13 +114,17 @@ public class StoreServiceImpl implements StoreService {
     @Override
     public void deleteByObjectId(String objectId) {
         FileMeta fileMeta = objectRepository.getByObjectId(objectId);
-        objectRepository.deleteObject(fileMeta);
+        if (fileMeta != null) {
+            objectRepository.updateSetDelete(fileMeta);
+        }
+        //objectRepository.deleteObject(fileMeta);
     }
 
     @Override
-    public void deleteByObjectName(String objectName) {
-        FileMeta fileMeta = objectRepository.getByObjectName(objectName);
-        objectRepository.deleteObject(fileMeta);
+    public void deleteByObjectName(String objectName, int owner) {
+        FileMeta fileMeta = objectRepository.getByObjectName(objectName, owner);
+        objectRepository.updateSetDelete(fileMeta);
+//        objectRepository.deleteObject(fileMeta);
     }
 
     @Override
@@ -194,28 +200,11 @@ public class StoreServiceImpl implements StoreService {
         return null;
     }
 
-    List<FileInfo> getFiles(String pid, int pageSize, String nextObjectId) {
-        String objectId = pid;
-        if (!objectId.isBlank()) {
-            FileMeta fileMeta = objectRepository.getByObjectName(pid);
-            int fileType = fileMeta.getFileType();
-            if (fileType != 1000) {
-                return Collections.emptyList();
-            }
-            objectId = fileMeta.getObjectId();
-        } else {
-            objectId = "0";
-        }
-
-        objectRepository.getObjectsByPage(pid, 1, 10);
-        return objectRepository.getFiles(objectId, pageSize, nextObjectId);
-    }
-
     @Override
-    public PageList<FileInfo> getByPrefix(String objectName, int pn, int ps) {
+    public PageList<FileInfo> getByPrefix(int owner, String objectName, int pn, int ps) {
         String pid = "0";
         if (!objectName.isBlank()) {
-            FileMeta fileMeta = objectRepository.getByObjectName(objectName);
+            FileMeta fileMeta = objectRepository.getByObjectName(objectName, owner);
             if (fileMeta != null) {
                 pid = fileMeta.getObjectId();
             }

+ 13 - 10
oss-store/src/main/java/cn/reghao/oss/store/service/GetObjectService.java

@@ -1,7 +1,8 @@
 package cn.reghao.oss.store.service;
 
 import cn.reghao.oss.api.dto.NodeProperties;
-import cn.reghao.oss.store.db.mapper.FileMetaMapper;
+import cn.reghao.oss.api.iface.ConsoleService;
+import cn.reghao.oss.store.db.repository.ObjectRepository;
 import cn.reghao.oss.store.model.dto.ContentRange;
 import cn.reghao.oss.store.model.po.FileMeta;
 import cn.reghao.oss.api.dto.ObjectMeta;
@@ -22,19 +23,21 @@ import java.nio.charset.StandardCharsets;
 @Slf4j
 @Service
 public class GetObjectService {
-    private final FileMetaMapper fileMetaMapper;
     // 1MB
     private final int bufSize = 1024*1024;
-    private final StoreLocalService storeLocalService;
+    private final ObjectRepository objectRepository;
+    private final ConsoleService consoleService;
 
-    public GetObjectService(FileMetaMapper fileMetaMapper, StoreLocalService storeLocalService) {
-        this.fileMetaMapper = fileMetaMapper;
-        this.storeLocalService = storeLocalService;
+    public GetObjectService(ObjectRepository objectRepository, ConsoleService consoleService) {
+        this.objectRepository = objectRepository;
+        this.consoleService = consoleService;
     }
     
     public void headObject(String objectName) throws IOException {
         HttpServletResponse response = ServletUtil.getResponse();
-        FileMeta fileMeta = fileMetaMapper.findByObjectName(objectName);
+        String domain = ServletUtil.getHeader("host");
+        int owner = consoleService.getNodeProperties(domain).getOwner();
+        FileMeta fileMeta = objectRepository.getByObjectName(objectName, owner);
         if (fileMeta == null) {
             response.setStatus(HttpServletResponse.SC_NOT_FOUND);
         } else {
@@ -54,7 +57,7 @@ public class GetObjectService {
 
     public void headObject1(String sha256sum) throws IOException {
         HttpServletResponse response = ServletUtil.getResponse();
-        FileMeta fileMeta = fileMetaMapper.findBySha256sum(sha256sum);
+        FileMeta fileMeta = objectRepository.getBySha256sum(sha256sum);
         if (fileMeta == null) {
             response.setStatus(HttpServletResponse.SC_NOT_FOUND);
         } else {
@@ -81,7 +84,7 @@ public class GetObjectService {
             writeContentRange(objectMeta, contentRange);
         } else {
             String domain = host;
-            NodeProperties nodeProperties = storeLocalService.getNodeProperties(host);
+            NodeProperties nodeProperties = consoleService.getNodeProperties(host);
             if (nodeProperties != null) {
                 domain = nodeProperties.getDomain();
             }
@@ -163,7 +166,7 @@ public class GetObjectService {
         /*response.setHeader("Content-Length", ""+(len-start));
         response.setHeader("Accept-Ranges", "bytes");
         response.setHeader("Content-Range", "bytes "+start+"-"+(len-1)+"/"+len);*/
-        String filename = fileMetaMapper.findByObjectId(objectMeta.getObjectId()).getFilename();
+        String filename = objectRepository.getByObjectId(objectMeta.getObjectId()).getFilename();
         String value = String.format("attachment;filename=%s", URLEncoder.encode(filename, StandardCharsets.UTF_8.toString()));
         response.setHeader("Content-Disposition", value);
         response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");

+ 6 - 6
oss-store/src/main/java/cn/reghao/oss/store/service/ObjectMultipartUploadService.java

@@ -2,7 +2,7 @@ package cn.reghao.oss.store.service;
 
 import cn.reghao.jutil.web.ServletUtil;
 import cn.reghao.oss.api.dto.ObjectChannel;
-import cn.reghao.oss.store.db.mapper.FileMetaMapper;
+import cn.reghao.oss.store.db.repository.ObjectRepository;
 import cn.reghao.oss.store.model.dto.PathUrl;
 import cn.reghao.oss.store.model.vo.ObjectProp;
 import cn.reghao.oss.store.util.StringUtil;
@@ -28,16 +28,16 @@ import java.util.*;
 public class ObjectMultipartUploadService {
     // 20MB
     private final static long PART_SIZE = 1024*1024*20;
-    private final FileMetaMapper fileMetaMapper;
+    private final ObjectRepository objectRepository;
     private final FileStoreService fileStoreService;
     private final Map<String, Set<Long>> map = new HashMap<>();
     private final Map<String, PathUrl> pathMap = new HashMap<>();
     private final ObjectNameService objectNameService;
     private final PutObjectService putObjectService;
 
-    public ObjectMultipartUploadService(FileMetaMapper fileMetaMapper, FileStoreService fileStoreService,
+    public ObjectMultipartUploadService(ObjectRepository objectRepository, FileStoreService fileStoreService,
                                         ObjectNameService objectNameService, PutObjectService putObjectService) {
-        this.fileMetaMapper = fileMetaMapper;
+        this.objectRepository = objectRepository;
         this.fileStoreService = fileStoreService;
         this.objectNameService = objectNameService;
         this.putObjectService = putObjectService;
@@ -45,7 +45,7 @@ public class ObjectMultipartUploadService {
 
     public synchronized UploadPrepareRet prepareUpload(UploadPrepare uploadPrepare) {
         String sha256sum = uploadPrepare.getSha256sum();
-        FileMeta fileMeta = fileMetaMapper.findBySha256sum(sha256sum);
+        FileMeta fileMeta = objectRepository.getBySha256sum(sha256sum);
         if (fileMeta == null) {
             return new UploadPrepareRet("uploadId", PART_SIZE, false, null);
         } else {
@@ -74,7 +74,7 @@ public class ObjectMultipartUploadService {
         log.info("{} -> {}:{}", currentPartSize, totalParts, chunkNumber);
 
         String sha256sum = uploadFilePart.getIdentifier();
-        FileMeta fileMeta = fileMetaMapper.findBySha256sum(sha256sum);
+        FileMeta fileMeta = objectRepository.getBySha256sum(sha256sum);
         if (fileMeta != null) {
             String objectName = fileMeta.getObjectName();
             String suffix = StringUtil.getSuffix(objectName);

+ 13 - 5
oss-store/src/main/java/cn/reghao/oss/store/service/ObjectNameService.java

@@ -1,6 +1,8 @@
 package cn.reghao.oss.store.service;
 
+import cn.reghao.jutil.web.ServletUtil;
 import cn.reghao.oss.api.dto.ObjectChannel;
+import cn.reghao.oss.api.iface.ConsoleService;
 import cn.reghao.oss.store.db.repository.ObjectRepository;
 import cn.reghao.oss.store.model.po.FileMeta;
 import cn.reghao.oss.store.model.vo.ObjectProp;
@@ -18,9 +20,11 @@ import java.util.UUID;
 @Service
 public class ObjectNameService {
     private final ObjectRepository objectRepository;
+    private final ConsoleService consoleService;
 
-    public ObjectNameService(ObjectRepository objectRepository) {
+    public ObjectNameService(ObjectRepository objectRepository, ConsoleService consoleService) {
         this.objectRepository = objectRepository;
+        this.consoleService = consoleService;
     }
 
     public ObjectProp getObjectProp(ObjectChannel channel, String filename) throws Exception {
@@ -28,7 +32,9 @@ public class ObjectNameService {
         String suffix = StringUtil.getSuffix(filename);
         String objectPrefix = channel.getPrefix();
         String objectName = objectPrefix + UUID.randomUUID().toString().replace("-", "") + suffix;
-        FileMeta fileMeta = objectRepository.getByObjectName(objectPrefix);
+        String domain = ServletUtil.getHeader("host");
+        int owner = consoleService.getNodeProperties(domain).getOwner();
+        FileMeta fileMeta = objectRepository.getByObjectName(objectPrefix, owner);
         if (fileMeta == null) {
             String errMsg = String.format("objectPrefix %s 不合法", objectPrefix);
             throw new Exception(errMsg);
@@ -41,7 +47,9 @@ public class ObjectNameService {
     public ObjectProp getObjectProp(String originalObjectName, String suffix) {
         int idx = originalObjectName.lastIndexOf("/");
         String prefix = originalObjectName.substring(0, idx+1);
-        FileMeta fileMeta = objectRepository.getByObjectName(originalObjectName);
+        String domain = ServletUtil.getHeader("host");
+        int owner = consoleService.getNodeProperties(domain).getOwner();
+        FileMeta fileMeta = objectRepository.getByObjectName(originalObjectName, owner);
         int scope = fileMeta.getScope();
         String pid = fileMeta.getPid();
 
@@ -60,13 +68,13 @@ public class ObjectNameService {
         List<String> list = getSortedParent(objectName);
         for (int i = 0; i < list.size(); i++) {
             String parentName = list.get(i);
-            FileMeta fileMeta = objectRepository.getByObjectName(parentName);
+            FileMeta fileMeta = objectRepository.getByObjectName(parentName, owner);
             if (fileMeta == null) {
                 String pid;
                 if (i == 0) {
                     pid = "0";
                 } else {
-                    pid = objectRepository.getByObjectName(list.get(i-1)).getObjectId();
+                    pid = objectRepository.getByObjectName(list.get(i-1), owner).getObjectId();
                 }
                 String objectId = UUID.randomUUID().toString().replace("-", "");
                 String[] names = parentName.split("/");

+ 11 - 3
oss-store/src/main/java/cn/reghao/oss/store/service/PutObjectService.java

@@ -1,6 +1,8 @@
 package cn.reghao.oss.store.service;
 
 import cn.reghao.jutil.jdk.security.DigestUtil;
+import cn.reghao.jutil.web.ServletUtil;
+import cn.reghao.oss.api.iface.ConsoleService;
 import cn.reghao.oss.store.config.props.OssProperties;
 import cn.reghao.oss.store.db.repository.ObjectRepository;
 import cn.reghao.oss.store.model.po.DataBlock;
@@ -28,12 +30,14 @@ public class PutObjectService {
     private final ObjectRepository objectRepository;
     private final ObjectNameService objectNameService;
     private final String nodeAddress;
+    private final ConsoleService consoleService;
 
     public PutObjectService(ObjectRepository objectRepository, ObjectNameService objectNameService,
-                            OssProperties ossProperties) {
+                            OssProperties ossProperties, ConsoleService consoleService) {
         this.objectRepository = objectRepository;
         this.objectNameService = objectNameService;
         this.nodeAddress = ossProperties.getStoreHost();
+        this.consoleService = consoleService;
     }
 
     public ObjectResult putObject(ObjectProp objectProp, String contentId, File savedFile, String originalFilename, String sha256sum) {
@@ -70,7 +74,9 @@ public class PutObjectService {
 
     public ObjectResult copyObject(ObjectProp objectProp, String filename, FileMeta fileMeta) {
         String dupObjectId = fileMeta.getObjectId();
-        ObjectMeta objectMeta = objectRepository.getObjectMetaByName(fileMeta.getObjectName());
+        String domain = ServletUtil.getHeader("host");
+        int owner = consoleService.getNodeProperties(domain).getOwner();
+        ObjectMeta objectMeta = objectRepository.getObjectMetaByName(fileMeta.getObjectName(), owner);
 
         int fileType = fileMeta.getFileType();
         String savedPath = objectMeta.getAbsolutePath();
@@ -83,7 +89,9 @@ public class PutObjectService {
     }
 
     public ObjectResult copyFromObjectName(String fromObjectName) {
-        FileMeta fileMeta = objectRepository.getByObjectName(fromObjectName);
+        String domain = ServletUtil.getHeader("host");
+        int owner = consoleService.getNodeProperties(domain).getOwner();
+        FileMeta fileMeta = objectRepository.getByObjectName(fromObjectName, owner);
         int fileType = fileMeta.getFileType();
 
         String suffix = StringUtil.getSuffix(fromObjectName);

+ 6 - 5
oss-store/src/main/java/cn/reghao/oss/store/service/SignService.java

@@ -1,6 +1,7 @@
 package cn.reghao.oss.store.service;
 
 import cn.reghao.jutil.jdk.security.RandomString;
+import cn.reghao.oss.api.iface.ConsoleService;
 import cn.reghao.oss.api.util.JwtUtil;
 import cn.reghao.oss.store.util.SignatureUtil;
 import cn.reghao.oss.api.constant.ChannelAction;
@@ -18,23 +19,23 @@ import java.util.UUID;
  */
 @Service
 public class SignService {
-    private final StoreLocalService storeLocalService;
+    private final ConsoleService consoleService;
     private final Cache<String, String> cache;
 
-    public SignService(StoreLocalService storeLocalService, Cache<String, String> cache) {
-        this.storeLocalService = storeLocalService;
+    public SignService(ConsoleService consoleService, Cache<String, String> cache) {
+        this.consoleService = consoleService;
         this.cache = cache;
     }
 
     public String getSignedUrl(int loginUser, String url, int expire) {
         long timestamp = System.currentTimeMillis() + expire*1000L;
-        int channelId = storeLocalService.getChannelIdByUrl(loginUser, url);
+        int channelId = consoleService.getChannelIdByUrl(loginUser, url);
 
         String action1 = ChannelAction.download.getName();
         String action = ChannelAction.access.getName();
         OssPayload ossPayload = new OssPayload(action, channelId, loginUser);
 
-        //String secretKey = storeLocalService.getSecretKey();
+        //String secretKey = consoleService.getSecretKey();
         String secretKey = RandomString.getString(128);
         String token = JwtUtil.createToken(ossPayload, timestamp, secretKey);
         cache.put(token, secretKey);

+ 0 - 36
oss-store/src/main/java/cn/reghao/oss/store/service/StoreLocalService.java

@@ -1,36 +0,0 @@
-package cn.reghao.oss.store.service;
-
-import cn.reghao.oss.api.dto.NodeProperties;
-import cn.reghao.oss.api.iface.ConsoleService;
-import cn.reghao.oss.api.dto.StoreNodeDto;
-import cn.reghao.oss.api.dto.ObjectChannel;
-import org.springframework.stereotype.Service;
-
-/**
- * @author reghao
- * @date 2024-03-08 09:20:27
- */
-@Service
-public class StoreLocalService {
-    private final ConsoleService consoleService;
-
-    public StoreLocalService(ConsoleService consoleService) {
-        this.consoleService = consoleService;
-    }
-
-    public void register(StoreNodeDto storeNodeDto) {
-        consoleService.registerNode(storeNodeDto);
-    }
-
-    public NodeProperties getNodeProperties(String host) {
-        return consoleService.getNodeProperties(host);
-    }
-
-    public ObjectChannel getChannelById(int loginUser, int channelId) {
-        return consoleService.getChannelById(loginUser, channelId);
-    }
-
-    public int getChannelIdByUrl(int loginUser, String url) {
-        return consoleService.getChannelIdByUrl(loginUser, url);
-    }
-}

+ 3 - 8
oss-store/src/main/resources/mapper/FileMetaMapper.xml

@@ -82,11 +82,6 @@
         limit #{max}
     </select>
 
-    <select id="countByObjectNamePrefix" resultType="java.lang.Integer">
-        select count(*)
-        from file_meta
-        where file_type!=1000 and object_name like concat(#{objectName},'%') and upload_by=#{uploadBy};
-    </select>
     <select id="findBySha256sum" resultType="cn.reghao.oss.store.model.po.FileMeta">
         select * from file_meta
         where sha256sum=#{sha256sum}
@@ -96,7 +91,7 @@
     <select id="findByObjectName" resultType="cn.reghao.oss.store.model.po.FileMeta">
         select *
         from file_meta
-        where object_name=#{objectName}
+        where deleted is false and object_name=#{objectName} and upload_by=#{owner}
     </select>
     <select id="findByObjectNames" resultType="cn.reghao.oss.store.model.po.FileMeta">
         select *
@@ -117,12 +112,12 @@
         from file_meta
         where content_id=#{contentId}
     </select>
-    <select id="findObjectMeta" resultType="cn.reghao.oss.api.dto.ObjectMeta">
+    <select id="findObjectMetaByName" resultType="cn.reghao.oss.api.dto.ObjectMeta">
         select file_meta.size,file_meta.content_type,file_meta.object_name,file_meta.object_id,file_meta.scope as scope,file_meta.upload_by,
         data_block.absolute_path
         from file_meta
         inner join data_block
-        on file_meta.content_id=data_block.content_id
+        on file_meta.deleted is false and file_meta.upload_by=#{owner} and file_meta.content_id=data_block.content_id
         and file_meta.object_name=#{objectName}
     </select>
     <select id="findObjectMetaById" resultType="cn.reghao.oss.api.dto.ObjectMeta">