feat(script-favorite): add ScriptFavoriteServiceImpl
- toggleFavorite: upsert via logical-delete check + save, @Transactional - getFavoritePage: paginate favorites then fetch EpicScript details - getFavoritedScriptIds: batch IN query for checking multiple scripts - isFavorited: count > 0 check for single script - getFavoriteCount: total count for current user - Uses UserContextHolder for userId, consistent with project pattern
This commit is contained in:
@@ -0,0 +1,149 @@
|
||||
package com.emotion.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.dto.response.EpicScriptResponse;
|
||||
import com.emotion.dto.response.ScriptFavoriteResponse;
|
||||
import com.emotion.entity.ScriptFavorite;
|
||||
import com.emotion.mapper.ScriptFavoriteMapper;
|
||||
import com.emotion.service.EpicScriptService;
|
||||
import com.emotion.service.ScriptFavoriteService;
|
||||
import com.emotion.util.UserContextHolder;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 剧本收藏服务实现
|
||||
*
|
||||
* @author huazhongmin
|
||||
* @date 2026-07-19
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class ScriptFavoriteServiceImpl extends ServiceImpl<ScriptFavoriteMapper, ScriptFavorite>
|
||||
implements ScriptFavoriteService {
|
||||
|
||||
private static final DateTimeFormatter FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
@Autowired
|
||||
private EpicScriptService epicScriptService;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public ScriptFavoriteResponse toggleFavorite(String scriptId) {
|
||||
String userId = UserContextHolder.getCurrentUserId();
|
||||
ScriptFavoriteResponse r = new ScriptFavoriteResponse();
|
||||
r.setScriptId(scriptId);
|
||||
|
||||
if (!StringUtils.hasText(userId)) {
|
||||
r.setIsFavorited(false);
|
||||
return r;
|
||||
}
|
||||
|
||||
LambdaQueryWrapper<ScriptFavorite> w = new LambdaQueryWrapper<>();
|
||||
w.eq(ScriptFavorite::getUserId, userId)
|
||||
.eq(ScriptFavorite::getScriptId, scriptId)
|
||||
.eq(ScriptFavorite::getIsDeleted, 0);
|
||||
|
||||
ScriptFavorite existing = this.getOne(w);
|
||||
if (existing != null) {
|
||||
this.removeById(existing.getId());
|
||||
r.setIsFavorited(false);
|
||||
} else {
|
||||
ScriptFavorite fav = new ScriptFavorite();
|
||||
fav.setUserId(userId);
|
||||
fav.setScriptId(scriptId);
|
||||
this.save(fav);
|
||||
r.setIsFavorited(true);
|
||||
if (fav.getCreateTime() != null) {
|
||||
r.setFavoriteTime(fav.getCreateTime().format(FMT));
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<EpicScriptResponse> getFavoritePage(long current, long size) {
|
||||
String userId = UserContextHolder.getCurrentUserId();
|
||||
if (!StringUtils.hasText(userId)) {
|
||||
return new PageResult<>();
|
||||
}
|
||||
|
||||
LambdaQueryWrapper<ScriptFavorite> w = new LambdaQueryWrapper<>();
|
||||
w.eq(ScriptFavorite::getUserId, userId)
|
||||
.eq(ScriptFavorite::getIsDeleted, 0)
|
||||
.orderByDesc(ScriptFavorite::getCreateTime);
|
||||
|
||||
Page<ScriptFavorite> page = new Page<>(current, size);
|
||||
Page<ScriptFavorite> result = this.page(page, w);
|
||||
|
||||
List<EpicScriptResponse> records = result.getRecords().stream()
|
||||
.map(ScriptFavorite::getScriptId)
|
||||
.map(epicScriptService::getScriptById)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
PageResult<EpicScriptResponse> pr = new PageResult<>();
|
||||
pr.setCurrent(result.getCurrent());
|
||||
pr.setSize(result.getSize());
|
||||
pr.setTotal(result.getTotal());
|
||||
pr.setPages(result.getPages());
|
||||
pr.setRecords(records);
|
||||
return pr;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getFavoritedScriptIds(Set<String> scriptIds) {
|
||||
String userId = UserContextHolder.getCurrentUserId();
|
||||
if (!StringUtils.hasText(userId) || scriptIds == null || scriptIds.isEmpty()) {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
||||
LambdaQueryWrapper<ScriptFavorite> w = new LambdaQueryWrapper<>();
|
||||
w.eq(ScriptFavorite::getUserId, userId)
|
||||
.in(ScriptFavorite::getScriptId, scriptIds)
|
||||
.eq(ScriptFavorite::getIsDeleted, 0);
|
||||
|
||||
return this.list(w).stream()
|
||||
.map(ScriptFavorite::getScriptId)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFavorited(String scriptId) {
|
||||
String userId = UserContextHolder.getCurrentUserId();
|
||||
if (!StringUtils.hasText(userId) || !StringUtils.hasText(scriptId)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
LambdaQueryWrapper<ScriptFavorite> w = new LambdaQueryWrapper<>();
|
||||
w.eq(ScriptFavorite::getUserId, userId)
|
||||
.eq(ScriptFavorite::getScriptId, scriptId)
|
||||
.eq(ScriptFavorite::getIsDeleted, 0);
|
||||
|
||||
return this.count(w) > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getFavoriteCount() {
|
||||
String userId = UserContextHolder.getCurrentUserId();
|
||||
if (!StringUtils.hasText(userId)) {
|
||||
return 0L;
|
||||
}
|
||||
|
||||
LambdaQueryWrapper<ScriptFavorite> w = new LambdaQueryWrapper<>();
|
||||
w.eq(ScriptFavorite::getUserId, userId)
|
||||
.eq(ScriptFavorite::getIsDeleted, 0);
|
||||
|
||||
return this.count(w);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user