Ver código fonte

1.删除 account 依赖, 使用 token 来鉴权
2.简化数据模型

reghao 2 anos atrás
pai
commit
72fa8128f3
39 arquivos alterados com 241 adições e 743 exclusões
  1. 0 5
      dfs-store/pom.xml
  2. 0 11
      dfs-store/src/main/java/cn/reghao/dfs/store/aop/AuthException.java
  3. 0 14
      dfs-store/src/main/java/cn/reghao/dfs/store/aop/AuthUser.java
  4. 0 38
      dfs-store/src/main/java/cn/reghao/dfs/store/aop/AuthUserAspect.java
  5. 2 10
      dfs-store/src/main/java/cn/reghao/dfs/store/controller/ObjectUploadController.java
  6. 2 0
      dfs-store/src/main/java/cn/reghao/dfs/store/db/mapper/AudioFileMapper.java
  7. 2 1
      dfs-store/src/main/java/cn/reghao/dfs/store/db/mapper/ImageFileMapper.java
  8. 0 21
      dfs-store/src/main/java/cn/reghao/dfs/store/db/mapper/ImageUrlMapper.java
  9. 3 1
      dfs-store/src/main/java/cn/reghao/dfs/store/db/mapper/VideoFileMapper.java
  10. 0 21
      dfs-store/src/main/java/cn/reghao/dfs/store/db/mapper/VideoUrlMapper.java
  11. 1 1
      dfs-store/src/main/java/cn/reghao/dfs/store/db/repository/AudioRepository.java
  12. 11 20
      dfs-store/src/main/java/cn/reghao/dfs/store/db/repository/ImageRepository.java
  13. 8 15
      dfs-store/src/main/java/cn/reghao/dfs/store/db/repository/VideoRepository.java
  14. 0 4
      dfs-store/src/main/java/cn/reghao/dfs/store/exception/ControllerExceptionHandler.java
  15. 1 52
      dfs-store/src/main/java/cn/reghao/dfs/store/inerceptor/AccessLogInterceptor.java
  16. 6 28
      dfs-store/src/main/java/cn/reghao/dfs/store/inerceptor/TokenFilter.java
  17. 4 7
      dfs-store/src/main/java/cn/reghao/dfs/store/model/po/AudioFile.java
  18. 17 1
      dfs-store/src/main/java/cn/reghao/dfs/store/model/po/ImageFile.java
  19. 0 25
      dfs-store/src/main/java/cn/reghao/dfs/store/model/po/ImageUrl.java
  20. 36 2
      dfs-store/src/main/java/cn/reghao/dfs/store/model/po/VideoFile.java
  21. 0 45
      dfs-store/src/main/java/cn/reghao/dfs/store/model/po/VideoUrl.java
  22. 24 12
      dfs-store/src/main/java/cn/reghao/dfs/store/rpc/PermissionServiceImpl.java
  23. 6 0
      dfs-store/src/main/java/cn/reghao/dfs/store/rpc/media/AudioFileServiceImpl.java
  24. 0 8
      dfs-store/src/main/java/cn/reghao/dfs/store/service/GetObjectService.java
  25. 3 0
      dfs-store/src/main/java/cn/reghao/dfs/store/service/ObjectNameService.java
  26. 1 14
      dfs-store/src/main/java/cn/reghao/dfs/store/task/ConvertTask.java
  27. 27 0
      dfs-store/src/main/java/cn/reghao/dfs/store/task/FileTask.java
  28. 0 101
      dfs-store/src/main/java/cn/reghao/dfs/store/task/VideoUrlUpdater.java
  29. 16 12
      dfs-store/src/main/java/cn/reghao/dfs/store/task/processor/AudioFileProcessor.java
  30. 10 50
      dfs-store/src/main/java/cn/reghao/dfs/store/task/processor/ImageFileProcessor.java
  31. 12 33
      dfs-store/src/main/java/cn/reghao/dfs/store/task/processor/VideoFileProcessor.java
  32. 9 6
      dfs-store/src/main/resources/mapper/AudioFileMapper.xml
  33. 14 11
      dfs-store/src/main/resources/mapper/ImageFileMapper.xml
  34. 0 43
      dfs-store/src/main/resources/mapper/ImageUrlMapper.xml
  35. 18 6
      dfs-store/src/main/resources/mapper/VideoFileMapper.xml
  36. 0 42
      dfs-store/src/main/resources/mapper/VideoUrlMapper.xml
  37. 0 83
      dfs-store/src/test/java/MediaFileTest.java
  38. 7 0
      oss-api/src/main/java/cn/reghao/oss/api/dto/media/AudioInfo.java
  39. 1 0
      oss-api/src/main/java/cn/reghao/oss/api/iface/PermissionService.java

+ 0 - 5
dfs-store/pom.xml

@@ -60,11 +60,6 @@
             <artifactId>oss-api</artifactId>
             <version>1.0.0-SNAPSHOT</version>
         </dependency>
-        <dependency>
-            <groupId>cn.reghao.tnb.account</groupId>
-            <artifactId>account-api</artifactId>
-            <version>1.0.0-SNAPSHOT</version>
-        </dependency>
 
         <dependency>
             <groupId>org.projectlombok</groupId>

+ 0 - 11
dfs-store/src/main/java/cn/reghao/dfs/store/aop/AuthException.java

@@ -1,11 +0,0 @@
-package cn.reghao.dfs.store.aop;
-
-/**
- * @author reghao
- * @date 2023-07-18 15:25:00
- */
-public class AuthException extends Throwable {
-    public AuthException(String msg) {
-        super(msg);
-    }
-}

+ 0 - 14
dfs-store/src/main/java/cn/reghao/dfs/store/aop/AuthUser.java

@@ -1,14 +0,0 @@
-package cn.reghao.dfs.store.aop;
-
-import java.lang.annotation.*;
-
-/**
- * @author reghao
- * @date 2023-07-18 15:15:10
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-public @interface AuthUser {
-    boolean value() default true;
-}

+ 0 - 38
dfs-store/src/main/java/cn/reghao/dfs/store/aop/AuthUserAspect.java

@@ -1,38 +0,0 @@
-package cn.reghao.dfs.store.aop;
-
-import cn.reghao.dfs.store.util.UserContext;
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Pointcut;
-import org.aspectj.lang.reflect.MethodSignature;
-import org.springframework.stereotype.Component;
-
-import java.lang.reflect.Method;
-
-/**
- * @author reghao
- * @date 2023-07-18 15:17:35
- */
-@Component
-@Aspect
-public class AuthUserAspect {
-    @Pointcut("@annotation(cn.reghao.dfs.store.aop.AuthUser)")
-    public void loginPointCut(){
-    }
-
-    @Around("loginPointCut()")
-    public Object tokenHandler(ProceedingJoinPoint point) throws Throwable {
-        Class<?> aClass = point.getTarget().getClass();
-        MethodSignature ms = (MethodSignature)point.getSignature();
-        Method method = aClass.getDeclaredMethod(ms.getName(),ms.getParameterTypes());
-        AuthUser authUser = method.getAnnotation(AuthUser.class);
-        long userId = UserContext.getUser();
-        boolean auth = authUser.value();
-        if (auth && userId != -1) {
-            return point.proceed(point.getArgs());
-        }
-
-        throw new AuthException("接口需要认证后才可访问");
-    }
-}

+ 2 - 10
dfs-store/src/main/java/cn/reghao/dfs/store/controller/ObjectUploadController.java

@@ -1,6 +1,5 @@
 package cn.reghao.dfs.store.controller;
 
-import cn.reghao.dfs.store.aop.AuthUser;
 import cn.reghao.dfs.store.model.vo.ObjectProp;
 import cn.reghao.dfs.store.model.vo.ObjectResult;
 import cn.reghao.dfs.store.service.ChannelValidateService;
@@ -9,7 +8,6 @@ import cn.reghao.dfs.store.service.ObjectNameService;
 import cn.reghao.dfs.store.service.PutObjectService;
 import cn.reghao.dfs.store.task.FileProcessor;
 import cn.reghao.dfs.store.util.JwtUtil;
-import cn.reghao.dfs.store.util.UserContext;
 import cn.reghao.jutil.jdk.result.WebResult;
 import cn.reghao.jutil.jdk.security.DigestUtil;
 import cn.reghao.jutil.web.ServletUtil;
@@ -49,7 +47,6 @@ public class ObjectUploadController {
         return WebResult.failWithMsg("not implement");
     }
 
-    @AuthUser
     @PostMapping(value = "/")
     public String postObject(MultipartFile file, Integer channelId, String client) throws Exception {
         /* permission check */
@@ -69,12 +66,8 @@ public class ObjectUploadController {
             if (channelId != channelId1) {
                 return WebResult.failWithMsg("channel not match in token");
             }
-
-            long userId1 = ossPayload.getUserId();
-            long loginUser = UserContext.getUser();
-            if (loginUser != userId1) {
-                return WebResult.failWithMsg("user not match in token");
-            }
+            /*long userId1 = ossPayload.getUserId();
+            UserContext context = new UserContext(userId1);*/
         }
 
         /* channel validate */
@@ -110,7 +103,6 @@ public class ObjectUploadController {
         return WebResult.fail();
     }
 
-    @AuthUser
     @DeleteMapping(value = "/")
     public String deleteObject(String objectId) {
         putObjectService.deleteObject(objectId);

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

@@ -2,6 +2,7 @@ package cn.reghao.dfs.store.db.mapper;
 
 import cn.reghao.dfs.store.model.po.AudioFile;
 import cn.reghao.jutil.jdk.db.BaseMapper;
+import cn.reghao.oss.api.dto.media.AudioInfo;
 import org.apache.ibatis.annotations.Mapper;
 
 /**
@@ -11,4 +12,5 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface AudioFileMapper extends BaseMapper<AudioFile> {
     AudioFile findByAudioFileId(String audioFileId);
+    AudioInfo findAudioInfo(String audioFileId);
 }

+ 2 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/db/mapper/ImageFileMapper.java

@@ -16,6 +16,7 @@ public interface ImageFileMapper extends BaseMapper<ImageFile> {
     void deleteByImageFileId(String imageFileId);
     void deleteByImageFileIds(List<String> list);
 
-    ImageFile findByImageFileId(String imageFileId);
+    List<ImageFile> findByImageFileId(String imageFileId);
+    List<ImageFile> findByImageFileIds(List<String> list);
     List<ImageObject> findAll1();
 }

+ 0 - 21
dfs-store/src/main/java/cn/reghao/dfs/store/db/mapper/ImageUrlMapper.java

@@ -1,21 +0,0 @@
-package cn.reghao.dfs.store.db.mapper;
-
-import cn.reghao.dfs.store.model.po.ImageUrl;
-import cn.reghao.dfs.store.model.vo.ImageObject;
-import cn.reghao.jutil.jdk.db.BaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2023-08-22 21:52:01
- */
-@Mapper
-public interface ImageUrlMapper extends BaseMapper<ImageUrl> {
-    void deleteByImageFileId(String imageFileId);
-
-    List<ImageUrl> findByImageFileIds(List<String> list);
-    List<ImageUrl> findByImageFileId(String imageFileId);
-    List<ImageObject> findAll1();
-}

+ 3 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/db/mapper/VideoFileMapper.java

@@ -4,6 +4,7 @@ import cn.reghao.dfs.store.model.po.VideoFile;
 import cn.reghao.jutil.jdk.db.BaseMapper;
 import cn.reghao.jutil.jdk.db.Page;
 import cn.reghao.oss.api.dto.media.VideoInfo;
+import cn.reghao.oss.api.dto.media.VideoUrlDto;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
@@ -17,6 +18,7 @@ public interface VideoFileMapper extends BaseMapper<VideoFile> {
     void deleteByVideoFileId(String videoFileId);
 
     List<VideoFile> findVideoFileByPage(Page page);
-    VideoFile findByVideoFileId(String videoFileId);
+    List<VideoUrlDto> findVideoUrls(String videoFileId);
+    List<VideoFile> findByVideoFileId(String videoFileId);
     VideoInfo findVideoInfo(String videoFileId);
 }

+ 0 - 21
dfs-store/src/main/java/cn/reghao/dfs/store/db/mapper/VideoUrlMapper.java

@@ -1,21 +0,0 @@
-package cn.reghao.dfs.store.db.mapper;
-
-import cn.reghao.oss.api.dto.media.VideoUrlDto;
-import cn.reghao.dfs.store.model.po.VideoUrl;
-import cn.reghao.jutil.jdk.db.BaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2022-08-04 09:31:27
- */
-@Mapper
-public interface VideoUrlMapper extends BaseMapper<VideoUrl> {
-    void deleteByVideoFileId(String videoFileId);
-
-    List<VideoUrlDto> findVideoUrls(String videoFileId);
-    List<VideoUrl> findByVideoFileId(String videoFileId);
-    VideoUrl findHighestQuality(String videoFileId);
-}

+ 1 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/db/repository/AudioRepository.java

@@ -26,6 +26,6 @@ public class AudioRepository {
     }
 
     public AudioInfo getAudioInfo(String audioFileId) {
-        return null;
+        return audioFileMapper.findAudioInfo(audioFileId);
     }
 }

+ 11 - 20
dfs-store/src/main/java/cn/reghao/dfs/store/db/repository/ImageRepository.java

@@ -17,24 +17,19 @@ import java.util.stream.Collectors;
 @Repository
 public class ImageRepository {
     private final ImageFileMapper imageFileMapper;
-    private final ImageUrlMapper imageUrlMapper;
 
-    public ImageRepository(ImageFileMapper imageFileMapper, ImageUrlMapper imageUrlMapper) {
+    public ImageRepository(ImageFileMapper imageFileMapper) {
         this.imageFileMapper = imageFileMapper;
-        this.imageUrlMapper = imageUrlMapper;
     }
 
     @Transactional(rollbackFor = Exception.class)
-    public void saveImageFile(ImageFile imageFile, List<ImageUrl> imageUrls) {
-        imageFileMapper.save(imageFile);
-        if (!imageUrls.isEmpty()) {
-            imageUrlMapper.saveAll(imageUrls);
-        }
+    public void saveImageFiles(List<ImageFile> imageFiles) {
+        imageFileMapper.saveAll(imageFiles);
     }
 
     public List<String> deleteImageFile(String imageFileId) {
-        List<String> objectIds = imageUrlMapper.findByImageFileId(imageFileId).stream()
-                .map(ImageUrl::getObjectId)
+        List<String> objectIds = imageFileMapper.findByImageFileId(imageFileId).stream()
+                .map(ImageFile::getObjectId)
                 .collect(Collectors.toList());
         deleteImageFile0(imageFileId);
         return objectIds;
@@ -42,16 +37,12 @@ public class ImageRepository {
 
     @Transactional(rollbackFor = Exception.class)
     public void deleteImageFile0(String imageFileId) {
-        imageUrlMapper.deleteByImageFileId(imageFileId);
         imageFileMapper.deleteByImageFileId(imageFileId);
     }
 
     public ImageFile getImageFile(String imageFileId) {
-        return imageFileMapper.findByImageFileId(imageFileId);
-    }
-
-    public List<ImageUrl> getImageUrls(String imageFileId) {
-        return imageUrlMapper.findByImageFileId(imageFileId);
+        List<ImageFile> list = imageFileMapper.findByImageFileId(imageFileId);
+        return list.isEmpty() ? null : list.get(0);
     }
 
     public List<ImageUrlDto> getImageUrls(List<String> imageFileIds) {
@@ -65,15 +56,15 @@ public class ImageRepository {
     }
 
     public ImageUrlDto getImageUrl(String imageFileId) {
-        List<ImageUrl> list = imageUrlMapper.findByImageFileId(imageFileId);
+        List<ImageFile> list = imageFileMapper.findByImageFileId(imageFileId);
         if (list.isEmpty()) {
             return null;
         }
 
         ImageUrlDto imageUrlDto = new ImageUrlDto(imageFileId);
-        for (ImageUrl imageUrl : list) {
-            String format = imageUrl.getFormat();
-            String url = imageUrl.getUrl();
+        for (ImageFile imageFile : list) {
+            String format = imageFile.getFormat();
+            String url = imageFile.getUrl();
             if ("webp".equals(format)) {
                 imageUrlDto.setThumbnailUrl(url);
             } else {

+ 8 - 15
dfs-store/src/main/java/cn/reghao/dfs/store/db/repository/VideoRepository.java

@@ -19,22 +19,19 @@ import java.util.stream.Collectors;
 @Repository
 public class VideoRepository {
     private final VideoFileMapper videoFileMapper;
-    private final VideoUrlMapper videoUrlMapper;
 
-    public VideoRepository(VideoFileMapper videoFileMapper, VideoUrlMapper videoUrlMapper) {
+    public VideoRepository(VideoFileMapper videoFileMapper) {
         this.videoFileMapper = videoFileMapper;
-        this.videoUrlMapper = videoUrlMapper;
     }
 
     @Transactional(rollbackFor = Exception.class)
-    public void saveVideoFile(VideoFile videoFile, VideoUrl videoUrl) {
-        videoFileMapper.save(videoFile);
-        videoUrlMapper.save(videoUrl);
+    public void saveVideoFiles(List<VideoFile> videoFiles) {
+        videoFileMapper.saveAll(videoFiles);
     }
 
     public List<String> deleteVideoFile(String videoFileId) {
-        List<String> objectIds = videoUrlMapper.findByVideoFileId(videoFileId).stream()
-                .map(VideoUrl::getObjectId)
+        List<String> objectIds = videoFileMapper.findByVideoFileId(videoFileId).stream()
+                .map(VideoFile::getObjectId)
                 .collect(Collectors.toList());
         deleteVideoFile0(videoFileId);
         return objectIds;
@@ -42,7 +39,6 @@ public class VideoRepository {
 
     @Transactional(rollbackFor = Exception.class)
     public void deleteVideoFile0(String videoFileId) {
-        videoUrlMapper.deleteByVideoFileId(videoFileId);
         videoFileMapper.deleteByVideoFileId(videoFileId);
     }
 
@@ -51,15 +47,12 @@ public class VideoRepository {
     }
 
     public VideoFile findVideoFile(String videoFileId) {
-        return videoFileMapper.findByVideoFileId(videoFileId);
-    }
-
-    public VideoUrl findVideoUrl(String videoFileId) {
-        return videoUrlMapper.findHighestQuality(videoFileId);
+        List<VideoFile> list = videoFileMapper.findByVideoFileId(videoFileId);
+        return list.isEmpty() ? null : list.get(0);
     }
 
     @Cacheable(cacheNames = "oss:store:videoUrls", key = "#videoFileId", unless = "#result.empty")
     public List<VideoUrlDto> findVideoUrls(String videoFileId) {
-        return videoUrlMapper.findVideoUrls(videoFileId);
+        return videoFileMapper.findVideoUrls(videoFileId);
     }
 }

+ 0 - 4
dfs-store/src/main/java/cn/reghao/dfs/store/exception/ControllerExceptionHandler.java

@@ -1,6 +1,5 @@
 package cn.reghao.dfs.store.exception;
 
-import cn.reghao.dfs.store.aop.AuthException;
 import cn.reghao.jutil.jdk.exception.ExceptionUtil;
 import cn.reghao.jutil.jdk.result.WebResult;
 import lombok.extern.slf4j.Slf4j;
@@ -55,9 +54,6 @@ public class ControllerExceptionHandler {
         } else if (e instanceof IllegalStateException) {
             IllegalStateException exception = (IllegalStateException) e;
             Throwable throwable = exception.getCause();
-            if (throwable instanceof AuthException) {
-                status = HttpStatus.UNAUTHORIZED.value();
-            }
             body = WebResult.errorWithMsg(throwable.getMessage());
         }
 

+ 1 - 52
dfs-store/src/main/java/cn/reghao/dfs/store/inerceptor/AccessLogInterceptor.java

@@ -1,9 +1,5 @@
 package cn.reghao.dfs.store.inerceptor;
 
-import cn.reghao.dfs.store.db.repository.ObjectRepository;
-import cn.reghao.dfs.store.model.po.FileMeta;
-import cn.reghao.dfs.store.util.UserContext;
-import cn.reghao.oss.api.constant.ObjectScope;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
@@ -12,8 +8,6 @@ import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.net.URLDecoder;
-import java.nio.charset.StandardCharsets;
 
 /**
  * 访问日志拦截器
@@ -24,55 +18,10 @@ import java.nio.charset.StandardCharsets;
 @Slf4j
 @Component
 public class AccessLogInterceptor implements HandlerInterceptor {
-    private final ObjectRepository objectRepository;
-
-    public AccessLogInterceptor(ObjectRepository objectRepository) {
-        this.objectRepository = objectRepository;
-    }
-
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         String uri = request.getRequestURI();
         String method = request.getMethod();
-        if (method.equals("OPTIONS")) {
-            return true;
-        }
-
-        return true;
-        //return checkPermission(method, uri, response);
-    }
-
-    private boolean checkPermission(String method, String uri,  HttpServletResponse response) {
-        long userId = UserContext.getUser();
-        if (method.equals("GET") || method.equals("HEAD")) {
-            String objectName = URLDecoder.decode(uri, StandardCharsets.UTF_8).replaceFirst("/", "");
-            FileMeta fileMeta = objectRepository.getByObjectName(objectName);
-            if (fileMeta == null) {
-                response.setStatus(HttpServletResponse.SC_NOT_FOUND);
-                return false;
-            }
-
-            long uploadBy = fileMeta.getUploadBy();
-            if (userId == uploadBy) {
-                return true;
-            }
-
-            int scope = fileMeta.getScope();
-            if (scope == ObjectScope.PRIVATE.getCode()) {
-                response.setStatus(HttpServletResponse.SC_FORBIDDEN);
-                return false;
-            } else if (scope == ObjectScope.PUBLIC.getCode()) {
-                return true;
-            } else if (scope == ObjectScope.FRIEND.getCode()) {
-                return false;
-            }
-        } else if (method.equals("PUT") || method.equals("POST")) {
-            if (userId == -1) {
-                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-                return false;
-            }
-        }
-
         return true;
     }
 
@@ -86,7 +35,7 @@ public class AccessLogInterceptor implements HandlerInterceptor {
         String ipv4 = request.getRemoteAddr();
         String referer = request.getHeader("referer");
         String sign = request.getParameter("sign");
-        log.info("{} {} -> {} {}", statusCode, method, uri, userAgent);
+        //log.info("{} {} -> {} {}", statusCode, method, uri, userAgent);
     }
 
     @Override

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

@@ -1,15 +1,12 @@
 package cn.reghao.dfs.store.inerceptor;
 
+import cn.reghao.dfs.store.util.JwtUtil;
 import cn.reghao.dfs.store.util.UserContext;
 import cn.reghao.jutil.web.ServletUtil;
-import cn.reghao.tnb.account.api.constant.TokenType;
-import cn.reghao.tnb.account.api.dto.AccountInfo;
-import cn.reghao.tnb.account.api.iface.AuthService;
-import org.apache.dubbo.config.annotation.DubboReference;
+import cn.reghao.oss.api.dto.OssPayload;
 import org.springframework.stereotype.Component;
 
 import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
 
 /**
@@ -18,10 +15,6 @@ import java.io.IOException;
  */
 @Component
 public class TokenFilter implements Filter {
-    @DubboReference(check = false)
-    private AuthService authService;
-    private final String cookieKey = "USERDATA";
-
     @Override
     public void init(FilterConfig filterConfig) throws ServletException {
     }
@@ -30,25 +23,10 @@ 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, request);
-        AccountInfo accountInfo = null;
-        if (sessId != null) {
-            accountInfo = authService.getAccountInfo(TokenType.cookie.getValue(), sessId);
-        } else {
-            sessId = ServletUtil.getBearerToken(request);
-            if (sessId != null) {
-                accountInfo = authService.getAccountInfo(TokenType.token.getValue(), sessId);
-            }
-        }
-
-        if (accountInfo != null) {
-            userId = accountInfo.getUserId();
-        }
-
-        HttpServletRequest servletRequest = (HttpServletRequest) request;
-        String xUserId = servletRequest.getHeader("x-user-id");
-        if (xUserId != null) {
-            userId = Long.parseLong(xUserId);
+        String token = ServletUtil.getBearerToken(request);
+        if (token != null) {
+            OssPayload ossPayload = JwtUtil.getOssPayload(token);
+            userId = ossPayload.getUserId();
         }
 
         try (UserContext context = new UserContext(userId)) {

+ 4 - 7
dfs-store/src/main/java/cn/reghao/dfs/store/model/po/AudioFile.java

@@ -1,6 +1,7 @@
 package cn.reghao.dfs.store.model.po;
 
 import cn.reghao.jutil.jdk.db.BaseObject;
+import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
@@ -11,19 +12,15 @@ import lombok.NoArgsConstructor;
  * @author reghao
  * @date 2023-07-05 16:42:01
  */
+@AllArgsConstructor
 @NoArgsConstructor
 @EqualsAndHashCode(callSuper = true)
 @Data
 public class AudioFile extends BaseObject<Integer> {
     private String audioFileId;
     private String objectId;
+    private int duration;
     private String codec;
+    private Long bitRate;
     private String url;
-
-    public AudioFile(String audioFileId, String objectId, String codec, String url) {
-        this.audioFileId = audioFileId;
-        this.objectId = objectId;
-        this.codec = codec;
-        this.url = url;
-    }
 }

+ 17 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/model/po/ImageFile.java

@@ -17,14 +17,30 @@ import lombok.NoArgsConstructor;
 public class ImageFile extends BaseObject<Integer> {
     // 原始文件的 objectId
     private String imageFileId;
+    private String objectId;
+    private String format;
+    private String url;
     private Integer width;
     private Integer height;
     private Boolean horizontal;
 
-    public ImageFile(String imageFileId, Integer width, Integer height) {
+    public ImageFile(String imageFileId, String objectId, String format, String url, Integer width, Integer height) {
         this.imageFileId = imageFileId;
+        this.objectId = objectId;
+        this.format = format;
+        this.url = url;
         this.width = width;
         this.height = height;
         this.horizontal = width > height;
     }
+
+    public ImageFile(ImageFile imageFile) {
+        this.imageFileId = imageFile.getImageFileId();
+        this.objectId = imageFile.getObjectId();
+        this.format = imageFile.getFormat();
+        this.url = imageFile.getUrl();
+        this.width = imageFile.getWidth();
+        this.height = imageFile.getHeight();
+        this.horizontal = imageFile.getHorizontal();
+    }
 }

+ 0 - 25
dfs-store/src/main/java/cn/reghao/dfs/store/model/po/ImageUrl.java

@@ -1,25 +0,0 @@
-package cn.reghao.dfs.store.model.po;
-
-import cn.reghao.jutil.jdk.db.BaseObject;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-
-/**
- * 图像 URL
- *
- * @author reghao
- * @date 2023-08-22 21:52:01
- */
-@AllArgsConstructor
-@NoArgsConstructor
-@Data
-public class ImageUrl extends BaseObject<Integer> {
-    private String imageFileId;
-    private String format;
-    private String objectId;
-    private String url;
-    private Integer width;
-    private Integer height;
-}

+ 36 - 2
dfs-store/src/main/java/cn/reghao/dfs/store/model/po/VideoFile.java

@@ -17,13 +17,47 @@ import lombok.Setter;
 public class VideoFile extends BaseObject<Integer> {
     // 原始文件的 objectId
     private String videoFileId;
+    private String objectId;
+    private String videoCodec;
+    private String audioCodec;
+    private String urlType;
+    private String url;
+    private Long bitRate;
+    private String quality;
+    private Integer width;
+    private Integer height;
     private Boolean horizontal;
     // 单位秒
     private Integer duration;
 
-    public VideoFile(String videoFileId, boolean horizontal, int duration) {
+    public VideoFile(String videoFileId, String objectId, String videoCodec, String audioCodec,
+                     String urlType, String url, long bitRate, String quality, int width, int height, int duration) {
         this.videoFileId = videoFileId;
-        this.horizontal = horizontal;
+        this.objectId = objectId;
+        this.videoCodec = videoCodec;
+        this.audioCodec = audioCodec;
+        this.urlType = urlType;
+        this.url = url;
+        this.bitRate = bitRate;
+        this.quality = quality;
+        this.width = width;
+        this.height = height;
+        this.horizontal = width>height;
         this.duration = duration;
     }
+
+    public VideoFile(String videoFileId, VideoFile videoFile) {
+        this.videoFileId = videoFileId;
+        this.objectId = videoFile.getObjectId();
+        this.videoCodec = videoFile.getVideoCodec();
+        this.audioCodec = videoFile.getAudioCodec();
+        this.urlType = videoFile.getUrlType();
+        this.url = videoFile.getUrl();
+        this.bitRate = videoFile.getBitRate();
+        this.quality = videoFile.getQuality();
+        this.width = videoFile.getWidth();
+        this.height = videoFile.getHeight();
+        this.horizontal = videoFile.getHorizontal();
+        this.duration = videoFile.getDuration();
+    }
 }

+ 0 - 45
dfs-store/src/main/java/cn/reghao/dfs/store/model/po/VideoUrl.java

@@ -1,45 +0,0 @@
-package cn.reghao.dfs.store.model.po;
-
-import cn.reghao.jutil.media.MediaResolution;
-import cn.reghao.jutil.jdk.db.BaseObject;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-/**
- * @author reghao
- * @date 2022-08-04 09:19:16
- */
-@AllArgsConstructor
-@NoArgsConstructor
-@Setter
-@Getter
-public class VideoUrl extends BaseObject<Integer> {
-    private String videoFileId;
-    private String objectId;
-    private String videoCodec;
-    private String audioCodec;
-    private String urlType;
-    private String url;
-    private Long bitRate;
-    private int quality;
-    private String qualityStr;
-    private Integer width;
-    private Integer height;
-
-    public VideoUrl(String videoFileId, String objectId, String videoCodec, String audioCodec,
-                    String urlType, String url, Long bitRate, MediaResolution mediaResolution) {
-        this.videoFileId = videoFileId;
-        this.objectId = objectId;
-        this.videoCodec = videoCodec;
-        this.audioCodec = audioCodec;
-        this.urlType = urlType;
-        this.url = url;
-        this.bitRate = bitRate;
-        this.quality = mediaResolution.getQuality();
-        this.qualityStr = mediaResolution.getQualityStr();
-        this.width = mediaResolution.getWidth();
-        this.height = mediaResolution.getHeight();
-    }
-}

+ 24 - 12
dfs-store/src/main/java/cn/reghao/dfs/store/rpc/PermissionServiceImpl.java

@@ -3,8 +3,7 @@ package cn.reghao.dfs.store.rpc;
 import cn.reghao.dfs.store.db.mapper.*;
 import cn.reghao.dfs.store.model.po.AudioFile;
 import cn.reghao.dfs.store.model.po.ImageFile;
-import cn.reghao.dfs.store.model.po.ImageUrl;
-import cn.reghao.dfs.store.model.po.VideoUrl;
+import cn.reghao.dfs.store.model.po.VideoFile;
 import cn.reghao.oss.api.constant.ObjectScope;
 import cn.reghao.oss.api.iface.PermissionService;
 import org.apache.dubbo.config.annotation.DubboService;
@@ -20,16 +19,16 @@ import java.util.stream.Collectors;
 @DubboService
 @Service
 public class PermissionServiceImpl implements PermissionService {
-    private final ImageUrlMapper imageUrlMapper;
+    private final ImageFileMapper imageFileMapper;
     private final AudioFileMapper audioFileMapper;
-    private final VideoUrlMapper videoUrlMapper;
+    private final VideoFileMapper videoFileMapper;
     private final FileMetaMapper fileMetaMapper;
 
-    public PermissionServiceImpl(ImageUrlMapper imageUrlMapper, AudioFileMapper audioFileMapper,
-                                 VideoUrlMapper videoUrlMapper, FileMetaMapper fileMetaMapper) {
-        this.imageUrlMapper = imageUrlMapper;
+    public PermissionServiceImpl(ImageFileMapper imageFileMapper, AudioFileMapper audioFileMapper,
+                                 VideoFileMapper videoFileMapper, FileMetaMapper fileMetaMapper) {
+        this.imageFileMapper = imageFileMapper;
         this.audioFileMapper = audioFileMapper;
-        this.videoUrlMapper = videoUrlMapper;
+        this.videoFileMapper = videoFileMapper;
         this.fileMetaMapper = fileMetaMapper;
     }
 
@@ -45,18 +44,31 @@ public class PermissionServiceImpl implements PermissionService {
 
     @Override
     public void setVideoPermission(String videoFileId, int scope) {
-        List<String> objectIds = videoUrlMapper.findByVideoFileId(videoFileId).stream()
-                .map(VideoUrl::getObjectId)
+        List<String> objectIds = videoFileMapper.findByVideoFileId(videoFileId).stream()
+                .map(VideoFile::getObjectId)
                 .collect(Collectors.toList());
         if (!objectIds.isEmpty()) {
             fileMetaMapper.updateScopeByObjectIds(scope, objectIds);
         }
     }
 
+    @Override
+    public void setAudioPermission(String audioFileId, int scope) {
+        AudioFile audioFile = audioFileMapper.findByAudioFileId(audioFileId);
+        if (audioFile == null) {
+            return;
+        }
+
+        List<String> objectIds = List.of(audioFile.getObjectId());
+        if (!objectIds.isEmpty()) {
+            fileMetaMapper.updateScopeByObjectIds(scope, objectIds);
+        }
+    }
+
     @Override
     public void setImagesPermission(List<String> imageFileIds, int scope) {
-        List<String> objectIds = imageUrlMapper.findByImageFileIds(imageFileIds).stream()
-                .map(ImageUrl::getObjectId)
+        List<String> objectIds = imageFileMapper.findByImageFileIds(imageFileIds).stream()
+                .map(ImageFile::getObjectId)
                 .collect(Collectors.toList());
         if (!objectIds.isEmpty()) {
             fileMetaMapper.updateScopeByObjectIds(scope, objectIds);

+ 6 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/rpc/media/AudioFileServiceImpl.java

@@ -23,4 +23,10 @@ public class AudioFileServiceImpl implements AudioFileService {
     public AudioInfo getAudioInfo(String audioFileId) {
         return audioRepository.getAudioInfo(audioFileId);
     }
+
+    public void getAudioUrl(String audioFileId) {
+        AudioInfo audioInfo = audioRepository.getAudioInfo(audioFileId);
+        String sign = "";
+        return;
+    }
 }

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

@@ -1,6 +1,5 @@
 package cn.reghao.dfs.store.service;
 
-import cn.reghao.dfs.store.aop.AuthUser;
 import cn.reghao.dfs.store.config.OssProperties;
 import cn.reghao.dfs.store.db.mapper.FileMetaMapper;
 import cn.reghao.dfs.store.db.repository.ObjectRepository;
@@ -91,7 +90,6 @@ public class GetObjectService {
         }
     }
 
-    @AuthUser
     public void downloadObject(String objectName) throws IOException {
         String token = ServletUtil.getBearerToken();
         if (token == null) {
@@ -110,12 +108,6 @@ public class GetObjectService {
             writeResponse(HttpServletResponse.SC_UNAUTHORIZED);
         }
 
-        long userId1 = ossPayload.getUserId();
-        long userId = UserContext.getUser();
-        if (userId != userId1) {
-            writeResponse(HttpServletResponse.SC_UNAUTHORIZED);
-        }
-
         String userAgent = ServletUtil.getRequest().getHeader("user-agent");
         String host = ServletUtil.getRequest().getHeader("host");
         HttpServletResponse response = ServletUtil.getResponse();

+ 3 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/service/ObjectNameService.java

@@ -46,6 +46,9 @@ public class ObjectNameService {
         String objectName = objectPrefix + UUID.randomUUID().toString().replace("-", "") + suffix;
         boolean diskFile = channelId == UploadChannel.disk.getCode();
         int scope = ObjectScope.PRIVATE.getCode();
+        if (channelId == UploadChannel.avatar.getCode() || channelId == UploadChannel.image.getCode()) {
+            scope = ObjectScope.PUBLIC.getCode();
+        }
 
         FileMeta fileMeta = objectRepository.getByObjectName(objectPrefix);
         if (fileMeta == null) {

+ 1 - 14
dfs-store/src/main/java/cn/reghao/dfs/store/task/ConvertTask.java

@@ -4,9 +4,6 @@ import cn.reghao.dfs.store.service.ObjectNameService;
 import cn.reghao.jutil.media.FFmpegWrapper;
 import cn.reghao.jutil.media.model.MediaProps;
 import cn.reghao.jutil.media.model.VideoProps;
-import cn.reghao.oss.api.constant.VideoUrlType;
-import cn.reghao.dfs.store.db.mapper.VideoUrlMapper;
-import cn.reghao.dfs.store.model.po.VideoUrl;
 import cn.reghao.jutil.media.MediaQuality;
 import cn.reghao.jutil.media.MediaResolution;
 
@@ -21,17 +18,14 @@ public class ConvertTask implements Runnable {
     private String videoFileId;
     private String absolutePath;
     private ObjectNameService objectNameService;
-    private VideoUrlMapper videoUrlMapper;
 
     public ConvertTask() {
     }
 
-    public ConvertTask(String videoFileId, String absolutePath,
-                       ObjectNameService objectNameService, VideoUrlMapper videoUrlMapper) {
+    public ConvertTask(String videoFileId, String absolutePath, ObjectNameService objectNameService) {
         this.videoFileId = videoFileId;
         this.absolutePath = absolutePath;
         this.objectNameService = objectNameService;
-        this.videoUrlMapper = videoUrlMapper;
     }
 
     @Override
@@ -52,16 +46,9 @@ public class ConvertTask implements Runnable {
             String audioCodec = "aac";
             long bitRate = videoProps.getBitRate();
             MediaResolution mediaResolution = MediaQuality.getQuality(width, height);
-            VideoUrl videoUrl = new VideoUrl(videoFileId, objectName, videoCodec, audioCodec,
-                    VideoUrlType.mp4.name(), url, bitRate, mediaResolution);
-            //videoUrlMapper.save(videoUrl);
             destFile.delete();
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
-
-    VideoUrl getConvertedVideoUrl() {
-        return null;
-    }
 }

+ 27 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/task/FileTask.java

@@ -0,0 +1,27 @@
+package cn.reghao.dfs.store.task;
+
+import cn.reghao.dfs.store.db.mapper.ImageFileMapper;
+import cn.reghao.dfs.store.db.repository.ObjectRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+
+/**
+ * @author reghao
+ * @date 2023-08-29 18:03:39
+ */
+@Slf4j
+@Service
+@Deprecated
+public class FileTask {
+    @Autowired
+    ImageFileMapper imageFileMapper;
+    @Autowired
+    ObjectRepository objectRepository;
+
+    //@PostConstruct
+    public void update() {
+    }
+}

+ 0 - 101
dfs-store/src/main/java/cn/reghao/dfs/store/task/VideoUrlUpdater.java

@@ -1,101 +0,0 @@
-package cn.reghao.dfs.store.task;
-
-import cn.reghao.dfs.store.db.mapper.ImageFileMapper;
-import cn.reghao.dfs.store.db.mapper.ImageUrlMapper;
-import cn.reghao.dfs.store.db.mapper.VideoUrlMapper;
-import cn.reghao.dfs.store.db.repository.ObjectRepository;
-import cn.reghao.dfs.store.model.po.ImageFile;
-import cn.reghao.dfs.store.model.po.VideoUrl;
-import cn.reghao.dfs.store.model.vo.ImageObject;
-import cn.reghao.jutil.media.FFmpegWrapper;
-import cn.reghao.jutil.media.ImageOps;
-import cn.reghao.jutil.media.model.AudioProps;
-import cn.reghao.jutil.media.model.MediaProps;
-import cn.reghao.jutil.media.model.VideoProps;
-import cn.reghao.oss.api.dto.ObjectMeta;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.PostConstruct;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author reghao
- * @date 2023-08-29 18:03:39
- */
-@Slf4j
-@Service
-@Deprecated
-public class VideoUrlUpdater {
-    @Autowired
-    ImageFileMapper imageFileMapper;
-    @Autowired
-    ImageUrlMapper imageUrlMapper;
-    @Autowired
-    ObjectRepository objectRepository;
-
-    //@PostConstruct
-    public void update() {
-        log.info("开始更新 VideoUrl...");
-
-        List<ImageObject> list = imageFileMapper.findAll1();
-        Set<String> ids = list.stream().map(ImageObject::getImageFileId).collect(Collectors.toSet());
-
-        List<ImageObject> list1 = imageUrlMapper.findAll1();
-        //Set<String> ids = list1.stream().map(ImageObject::getImageFileId).collect(Collectors.toSet());
-
-        List<ImageObject> notExist = new ArrayList<>();
-        list1.forEach(imageObject -> {
-            if (!ids.contains(imageObject.getImageFileId())) {
-                notExist.add(imageObject);
-            }
-        });
-
-        List<ImageFile> imageFiles = new ArrayList<>();
-        /*for (ImageObject imageObject : notExist) {
-            String imageFileId = imageObject.getImageFileId();
-            String objectId = imageObject.getObjectId();
-            ObjectMeta objectMeta = objectRepository.getObjectMetaById(objectId);
-            if (objectMeta == null) {
-                log.error("object {} not exist", objectId);
-                continue;
-            }
-
-            String absolutePath = objectMeta.getAbsolutePath();
-            File file = new File(absolutePath);
-            if (!file.exists()) {
-                log.error("file {} not exist", absolutePath);
-                continue;
-            }
-
-            try {
-                ImageOps.Size size = ImageOps.info(file);
-                int width = size.getWidth();
-                int height = size.getHeight();
-                ImageFile imageFile = new ImageFile(imageFileId, width, height);
-                imageFiles.add(imageFile);
-
-                if (imageFiles.size() > 10_000) {
-                    imageFileMapper.saveAll(imageFiles);
-                    log.info("持久化 {} 个 ImageFile", imageFiles.size());
-                    imageFiles.clear();
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-
-        if (imageFiles.size() > 0) {
-            imageFileMapper.saveAll(imageFiles);
-            log.info("持久化 {} 个 ImageFile", imageFiles.size());
-            imageFiles.clear();
-        }*/
-
-        log.info("VideoUrl 更新完成...");
-    }
-}

+ 16 - 12
dfs-store/src/main/java/cn/reghao/dfs/store/task/processor/AudioFileProcessor.java

@@ -45,18 +45,20 @@ public class AudioFileProcessor {
     }
 
     public UploadFileRet process(ObjectResult objectResult) {
-        String originalObjectName = objectResult.getObjectName();
+        String objectName = objectResult.getObjectName();
         String audioFileId = objectResult.getObjectId();
         boolean duplicate = objectResult.isDuplicate();
         if (duplicate) {
-            ObjectResult objectResult1 = putObjectService.copyObject(originalObjectName);
+            ObjectResult objectResult1 = putObjectService.copyObject(objectName);
             String objectId1 = objectResult1.getObjectId();
             String url1 = objectNameService.getObjectUrl(objectResult1.getObjectName());
 
             String dupObjectId = objectResult.getDupObjectId();
             AudioFile audioFile = audioRepository.findAudioFile(dupObjectId);
+            int duration = audioFile.getDuration();
             String audioCodec = audioFile.getCodec();
-            AudioFile audioFile1 = new AudioFile(audioFileId, objectId1, audioCodec, url1);
+            long bitRate = audioFile.getBitRate();
+            AudioFile audioFile1 = new AudioFile(audioFileId, objectId1, duration, audioCodec, bitRate, url1);
             audioRepository.saveAudioFile(audioFile1);
             return new UploadFileRet(objectId1, null);
         }
@@ -64,24 +66,24 @@ public class AudioFileProcessor {
         String absolutePath = objectResult.getAbsolutePath();
         MediaProps mediaProps = FFmpegWrapper.getMediaProps(absolutePath);
         if (mediaProps == null || mediaProps.getAudioProps() == null) {
-            log.error("{} 的 FFmpeg 音频信息为 null", originalObjectName);
+            log.error("{} 的 FFmpeg 音频信息为 null", objectName);
             return null;
         }
 
         AudioProps audioProps = mediaProps.getAudioProps();
         String audioCodec = audioProps.getCodecName();
+        int duration = audioProps.getDuration().intValue();
+        long bitRate = audioProps.getBitRate();
         if (!audioCodecs.contains(audioCodec)) {
-            log.info("将 {} 对象的音频转换为 aac 编码", originalObjectName);
+            log.info("将 {} 对象的音频转换为 aac 编码", objectName);
             File file = new File(objectResult.getAbsolutePath());
-            return getConvertedAudioFile(audioFileId, file, originalObjectName, ".m4a");
+            return getConvertedAudioFile(audioFileId, file, objectName, ".m4a");
         }
 
-        ObjectResult objectResult1 = putObjectService.copyObject(originalObjectName);
-        String objectId1 = objectResult1.getObjectId();
-        String url1 = objectNameService.getObjectUrl(objectResult1.getObjectName());
-        AudioFile audioFile = new AudioFile(audioFileId, objectId1, audioCodec, url1);
+        String url1 = objectNameService.getObjectUrl(objectName);
+        AudioFile audioFile = new AudioFile(audioFileId, audioFileId, duration, audioCodec, bitRate, url1);
         audioRepository.saveAudioFile(audioFile);
-        return new UploadFileRet(objectId1, null);
+        return new UploadFileRet(audioFileId, null);
     }
 
     private UploadFileRet getConvertedAudioFile(String audioFileId, File file, String originalObjectName, String suffix) {
@@ -104,8 +106,10 @@ public class AudioFileProcessor {
             ObjectResult objectResult = putObjectService.putObject(objectProp, contentId, savedFile, originalFilename, sha256sum);
             String objectId = objectResult.getObjectId();
             String url = objectNameService.getObjectUrl(objectResult.getObjectName());
+            int duration = 0;
             String codec = "aac";
-            AudioFile audioFile = new AudioFile(audioFileId, objectId, codec, url);
+            long bitRate = 0;
+            AudioFile audioFile = new AudioFile(audioFileId, objectId, duration, codec, bitRate, url);
             audioRepository.saveAudioFile(audioFile);
             return new UploadFileRet(objectId, null);
         } catch (Exception e) {

+ 10 - 50
dfs-store/src/main/java/cn/reghao/dfs/store/task/processor/ImageFileProcessor.java

@@ -1,7 +1,6 @@
 package cn.reghao.dfs.store.task.processor;
 
 import cn.reghao.dfs.store.db.repository.ImageRepository;
-import cn.reghao.dfs.store.model.po.ImageUrl;
 import cn.reghao.dfs.store.model.vo.ObjectProp;
 import cn.reghao.dfs.store.model.vo.ObjectResult;
 import cn.reghao.dfs.store.service.FileStoreService;
@@ -51,22 +50,8 @@ public class ImageFileProcessor {
         if (duplicate) {
             String dupObjectId = objectResult.getDupObjectId();
             ImageFile imageFile = imageRepository.getImageFile(dupObjectId);
-            int width = imageFile.getWidth();
-            int height = imageFile.getHeight();
-            ImageFile imageFile1 = new ImageFile(objectId, width, height);
-
-            List<ImageUrl> imageUrls = imageRepository.getImageUrls(dupObjectId);
-            if (imageUrls.size() > 1) {
-                log.info("{} 文件经过转码, 暂不处理", objectName);
-                return null;
-            }
-
-            ImageUrl imageUrl = imageUrls.get(0);
-            String format = imageUrl.getFormat();
-            String url = objectNameService.getObjectUrl(objectName);
-            ImageUrl imageUrl1 = new ImageUrl(objectId, format, objectId, url, width, height);
-
-            imageRepository.saveImageFile(imageFile1, List.of(imageUrl1));
+            ImageFile imageFile1 = new ImageFile(imageFile);
+            imageRepository.saveImageFiles(List.of(imageFile1));
             return new UploadFileRet(objectId, null);
         }
 
@@ -79,9 +64,8 @@ public class ImageFileProcessor {
                 int height = size.getHeight();
                 String url = objectNameService.getObjectUrl(objectName);
 
-                ImageFile imageFile = new ImageFile(objectId, width, height);
-                ImageUrl imageUrl = new ImageUrl(objectId, format, objectId, url, width, height);
-                imageRepository.saveImageFile(imageFile, List.of(imageUrl));
+                ImageFile imageFile = new ImageFile(objectId, objectId, format, url, width, height);
+                imageRepository.saveImageFiles(List.of(imageFile));
                 return new UploadFileRet(objectId, null);
             } else {
                 log.info("不支持 {} 格式的文件", format);
@@ -99,31 +83,8 @@ public class ImageFileProcessor {
         if (duplicate) {
             String dupObjectId = objectResult.getDupObjectId();
             ImageFile imageFile = imageRepository.getImageFile(dupObjectId);
-            int width = imageFile.getWidth();
-            int height = imageFile.getHeight();
-            ImageFile imageFile1 = new ImageFile(objectId, width, height);
-            List<ImageUrl> list = new ArrayList<>();
-
-            List<ImageUrl> imageUrls = imageRepository.getImageUrls(dupObjectId);
-            if (imageUrls.size() > 1) {
-                ImageUrl imageUrl = imageUrls.get(1);
-                ObjectResult objectResult1 = getCopiedObject(imageUrl.getUrl());
-                String objectName1 = objectResult1.getObjectName();
-                String objectId1 = objectResult1.getObjectId();
-
-                String format = imageUrl.getFormat();
-                String url1 = objectNameService.getObjectUrl(objectName1);
-                ImageUrl imageUrl2 = new ImageUrl(objectId, format, objectId1, url1, width, height);
-                list.add(imageUrl2);
-            }
-
-            ImageUrl imageUrl = imageUrls.get(0);
-            String format = imageUrl.getFormat();
-            String url = objectNameService.getObjectUrl(objectName);
-            ImageUrl imageUrl1 = new ImageUrl(objectId, format, objectId, url, width, height);
-            list.add(imageUrl1);
-
-            imageRepository.saveImageFile(imageFile1, list);
+            ImageFile imageFile1 = new ImageFile(imageFile);
+            imageRepository.saveImageFiles(List.of(imageFile1));
             return new UploadFileRet(objectId, null);
         }
 
@@ -136,18 +97,17 @@ public class ImageFileProcessor {
                 int height = size.getHeight();
                 String url = objectNameService.getObjectUrl(objectName);
 
-                ImageFile imageFile = new ImageFile(objectId, width, height);
-                List<ImageUrl> imageUrls = new ArrayList<>();
-                imageUrls.add(new ImageUrl(objectId, format, objectId, url, width, height));
+                List<ImageFile> imageFiles = new ArrayList<>();
+                imageFiles.add(new ImageFile(objectId, objectId, format, url, width, height));
                 if (!"webp".equals(format)) {
                     ObjectResult webpResult = getWebpObject(objectResult);
                     String webpObjectName = webpResult.getObjectName();
                     String webpObjectId = webpResult.getObjectId();
                     String webpUrl = objectNameService.getObjectUrl(webpObjectName);
-                    imageUrls.add(new ImageUrl(objectId, "webp", webpObjectId, webpUrl, width, height));
+                    imageFiles.add(new ImageFile(objectId, webpObjectId, "webp", webpUrl, width, height));
                 }
 
-                imageRepository.saveImageFile(imageFile, imageUrls);
+                imageRepository.saveImageFiles(imageFiles);
                 return new UploadFileRet(objectId, null);
             } else {
                 log.info("不支持 {} 格式的文件", format);

+ 12 - 33
dfs-store/src/main/java/cn/reghao/dfs/store/task/processor/VideoFileProcessor.java

@@ -12,7 +12,6 @@ import cn.reghao.dfs.store.service.ObjectNameService;
 import cn.reghao.dfs.store.service.PutObjectService;
 import cn.reghao.jutil.jdk.security.DigestUtil;
 import cn.reghao.dfs.store.model.po.VideoFile;
-import cn.reghao.dfs.store.model.po.VideoUrl;
 import cn.reghao.jutil.media.FFmpegWrapper;
 import cn.reghao.jutil.media.MediaQuality;
 import cn.reghao.jutil.media.MediaResolution;
@@ -23,6 +22,7 @@ import org.springframework.stereotype.Service;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.List;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ExecutorService;
@@ -57,31 +57,8 @@ public class VideoFileProcessor {
         if (duplicate) {
             String dupObjectId = objectResult.getDupObjectId();
             VideoFile videoFile = videoRepository.findVideoFile(dupObjectId);
-            boolean horizontal = videoFile.getHorizontal();
-            int duration = videoFile.getDuration();
-            VideoFile videoFile1 = new VideoFile(videoFileId, horizontal, duration);
-
-            VideoUrl videoUrl = videoRepository.findVideoUrl(dupObjectId);
-            String videoFileId1 = videoUrl.getVideoFileId();
-            String urlObjectId = videoUrl.getObjectId();
-            if (!videoFileId1.equals(urlObjectId)) {
-                log.info("{} 文件经过转码, 暂不处理", objectName);
-                return null;
-            }
-
-            String videoCodec = videoUrl.getVideoCodec();
-            String audioCodec = videoUrl.getAudioCodec();
-            String urlType = videoUrl.getUrlType();
-            String url = objectNameService.getObjectUrl(objectName);
-            long bitRate = videoUrl.getBitRate();
-            int quality = videoUrl.getQuality();
-            String qualityStr = videoUrl.getQualityStr();
-            int width = videoUrl.getWidth();
-            int height = videoUrl.getHeight();
-            VideoUrl videoUrl1 = new VideoUrl(videoFileId, videoFileId, videoCodec, audioCodec, urlType, url,
-                    bitRate, quality, qualityStr, width, height);
-
-            videoRepository.saveVideoFile(videoFile1, videoUrl1);
+            VideoFile videoFile1 = new VideoFile(videoFileId, videoFile);
+            videoRepository.saveVideoFiles(List.of(videoFile1));
             return new UploadFileRet(videoFileId, null);
         }
 
@@ -119,22 +96,21 @@ public class VideoFileProcessor {
         int height = videoProps.getCodedHeight().intValue();
         boolean horizontal = width>height;
         int duration = videoProps.getDuration().intValue();
-        VideoFile videoFile = new VideoFile(videoFileId, horizontal, duration);
-
         String originalUrl = objectNameService.getObjectUrl(objectName);
         long bitRate = videoProps.getBitRate();
         MediaResolution mediaResolution = MediaQuality.getQuality(width, height);
+        String quality = mediaResolution.getQualityStr();
         String urlType = FileType.getVideoUrlType(absolutePath);
-        VideoUrl videoUrl  =
-                new VideoUrl(videoFileId, videoFileId, videoCodec, audioCodec, urlType, originalUrl, bitRate, mediaResolution);
-        videoRepository.saveVideoFile(videoFile, videoUrl);
+        VideoFile videoFile = new VideoFile(videoFileId, videoFileId, videoCodec, audioCodec, urlType, originalUrl,
+                bitRate, quality, width, height, duration);
+        videoRepository.saveVideoFiles(List.of(videoFile));
         return new UploadFileRet(videoFileId, null);
 
         //log.info("添加视频格式转码任务");
         //threadPool.submit(new ConvertTask());
     }
 
-    private VideoUrl getConvertedVideoUrl(String videoFileId, File file, String originalObjectName,
+    private VideoFile getConvertedVideoFile(String videoFileId, File file, String originalObjectName,
                                           int width, int height, String suffix) {
         String contentId = UUID.randomUUID().toString().replace("-", "");
         String absolutePath = fileStoreService.genFilePath(contentId, file.length(), suffix);
@@ -161,8 +137,11 @@ public class VideoFileProcessor {
             String url = objectNameService.getObjectUrl(objectResult.getObjectName());
             String urlType = FileType.getVideoUrlType(absolutePath);
             long bitRate = 0;
+            int duration = 0;
             MediaResolution mediaResolution = MediaQuality.getQuality(width, height);
-            return new VideoUrl(videoFileId, objectId, videoCodec, audioCodec, urlType, url, bitRate, mediaResolution);
+            String quality = mediaResolution.getQualityStr();
+            return new VideoFile(videoFileId, objectId, videoCodec, audioCodec, urlType, url, bitRate,
+                    quality, width, height, duration);
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 9 - 6
dfs-store/src/main/resources/mapper/AudioFileMapper.xml

@@ -4,16 +4,19 @@
 <mapper namespace="cn.reghao.dfs.store.db.mapper.AudioFileMapper">
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
         insert into audio_file
-        (`id`,`deleted`,`create_time`,`update_time`,`audio_file_id`,`object_id`,`codec`,`url`)
+        (`id`,`deleted`,`create_time`,`update_time`,`audio_file_id`,`object_id`,`duration`,`codec`,`bit_rate`,`url`)
         values
-        (#{id},#{deleted},#{createTime},#{updateTime},#{audioFileId},#{objectId},#{codec},#{url})
+        (#{id},#{deleted},#{createTime},#{updateTime},#{audioFileId},#{objectId},#{duration},#{codec},#{bitRate},#{url})
     </insert>
 
-    <select id="findAll" resultType="cn.reghao.dfs.store.model.po.AudioFile">
-        select * from audio_file
-    </select>
     <select id="findByAudioFileId" resultType="cn.reghao.dfs.store.model.po.AudioFile">
-        select * from audio_file
+        select *
+        from audio_file
+        where audio_file_id=#{audioFileId}
+    </select>
+    <select id="findAudioInfo" resultType="cn.reghao.oss.api.dto.media.AudioInfo">
+        select audio_file_id,duration,url
+        from audio_file
         where audio_file_id=#{audioFileId}
     </select>
 </mapper>

+ 14 - 11
dfs-store/src/main/resources/mapper/ImageFileMapper.xml

@@ -4,25 +4,19 @@
 <mapper namespace="cn.reghao.dfs.store.db.mapper.ImageFileMapper">
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
         insert into image_file
-        (`id`,`deleted`,`create_time`,`update_time`,`image_file_id`,`width`,`height`,`horizontal`)
+        (`image_file_id`,`object_id`,`format`,`url`,`width`,`height`,`horizontal`)
         values 
-        (#{id},#{deleted},#{createTime},#{updateTime},#{imageFileId},#{width},#{height},#{horizontal})
+        (#{imageFileId},#{objectId},#{format},#{url},#{width},#{height},#{horizontal})
     </insert>
     <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
         insert into image_file
-        (`id`,`deleted`,`create_time`,`update_time`,`image_file_id`,`width`,`height`,`horizontal`)
+        (`image_file_id`,`object_id`,`format`,`url`,`width`,`height`,`horizontal`)
         values
         <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.id},#{item.deleted},#{item.createTime},#{item.updateTime},#{item.imageFileId},#{item.width},#{item.height},#{item.horizontal})
+            (#{item.imageFileId},#{item.objectId},#{item.format},#{item.url},#{item.width},#{item.height},#{item.horizontal})
         </foreach>
     </insert>
 
-    <update id="update">
-        update image_file
-        set jpeg_object_id=#{jpegObjectId}
-        where id=#{id}
-    </update>
-
     <delete id="deleteByImageFileId">
         delete from image_file
         where image_file_id=#{imageFileId}
@@ -39,9 +33,18 @@
         select * from image_file
     </select>
     <select id="findByImageFileId" resultType="cn.reghao.dfs.store.model.po.ImageFile">
-        select * from image_file
+        select *
+        from image_file
         where image_file_id=#{imageFileId}
     </select>
+    <select id="findByImageFileIds" resultType="cn.reghao.dfs.store.model.po.ImageFile">
+        select *
+        from image_file
+        where image_file_id in
+        <foreach collection="list" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
     <select id="findAll1" resultType="cn.reghao.dfs.store.model.vo.ImageObject">
         select image_file_id
         from image_file

+ 0 - 43
dfs-store/src/main/resources/mapper/ImageUrlMapper.xml

@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
-<mapper namespace="cn.reghao.dfs.store.db.mapper.ImageUrlMapper">
-    <insert id="save" useGeneratedKeys="true" keyProperty="id">
-        insert into image_url
-        (`image_file_id`,`format`,`object_id`,`url`)
-        values 
-        (#{imageFileId},#{format},#{objectId},#{url})
-    </insert>
-    <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
-        insert into image_url
-        (`image_file_id`,`format`,`object_id`,`url`)
-        values
-        <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.imageFileId},#{item.format},#{item.objectId},#{item.url})
-        </foreach>
-    </insert>
-
-    <delete id="deleteByImageFileId">
-        delete from image_url
-        where image_file_id=#{imageFileId}
-    </delete>
-
-    <select id="findByImageFileIds" resultType="cn.reghao.dfs.store.model.po.ImageUrl">
-        select *
-        from image_url
-        where image_file_id in
-        <foreach collection="list" item="item" separator="," open="(" close=")">
-            #{item}
-        </foreach>
-    </select>
-    <select id="findByImageFileId" resultType="cn.reghao.dfs.store.model.po.ImageUrl">
-        select *
-        from image_url
-        where image_file_id=#{imageFileId}
-        order by format asc
-    </select>
-    <select id="findAll1" resultType="cn.reghao.dfs.store.model.vo.ImageObject">
-        select image_file_id,object_id
-        from image_url
-    </select>
-</mapper>

+ 18 - 6
dfs-store/src/main/resources/mapper/VideoFileMapper.xml

@@ -4,9 +4,17 @@
 <mapper namespace="cn.reghao.dfs.store.db.mapper.VideoFileMapper">
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
         insert into video_file
-        (`id`,`deleted`,`create_time`,`update_time`,`video_file_id`,`horizontal`,`duration`)
+        (`video_file_id`,`object_id`,`video_codec`,`audio_codec`,`url_type`,`url`,`bit_rate`,`quality`,`width`,`height`,`horizontal`,`duration`)
         values 
-        (#{id},#{deleted},#{createTime},#{updateTime},#{videoFileId},#{horizontal},#{duration})
+        (#{videoFileId},#{objectId},#{videoCodec},#{audioCodec},#{urlType},#{url},#{bitRate},#{quality},#{width},#{height},#{horizontal},#{duration})
+    </insert>
+    <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
+        insert into video_file
+        (`video_file_id`,`object_id`,`video_codec`,`audio_codec`,`url_type`,`url`,`bit_rate`,`quality`,`width`,`height`,`horizontal`,`duration`)
+        values
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.videoFileId},#{item.objectId},#{item.videoCodec},#{item.audioCodec},#{item.urlType},#{item.url},#{item.bitRate},#{item.quality},#{item.width},#{item.height},#{item.horizontal},#{item.duration})
+        </foreach>
     </insert>
 
     <delete id="deleteByVideoFileId">
@@ -21,15 +29,19 @@
         select * from video_file
     </select>
     <select id="findVideoInfo" resultType="cn.reghao.oss.api.dto.media.VideoInfo">
-        select video_file.video_file_id,video_file.duration,video_file.horizontal,video_url.quality_str as quality
+        select video_file.video_file_id,video_file.duration,video_file.horizontal,quality
         from video_file
-        inner join video_url
-        on video_file.video_file_id=video_url.video_file_id and video_file.video_file_id=#{videoFileId}
-        order by video_url.quality desc
+        where video_file_id=#{videoFileId}
+        order by quality desc
         limit 1
     </select>
     <select id="findByVideoFileId" resultType="cn.reghao.dfs.store.model.po.VideoFile">
         select * from video_file
         where video_file_id=#{videoFileId}
     </select>
+    <select id="findVideoUrls" resultType="cn.reghao.oss.api.dto.media.VideoUrlDto">
+        select url_type as type,url,width,height,quality_str as quality
+        from video_file
+        where video_file_id=#{videoFileId}
+    </select>
 </mapper>

+ 0 - 42
dfs-store/src/main/resources/mapper/VideoUrlMapper.xml

@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
-<mapper namespace="cn.reghao.dfs.store.db.mapper.VideoUrlMapper">
-    <insert id="save" useGeneratedKeys="true" keyProperty="id">
-        insert into video_url
-        (`video_file_id`,`object_id`,`video_codec`,`audio_codec`,`url_type`,`url`,`bit_rate`,`quality`,`quality_str`,`width`,`height`)
-        values
-        (#{videoFileId},#{objectId},#{videoCodec},#{audioCodec},#{urlType},#{url},#{bitRate},#{quality},#{qualityStr},#{width},#{height})
-    </insert>
-
-    <delete id="deleteByVideoFileId">
-        delete from video_url
-        where video_file_id=#{videoFileId}
-    </delete>
-
-    <update id="update">
-        update video_url
-        set video_codec=#{videoCodec},audio_codec=#{audioCodec},quality=#{quality}
-        where object_id=#{objectId}
-    </update>
-
-    <select id="findAll" resultType="cn.reghao.dfs.store.model.po.VideoUrl">
-        select * from video_url
-    </select>
-    <select id="findVideoUrls" resultType="cn.reghao.oss.api.dto.media.VideoUrlDto">
-        select url_type as type,url,width,height,quality_str as quality
-        from video_url
-        where video_file_id=#{videoFileId}
-    </select>
-    <select id="findByVideoFileId" resultType="cn.reghao.dfs.store.model.po.VideoUrl">
-        select *
-        from video_url
-        where video_file_id=#{videoFileId}
-    </select>
-    <select id="findHighestQuality" resultType="cn.reghao.dfs.store.model.po.VideoUrl">
-        select *
-        from video_url
-        order by quality desc
-        limit 1
-    </select>
-</mapper>

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

@@ -1,25 +1,10 @@
 import cn.reghao.dfs.store.DfsStoreApplication;
-import cn.reghao.dfs.store.db.mapper.*;
-import cn.reghao.dfs.store.db.repository.ObjectRepository;
-import cn.reghao.dfs.store.model.po.*;
-import cn.reghao.dfs.store.model.vo.ImageObject;
-import cn.reghao.jutil.media.ImageOps;
-import cn.reghao.oss.api.dto.ObjectMeta;
-import cn.reghao.oss.api.rest.UploadFileRet;
 import lombok.extern.slf4j.Slf4j;
-import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
 /**
  * @author reghao
  * @date 2023-03-22 16:19:12
@@ -29,72 +14,4 @@ import java.util.stream.Collectors;
 @SpringBootTest(classes = DfsStoreApplication.class)
 @RunWith(SpringRunner.class)
 public class MediaFileTest {
-    @Autowired
-    VideoFileMapper videoFileMapper;
-    @Autowired
-    VideoUrlMapper videoUrlMapper;
-    @Autowired
-    FileMetaMapper fileMetaMapper;
-
-    @Autowired
-    ImageFileMapper imageFileMapper;
-    @Autowired
-    ImageUrlMapper imageUrlMapper;
-    @Autowired
-    ObjectRepository objectRepository;
-    @Test
-    public void videoUrlTest() {
-        List<ImageObject> list = imageFileMapper.findAll1();
-        Set<String> ids = list.stream().map(ImageObject::getImageFileId).collect(Collectors.toSet());
-
-        List<ImageObject> list1 = imageUrlMapper.findAll1();
-        //Set<String> ids = list1.stream().map(ImageObject::getImageFileId).collect(Collectors.toSet());
-
-        List<ImageObject> notExist = new ArrayList<>();
-        list1.forEach(imageObject -> {
-            if (!ids.contains(imageObject.getImageFileId())) {
-                notExist.add(imageObject);
-            }
-        });
-
-        List<ImageFile> imageFiles = new ArrayList<>();
-        /*for (ImageObject imageObject : notExist) {
-            String imageFileId = imageObject.getImageFileId();
-            String objectId = imageObject.getObjectId();
-            ObjectMeta objectMeta = objectRepository.getObjectMetaById(objectId);
-            if (objectMeta == null) {
-                log.error("object {} not exist", objectId);
-                continue;
-            }
-
-            String absolutePath = objectMeta.getAbsolutePath();
-            File file = new File(absolutePath);
-            if (!file.exists()) {
-                log.error("file {} not exist", absolutePath);
-                continue;
-            }
-
-            try {
-                ImageOps.Size size = ImageOps.info(file);
-                int width = size.getWidth();
-                int height = size.getHeight();
-                ImageFile imageFile = new ImageFile(imageFileId, width, height);
-                imageFiles.add(imageFile);
-
-                if (imageFiles.size() > 10_000) {
-                    imageFileMapper.saveAll(imageFiles);
-                    log.info("持久化 {} 个 ImageFile", imageFiles.size());
-                    imageFiles.clear();
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-
-        if (imageFiles.size() > 0) {
-            imageFileMapper.saveAll(imageFiles);
-            log.info("持久化 {} 个 ImageFile", imageFiles.size());
-            imageFiles.clear();
-        }*/
-    }
 }

+ 7 - 0
oss-api/src/main/java/cn/reghao/oss/api/dto/media/AudioInfo.java

@@ -1,13 +1,20 @@
 package cn.reghao.oss.api.dto.media;
 
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
 import java.io.Serializable;
 
 /**
  * @author reghao
  * @date 2023-08-28 17:00:56
  */
+@NoArgsConstructor
+@Getter
 public class AudioInfo implements Serializable {
     private static final long serialVersionUID = 1L;
 
     private String audioFileId;
+    private int duration;
+    private String url;
 }

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

@@ -10,5 +10,6 @@ public interface PermissionService {
     void setDirPermission(String prefix, int scope);
     void getDirPermission(String prefix);
     void setVideoPermission(String videoFileId, int scope);
+    void setAudioPermission(String audioFileId, int scope);
     void setImagesPermission(List<String> imageFileIds, int scope);
 }