|
|
@@ -2,6 +2,7 @@ package cn.reghao.tnb.content.app.disk.service;
|
|
|
|
|
|
import cn.reghao.file.api.iface.OssService;
|
|
|
import cn.reghao.jutil.jdk.db.PageList;
|
|
|
+import cn.reghao.jutil.jdk.result.Result;
|
|
|
import cn.reghao.jutil.tool.id.SnowFlake;
|
|
|
import cn.reghao.oss.sdk.model.constant.ObjectType;
|
|
|
import cn.reghao.oss.sdk.model.dto.ObjectInfo;
|
|
|
@@ -9,18 +10,18 @@ import cn.reghao.tnb.common.auth.UserContext;
|
|
|
import cn.reghao.tnb.common.db.SelectOption;
|
|
|
import cn.reghao.tnb.content.app.disk.db.mapper.DiskAlbumMapper;
|
|
|
import cn.reghao.tnb.content.app.disk.db.mapper.DiskFileMapper;
|
|
|
+import cn.reghao.tnb.content.app.disk.db.repository.DiskAlbumRepository;
|
|
|
import cn.reghao.tnb.content.app.disk.model.dto.AlbumAdd;
|
|
|
import cn.reghao.tnb.content.app.disk.model.dto.AlbumCreate;
|
|
|
import cn.reghao.tnb.content.app.disk.model.po.DiskAlbum;
|
|
|
import cn.reghao.tnb.content.app.disk.model.po.DiskAlbumFile;
|
|
|
+import cn.reghao.tnb.content.app.disk.model.po.DiskFile;
|
|
|
import cn.reghao.tnb.content.app.disk.model.vo.*;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.util.List;
|
|
|
-import java.util.Objects;
|
|
|
-import java.util.Set;
|
|
|
+import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
@@ -33,15 +34,18 @@ public class DiskAlbumService {
|
|
|
@DubboReference(check = false, timeout = 60_000)
|
|
|
private OssService ossService;
|
|
|
private final int channelCode = 111;
|
|
|
+ private final int albumMaxFiles = 1000;
|
|
|
private final DiskFileMapper diskFileMapper;
|
|
|
private final DiskAlbumMapper diskAlbumMapper;
|
|
|
+ private final DiskAlbumRepository diskAlbumRepository;
|
|
|
private final DiskFileService diskFileService;
|
|
|
private final SnowFlake idGenerator;
|
|
|
|
|
|
public DiskAlbumService(DiskFileMapper diskFileMapper, DiskAlbumMapper diskAlbumMapper,
|
|
|
- DiskFileService diskFileService) {
|
|
|
+ DiskAlbumRepository diskAlbumRepository, DiskFileService diskFileService) {
|
|
|
this.diskFileMapper = diskFileMapper;
|
|
|
this.diskAlbumMapper = diskAlbumMapper;
|
|
|
+ this.diskAlbumRepository = diskAlbumRepository;
|
|
|
this.diskFileService = diskFileService;
|
|
|
this.idGenerator = new SnowFlake(1, 1);
|
|
|
}
|
|
|
@@ -52,43 +56,61 @@ public class DiskAlbumService {
|
|
|
diskAlbumMapper.save(diskAlbum);
|
|
|
}
|
|
|
|
|
|
- public void addAlbumFile(AlbumAdd albumAdd) {
|
|
|
+ public Result addAlbumFile(AlbumAdd albumAdd) {
|
|
|
long albumId = albumAdd.getAlbumId();
|
|
|
- Set<String> existFileIds = diskAlbumMapper.findByAlbumId(albumId).stream()
|
|
|
+ Set<String> existFileIds = diskAlbumMapper.findDiskAlbumFiles(albumId).stream()
|
|
|
.map(DiskAlbumFile::getFileId)
|
|
|
.collect(Collectors.toSet());
|
|
|
+ if (existFileIds.size() >= albumMaxFiles) {
|
|
|
+ return Result.fail(String.format("单个相册最多能容纳 %s 张照片", albumMaxFiles));
|
|
|
+ }
|
|
|
+
|
|
|
+ Set<String> existSha256sums = new HashSet<>();
|
|
|
+ if (!existFileIds.isEmpty()) {
|
|
|
+ existSha256sums = diskFileMapper.findByFileIds(new ArrayList<>(existFileIds)).stream()
|
|
|
+ .map(DiskFile::getSha256sum)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ }
|
|
|
+
|
|
|
List<String> fileIds = albumAdd.getFileIds().stream()
|
|
|
.filter(fileId -> !existFileIds.contains(fileId))
|
|
|
.collect(Collectors.toList());
|
|
|
if (fileIds.isEmpty()) {
|
|
|
- return;
|
|
|
+ return Result.fail("添加的照片在当前相册中已存在");
|
|
|
}
|
|
|
|
|
|
long loginUser = UserContext.getUserId();
|
|
|
- List<DiskAlbumFile> list = diskFileMapper.findByFileIds(fileIds).stream()
|
|
|
+ List<DiskFile> diskFileList = diskFileMapper.findByFileIds(fileIds).stream()
|
|
|
+ .filter(diskFile -> diskFile.getOwner() == loginUser)
|
|
|
.filter(diskFile -> diskFile.getFileType() == ObjectType.Image.getCode()
|
|
|
|| diskFile.getFileType() == ObjectType.Video.getCode())
|
|
|
- .filter(diskFile -> diskFile.getOwner() == loginUser)
|
|
|
- .map(diskFile -> {
|
|
|
- String fileId = diskFile.getFileId();
|
|
|
- int fileType = diskFile.getFileType();
|
|
|
- return new DiskAlbumFile(albumId, fileId, fileType);
|
|
|
- })
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
- if (!list.isEmpty()) {
|
|
|
- DiskAlbumFile diskAlbumFile = list.get(0);
|
|
|
- String objectId = diskAlbumFile.getFileId();
|
|
|
- try {
|
|
|
- ObjectInfo objectInfo = ossService.getObjectInfo(channelCode, objectId);
|
|
|
- String url = objectInfo.getUrl();
|
|
|
- diskAlbumMapper.updateCoverUrl(albumId, url);
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
+ int startPos = existFileIds.size()+1;
|
|
|
+ List<DiskAlbumFile> list = new ArrayList<>();
|
|
|
+ for (DiskFile diskFile : diskFileList) {
|
|
|
+ if (existSha256sums.add(diskFile.getSha256sum())) {
|
|
|
+ list.add(new DiskAlbumFile(albumId, diskFile, startPos));
|
|
|
+ startPos++;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- diskAlbumMapper.saveAlbumFiles(list);
|
|
|
+ if (list.isEmpty()) {
|
|
|
+ return Result.fail("添加的照片在当前相册中已存在");
|
|
|
}
|
|
|
+
|
|
|
+ DiskAlbumFile diskAlbumFile = list.get(0);
|
|
|
+ String objectId = diskAlbumFile.getFileId();
|
|
|
+ String coverUrl = "";
|
|
|
+ try {
|
|
|
+ ObjectInfo objectInfo = ossService.getObjectInfo(channelCode, objectId);
|
|
|
+ coverUrl = objectInfo.getUrl();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ diskAlbumRepository.saveDiskAlbum(albumId, coverUrl, existSha256sums.size(), list);
|
|
|
+ return Result.successWithMsg(String.format("当前相册中新添加了 %s 张照片", list.size()));
|
|
|
}
|
|
|
|
|
|
public List<SelectOption> getAlbumKeyValues() {
|
|
|
@@ -116,26 +138,36 @@ public class DiskAlbumService {
|
|
|
return diskAlbumList;
|
|
|
}
|
|
|
|
|
|
- public PageList<DiskFileDetail> getDiskAlbumDetail(long albumId) {
|
|
|
+ public DiskAlbumDetail getDiskAlbumDetail(long albumId) {
|
|
|
long loginUser = UserContext.getUserId();
|
|
|
DiskAlbum diskAlbum = diskAlbumMapper.findDiskAlbum(albumId);
|
|
|
+ if (diskAlbum == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
long createBy = diskAlbum.getCreateBy();
|
|
|
if (createBy != loginUser) {
|
|
|
- return PageList.empty();
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
- List<DiskAlbumFile> diskAlbumFileList = diskAlbumMapper.findByAlbumId(albumId);
|
|
|
+ List<DiskAlbumFile> diskAlbumFileList = diskAlbumMapper.findDiskAlbumFiles(albumId);
|
|
|
List<String> fileIds = diskAlbumFileList.stream().map(DiskAlbumFile::getFileId).collect(Collectors.toList());
|
|
|
- if (!fileIds.isEmpty()) {
|
|
|
- List<DiskFileDetail> diskFileDetailList = diskFileMapper.findByFileIds(fileIds).stream().map(diskFile -> {
|
|
|
- String objectId = diskFile.getFileId();
|
|
|
- return diskFileService.getDiskFileDetail(channelCode, objectId);
|
|
|
- }).filter(Objects::nonNull).collect(Collectors.toList());
|
|
|
-
|
|
|
- int total = diskFileDetailList.size();
|
|
|
- return PageList.pageList(1, 10, total, diskFileDetailList);
|
|
|
+ if (fileIds.isEmpty()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ Map<String, Integer> map = new HashMap<>();
|
|
|
+ for (DiskAlbumFile diskAlbumFile : diskAlbumFileList) {
|
|
|
+ map.put(diskAlbumFile.getFileId(), diskAlbumFile.getPos());
|
|
|
}
|
|
|
|
|
|
- return PageList.empty();
|
|
|
+ List<DiskFileDetail> diskFileDetailList = diskFileMapper.findByFileIds(fileIds).stream().
|
|
|
+ map(diskFile -> {
|
|
|
+ String objectId = diskFile.getFileId();
|
|
|
+ return diskFileService.getDiskFileDetail(channelCode, objectId);
|
|
|
+ })
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .sorted(Comparator.comparingInt(o -> map.get(o.getFileId())))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ return new DiskAlbumDetail(diskAlbum, diskFileDetailList);
|
|
|
}
|
|
|
}
|