diff --git a/src/main/java/com/unit/daybook/domain/board/controller/BoardController.java b/src/main/java/com/unit/daybook/domain/board/controller/BoardController.java index 848e1dc..c39b235 100644 --- a/src/main/java/com/unit/daybook/domain/board/controller/BoardController.java +++ b/src/main/java/com/unit/daybook/domain/board/controller/BoardController.java @@ -1,18 +1,19 @@ package com.unit.daybook.domain.board.controller; import com.unit.daybook.domain.board.dto.request.AddBoardRequestDto; -import com.unit.daybook.domain.board.dto.response.AddBoardResponseDto; +import com.unit.daybook.domain.board.dto.response.BoardResponseDto; import com.unit.daybook.domain.board.dto.response.BoardTmpResponse; -import com.unit.daybook.domain.board.entity.ReadBoard; +import com.unit.daybook.domain.board.dto.response.FindBoardListResponse; +import com.unit.daybook.domain.board.dto.response.FindOneBoardResponse; import com.unit.daybook.domain.board.service.BoardService; import com.unit.daybook.domain.common.annotation.LoginUsers; -import com.unit.daybook.domain.member.domain.Member; import com.unit.daybook.global.config.security.CustomUserDetails; import lombok.RequiredArgsConstructor; + +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; -import java.util.Map; @RequiredArgsConstructor @RequestMapping("/board") @@ -22,7 +23,9 @@ public class BoardController { private final BoardService boardService; @GetMapping("/{boardId}") - public AddBoardResponseDto getBoard(@PathVariable("boardId") Long boardId) { + public FindOneBoardResponse getBoard( + @PathVariable("boardId") Long boardId + ) { return boardService.getBoard(boardId); } @@ -30,7 +33,7 @@ public AddBoardResponseDto getBoard(@PathVariable("boardId") Long boardId) { * 사용자가 작성한 일지 목록 조회 */ @GetMapping("/boards") - public List getMyBoards(@LoginUsers CustomUserDetails userDetails) { + public FindBoardListResponse getMyBoards(@LoginUsers CustomUserDetails userDetails) { return boardService.getMyBoards(userDetails.getMemberId()); } @@ -40,26 +43,29 @@ public List getMyBoards(@LoginUsers CustomUserDetails userD * 만약 배치 후 가입한 사용자라면, 자기가 쓰지 않은 최신글 */ @GetMapping("/random") - public List getRandomBoards(@LoginUsers CustomUserDetails userDetails) { - List result = boardService.getRandomBoards(userDetails.getMemberId()); + public List getRandomBoards(@LoginUsers CustomUserDetails userDetails) { - return result; + return boardService.getRandomBoards(userDetails.getMemberId()); } @PostMapping - public BoardTmpResponse addBoard(@RequestBody AddBoardRequestDto addBoardRequestDto, @LoginUsers CustomUserDetails userDetails) { - AddBoardResponseDto board = boardService.addBoard(addBoardRequestDto, userDetails.getMemberId()); + public BoardTmpResponse addBoard( + @RequestBody AddBoardRequestDto addBoardRequestDto, + @LoginUsers CustomUserDetails userDetails) + { + BoardResponseDto board = boardService.addBoard(addBoardRequestDto, userDetails.getMemberId()); return boardService.getBoardWithHashTag(board.boardId()); } - @PostMapping("/{boardId}") - public BoardTmpResponse modifyBoard(@PathVariable("boardId") Long boardId, @RequestBody AddBoardRequestDto addBoardRequestDto) { - return boardService.modifyBoard(boardId, addBoardRequestDto); - } + // @PostMapping("/{boardId}") + // public BoardTmpResponse modifyBoard(@PathVariable("boardId") Long boardId, @RequestBody AddBoardRequestDto addBoardRequestDto) { + // return boardService.modifyBoard(boardId, addBoardRequestDto); + // } @DeleteMapping("/{boardId}") - public Map deleteBoard(@PathVariable("boardId") Long boardId) { - return boardService.deleteBoard(boardId); + public ResponseEntity deleteBoard(@PathVariable("boardId") Long boardId) { + boardService.deleteBoard(boardId); + return ResponseEntity.ok().build(); } @GetMapping("/test") diff --git a/src/main/java/com/unit/daybook/domain/board/dto/response/AddBoardResponseDto.java b/src/main/java/com/unit/daybook/domain/board/dto/response/AddBoardResponseDto.java deleted file mode 100644 index ec1fd71..0000000 --- a/src/main/java/com/unit/daybook/domain/board/dto/response/AddBoardResponseDto.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.unit.daybook.domain.board.dto.response; - -import com.unit.daybook.domain.board.entity.Board; - -import java.time.LocalDateTime; -import java.util.List; - -public record AddBoardResponseDto( - Long boardId, - String content, - Long respectBoardId, - Long authorId, - - String category, - Long hearts, - List hashtags, - String paperType, - LocalDateTime createdAt -) { - - public static AddBoardResponseDto from(Board board) { - List hashContents = board.getHashtags().stream().map(hashtag -> hashtag.getContent()).toList(); - return new AddBoardResponseDto(board.getBoardId(), board.getContent(), board.getRespectBoardId(), board.getMemeber().getId(), board.getCategory(), board.getHearts(), hashContents, board.getPaperType(), board.getCreatedAt()); - } -} diff --git a/src/main/java/com/unit/daybook/domain/board/dto/response/BoardResponseDto.java b/src/main/java/com/unit/daybook/domain/board/dto/response/BoardResponseDto.java new file mode 100644 index 0000000..a310dfa --- /dev/null +++ b/src/main/java/com/unit/daybook/domain/board/dto/response/BoardResponseDto.java @@ -0,0 +1,35 @@ +package com.unit.daybook.domain.board.dto.response; + +import com.unit.daybook.domain.board.entity.Board; +import com.unit.daybook.domain.board.entity.Hashtag; + +import java.time.LocalDateTime; +import java.util.List; + +public record BoardResponseDto( + Long boardId, + String content, + Long respectBoardId, + Long authorId, + String category, + Long hearts, + List hashtags, + String paperType, + LocalDateTime createdAt +) { + + public static BoardResponseDto from(Board board) { + List hashContents = board.getHashtags().stream().map(Hashtag::getContent).toList(); + return new BoardResponseDto( + board.getBoardId(), + board.getContent(), + board.getRespectBoardId(), + board.getMemeber().getId(), + board.getCategory(), + board.getHearts(), + hashContents, + board.getPaperType(), + board.getCreatedAt() + ); + } +} diff --git a/src/main/java/com/unit/daybook/domain/board/dto/response/BoardTmpResponse.java b/src/main/java/com/unit/daybook/domain/board/dto/response/BoardTmpResponse.java index f092c34..bd7ad7e 100644 --- a/src/main/java/com/unit/daybook/domain/board/dto/response/BoardTmpResponse.java +++ b/src/main/java/com/unit/daybook/domain/board/dto/response/BoardTmpResponse.java @@ -15,11 +15,11 @@ public class BoardTmpResponse { private String category; private Long hearts; private String papaerType; - private List hashtags; + private List hashtags; private LocalDateTime createdAt; @Builder - public BoardTmpResponse(AddBoardResponseDto dto, List hashtags) { + public BoardTmpResponse(FindOneBoardResponse dto, List hashtags) { this.boardId = dto.boardId(); this.content = dto.content(); this.respectBoardId = dto.respectBoardId(); diff --git a/src/main/java/com/unit/daybook/domain/board/dto/response/FindBoardListResponse.java b/src/main/java/com/unit/daybook/domain/board/dto/response/FindBoardListResponse.java new file mode 100644 index 0000000..254a134 --- /dev/null +++ b/src/main/java/com/unit/daybook/domain/board/dto/response/FindBoardListResponse.java @@ -0,0 +1,13 @@ +package com.unit.daybook.domain.board.dto.response; + +import java.util.List; + +import com.unit.daybook.domain.board.entity.Board; + +public record FindBoardListResponse ( + List boards +) { + public static FindBoardListResponse from(List board) { + return new FindBoardListResponse(board.stream().map(FindBoardResponse::from).toList()); + } +} diff --git a/src/main/java/com/unit/daybook/domain/board/dto/response/FindBoardResponse.java b/src/main/java/com/unit/daybook/domain/board/dto/response/FindBoardResponse.java new file mode 100644 index 0000000..2e3fde9 --- /dev/null +++ b/src/main/java/com/unit/daybook/domain/board/dto/response/FindBoardResponse.java @@ -0,0 +1,29 @@ +package com.unit.daybook.domain.board.dto.response; + +import java.time.LocalDateTime; + +import com.unit.daybook.domain.board.entity.Board; + +public record FindBoardResponse( + Long boardId, + String content, + Long respectBoardId, + Long authorId, + String category, + Long hearts, + String paperType, + LocalDateTime createdAt +) { + public static FindBoardResponse from(Board board) { + return new FindBoardResponse( + board.getBoardId(), + board.getContent(), + board.getRespectBoardId(), + board.getMemeber().getId(), + board.getCategory(), + board.getHearts(), + board.getPaperType(), + board.getCreatedAt() + ); + } +} diff --git a/src/main/java/com/unit/daybook/domain/board/dto/response/FindOneBoardResponse.java b/src/main/java/com/unit/daybook/domain/board/dto/response/FindOneBoardResponse.java new file mode 100644 index 0000000..9f8db83 --- /dev/null +++ b/src/main/java/com/unit/daybook/domain/board/dto/response/FindOneBoardResponse.java @@ -0,0 +1,40 @@ +package com.unit.daybook.domain.board.dto.response; + +import java.time.LocalDateTime; +import java.util.List; + +import com.unit.daybook.domain.board.entity.Board; +import com.unit.daybook.domain.board.entity.Hashtag; +import com.unit.daybook.domain.reaction.dto.response.ReactionTypeAndCount; +import com.unit.daybook.domain.reaction.entity.Reaction; + +public record FindOneBoardResponse( + Long boardId, + String content, + Long respectBoardId, + Long authorId, + + String category, + Long hearts, + List hashtags, + String paperType, + List reactions, + LocalDateTime createdAt +) { + public static FindOneBoardResponse of(Board board, List reactions) { + List hashContents = board.getHashtags().stream().map(Hashtag::getContent).toList(); + Long heartsFromReactions = reactions.stream().mapToLong(ReactionTypeAndCount::count).sum(); + return new FindOneBoardResponse( + board.getBoardId(), + board.getContent(), + board.getRespectBoardId(), + board.getMemeber().getId(), + board.getCategory(), + heartsFromReactions, + hashContents, + board.getPaperType(), + reactions, + board.getCreatedAt() + ); + } +} diff --git a/src/main/java/com/unit/daybook/domain/board/repository/BoardRepository.java b/src/main/java/com/unit/daybook/domain/board/repository/BoardRepository.java index 5e0b63d..e86b160 100644 --- a/src/main/java/com/unit/daybook/domain/board/repository/BoardRepository.java +++ b/src/main/java/com/unit/daybook/domain/board/repository/BoardRepository.java @@ -5,6 +5,6 @@ import org.springframework.stereotype.Repository; @Repository -public interface BoardRepository extends JpaRepository { +public interface BoardRepository extends JpaRepository, BoardRepositoryCustom { } diff --git a/src/main/java/com/unit/daybook/domain/board/repository/BoardRepositoryCustom.java b/src/main/java/com/unit/daybook/domain/board/repository/BoardRepositoryCustom.java index a8325c1..44b2902 100644 --- a/src/main/java/com/unit/daybook/domain/board/repository/BoardRepositoryCustom.java +++ b/src/main/java/com/unit/daybook/domain/board/repository/BoardRepositoryCustom.java @@ -1,5 +1,14 @@ package com.unit.daybook.domain.board.repository; +import java.util.List; + +import com.unit.daybook.domain.board.entity.Board; public interface BoardRepositoryCustom { + List findBoardsByMemberId(Long memberId); + List findBoardInBoardIds(List boardIds); + + List findNotReadBoardsByMemberId(Long memberId, List alreadyReadBoards); + + List findCurrentBoards(Long memberId); } diff --git a/src/main/java/com/unit/daybook/domain/board/repository/BoardRepositoryImpl.java b/src/main/java/com/unit/daybook/domain/board/repository/BoardRepositoryImpl.java index 8e4f6ce..3cc9ce4 100644 --- a/src/main/java/com/unit/daybook/domain/board/repository/BoardRepositoryImpl.java +++ b/src/main/java/com/unit/daybook/domain/board/repository/BoardRepositoryImpl.java @@ -30,7 +30,7 @@ public List findBoardsByMemberId(Long memberId) { } - public List findNotReadBoardsByMemberId(Long memberId, List aleadyReadBoardIds) { + public List findNotReadBoardsByMemberId(Long memberId, List alreadyReadBoardIds) { return queryFactory .select(board) .from(board) @@ -38,19 +38,19 @@ public List findNotReadBoardsByMemberId(Long memberId, List aleadyR .where( // member.id.eq(memberId) //.and( - board.boardId.notIn(aleadyReadBoardIds) + board.in(alreadyReadBoardIds) //) ) .fetch(); } - public List findBoardInBoardIds(List todayBoards) { + public List findBoardInBoardIds(List todayBoardIds) { return queryFactory .select(board) .from(board) .where( - board.boardId.in(todayBoards) + board.boardId.in(todayBoardIds) ) .fetch(); diff --git a/src/main/java/com/unit/daybook/domain/board/repository/HashtagRepository.java b/src/main/java/com/unit/daybook/domain/board/repository/HashtagRepository.java index e7e3a2b..017e36c 100644 --- a/src/main/java/com/unit/daybook/domain/board/repository/HashtagRepository.java +++ b/src/main/java/com/unit/daybook/domain/board/repository/HashtagRepository.java @@ -6,5 +6,5 @@ import org.springframework.stereotype.Repository; @Repository -public interface HashtagRepository extends JpaRepository { +public interface HashtagRepository extends JpaRepository, HashtagRepositoryCustom { } diff --git a/src/main/java/com/unit/daybook/domain/board/repository/HashtagRepositoryCustom.java b/src/main/java/com/unit/daybook/domain/board/repository/HashtagRepositoryCustom.java index c3ac749..0a34c0e 100644 --- a/src/main/java/com/unit/daybook/domain/board/repository/HashtagRepositoryCustom.java +++ b/src/main/java/com/unit/daybook/domain/board/repository/HashtagRepositoryCustom.java @@ -1,4 +1,7 @@ package com.unit.daybook.domain.board.repository; +import java.util.List; + public interface HashtagRepositoryCustom { + List findAllByBoardId(Long boardId); } diff --git a/src/main/java/com/unit/daybook/domain/board/repository/ReadBoardRepository.java b/src/main/java/com/unit/daybook/domain/board/repository/ReadBoardRepository.java index fe16e9a..c2d5991 100644 --- a/src/main/java/com/unit/daybook/domain/board/repository/ReadBoardRepository.java +++ b/src/main/java/com/unit/daybook/domain/board/repository/ReadBoardRepository.java @@ -5,6 +5,6 @@ import org.springframework.stereotype.Repository; @Repository -public interface ReadBoardRepository extends JpaRepository { +public interface ReadBoardRepository extends JpaRepository, ReadBoardRepositoryCustom { } diff --git a/src/main/java/com/unit/daybook/domain/board/repository/ReadBoardRepositoryCustom.java b/src/main/java/com/unit/daybook/domain/board/repository/ReadBoardRepositoryCustom.java index ef89535..4ba13be 100644 --- a/src/main/java/com/unit/daybook/domain/board/repository/ReadBoardRepositoryCustom.java +++ b/src/main/java/com/unit/daybook/domain/board/repository/ReadBoardRepositoryCustom.java @@ -1,4 +1,11 @@ package com.unit.daybook.domain.board.repository; +import java.util.List; + +import com.unit.daybook.domain.board.entity.Board; + public interface ReadBoardRepositoryCustom { + List findBoardsByMemberId(Long memberId); + + List findTodayBoardsByMemberId(Long memberId); } diff --git a/src/main/java/com/unit/daybook/domain/board/repository/ReadBoardRepositoryImpl.java b/src/main/java/com/unit/daybook/domain/board/repository/ReadBoardRepositoryImpl.java index 0492e0c..02533dc 100644 --- a/src/main/java/com/unit/daybook/domain/board/repository/ReadBoardRepositoryImpl.java +++ b/src/main/java/com/unit/daybook/domain/board/repository/ReadBoardRepositoryImpl.java @@ -1,6 +1,9 @@ package com.unit.daybook.domain.board.repository; import com.querydsl.jpa.impl.JPAQueryFactory; +import com.unit.daybook.domain.board.entity.Board; +import com.unit.daybook.domain.board.entity.ReadBoard; + import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -14,21 +17,19 @@ @Repository @RequiredArgsConstructor -public class ReadBoardRepositoryImpl implements BoardRepositoryCustom { +public class ReadBoardRepositoryImpl implements ReadBoardRepositoryCustom { private final JPAQueryFactory queryFactory; - public List findBoardsByMemberId(Long memberId) { + public List findBoardsByMemberId(Long memberId) { - List boards = queryFactory - .select(readBoard.board.boardId) + return queryFactory + .select(readBoard.board) .from(readBoard) .innerJoin(readBoard.member, member) .where( member.id.eq(memberId) ) .fetch(); - - return boards; } public List findTodayBoardsByMemberId(Long memberId) { @@ -38,10 +39,14 @@ public List findTodayBoardsByMemberId(Long memberId) { .select(readBoard.board.boardId) .from(readBoard) .innerJoin(readBoard.board, board) + .on(readBoard.board.boardId.eq(board.boardId)) .innerJoin(readBoard.member, member) + .on(readBoard.member.id.eq(member.id)) .where( member.id.eq(memberId) - .and(readBoard.createdAt.between(currentDate.atStartOfDay(), currentDate.atStartOfDay().plusDays(1).minusNanos(1)) + .and(readBoard.createdAt.between( + currentDate.atStartOfDay(), + currentDate.atStartOfDay().plusDays(1).minusNanos(1)) )) .fetch(); } diff --git a/src/main/java/com/unit/daybook/domain/board/service/BoardService.java b/src/main/java/com/unit/daybook/domain/board/service/BoardService.java index f07729b..49ca293 100644 --- a/src/main/java/com/unit/daybook/domain/board/service/BoardService.java +++ b/src/main/java/com/unit/daybook/domain/board/service/BoardService.java @@ -1,8 +1,10 @@ package com.unit.daybook.domain.board.service; import com.unit.daybook.domain.board.dto.request.AddBoardRequestDto; -import com.unit.daybook.domain.board.dto.response.AddBoardResponseDto; +import com.unit.daybook.domain.board.dto.response.BoardResponseDto; import com.unit.daybook.domain.board.dto.response.BoardTmpResponse; +import com.unit.daybook.domain.board.dto.response.FindBoardListResponse; +import com.unit.daybook.domain.board.dto.response.FindOneBoardResponse; import com.unit.daybook.domain.board.entity.Board; import com.unit.daybook.domain.board.entity.Hashtag; import com.unit.daybook.domain.board.entity.ReadBoard; @@ -10,6 +12,11 @@ import com.unit.daybook.domain.member.domain.Member; import com.unit.daybook.domain.member.repository.MemberRepository; +import com.unit.daybook.domain.reaction.dto.response.ReactionTypeAndCount; +import com.unit.daybook.domain.reaction.repository.ReactionRepository; +import com.unit.daybook.global.error.exception.CustomException; +import com.unit.daybook.global.error.exception.ErrorCode; + import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,18 +29,18 @@ public class BoardService { private final BoardRepository boardRepository; - private final BoardRepositoryImpl boardRepositoryImpl; private final MemberRepository memberRepository; - private final ReadBoardRepositoryImpl readBoardRepositoryImpl; private final ReadBoardRepository readBoardRepository; private final HashtagRepository hashtagRepository; - private final HashtagRepositoryImpl hashtagRepositoryImpl; - - public AddBoardResponseDto addBoard(AddBoardRequestDto addBoardRequestDto, Long memberId) { + private final ReactionRepository reactionRepository; - Member member = memberRepository.findById(memberId).orElseThrow(() -> new RuntimeException(memberId + "not found")); + public BoardResponseDto addBoard(AddBoardRequestDto addBoardRequestDto, Long memberId) { + Member member = memberRepository + .findById(memberId).orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND)); if (addBoardRequestDto.respectBoardId() != null) { - Board respectBoard = boardRepository.findById(addBoardRequestDto.respectBoardId()).orElseThrow(() -> new RuntimeException(addBoardRequestDto.respectBoardId() + "not found")); + Board respectBoard = boardRepository + .findById(addBoardRequestDto.respectBoardId()) + .orElseThrow(() -> new CustomException(ErrorCode.BOARD_NOT_FOUND)); respectBoard.plusRespect(); boardRepository.save(respectBoard); } @@ -45,28 +52,39 @@ public AddBoardResponseDto addBoard(AddBoardRequestDto addBoardRequestDto, Long hashtagRepository.save(Hashtag.createHashtag(addBoardRequestDto.hashtags().get(i), board)); } - return AddBoardResponseDto.from(board); + return BoardResponseDto.from(board); } @Transactional(readOnly = true) - public AddBoardResponseDto getBoard(Long boardId) { - return AddBoardResponseDto.from( - boardRepository.findById(boardId).orElseThrow(() -> new RuntimeException(boardId + "not found"))); + public FindOneBoardResponse getBoard(Long boardId) { + Board board = boardRepository.findById(boardId) + .orElseThrow(() -> new CustomException(ErrorCode.BOARD_NOT_FOUND)); + List reactions = reactionRepository.findAllByBoardGroupByReactionType(board); + + return FindOneBoardResponse.of(board, reactions); } @Transactional(readOnly = true) - public List getMyBoards(Long memberId) { - // 페이지네이션x - 스와이프 방식 - return boardRepositoryImpl.findBoardsByMemberId(memberId) - .stream() - .map(AddBoardResponseDto::from) - .toList(); + public FindBoardListResponse getMyBoards(Long memberId) { + List boards= boardRepository.findBoardsByMemberId(memberId); + return FindBoardListResponse.from(boards); } - public List getRandomBoards(Long memberId) { - List result = getTodayBoardByMemberId(memberId); - if (result.size() == 3) { - return result; + @Transactional(readOnly = true) + public List getRandomBoards(Long memberId) { + List result = getTodayBoardByMemberId(memberId); + if (result.size() < 3) { + List boards = getCurrentBoards(memberId); + // read-board 에도 적재 + Member member = memberRepository + .findById(memberId) + .orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND)); + readBoardRepository.save(ReadBoard.createReadBoard(member, boards.get(0))); + readBoardRepository.save(ReadBoard.createReadBoard(member, boards.get(1))); + readBoardRepository.save(ReadBoard.createReadBoard(member, boards.get(2))); + result = boards.stream() + .map(BoardResponseDto::from) + .toList(); } result = new ArrayList<>(); List boards = getCurrentBoards(memberId); @@ -75,7 +93,7 @@ public List getRandomBoards(Long memberId) { int toSave = 3 - result.size(); for (int i =0 ; i memberIds = memberRepository.findAll().stream().map(Member::getId).toList(); - for (int i = 0; i < memberIds.size(); i++) { - Long memberId = memberIds.get(i); - // 이미 읽은 일지 - List aleadyReadBoardIds = readBoardRepositoryImpl.findBoardsByMemberId(memberId); + for (Long memberId : memberIds) { + // 이미 읽은 일지 + List alreadyReadBoards = readBoardRepository.findBoardsByMemberId(memberId); - // 안 읽은 일지 - List notReadBoards = boardRepositoryImpl.findNotReadBoardsByMemberId(memberId, aleadyReadBoardIds); + // 안 읽은 일지 + List notReadBoards = boardRepository.findNotReadBoardsByMemberId(memberId, alreadyReadBoards); - // 적재할 일지 고유 id - List randomIdxs = selectRandomNumbers(notReadBoards.size() - 1); + // 적재할 일지 고유 id + List randomIdxs = selectRandomNumbers(notReadBoards.size() - 1); - // 적재 - Member member = memberRepository.findById(memberId).orElseThrow(() -> new RuntimeException(memberId + "not found")); - readBoardRepository.save(ReadBoard.createReadBoard(member, notReadBoards.get(Math.toIntExact(randomIdxs.get(0))))); - readBoardRepository.save(ReadBoard.createReadBoard(member, notReadBoards.get(Math.toIntExact(randomIdxs.get(1))))); - readBoardRepository.save(ReadBoard.createReadBoard(member, notReadBoards.get(Math.toIntExact(randomIdxs.get(2))))); + // 적재 + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new RuntimeException(memberId + "not found")); + readBoardRepository.save( + ReadBoard.createReadBoard(member, notReadBoards.get(Math.toIntExact(randomIdxs.get(0))))); + readBoardRepository.save( + ReadBoard.createReadBoard(member, notReadBoards.get(Math.toIntExact(randomIdxs.get(1))))); + readBoardRepository.save( + ReadBoard.createReadBoard(member, notReadBoards.get(Math.toIntExact(randomIdxs.get(2))))); - } + } } - public List getTodayBoardByMemberId(Long memberId) { - List todayBoards = readBoardRepositoryImpl.findTodayBoardsByMemberId(memberId); - List result = boardRepositoryImpl.findBoardInBoardIds(todayBoards); + public List getTodayBoardByMemberId(Long memberId) { + List todayBoardIds = readBoardRepository.findTodayBoardsByMemberId(memberId); + List result = boardRepository.findBoardInBoardIds(todayBoardIds); return result.stream() - .map(AddBoardResponseDto::from) + .map(BoardResponseDto::from) .toList(); } @@ -136,45 +157,33 @@ public static List selectRandomNumbers(long n) { return randomNumbers; } - public BoardTmpResponse modifyBoard(Long boardId, AddBoardRequestDto addBoardRequestDto) { - Board board = boardRepository.findById(boardId).orElseThrow(() -> new RuntimeException(boardId + "")); - board.modifyBoard(addBoardRequestDto); - List newHashContents = addBoardRequestDto.hashtags(); - List newHashContents2 = addBoardRequestDto.hashtags(); - - List originHashContents = board.getHashtags(); - - - for (int i = 0; i < newHashContents.size(); i++) { - hashtagRepository.save(Hashtag.createHashtag(newHashContents.get(i), board)); - } - - return BoardTmpResponse.builder().dto(AddBoardResponseDto.from(board)).hashtags(newHashContents).build(); - } - - public Map deleteBoard(Long boardId) { + // public BoardTmpResponse modifyBoard(Long boardId, AddBoardRequestDto addBoardRequestDto) { + // Board board = boardRepository.findById(boardId).orElseThrow(() -> new RuntimeException(boardId + "")); + // board.modifyBoard(addBoardRequestDto); + // List newHashContents = addBoardRequestDto.hashtags(); + // List newHashContents2 = addBoardRequestDto.hashtags(); + // + // List originHashContents = board.getHashtags(); + // + // for (String newHashContent : newHashContents) { + // hashtagRepository.save(Hashtag.createHashtag(newHashContent, board)); + // } + // + // return BoardTmpResponse.builder().dto(AddBoardResponseDto.from(board)).hashtags(newHashContents).build(); + // } + + public void deleteBoard(Long boardId) { boardRepository.deleteById(boardId); - Map result = new HashMap<>(); - result.put("boardId", boardId); - return result; } public BoardTmpResponse getBoardWithHashTag(Long boardId) { - //List x = boardRepositoryImpl.findBoardWithHashtag(boardId).get(0); - - List hashContents = hashtagRepositoryImpl.findAllByBoardId(boardId); - AddBoardResponseDto result = getBoard(boardId); + List hashContents = hashtagRepository.findAllByBoardId(boardId); + FindOneBoardResponse result = getBoard(boardId); return BoardTmpResponse.builder().dto(result).hashtags(hashContents).build(); - // return AddBoardResponseDto.from(boardRepositoryImpl.findBoardWithHashtag(boardId).get(0)); - } - public List getCurrentBoards(Long memberId) { - List result = boardRepositoryImpl.findCurrentBoards(memberId); - return result; -// return result.stream() -// .map(AddBoardResponseDto::from) -// .toList(); + private List getCurrentBoards(Long memberId) { + return boardRepository.findCurrentBoards(memberId); } } diff --git a/src/main/java/com/unit/daybook/domain/reaction/dto/response/ReactionTypeAndCount.java b/src/main/java/com/unit/daybook/domain/reaction/dto/response/ReactionTypeAndCount.java new file mode 100644 index 0000000..80472f9 --- /dev/null +++ b/src/main/java/com/unit/daybook/domain/reaction/dto/response/ReactionTypeAndCount.java @@ -0,0 +1,9 @@ +package com.unit.daybook.domain.reaction.dto.response; + +import com.unit.daybook.domain.reaction.entity.ReactionType; + +public record ReactionTypeAndCount( + ReactionType reactionType, + Long count +) { +} diff --git a/src/main/java/com/unit/daybook/domain/reaction/repository/ReactionRepository.java b/src/main/java/com/unit/daybook/domain/reaction/repository/ReactionRepository.java index 969e4e4..9bfb2ba 100644 --- a/src/main/java/com/unit/daybook/domain/reaction/repository/ReactionRepository.java +++ b/src/main/java/com/unit/daybook/domain/reaction/repository/ReactionRepository.java @@ -1,7 +1,11 @@ package com.unit.daybook.domain.reaction.repository; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import com.unit.daybook.domain.board.entity.Board; import com.unit.daybook.domain.reaction.entity.Reaction; public interface ReactionRepository extends JpaRepository, ReactionRepositoryCustom { diff --git a/src/main/java/com/unit/daybook/domain/reaction/repository/ReactionRepositoryCustom.java b/src/main/java/com/unit/daybook/domain/reaction/repository/ReactionRepositoryCustom.java index 2900955..eb17f23 100644 --- a/src/main/java/com/unit/daybook/domain/reaction/repository/ReactionRepositoryCustom.java +++ b/src/main/java/com/unit/daybook/domain/reaction/repository/ReactionRepositoryCustom.java @@ -1,10 +1,14 @@ package com.unit.daybook.domain.reaction.repository; +import java.util.List; + import com.unit.daybook.domain.board.entity.Board; import com.unit.daybook.domain.member.domain.Member; +import com.unit.daybook.domain.reaction.dto.response.ReactionTypeAndCount; import com.unit.daybook.domain.reaction.entity.Reaction; public interface ReactionRepositoryCustom { Reaction findReactionByMemberAndBoard(Member member, Board board); + List findAllByBoardGroupByReactionType(Board board); } diff --git a/src/main/java/com/unit/daybook/domain/reaction/repository/ReactionRepositoryImpl.java b/src/main/java/com/unit/daybook/domain/reaction/repository/ReactionRepositoryImpl.java index d1d8d0b..0931992 100644 --- a/src/main/java/com/unit/daybook/domain/reaction/repository/ReactionRepositoryImpl.java +++ b/src/main/java/com/unit/daybook/domain/reaction/repository/ReactionRepositoryImpl.java @@ -2,11 +2,15 @@ import static com.unit.daybook.domain.reaction.entity.QReaction.*; +import java.util.List; + import org.springframework.stereotype.Repository; +import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; import com.unit.daybook.domain.board.entity.Board; import com.unit.daybook.domain.member.domain.Member; +import com.unit.daybook.domain.reaction.dto.response.ReactionTypeAndCount; import com.unit.daybook.domain.reaction.entity.Reaction; import lombok.RequiredArgsConstructor; @@ -25,4 +29,15 @@ public Reaction findReactionByMemberAndBoard(Member member, Board board) { reaction.member.id.eq(member.getId())) .fetchOne(); } + + @Override + public List findAllByBoardGroupByReactionType(Board board) { + return jpaQueryFactory + .select(Projections.constructor(ReactionTypeAndCount.class, reaction.reactionType, reaction.count())) + .from(reaction) + .where(reaction.board.eq(board)) + .groupBy(reaction.reactionType) + .fetch(); + } + }