From b64f9ef1f6186a660b317600e2b23273617952f4 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 18 Sep 2025 10:43:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=8A=BD=E5=A5=96=E8=B4=B4=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E7=9C=8B=E8=A7=81=E5=8F=82=E4=B8=8E=E4=BA=BA=E5=91=98?= =?UTF-8?q?=20#999?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../openisle/controller/PostController.java | 10 ++++++++++ .../java/com/openisle/mapper/PostMapper.java | 4 ++++ .../com/openisle/service/PostService.java | 20 +++++++++++-------- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/backend/src/main/java/com/openisle/controller/PostController.java b/backend/src/main/java/com/openisle/controller/PostController.java index 963e06bb6..23386f201 100644 --- a/backend/src/main/java/com/openisle/controller/PostController.java +++ b/backend/src/main/java/com/openisle/controller/PostController.java @@ -1,5 +1,6 @@ package com.openisle.controller; +import com.openisle.config.CachingConfig; import com.openisle.dto.PostDetailDto; import com.openisle.dto.PostRequest; import com.openisle.dto.PostSummaryDto; @@ -15,6 +16,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.Cacheable; import org.springframework.http.ResponseEntity; import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.*; @@ -142,6 +144,10 @@ public class PostController { @Operation(summary = "List posts", description = "List posts by various filters") @ApiResponse(responseCode = "200", description = "List of posts", content = @Content(array = @ArraySchema(schema = @Schema(implementation = PostSummaryDto.class)))) + @Cacheable( + value = CachingConfig.POST_CACHE_NAME, + key = "new org.springframework.cache.interceptor.SimpleKey('default', #categoryId, #categoryIds, #tagId, #tagIds, #page, #pageSize)" + ) public List listPosts(@RequestParam(value = "categoryId", required = false) Long categoryId, @RequestParam(value = "categoryIds", required = false) List categoryIds, @RequestParam(value = "tagId", required = false) Long tagId, @@ -188,6 +194,10 @@ public class PostController { @Operation(summary = "Latest reply posts", description = "List posts by latest replies") @ApiResponse(responseCode = "200", description = "Posts sorted by latest reply", content = @Content(array = @ArraySchema(schema = @Schema(implementation = PostSummaryDto.class)))) + @Cacheable( + value = CachingConfig.POST_CACHE_NAME, + key = "new org.springframework.cache.interceptor.SimpleKey('latest_reply', #categoryId, #categoryIds, #tagIds, #page, #pageSize)" + ) public List latestReplyPosts(@RequestParam(value = "categoryId", required = false) Long categoryId, @RequestParam(value = "categoryIds", required = false) List categoryIds, @RequestParam(value = "tagId", required = false) Long tagId, diff --git a/backend/src/main/java/com/openisle/mapper/PostMapper.java b/backend/src/main/java/com/openisle/mapper/PostMapper.java index a350908c4..058a39d96 100644 --- a/backend/src/main/java/com/openisle/mapper/PostMapper.java +++ b/backend/src/main/java/com/openisle/mapper/PostMapper.java @@ -23,6 +23,7 @@ import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; /** Mapper responsible for converting posts into DTOs. */ @@ -99,6 +100,8 @@ public class PostMapper { l.setPointCost(lp.getPointCost()); l.setStartTime(lp.getStartTime()); l.setEndTime(lp.getEndTime()); + l.setParticipants(lp.getParticipants().stream().map(userMapper::toAuthorDto).collect(Collectors.toList())); + l.setWinners(lp.getWinners().stream().map(userMapper::toAuthorDto).collect(Collectors.toList())); dto.setLottery(l); } @@ -107,6 +110,7 @@ public class PostMapper { p.setOptions(pp.getOptions()); p.setVotes(pp.getVotes()); p.setEndTime(pp.getEndTime()); + p.setParticipants(pp.getParticipants().stream().map(userMapper::toAuthorDto).collect(Collectors.toList())); Map> optionParticipants = pollVoteRepository.findByPostId(pp.getId()).stream() .collect(Collectors.groupingBy(PollVote::getOptionIndex, Collectors.mapping(v -> userMapper.toAuthorDto(v.getUser()), Collectors.toList()))); diff --git a/backend/src/main/java/com/openisle/service/PostService.java b/backend/src/main/java/com/openisle/service/PostService.java index a948bf801..c332b74b4 100644 --- a/backend/src/main/java/com/openisle/service/PostService.java +++ b/backend/src/main/java/com/openisle/service/PostService.java @@ -323,6 +323,9 @@ public class PostService { return false; } + @CacheEvict( + value = CachingConfig.POST_CACHE_NAME, allEntries = true + ) public void joinLottery(Long postId, String username) { LotteryPost post = lotteryPostRepository.findById(postId) .orElseThrow(() -> new com.openisle.exception.NotFoundException("Post not found")); @@ -339,6 +342,9 @@ public class PostService { .orElseThrow(() -> new com.openisle.exception.NotFoundException("Post not found")); } + @CacheEvict( + value = CachingConfig.POST_CACHE_NAME, allEntries = true + ) @Transactional public PollPost votePoll(Long postId, String username, java.util.List optionIndices) { PollPost post = pollPostRepository.findById(postId) @@ -376,6 +382,9 @@ public class PostService { return saved; } + @CacheEvict( + value = CachingConfig.POST_CACHE_NAME, allEntries = true + ) @Transactional public void finalizePoll(Long postId) { scheduledFinalizations.remove(postId); @@ -395,6 +404,9 @@ public class PostService { }); } + @CacheEvict( + value = CachingConfig.POST_CACHE_NAME, allEntries = true + ) @Transactional public void finalizeLottery(Long postId) { log.info("start to finalizeLottery for {}", postId); @@ -508,10 +520,6 @@ public class PostService { return listPostsByLatestReply(null, null, page, pageSize); } - @Cacheable( - value = CachingConfig.POST_CACHE_NAME, - key = "new org.springframework.cache.interceptor.SimpleKey('latest_reply', #categoryIds, #tagIds, #page, #pageSize)" - ) public List listPostsByLatestReply(java.util.List categoryIds, java.util.List tagIds, Integer page, @@ -647,10 +655,6 @@ public class PostService { * @param pageSize * @return */ - @Cacheable( - value = CachingConfig.POST_CACHE_NAME, - key = "new org.springframework.cache.interceptor.SimpleKey('default', #ids, #tids, #page, #pageSize)" - ) public List defaultListPosts(List ids, List tids, Integer page, Integer pageSize){ boolean hasCategories = !CollectionUtils.isEmpty(ids); boolean hasTags = !CollectionUtils.isEmpty(tids);