130 lines
5.6 KiB
Java
130 lines
5.6 KiB
Java
|
package com.teriteri.backend.controller;
|
|||
|
|
|||
|
import com.teriteri.backend.pojo.CustomResponse;
|
|||
|
import com.teriteri.backend.pojo.Favorite;
|
|||
|
import com.teriteri.backend.service.utils.CurrentUser;
|
|||
|
import com.teriteri.backend.service.video.FavoriteService;
|
|||
|
import com.teriteri.backend.service.video.FavoriteVideoService;
|
|||
|
import com.teriteri.backend.service.video.UserVideoService;
|
|||
|
import org.springframework.beans.factory.annotation.Autowired;
|
|||
|
import org.springframework.web.bind.annotation.GetMapping;
|
|||
|
import org.springframework.web.bind.annotation.PostMapping;
|
|||
|
import org.springframework.web.bind.annotation.RequestParam;
|
|||
|
import org.springframework.web.bind.annotation.RestController;
|
|||
|
|
|||
|
import java.util.Arrays;
|
|||
|
import java.util.HashSet;
|
|||
|
import java.util.List;
|
|||
|
import java.util.Set;
|
|||
|
import java.util.stream.Collectors;
|
|||
|
|
|||
|
@RestController
|
|||
|
public class FavoriteVideoController {
|
|||
|
@Autowired
|
|||
|
private CurrentUser currentUser;
|
|||
|
|
|||
|
@Autowired
|
|||
|
private FavoriteService favoriteService;
|
|||
|
|
|||
|
@Autowired
|
|||
|
private FavoriteVideoService favoriteVideoService;
|
|||
|
|
|||
|
@Autowired
|
|||
|
private UserVideoService userVideoService;
|
|||
|
|
|||
|
/**
|
|||
|
* 获取用户收藏了该视频的收藏夹列表
|
|||
|
* @param vid 视频id
|
|||
|
* @return 收藏了该视频的收藏夹列表
|
|||
|
*/
|
|||
|
@GetMapping("/video/collected-fids")
|
|||
|
public CustomResponse getCollectedFids(@RequestParam("vid") Integer vid) {
|
|||
|
Integer uid = currentUser.getUserId();
|
|||
|
Set<Integer> fids = findFidsOfUserFavorites(uid);
|
|||
|
Set<Integer> collectedFids = favoriteVideoService.findFidsOfCollected(vid, fids);
|
|||
|
CustomResponse customResponse = new CustomResponse();
|
|||
|
customResponse.setData(collectedFids);
|
|||
|
return customResponse;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 收藏或取消收藏某视频
|
|||
|
* @param vid 视频ID
|
|||
|
* @param addArray 包含需要添加收藏的多个收藏夹ID组成的字符串,形式如 1,12,13,20 不能含有字符"["和"]"
|
|||
|
* @param removeArray 包含需要移出收藏的多个收藏夹ID组成的字符串,形式如 1,12,13,20 不能含有字符"["和"]"
|
|||
|
* @return 无数据返回
|
|||
|
*/
|
|||
|
@PostMapping("/video/collect")
|
|||
|
public CustomResponse collectVideo(@RequestParam("vid") Integer vid,
|
|||
|
@RequestParam("adds") String[] addArray,
|
|||
|
@RequestParam("removes") String[] removeArray) {
|
|||
|
CustomResponse customResponse = new CustomResponse();
|
|||
|
Integer uid = currentUser.getUserId();
|
|||
|
Set<Integer> fids = findFidsOfUserFavorites(uid);
|
|||
|
Set<Integer> addSet = Arrays.stream(addArray).map(Integer::parseInt).collect(Collectors.toSet());
|
|||
|
Set<Integer> removeSet = Arrays.stream(removeArray).map(Integer::parseInt).collect(Collectors.toSet());
|
|||
|
boolean allElementsInFids = fids.containsAll(addSet) && fids.containsAll(removeSet); // 判断添加或移出的收藏夹是否都属于该用户
|
|||
|
if (!allElementsInFids) {
|
|||
|
customResponse.setCode(403);
|
|||
|
customResponse.setMessage("无权操作该收藏夹");
|
|||
|
return customResponse;
|
|||
|
}
|
|||
|
Set<Integer> collectedFids = favoriteVideoService.findFidsOfCollected(vid, fids); // 原本该用户已收藏该视频的收藏夹ID集合
|
|||
|
if (addSet.size() > 0) {
|
|||
|
favoriteVideoService.addToFav(uid, vid, addSet);
|
|||
|
}
|
|||
|
if (removeSet.size() > 0) {
|
|||
|
favoriteVideoService.removeFromFav(uid, vid, removeSet);
|
|||
|
}
|
|||
|
boolean isCollect = addSet.size() > 0 && collectedFids.size() == 0;
|
|||
|
boolean isCancel = addSet.size() == 0 && collectedFids.size() > 0 && collectedFids.size() == removeSet.size() && collectedFids.containsAll(removeSet);
|
|||
|
if (isCollect) {
|
|||
|
userVideoService.collectOrCancel(uid, vid, true);
|
|||
|
} else if (isCancel) {
|
|||
|
userVideoService.collectOrCancel(uid, vid, false);
|
|||
|
}
|
|||
|
return customResponse;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 取消单个视频在单个收藏夹的收藏
|
|||
|
* @param vid 视频vid
|
|||
|
* @param fid 收藏夹id
|
|||
|
* @return 响应对象
|
|||
|
*/
|
|||
|
@PostMapping("/video/cancel-collect")
|
|||
|
public CustomResponse cancelCollect(@RequestParam("vid") Integer vid, @RequestParam("fid") Integer fid) {
|
|||
|
CustomResponse customResponse = new CustomResponse();
|
|||
|
Integer uid = currentUser.getUserId();
|
|||
|
Set<Integer> fids = findFidsOfUserFavorites(uid);
|
|||
|
Set<Integer> removeSet = new HashSet<>();
|
|||
|
removeSet.add(fid);
|
|||
|
if (!fids.containsAll(removeSet)) {
|
|||
|
customResponse.setCode(403);
|
|||
|
customResponse.setMessage("无权操作该收藏夹");
|
|||
|
return customResponse;
|
|||
|
}
|
|||
|
Set<Integer> collectedFids = favoriteVideoService.findFidsOfCollected(vid, fids); // 原本该用户已收藏该视频的收藏夹ID集合
|
|||
|
favoriteVideoService.removeFromFav(uid, vid, removeSet);
|
|||
|
// 判断是否是最后一个取消收藏的收藏夹,是就要标记视频为未收藏
|
|||
|
boolean isCancel = collectedFids.size() > 0 && collectedFids.size() == removeSet.size() && collectedFids.containsAll(removeSet);
|
|||
|
if (isCancel) {
|
|||
|
userVideoService.collectOrCancel(uid, vid, false);
|
|||
|
}
|
|||
|
return customResponse;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 提取某用户的全部收藏夹信息的FID整合成集合
|
|||
|
* @param uid 用户ID
|
|||
|
* @return fid集合
|
|||
|
*/
|
|||
|
private Set<Integer> findFidsOfUserFavorites(Integer uid) {
|
|||
|
List<Favorite> list = favoriteService.getFavorites(uid, true);
|
|||
|
if (list == null) return new HashSet<>();
|
|||
|
return list.stream()
|
|||
|
.map(Favorite::getFid)
|
|||
|
.collect(Collectors.toSet());
|
|||
|
}
|
|||
|
}
|