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 c522757..ec5e0c0 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 @@ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RequiredArgsConstructor @RequestMapping("/board") @RestController @@ -14,15 +16,26 @@ public class BoardController { private final BoardService boardService; @GetMapping("/{boardId}") - public String getBoard(@PathVariable("boardId") Long boardId) { - return "단일 조회 정보 " + boardId; + public AddBoardResponseDto getBoard(@PathVariable("boardId") Long boardId) { + return boardService.getBoard(boardId); } @GetMapping("/boards") - public String getBoards() { - return "목록 조회 정보"; + public List getMyBoards() { + // 사용자가 작성한 일지 목록 조회 + Long memberId = 1L; // TODO 인증 + return boardService.getMyBoards(memberId); } + // TODO 사용자가 보지 않은 글 중에서 랜덤 3개 골라 주기 + @GetMapping("/random") + public List getRandomBoards() { + // 사용자가 작성한 일지 목록 조회 + // TODO api 호출 시점마다 랜덤x. 12시에 사용자가 읽지 않은 글을 today_user_table에 저장한다. 전날 건 삭제 + // todo api는 today_user_table 에 있는 정보를 read. 계산 x + Long memberId = 1L; // TODO 인증 + return boardService.getRandomBoards(memberId); + } @PostMapping public AddBoardResponseDto addBoard(@RequestBody AddBoardRequestDto addBoardRequestDto) { diff --git a/src/main/java/com/unit/daybook/domain/board/dto/request/AddBoardRequestDto.java b/src/main/java/com/unit/daybook/domain/board/dto/request/AddBoardRequestDto.java index 0d0f11d..8cf5e18 100644 --- a/src/main/java/com/unit/daybook/domain/board/dto/request/AddBoardRequestDto.java +++ b/src/main/java/com/unit/daybook/domain/board/dto/request/AddBoardRequestDto.java @@ -1,5 +1,5 @@ package com.unit.daybook.domain.board.dto.request; -public record AddBoardRequestDto(String content, Long respectBoardId) { +public record AddBoardRequestDto(String content, Long respectBoardId, String category, Long hearts) { } \ No newline at end of file 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 index 817f2c3..eb08c4c 100644 --- 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 @@ -5,11 +5,15 @@ public record AddBoardResponseDto( Long boardId, String content, - Long respectBoardId + Long respectBoardId, + Long authorId, + String category, + Long hearts + ) { public static AddBoardResponseDto from(Board board) { - return new AddBoardResponseDto(board.getBoardId(), board.getContent(), board.getRespectBoardId()); + return new AddBoardResponseDto(board.getBoardId(), board.getContent(), board.getRespectBoardId(), board.getMemeber().getId(), board.getCategory(), board.getHearts()); } } diff --git a/src/main/java/com/unit/daybook/domain/board/entity/Board.java b/src/main/java/com/unit/daybook/domain/board/entity/Board.java index 76eebc2..fe4a3b0 100644 --- a/src/main/java/com/unit/daybook/domain/board/entity/Board.java +++ b/src/main/java/com/unit/daybook/domain/board/entity/Board.java @@ -2,6 +2,7 @@ import com.unit.daybook.domain.board.dto.request.AddBoardRequestDto; import com.unit.daybook.domain.common.model.BaseTimeEntity; +import com.unit.daybook.domain.member.domain.Member; import jakarta.persistence.*; import lombok.*; @@ -20,22 +21,41 @@ public class Board extends BaseTimeEntity { @Column private String content; + @Column + private String category; + @Column(name = "respect_board_id") private Long respectBoardId; + @ManyToOne + @JoinColumn(name = "member_id") + private Member memeber; + + @Column + private Long hearts; @Builder(access = AccessLevel.PRIVATE) - public Board(Long boardId, String content, Long respectBoardId) { + public Board(Long boardId, String content, Long respectBoardId, Member member, String category, Long hearts) { this.boardId = boardId; this.content = content; this.respectBoardId = respectBoardId; + this.memeber = member; + this.category = category; + this.hearts = hearts; } - public static Board createBoard(AddBoardRequestDto addBoardRequestDto) { + public static Board createBoard(AddBoardRequestDto addBoardRequestDto, Member member) { return Board.builder() .content(addBoardRequestDto.content()) .respectBoardId(addBoardRequestDto.respectBoardId()) + .member(member) + .category(addBoardRequestDto.category()) + .hearts(0L) // todo .build(); } + public void plusRespect() { + this.hearts += 1; + } + } diff --git a/src/main/java/com/unit/daybook/domain/board/entity/ReadBoard.java b/src/main/java/com/unit/daybook/domain/board/entity/ReadBoard.java new file mode 100644 index 0000000..9a511c4 --- /dev/null +++ b/src/main/java/com/unit/daybook/domain/board/entity/ReadBoard.java @@ -0,0 +1,29 @@ +package com.unit.daybook.domain.board.entity; + +import com.unit.daybook.domain.common.model.BaseTimeEntity; +import com.unit.daybook.domain.member.domain.Member; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@Table(name = "read_board") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +class ReadBoard extends BaseTimeEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "read_board_id") + private Long readBoardId; + + @ManyToOne + @JoinColumn(name = "member_id") + private Member member; + + @ManyToOne + @JoinColumn(name = "board_id") + private Board board; + +} \ No newline at end of file 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 new file mode 100644 index 0000000..a8325c1 --- /dev/null +++ b/src/main/java/com/unit/daybook/domain/board/repository/BoardRepositoryCustom.java @@ -0,0 +1,5 @@ +package com.unit.daybook.domain.board.repository; + + +public interface BoardRepositoryCustom { +} 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 new file mode 100644 index 0000000..17dd363 --- /dev/null +++ b/src/main/java/com/unit/daybook/domain/board/repository/BoardRepositoryImpl.java @@ -0,0 +1,33 @@ +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.QBoard; +import com.unit.daybook.domain.member.domain.QMember; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +import static com.unit.daybook.domain.board.entity.QBoard.board; +import static com.unit.daybook.domain.member.domain.QMember.member; + +@Repository +@RequiredArgsConstructor +public class BoardRepositoryImpl implements BoardRepositoryCustom { + private final JPAQueryFactory queryFactory; + + public List findBoardsByMemberId(Long memberId) { + + List boards = queryFactory + .select(board) + .from(board) + .join(board.memeber, member).fetchJoin() + .where( + member.id.eq(memberId) + ) + .fetch(); + + return boards; + } +} 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 10e29ff..b249973 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 @@ -5,19 +5,52 @@ import com.unit.daybook.domain.board.entity.Board; import com.unit.daybook.domain.board.repository.BoardRepository; +import com.unit.daybook.domain.board.repository.BoardRepositoryImpl; +import com.unit.daybook.domain.member.domain.Member; +import com.unit.daybook.domain.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.stream.Collectors; + @Transactional @Service @RequiredArgsConstructor public class BoardService { private final BoardRepository boardRepository; + private final BoardRepositoryImpl boardRepositoryImpl; + private final MemberRepository memberRepository; public AddBoardResponseDto addBoard(AddBoardRequestDto addBoardRequestDto, Long memberId) { - return AddBoardResponseDto.from(boardRepository.save(Board.createBoard(addBoardRequestDto))); + Member member = memberRepository.findById(memberId).orElseThrow(() -> new RuntimeException(memberId + "not found")); + if (addBoardRequestDto.respectBoardId() != null) { + Board respectBoard = boardRepository.findById(addBoardRequestDto.respectBoardId()).orElseThrow(() -> new RuntimeException(addBoardRequestDto.respectBoardId() + "not found")); + respectBoard.plusRespect(); + boardRepository.save(respectBoard); + } + // 글의 카운트 올리기.. redis..? + + return AddBoardResponseDto.from(boardRepository.save(Board.createBoard(addBoardRequestDto, member))); + } + + + public AddBoardResponseDto getBoard(Long boardId) { + return AddBoardResponseDto.from( + boardRepository.findById(boardId).orElseThrow(() -> new RuntimeException(boardId + "not found"))); + } + + public List getMyBoards(Long memberId) { + // TODO 페이지네이션 - 스와이프 방식? + return boardRepositoryImpl.findBoardsByMemberId(memberId) + .stream() + .map(AddBoardResponseDto::from) + .toList(); } + public List getRandomBoards(Long memberId) { + return null; + } } diff --git a/src/main/java/com/unit/daybook/domain/member/domain/Member.java b/src/main/java/com/unit/daybook/domain/member/domain/Member.java index 9e843d8..53d9234 100644 --- a/src/main/java/com/unit/daybook/domain/member/domain/Member.java +++ b/src/main/java/com/unit/daybook/domain/member/domain/Member.java @@ -1,17 +1,13 @@ package com.unit.daybook.domain.member.domain; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import com.unit.daybook.domain.board.entity.Board; import com.unit.daybook.domain.common.model.BaseTimeEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Embedded; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -40,6 +36,8 @@ public class Member extends BaseTimeEntity { private LocalDateTime lastLoginAt; + @OneToMany(fetch = FetchType.LAZY) + private List boards = new ArrayList<>(); @Builder(access = AccessLevel.PRIVATE) private Member( @@ -64,6 +62,7 @@ public static Member createNormalMember(OauthInfo oauthInfo, String nickname) { .build(); } + public void updateLastLoginAt() { this.lastLoginAt = LocalDateTime.now(); }