video/src/main/java/com/teriteri/backend/controller/FavoriteVideoController.java

130 lines
5.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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());
}
}