Selaa lähdekoodia

1.修改 object scope 更新接口
2.使用 @CacheEvict 注解的方法必须由外部类调用才会生效

reghao 2 vuotta sitten
vanhempi
commit
f106d33f46

+ 4 - 4
oss-console/src/main/java/cn/reghao/oss/console/app/controller/ImageFileController.java

@@ -1,6 +1,7 @@
 package cn.reghao.oss.console.app.controller;
 
 import cn.reghao.jutil.jdk.result.WebResult;
+import cn.reghao.oss.console.app.model.dto.GetImageUrls;
 import cn.reghao.oss.store.api.dto.media.ImageUrlDto;
 import cn.reghao.oss.console.app.rpc.ImageService;
 import io.swagger.annotations.Api;
@@ -33,10 +34,9 @@ public class ImageFileController {
     }
 
     @ApiOperation(value = "获取图片文件 url")
-    @GetMapping(value = "/urls", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getImageUrls(@RequestParam("channelId") Integer channelId,
-                               @RequestParam("imageFileIds") Set<String> imageFileIds) throws Exception {
-        List<ImageUrlDto> list = imageService.getImageUrls(channelId, imageFileIds);
+    @PostMapping(value = "/urls", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getImageUrls(GetImageUrls getImageUrls) throws Exception {
+        List<ImageUrlDto> list = imageService.getImageUrls(getImageUrls.getChannelId(), getImageUrls.getImageFileIds());
         return WebResult.success(list);
     }
 }

+ 3 - 3
oss-console/src/main/java/cn/reghao/oss/console/app/controller/OssObjectController.java

@@ -1,6 +1,7 @@
 package cn.reghao.oss.console.app.controller;
 
 import cn.reghao.jutil.jdk.result.WebResult;
+import cn.reghao.oss.console.app.model.dto.ObjectsScopeDto;
 import cn.reghao.oss.console.app.model.dto.SetScopeDto;
 import cn.reghao.oss.console.app.rpc.OssObjectService;
 import io.swagger.annotations.Api;
@@ -32,9 +33,8 @@ public class OssObjectController {
 
     @ApiOperation(value = "设置对象列表可见范围")
     @PostMapping(value = "/scope/objects", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String setObjectsScope(@RequestParam("scope") Integer scope,
-                                  @RequestParam("objectIds") List<String> objectIds,
-                                  @RequestParam("contentType") Integer contentType) {
+    public String setObjectsScope(ObjectsScopeDto objectsScopeDto) throws Exception {
+        ossObjectService.setObjectsScope(objectsScopeDto);
         return WebResult.success();
     }
 

+ 15 - 1
oss-console/src/main/java/cn/reghao/oss/console/app/controller/OssServerController.java

@@ -2,7 +2,11 @@ package cn.reghao.oss.console.app.controller;
 
 import cn.reghao.jutil.jdk.result.WebResult;
 import cn.reghao.oss.console.app.rpc.OssObjectService;
+import cn.reghao.oss.console.app.service.OssStoreService;
+import cn.reghao.oss.console.app.service.UploadChannelService;
+import cn.reghao.oss.console.util.AuthKeyContext;
 import cn.reghao.oss.store.api.dto.DownloadUrl;
+import cn.reghao.oss.store.api.dto.ObjectChannel;
 import cn.reghao.oss.store.api.dto.ObjectInfo;
 import cn.reghao.oss.store.api.dto.ServerInfo;
 import cn.reghao.oss.console.app.rpc.OssService;
@@ -24,10 +28,12 @@ import org.springframework.web.bind.annotation.RestController;
 public class OssServerController {
     private final OssService ossService;
     private final OssObjectService ossObjectService;
+    private final OssStoreService ossStoreService;
 
-    public OssServerController(OssService ossService, OssObjectService ossObjectService) {
+    public OssServerController(OssService ossService, OssObjectService ossObjectService, OssStoreService ossStoreService) {
         this.ossService = ossService;
         this.ossObjectService = ossObjectService;
+        this.ossStoreService = ossStoreService;
     }
 
     @ApiOperation(value = "获取 oss-store 节点")
@@ -37,6 +43,14 @@ public class OssServerController {
         return WebResult.success(serverInfo);
     }
 
+    @ApiOperation(value = "根据 channel_id 获取 UploadChannel")
+    @GetMapping(value = "/server/channel", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getChannel(@RequestParam("channelId") int channelId) {
+        int loginUser = AuthKeyContext.getUser();
+        ObjectChannel objectChannel = ossStoreService.getObjectChannel(loginUser, channelId);
+        return WebResult.success(objectChannel);
+    }
+
     @ApiOperation(value = "获取对象信息")
     @GetMapping(value = "/object/info", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getObjectInfo(@RequestParam("objectId") String objectId) {

+ 17 - 0
oss-console/src/main/java/cn/reghao/oss/console/app/model/dto/GetImageUrls.java

@@ -0,0 +1,17 @@
+package cn.reghao.oss.console.app.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Set;
+
+/**
+ * @author reghao
+ * @date 2024-03-01 16:02:57
+ */
+@Setter
+@Getter
+public class GetImageUrls {
+    private Integer channelId;
+    private Set<String> imageFileIds;
+}

+ 18 - 0
oss-console/src/main/java/cn/reghao/oss/console/app/model/dto/ObjectsScopeDto.java

@@ -0,0 +1,18 @@
+package cn.reghao.oss.console.app.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2024-03-01 13:32:25
+ */
+@Setter
+@Getter
+public class ObjectsScopeDto {
+    private Integer channelId;
+    private Integer scope;
+    private List<String> objectNames;
+}

+ 35 - 0
oss-console/src/main/java/cn/reghao/oss/console/app/rpc/OssObjectService.java

@@ -1,8 +1,13 @@
 package cn.reghao.oss.console.app.rpc;
 
+import cn.reghao.oss.console.app.model.dto.ObjectsScopeDto;
+import cn.reghao.oss.console.app.model.dto.SetScopeDto;
+import cn.reghao.oss.console.app.model.po.StoreNode;
+import cn.reghao.oss.console.app.service.UploadChannelService;
 import cn.reghao.oss.store.api.dto.DownloadUrl;
 import cn.reghao.oss.store.api.dto.ObjectInfo;
 import cn.reghao.oss.store.api.iface.ObjectService;
+import cn.reghao.oss.store.api.iface.media.ImageFileService;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -14,6 +19,23 @@ import java.util.List;
 @Service
 public class OssObjectService {
     private ObjectService objectService;
+    private final UploadChannelService uploadChannelService;
+
+    public OssObjectService(UploadChannelService uploadChannelService) {
+        this.uploadChannelService = uploadChannelService;
+    }
+
+    public void setObjectScope(SetScopeDto setScopeDto) {
+
+    }
+
+    public void setObjectsScope(ObjectsScopeDto objectsScopeDto) throws Exception {
+        int channelId = objectsScopeDto.getChannelId();
+        ObjectService objectService = getObjectService(channelId);
+        int scope = objectsScopeDto.getScope();
+        List<String> objectNames = objectsScopeDto.getObjectNames();
+        objectService.setObjectsScope(scope, objectNames);
+    }
 
     public void deleteByObjectNames(List<String> objectNames) {
         RemoteService<ObjectService> remoteService = new RemoteService<>();
@@ -39,4 +61,17 @@ public class OssObjectService {
         ObjectService objectService = remoteService.getService(host, port, ObjectService.class);
         return objectService.getDownloadUrl(objectId, expireSecond);
     }
+
+    private ObjectService getObjectService(int channelId) throws Exception {
+        StoreNode storeNode = uploadChannelService.getStoreNode(channelId);
+        if (storeNode == null) {
+            String errMsg = String.format("channel_id %s not associate with any store_node", channelId);
+            throw new Exception(errMsg);
+        }
+
+        RemoteService<ObjectService> remoteService = new RemoteService<>();
+        String host = storeNode.getIpv4Addr();
+        int port = storeNode.getRpcPort();
+        return remoteService.getService(host, port, ObjectService.class);
+    }
 }

+ 13 - 4
oss-console/src/main/java/cn/reghao/oss/console/app/service/OssStoreService.java

@@ -42,7 +42,7 @@ public class OssStoreService {
 
         String domain = storeNode.getDomain();
         return uploadChannelRepository.findByBindDomain(domain).stream()
-                .map(uploadChannel -> getObjectChannel(uploadChannel, domain))
+                .map(this::getObjectChannel)
                 .collect(Collectors.toList());
     }
 
@@ -58,10 +58,19 @@ public class OssStoreService {
             return null;
         }
 
-        return getObjectChannel(uploadChannel, domain);
+        return getObjectChannel(uploadChannel);
     }
 
-    private ObjectChannel getObjectChannel(UploadChannel uploadChannel, String domain) {
+    public ObjectChannel getObjectChannel(int createBy, int channelId) {
+        UploadChannel uploadChannel = uploadChannelRepository.findByChannelIdAndCreateBy(channelId, createBy);
+        if (uploadChannel == null) {
+            return null;
+        }
+
+        return getObjectChannel(uploadChannel);
+    }
+
+    private ObjectChannel getObjectChannel(UploadChannel uploadChannel) {
         int channelId = uploadChannel.getChannelId();
         String name = uploadChannel.getName();
         String channelPrefix = uploadChannel.getPrefix();
@@ -69,6 +78,7 @@ public class OssStoreService {
         int fileType = uploadChannel.getFileType();
         boolean processFile = uploadChannel.getProcessFile();
         int scope = uploadChannel.getScope();
+        String domain = uploadChannel.getBindDomain();
         return new ObjectChannel(channelId, name, channelPrefix, maxSize, fileType, processFile, scope, domain);
     }
 
@@ -79,5 +89,4 @@ public class OssStoreService {
         String secretKey = storeNode.getSecretKey();
         return new StoreProperties(domain, referer, secretKey);
     }
-
 }

+ 41 - 10
oss-sdk/src/main/java/cn/reghao/oss/sdk/OssConsoleClient.java

@@ -193,6 +193,31 @@ public class OssConsoleClient {
         return webResult.getData();
     }
 
+    public ObjectChannel getObjectChannel(int channelId) throws Exception {
+        String api = String.format("%s/api/oss/server/channel?channelId=%s", endpoint, channelId);
+        HttpRequest httpRequest = HttpRequest.newBuilder(new URI(api))
+                .header("authorization", "Bearer " + token)
+                .version(HttpClient.Version.HTTP_1_1)
+                .GET()
+                .build();
+        HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
+        int statusCode = httpResponse.statusCode();
+        String body = httpResponse.body();
+        if (statusCode != 200) {
+            String errMsg = String.format("%s -> %s", statusCode, body);
+            throw new Exception(errMsg);
+        }
+
+        Type type = new TypeToken<WebResult<ObjectChannel>>(){}.getType();
+        WebResult<ObjectChannel> webResult = JsonConverter.jsonToObject(body, type);
+        if (webResult.getCode() != 0) {
+            String errMsg = String.format("%s - %s", webResult.getCode(), webResult.getMsg());
+            throw new Exception(errMsg);
+        }
+
+        return webResult.getData();
+    }
+
     public ObjectInfo getObjectInfo(String objectId) throws Exception {
         String api = String.format("%s/api/oss/object/info?objectId=%s", endpoint, objectId);
         HttpRequest httpRequest = HttpRequest.newBuilder(new URI(api))
@@ -277,18 +302,19 @@ public class OssConsoleClient {
         }
     }
 
-    public void setObjectsScope(int scope, List<String> objectIds, int contentType) throws Exception {
-        String objectIdsStr = objectIds.toString().replace("[", "").replace("]", "");
-        String api = String.format("%s/api/oss/media/scope/objects", endpoint);
-        MultiPartBodyPublisher publisher = new MultiPartBodyPublisher();
-        publisher.addPart("scope", scope+"");
-        publisher.addPart("objectIds", objectIdsStr);
-        publisher.addPart("contentType", contentType+"");
+    public void setObjectsScope(int channelId, List<String> objectNames, int scope) throws Exception {
+        String objectNamesStr = objectNames.toString().replace("[", "").replace("]", "");
+        Map<String, String> formData = new HashMap<>();
+        formData.put("channelId", channelId+"");
+        formData.put("scope", scope+"");
+        formData.put("objectNames", objectNamesStr);
 
+        String api = String.format("%s/api/oss/media/scope/objects", endpoint);
         HttpRequest httpRequest = HttpRequest.newBuilder(new URI(api))
                 .header("authorization", "Bearer " + token)
+                .headers("content-type", "application/x-www-form-urlencoded")
                 .version(HttpClient.Version.HTTP_1_1)
-                .POST(publisher.build())
+                .POST(HttpRequest.BodyPublishers.ofString(getFormDataAsString(formData)))
                 .build();
         HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
         int statusCode = httpResponse.statusCode();
@@ -453,11 +479,16 @@ public class OssConsoleClient {
 
     public List<ImageUrlDto> getImageUrls(int channelId, Set<String> imageFileIds) throws Exception {
         String imageFileIdsStr = imageFileIds.toString().replace("[", "").replace("]", "");
-        String api = String.format("%s/api/oss/media/image/urls?channelId=%s&imageFileIds=%s", endpoint, channelId, imageFileIdsStr);
+        Map<String, String> formData = new HashMap<>();
+        formData.put("channelId", channelId+"");
+        formData.put("imageFileIds", imageFileIdsStr);
+
+        String api = String.format("%s/api/oss/media/image/urls", endpoint);
         HttpRequest httpRequest = HttpRequest.newBuilder(new URI(api))
                 .header("authorization", "Bearer " + token)
+                .headers("content-type", "application/x-www-form-urlencoded")
                 .version(HttpClient.Version.HTTP_1_1)
-                .GET()
+                .POST(HttpRequest.BodyPublishers.ofString(getFormDataAsString(formData)))
                 .build();
         HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
         int statusCode = httpResponse.statusCode();

+ 1 - 2
oss-store/src/main/java/cn/reghao/oss/store/db/mapper/FileMetaMapper.java

@@ -17,8 +17,7 @@ import java.util.List;
  */
 @Mapper
 public interface FileMetaMapper extends BaseMapper<FileMeta> {
-    @Deprecated
-    void updateScopeByObjectIds(@Param("scope") int scope, @Param("list") List<String> list);
+    void updateScopeByObjectName(@Param("scope") int scope, @Param("objectName") String objectName);
     void updateScopeByObjectNames(@Param("scope") int scope, @Param("list") List<String> list);
 
     List<FileMeta> findFileMetaByPage(Page page);

+ 8 - 12
oss-store/src/main/java/cn/reghao/oss/store/db/repository/ObjectRepository.java

@@ -40,15 +40,15 @@ public class ObjectRepository {
         dataBlockMapper.saveAll(list);
     }
 
-    //@CacheEvict(cacheNames = "oss:store:objectMeta", key = "#fileMeta.objectName")
-    @Deprecated
-    public void updateObjectScope(int scope, List<String> objectIds) {
-        fileMetaMapper.updateScopeByObjectIds(scope, objectIds);
+    public void updateObjectsScope(int scope, List<String> objectNames) {
+        //fileMetaMapper.updateScopeByObjectNames(scope, objectNames);
+        objectNames.forEach(objectName -> updateObjectScope(scope, objectName));
     }
 
-    //@CacheEvict(cacheNames = "oss:store:objectMeta", key = "#objectName")
-    public void updateObjectScope1(int scope, List<String> objectNames) {
-        fileMetaMapper.updateScopeByObjectNames(scope, objectNames);
+    @CacheEvict(cacheNames = "oss:store:objectMeta", key = "#objectName")
+    public void updateObjectScope(int scope, String objectName) {
+        fileMetaMapper.updateScopeByObjectName(scope, objectName);
+        log.info("evict {}", objectName);
     }
 
     @CacheEvict(cacheNames = "oss:store:objectMeta", key = "#fileMeta.objectName")
@@ -104,7 +104,7 @@ public class ObjectRepository {
 
     @Cacheable(cacheNames = "oss:store:objectMeta", key = "#objectName", unless = "#result == null")
     public ObjectMeta getObjectMeta(String objectName) {
-        log.info("cache miss");
+        log.info("cache miss {}", objectName);
         ObjectMeta objectMeta = fileMetaMapper.findObjectMeta(objectName);
         return objectMeta;
     }
@@ -112,8 +112,4 @@ public class ObjectRepository {
     public ObjectMeta getObjectMetaById(String objectId) {
         return fileMetaMapper.findObjectMetaById(objectId);
     }
-
-    public List<String> getObjectNames(List<String> objectIds) {
-        return fileMetaMapper.findObjectNames(objectIds);
-    }
 }

+ 4 - 4
oss-store/src/main/java/cn/reghao/oss/store/rpc/ObjectServiceImpl.java

@@ -35,13 +35,13 @@ public class ObjectServiceImpl implements ObjectService {
     }
 
     @Override
-    public void setObjectsScope(int scope, List<String> objectIds) {
-        if (objectIds.isEmpty()) {
+    public void setObjectsScope(int scope, List<String> objectNames) {
+        if (objectNames.isEmpty()) {
             return;
         }
 
-        List<String> objectNames = objectRepository.getObjectNames(objectIds);
-        objectRepository.updateObjectScope1(scope, objectNames);
+        objectNames.forEach(objectName -> objectRepository.updateObjectScope(scope, objectName));
+        //objectRepository.updateObjectsScope(scope, objectNames);
     }
 
     @Override

+ 2 - 5
oss-store/src/main/resources/mapper/FileMetaMapper.xml

@@ -27,13 +27,10 @@
         set object_name=#{objectName}
         where object_id=#{objectId}
     </update>
-    <update id="updateScopeByObjectIds">
+    <update id="updateScopeByObjectName">
         update file_meta
         set scope=#{scope}
-        where object_id in
-        <foreach collection="list" item="item" separator="," open="(" close=")">
-            #{item}
-        </foreach>
+        where object_name=#{objectName}
     </update>
     <update id="updateScopeByObjectNames">
         update file_meta