Skip to content

Commit 2f8ca8c

Browse files
authored
Merge pull request #13 from T1F5/feature/#12
Feature/#12
2 parents 904212e + df1858e commit 2f8ca8c

File tree

9 files changed

+154
-18
lines changed

9 files changed

+154
-18
lines changed

src/main/java/com/unit/daybook/domain/board/controller/BoardController.java

+17-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import lombok.RequiredArgsConstructor;
77
import org.springframework.web.bind.annotation.*;
88

9+
import java.util.List;
10+
911
@RequiredArgsConstructor
1012
@RequestMapping("/board")
1113
@RestController
@@ -14,15 +16,26 @@ public class BoardController {
1416
private final BoardService boardService;
1517

1618
@GetMapping("/{boardId}")
17-
public String getBoard(@PathVariable("boardId") Long boardId) {
18-
return "단일 조회 정보 " + boardId;
19+
public AddBoardResponseDto getBoard(@PathVariable("boardId") Long boardId) {
20+
return boardService.getBoard(boardId);
1921
}
2022

2123
@GetMapping("/boards")
22-
public String getBoards() {
23-
return "목록 조회 정보";
24+
public List<AddBoardResponseDto> getMyBoards() {
25+
// 사용자가 작성한 일지 목록 조회
26+
Long memberId = 1L; // TODO 인증
27+
return boardService.getMyBoards(memberId);
2428
}
2529

30+
// TODO 사용자가 보지 않은 글 중에서 랜덤 3개 골라 주기
31+
@GetMapping("/random")
32+
public List<AddBoardResponseDto> getRandomBoards() {
33+
// 사용자가 작성한 일지 목록 조회
34+
// TODO api 호출 시점마다 랜덤x. 12시에 사용자가 읽지 않은 글을 today_user_table에 저장한다. 전날 건 삭제
35+
// todo api는 today_user_table 에 있는 정보를 read. 계산 x
36+
Long memberId = 1L; // TODO 인증
37+
return boardService.getRandomBoards(memberId);
38+
}
2639

2740
@PostMapping
2841
public AddBoardResponseDto addBoard(@RequestBody AddBoardRequestDto addBoardRequestDto) {
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package com.unit.daybook.domain.board.dto.request;
22

33

4-
public record AddBoardRequestDto(String content, Long respectBoardId) {
4+
public record AddBoardRequestDto(String content, Long respectBoardId, String category, Long hearts) {
55
}

src/main/java/com/unit/daybook/domain/board/dto/response/AddBoardResponseDto.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@
55
public record AddBoardResponseDto(
66
Long boardId,
77
String content,
8-
Long respectBoardId
8+
Long respectBoardId,
9+
Long authorId,
10+
String category,
11+
Long hearts
12+
913
) {
1014

1115
public static AddBoardResponseDto from(Board board) {
12-
return new AddBoardResponseDto(board.getBoardId(), board.getContent(), board.getRespectBoardId());
16+
return new AddBoardResponseDto(board.getBoardId(), board.getContent(), board.getRespectBoardId(), board.getMemeber().getId(), board.getCategory(), board.getHearts());
1317
}
1418

1519
}

src/main/java/com/unit/daybook/domain/board/entity/Board.java

+22-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.unit.daybook.domain.board.dto.request.AddBoardRequestDto;
44
import com.unit.daybook.domain.common.model.BaseTimeEntity;
5+
import com.unit.daybook.domain.member.domain.Member;
56
import jakarta.persistence.*;
67
import lombok.*;
78

@@ -20,22 +21,41 @@ public class Board extends BaseTimeEntity {
2021
@Column
2122
private String content;
2223

24+
@Column
25+
private String category;
26+
2327
@Column(name = "respect_board_id")
2428
private Long respectBoardId;
2529

30+
@ManyToOne
31+
@JoinColumn(name = "member_id")
32+
private Member memeber;
33+
34+
@Column
35+
private Long hearts;
2636

2737
@Builder(access = AccessLevel.PRIVATE)
28-
public Board(Long boardId, String content, Long respectBoardId) {
38+
public Board(Long boardId, String content, Long respectBoardId, Member member, String category, Long hearts) {
2939
this.boardId = boardId;
3040
this.content = content;
3141
this.respectBoardId = respectBoardId;
42+
this.memeber = member;
43+
this.category = category;
44+
this.hearts = hearts;
3245
}
3346

34-
public static Board createBoard(AddBoardRequestDto addBoardRequestDto) {
47+
public static Board createBoard(AddBoardRequestDto addBoardRequestDto, Member member) {
3548
return Board.builder()
3649
.content(addBoardRequestDto.content())
3750
.respectBoardId(addBoardRequestDto.respectBoardId())
51+
.member(member)
52+
.category(addBoardRequestDto.category())
53+
.hearts(0L) // todo
3854
.build();
3955
}
4056

57+
public void plusRespect() {
58+
this.hearts += 1;
59+
}
60+
4161
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.unit.daybook.domain.board.entity;
2+
3+
import com.unit.daybook.domain.common.model.BaseTimeEntity;
4+
import com.unit.daybook.domain.member.domain.Member;
5+
import jakarta.persistence.*;
6+
import lombok.AccessLevel;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
@Getter
11+
@Entity
12+
@Table(name = "read_board")
13+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
14+
class ReadBoard extends BaseTimeEntity {
15+
16+
@Id
17+
@GeneratedValue(strategy = GenerationType.IDENTITY)
18+
@Column(name = "read_board_id")
19+
private Long readBoardId;
20+
21+
@ManyToOne
22+
@JoinColumn(name = "member_id")
23+
private Member member;
24+
25+
@ManyToOne
26+
@JoinColumn(name = "board_id")
27+
private Board board;
28+
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.unit.daybook.domain.board.repository;
2+
3+
4+
public interface BoardRepositoryCustom {
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.unit.daybook.domain.board.repository;
2+
3+
import com.querydsl.jpa.impl.JPAQueryFactory;
4+
import com.unit.daybook.domain.board.entity.Board;
5+
import com.unit.daybook.domain.board.entity.QBoard;
6+
import com.unit.daybook.domain.member.domain.QMember;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.stereotype.Repository;
9+
10+
import java.util.List;
11+
12+
import static com.unit.daybook.domain.board.entity.QBoard.board;
13+
import static com.unit.daybook.domain.member.domain.QMember.member;
14+
15+
@Repository
16+
@RequiredArgsConstructor
17+
public class BoardRepositoryImpl implements BoardRepositoryCustom {
18+
private final JPAQueryFactory queryFactory;
19+
20+
public List<Board> findBoardsByMemberId(Long memberId) {
21+
22+
List<Board> boards = queryFactory
23+
.select(board)
24+
.from(board)
25+
.join(board.memeber, member).fetchJoin()
26+
.where(
27+
member.id.eq(memberId)
28+
)
29+
.fetch();
30+
31+
return boards;
32+
}
33+
}

src/main/java/com/unit/daybook/domain/board/service/BoardService.java

+34-1
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,52 @@
55
import com.unit.daybook.domain.board.entity.Board;
66
import com.unit.daybook.domain.board.repository.BoardRepository;
77

8+
import com.unit.daybook.domain.board.repository.BoardRepositoryImpl;
9+
import com.unit.daybook.domain.member.domain.Member;
10+
import com.unit.daybook.domain.member.repository.MemberRepository;
811
import lombok.RequiredArgsConstructor;
912
import org.springframework.stereotype.Service;
1013
import org.springframework.transaction.annotation.Transactional;
1114

15+
import java.util.List;
16+
import java.util.stream.Collectors;
17+
1218
@Transactional
1319
@Service
1420
@RequiredArgsConstructor
1521
public class BoardService {
1622

1723
private final BoardRepository boardRepository;
24+
private final BoardRepositoryImpl boardRepositoryImpl;
25+
private final MemberRepository memberRepository;
1826

1927
public AddBoardResponseDto addBoard(AddBoardRequestDto addBoardRequestDto, Long memberId) {
20-
return AddBoardResponseDto.from(boardRepository.save(Board.createBoard(addBoardRequestDto)));
28+
Member member = memberRepository.findById(memberId).orElseThrow(() -> new RuntimeException(memberId + "not found"));
29+
if (addBoardRequestDto.respectBoardId() != null) {
30+
Board respectBoard = boardRepository.findById(addBoardRequestDto.respectBoardId()).orElseThrow(() -> new RuntimeException(addBoardRequestDto.respectBoardId() + "not found"));
31+
respectBoard.plusRespect();
32+
boardRepository.save(respectBoard);
33+
}
34+
// 글의 카운트 올리기.. redis..?
35+
36+
return AddBoardResponseDto.from(boardRepository.save(Board.createBoard(addBoardRequestDto, member)));
37+
}
38+
39+
40+
public AddBoardResponseDto getBoard(Long boardId) {
41+
return AddBoardResponseDto.from(
42+
boardRepository.findById(boardId).orElseThrow(() -> new RuntimeException(boardId + "not found")));
43+
}
44+
45+
public List<AddBoardResponseDto> getMyBoards(Long memberId) {
46+
// TODO 페이지네이션 - 스와이프 방식?
47+
return boardRepositoryImpl.findBoardsByMemberId(memberId)
48+
.stream()
49+
.map(AddBoardResponseDto::from)
50+
.toList();
2151
}
2252

53+
public List<AddBoardResponseDto> getRandomBoards(Long memberId) {
54+
return null;
55+
}
2356
}

src/main/java/com/unit/daybook/domain/member/domain/Member.java

+7-8
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
package com.unit.daybook.domain.member.domain;
22

33
import java.time.LocalDateTime;
4+
import java.util.ArrayList;
5+
import java.util.List;
46

7+
import com.unit.daybook.domain.board.entity.Board;
58
import com.unit.daybook.domain.common.model.BaseTimeEntity;
69

7-
import jakarta.persistence.Column;
8-
import jakarta.persistence.Embedded;
9-
import jakarta.persistence.Entity;
10-
import jakarta.persistence.EnumType;
11-
import jakarta.persistence.Enumerated;
12-
import jakarta.persistence.GeneratedValue;
13-
import jakarta.persistence.GenerationType;
14-
import jakarta.persistence.Id;
10+
import jakarta.persistence.*;
1511
import lombok.AccessLevel;
1612
import lombok.Builder;
1713
import lombok.Getter;
@@ -40,6 +36,8 @@ public class Member extends BaseTimeEntity {
4036

4137
private LocalDateTime lastLoginAt;
4238

39+
@OneToMany(fetch = FetchType.LAZY)
40+
private List<Board> boards = new ArrayList<>();
4341

4442
@Builder(access = AccessLevel.PRIVATE)
4543
private Member(
@@ -64,6 +62,7 @@ public static Member createNormalMember(OauthInfo oauthInfo, String nickname) {
6462
.build();
6563
}
6664

65+
6766
public void updateLastLoginAt() {
6867
this.lastLoginAt = LocalDateTime.now();
6968
}

0 commit comments

Comments
 (0)