blob: ea79dbb35db4e150b851482ab3dd9b0b662d13c8 [file] [log] [blame]
package com.g9.g9backend.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.g9.g9backend.pojo.Community;
import com.g9.g9backend.pojo.DTO.*;
import com.g9.g9backend.pojo.Subscription;
import com.g9.g9backend.pojo.Thread;
import com.g9.g9backend.pojo.ThreadLike;
import com.g9.g9backend.service.*;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
/**
* CommunityController 社区控制器类,处理与社区相关的请求
*
* @author Seamher
*/
@RestController
public class CommunityController {
private final CommunityService communityService;
private final ThreadService threadService;
private final SubscriptionService subscriptionService;
private final ThreadLikeService threadLikeService;
private final Logger logger = LoggerFactory.getLogger(CommunityController.class);
public CommunityController(CommunityService communityService, ThreadService threadService, SubscriptionService subscriptionService, ThreadLikeService threadLikeService) {
this.communityService = communityService;
this.threadService = threadService;
this.threadLikeService = threadLikeService;
this.subscriptionService = subscriptionService;
}
@PostMapping(value = "/thread")
public ResponseEntity<String> postThread(@RequestBody Thread thread) {
thread.setLikes(0);
thread.setCommentNumber(0);
threadService.save(thread);
Community community = communityService.getById(thread.getCommunityId());
community.setThreadNumber(community.getThreadNumber() + 1);
communityService.updateById(community);
logger.info("帖子已发布");
return ResponseEntity.ok("");
}
@PostMapping(value = "/thread/like")
public ResponseEntity<String> postThreadLike(@RequestBody Map<String, Integer> request) {
Integer userId = request.get("userId");
Integer threadId = request.get("threadId");
ThreadLike threadLike = new ThreadLike(userId, threadId);
threadLikeService.save(threadLike);
Thread thread = threadService.getById(threadId);
thread.setLikes(thread.getLikes() + 1);
threadService.updateById(thread);
logger.info("点赞成功");
return ResponseEntity.ok("");
}
@DeleteMapping(value = "/thread")
public ResponseEntity<String> deleteThread(@RequestParam Integer threadId) {
Thread thread = threadService.getById(threadId);
threadService.removeById(threadId);
Community community = communityService.getById(thread.getCommunityId());
community.setThreadNumber(community.getThreadNumber() - 1);
communityService.updateById(community);
logger.info("帖子已删除");
return ResponseEntity.noContent().build();
}
@DeleteMapping(value = "/thread/like")
public ResponseEntity<String> deleteLike(@RequestParam Integer userId, @RequestParam Integer threadId) {
LambdaQueryWrapper<ThreadLike> threadLikeQuery = new LambdaQueryWrapper<ThreadLike>()
.eq(ThreadLike::getUserId, userId)
.eq(ThreadLike::getThreadId, threadId);
threadLikeService.remove(threadLikeQuery);
Thread thread = threadService.getById(threadId);
thread.setLikes(thread.getLikes() - 1);
threadService.updateById(thread);
logger.info("取消点赞成功");
return ResponseEntity.noContent().build();
}
@GetMapping(value = "/community")
public ResponseEntity<GetCommunityDTO> getCommunity(@RequestParam String searchValue,
@RequestParam String type,
@RequestParam Integer pageNumber,
@RequestParam Integer rows) {
Page<Community> communityPage = new Page<>(pageNumber, rows);
LambdaQueryWrapper<Community> communityQuery = new LambdaQueryWrapper<Community>()
.eq(Community::getType, type)
.like(StringUtils.isNotBlank(searchValue), Community::getCommunityName, searchValue)
.orderByDesc(Community::getHot);
Page<Community> result = communityService.page(communityPage, communityQuery);
GetCommunityDTO getCommunityDTO = wrapCommunityPage(result, item -> {
GetCommunityDTO.Community community = new GetCommunityDTO.Community();
community.setCommunityId(item.getCommunityId());
community.setCommunityName(item.getCommunityName());
community.setCommunityPicture(item.getCommunityPicture());
community.setDescription(item.getDescription());
community.setHot(item.getHot());
community.setThreadNumber(item.getThreadNumber());
community.setResourceId(item.getResourceId());
return community;
});
return ResponseEntity.ok(getCommunityDTO);
}
@NotNull
private <T> GetCommunityDTO wrapCommunityPage(Page<T> page, Function<T, GetCommunityDTO.Community> mapper) {
List<GetCommunityDTO.Community> records = page.getRecords().stream().map(mapper).toList();
return new GetCommunityDTO(records, (int) page.getTotal(), (int) page.getPages(), (int) page.getCurrent(), (int) page.getSize());
}
@GetMapping(value = "/community/info")
public ResponseEntity<Community> getCommunityInfo(@RequestParam Integer communityId) {
return ResponseEntity.ok(communityService.getById(communityId));
}
@GetMapping(value = "/thread")
public ResponseEntity<ThreadDTO> getThread(@RequestParam Integer threadId, @RequestParam Integer userId) {
LambdaQueryWrapper<ThreadLike> threadLikeQuery = new LambdaQueryWrapper<ThreadLike>()
.eq(ThreadLike::getUserId, userId)
.eq(ThreadLike::getThreadId, threadId);
Thread thread = threadService.getById(threadId);
ThreadDTO threadDTO = new ThreadDTO(
threadId,
thread.getUserId(),
thread.getThreadPicture(),
thread.getTitle(),
thread.getContent(),
thread.getLikes(),
threadLikeService.getOne(threadLikeQuery) != null,
thread.getCreateAt(),
thread.getCommentNumber(),
thread.getCommunityId()
);
return ResponseEntity.ok(threadDTO);
}
@GetMapping(value = "/community/threads")
public ResponseEntity<GetCommunityThreadsDTO> getCommunityThreads(@RequestParam Integer communityId,
@RequestParam Integer pageNumber,
@RequestParam Integer rows,
@RequestParam String option,
@RequestParam String searchValue,
@RequestParam Integer userId) {
Page<Thread> threadPage = new Page<>(pageNumber, rows);
LambdaQueryWrapper<Thread> threadQuery = new LambdaQueryWrapper<Thread>()
.eq(Thread::getCommunityId, communityId)
.like(StringUtils.isNotBlank(searchValue), Thread::getTitle, searchValue);
if (Objects.equals(option, "最高热度")) {
threadQuery.orderByDesc(Thread::getLikes);
} else {
List<Integer> userIds = subscriptionService.list(new LambdaQueryWrapper<Subscription>()
.eq(Subscription::getUserId, userId))
.stream()
.map(Subscription::getFollowerId)
.toList();
threadQuery.in(!userIds.isEmpty(), Thread::getUserId, userIds)
.orderByDesc(Thread::getLikes);
}
Page<Thread> result = threadService.page(threadPage, threadQuery);
GetCommunityThreadsDTO getCommunityThreadsDTO = wrapThreadPage(result, item -> {
GetCommunityThreadsDTO.Thread thread = new GetCommunityThreadsDTO.Thread();
thread.setThreadId(item.getThreadId());
thread.setUserId(item.getUserId());
thread.setThreadPicture(item.getThreadPicture());
thread.setTitle(item.getTitle());
thread.setLikes(item.getLikes());
thread.setCreateAt(item.getCreateAt());
return thread;
});
return ResponseEntity.ok(getCommunityThreadsDTO);
}
@NotNull
private <T> GetCommunityThreadsDTO wrapThreadPage(Page<T> page, Function<T, GetCommunityThreadsDTO.Thread> mapper) {
List<GetCommunityThreadsDTO.Thread> records = page.getRecords().stream().map(mapper).toList();
return new GetCommunityThreadsDTO(records, (int) page.getTotal(), (int) page.getPages(), (int) page.getCurrent(), (int) page.getSize());
}
@GetMapping(value = "/community/hot")
public ResponseEntity<GetCommunityHotDTO> getCommunityHot() {
Page<Community> communityPage = new Page<>(1, 3);
LambdaQueryWrapper<Community> communityQuery = new LambdaQueryWrapper<Community>()
.orderByDesc(Community::getHot);
Page<Community> result = communityService.page(communityPage, communityQuery);
List<GetCommunityHotDTO.Community> communityList = getCommunityList(result);
GetCommunityHotDTO getCommunityHotDTO = new GetCommunityHotDTO(communityList);
return ResponseEntity.ok(getCommunityHotDTO);
}
@NotNull
private static List<GetCommunityHotDTO.Community> getCommunityList(Page<Community> communityPage) {
List<Community> communityListT = communityPage.getRecords();
List<GetCommunityHotDTO.Community> communityList = new ArrayList<>();
int status = 1;
for (Community community : communityListT) {
GetCommunityHotDTO.Community communityHot = new GetCommunityHotDTO.Community(
community.getCommunityId(),
community.getCommunityName(),
community.getCommunityPicture(),
community.getCommunityPicture(),
community.getHot(),
community.getType(),
community.getThreadNumber(),
community.getResourceId(),
status);
communityList.add(communityHot);
status++;
}
return communityList;
}
@GetMapping(value = "/community/common")
public ResponseEntity<GetCommunityCommonDTO> getCommunityCommon() {
Page<Community> communityPage = new Page<>(2, 3);
LambdaQueryWrapper<Community> communityQuery = new LambdaQueryWrapper<Community>()
.orderByDesc(Community::getHot);
Page<Community> result = communityService.page(communityPage, communityQuery);
List<Community> communityList = result.getRecords();
GetCommunityCommonDTO getCommunityCommonDTO = new GetCommunityCommonDTO(communityList);
return ResponseEntity.ok(getCommunityCommonDTO);
}
}