소스 검색

开发设置 ObjectScope 的 RPC 接口

reghao 2 년 전
부모
커밋
c28f506010

+ 2 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/db/mapper/FileMetaMapper.java

@@ -17,6 +17,8 @@ import java.util.List;
  */
 @Mapper
 public interface FileMetaMapper extends BaseMapper<FileMeta> {
+    void updateScopeByObjectIds(@Param("scope") int scope, @Param("list") List<String> list);
+
     FileMeta findBySha256sum(String sha256sum);
     FileMeta findByObjectName(String objectName);
     FileMeta findByObjectId(String objectId);

+ 2 - 2
dfs-store/src/main/java/cn/reghao/dfs/store/inerceptor/TokenFilter.java

@@ -29,12 +29,12 @@ public class TokenFilter implements Filter {
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
             throws IOException, ServletException {
         long userId = -1L;
-        String sessId = ServletUtil.getCookie(cookieKey);
+        String sessId = ServletUtil.getCookie(cookieKey, request);
         AccountInfo accountInfo = null;
         if (sessId != null) {
             accountInfo = authService.getAccountInfo(TokenType.cookie.getValue(), sessId);
         } else {
-            sessId = ServletUtil.getBearerToken();
+            sessId = ServletUtil.getBearerToken(request);
             if (sessId != null) {
                 accountInfo = authService.getAccountInfo(TokenType.token.getValue(), sessId);
             }

+ 8 - 32
dfs-store/src/main/java/cn/reghao/dfs/store/rpc/PermissionServiceImpl.java

@@ -13,6 +13,7 @@ import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -45,41 +46,16 @@ public class PermissionServiceImpl implements PermissionService {
     }
 
     @Override
-    public void setObjectPermission(String objectName, int acl) {
-    }
-
-    public void setImagePermission(String imageFileId, int acl) {
-        fileMetaMapper.updateSetAcl(imageFileId, acl);
-
-        ImageFile imageFile = imageFileMapper.findByImageFileId(imageFileId);
-        String jpegObjectId = imageFile.getJpegObjectId();
-        fileMetaMapper.updateSetAcl(jpegObjectId, acl);
-
-        String webpObjectId = imageFile.getWebpObjectId();
-        if (webpObjectId != null) {
-            fileMetaMapper.updateSetAcl(webpObjectId, acl);
-        }
-    }
-
-    public void setAudioPermission(String audioFileId, int acl) {
-        fileMetaMapper.updateSetAcl(audioFileId, acl);
-
-        AudioFile audioFile = audioFileMapper.findByAudioFileId(audioFileId);
-        String objectId = audioFile.getObjectId();
-        fileMetaMapper.updateSetAcl(objectId, acl);
-    }
-
-    public void setVideoPermission(String videoFileId, int acl) {
-        fileMetaMapper.updateSetAcl(videoFileId, acl);
-
-        List<VideoUrl> list = videoUrlMapper.findByVideoFileId(videoFileId);
-        for (VideoUrl videoUrl : list) {
-            String objectId = videoUrl.getObjectId();
-            fileMetaMapper.updateSetAcl(objectId, acl);
+    public void setVideoPermission(String videoFileId, int scope) {
+        List<String> objectIds = videoUrlMapper.findByVideoFileId(videoFileId).stream()
+                .map(VideoUrl::getObjectId)
+                .collect(Collectors.toList());
+        if (!objectIds.isEmpty()) {
+            fileMetaMapper.updateScopeByObjectIds(scope, objectIds);
         }
     }
 
     @Override
-    public void getObjectPermission(String objectName) {
+    public void setImagePermission(String imageFileId, int scope) {
     }
 }

+ 21 - 8
dfs-store/src/main/java/cn/reghao/dfs/store/service/GetObjectService.java

@@ -8,6 +8,7 @@ import cn.reghao.dfs.store.model.dto.ContentRange;
 import cn.reghao.dfs.store.model.po.FileMeta;
 import cn.reghao.dfs.store.util.JwtUtil;
 import cn.reghao.dfs.store.util.UserContext;
+import cn.reghao.oss.api.constant.ObjectScope;
 import cn.reghao.oss.api.constant.UploadChannel;
 import cn.reghao.oss.api.dto.ObjectMeta;
 import cn.reghao.jutil.web.ServletUtil;
@@ -67,10 +68,12 @@ public class GetObjectService {
 
         ObjectMeta objectMeta = objectRepository.getObjectMeta(objectName);
         if (objectMeta == null) {
-            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
-            OutputStream outputStream = response.getOutputStream();
-            outputStream.flush();
-            outputStream.close();
+            writeResponse(HttpServletResponse.SC_NOT_FOUND);
+            return;
+        }
+
+        if (!checkPermission(objectMeta.getScope(), objectMeta.getUploadBy())) {
+            writeResponse(HttpServletResponse.SC_UNAUTHORIZED);
             return;
         }
 
@@ -119,16 +122,26 @@ public class GetObjectService {
 
         ObjectMeta objectMeta = objectRepository.getObjectMeta(objectName);
         if (objectMeta == null) {
-            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
-            OutputStream outputStream = response.getOutputStream();
-            outputStream.flush();
-            outputStream.close();
+            writeResponse(HttpServletResponse.SC_NOT_FOUND);
             return;
         }
 
         writeDownloadContent(objectMeta);
     }
 
+    private boolean checkPermission(int scope, long uploadBy) {
+        if (scope == ObjectScope.PRIVATE.getCode()) {
+            long userId = UserContext.getUser();
+            return userId == uploadBy;
+        } else if (scope == ObjectScope.FRIEND.getCode()) {
+            return false;
+        } else if (scope == ObjectScope.PROTECT.getCode()) {
+            return false;
+        }
+
+        return true;
+    }
+
     private void writeResponse(int statusCode) throws IOException {
         HttpServletResponse response = ServletUtil.getResponse();
         response.setStatus(statusCode);

+ 11 - 2
dfs-store/src/main/resources/mapper/FileMetaMapper.xml

@@ -17,6 +17,14 @@
         </foreach>
     </insert>
 
+    <update id="updateScopeByObjectIds">
+        update file_meta
+        set scope=#{scope}
+        where object_id in
+        <foreach collection="list" item="item" separator="," open="(" close=")">
+            #{item.objectId}
+        </foreach>
+    </update>
     <update id="updateSetAcl">
         update file_meta
         set update_time=now() and acl=#{acl}
@@ -96,7 +104,7 @@
         where content_id=#{contentId}
     </select>
     <select id="findObjectMeta" resultType="cn.reghao.oss.api.dto.ObjectMeta">
-        select file_meta.size,file_meta.content_type,file_meta.object_name,file_meta.object_id,
+        select file_meta.size,file_meta.content_type,file_meta.object_name,file_meta.object_id,file_meta.acl as scope,file_meta.upload_by,
         data_block.absolute_path
         from file_meta
         inner join data_block
@@ -104,7 +112,8 @@
         and file_meta.object_name=#{objectName}
     </select>
     <select id="findObjectMetaByPage" resultType="cn.reghao.oss.api.dto.ObjectMeta">
-        select file_meta.size,file_meta.content_type,file_meta.object_name,data_block.absolute_path
+        select file_meta.size,file_meta.content_type,file_meta.object_name,file_meta.object_id,file_meta.acl as scope,file_meta.upload_by,
+        data_block.absolute_path
         from file_meta
         inner join data_block
         on file_meta.object_id=data_block.object_id

+ 7 - 0
dfs-store/src/test/java/MediaFileTest.java

@@ -81,4 +81,11 @@ public class MediaFileTest {
             }
         }
     }
+
+    @Test
+    public void test11() {
+        int scope = 4;
+        List<String> list = List.of("eadf4146d67846f7abdf8ce63e354440", "98d20cf30c27417c8e5bcdb83e18562b");
+        fileMetaMapper.updateScopeByObjectIds(scope, list);
+    }
 }

+ 2 - 0
oss-api/src/main/java/cn/reghao/oss/api/dto/ObjectMeta.java

@@ -19,4 +19,6 @@ public class ObjectMeta implements Serializable {
     private String absolutePath;
     private long size;
     private String contentType;
+    private int scope;
+    private long uploadBy;
 }

+ 3 - 3
oss-api/src/main/java/cn/reghao/oss/api/iface/PermissionService.java

@@ -5,8 +5,8 @@ package cn.reghao.oss.api.iface;
  * @date 2023-06-02 10:06:21
  */
 public interface PermissionService {
-    void setDirPermission(String prefix, int acl);
+    void setDirPermission(String prefix, int scope);
     void getDirPermission(String prefix);
-    void setObjectPermission(String objectName, int acl);
-    void getObjectPermission(String objectName);
+    void setVideoPermission(String videoFileId, int scope);
+    void setImagePermission(String imageFileId, int scope);
 }