Skip to content

Commit 09ba02b

Browse files
authored
Merge pull request #71 from Zy0ung/epic/board
2 parents 0e134f8 + 4637ccb commit 09ba02b

File tree

14 files changed

+608
-6
lines changed

14 files changed

+608
-6
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package org.myteam.server.board.controller;
2+
3+
import static org.myteam.server.global.web.response.ResponseStatus.SUCCESS;
4+
5+
import jakarta.servlet.http.HttpServletRequest;
6+
import jakarta.validation.Valid;
7+
import lombok.RequiredArgsConstructor;
8+
import lombok.extern.slf4j.Slf4j;
9+
import org.myteam.server.board.controller.reponse.BoardResponse;
10+
import org.myteam.server.board.dto.BoardSaveRequest;
11+
import org.myteam.server.board.service.BoardService;
12+
import org.myteam.server.global.security.dto.CustomUserDetails;
13+
import org.myteam.server.global.web.response.ResponseDto;
14+
import org.myteam.server.util.ClientUtils;
15+
import org.springframework.http.ResponseEntity;
16+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
17+
import org.springframework.web.bind.annotation.DeleteMapping;
18+
import org.springframework.web.bind.annotation.GetMapping;
19+
import org.springframework.web.bind.annotation.PathVariable;
20+
import org.springframework.web.bind.annotation.PostMapping;
21+
import org.springframework.web.bind.annotation.PutMapping;
22+
import org.springframework.web.bind.annotation.RequestBody;
23+
import org.springframework.web.bind.annotation.RequestMapping;
24+
import org.springframework.web.bind.annotation.RestController;
25+
26+
@Slf4j
27+
@RestController
28+
@RequestMapping("/api/board")
29+
@RequiredArgsConstructor
30+
public class BoardController {
31+
32+
private final BoardService boardService;
33+
34+
/**
35+
* 게시글 생성
36+
*/
37+
@PostMapping
38+
public ResponseEntity<ResponseDto<BoardResponse>> saveBoard(
39+
@AuthenticationPrincipal final CustomUserDetails userDetails,
40+
@Valid @RequestBody final BoardSaveRequest boardSaveRequest,
41+
final HttpServletRequest request) {
42+
final String clientIP = ClientUtils.getRemoteIP(request);
43+
final BoardResponse response = boardService.saveBoard(boardSaveRequest, userDetails, clientIP);
44+
return ResponseEntity.ok(new ResponseDto<>(SUCCESS.name(), "게시글 생성 성공", response));
45+
}
46+
47+
/**
48+
* 게시글 수정
49+
*/
50+
@PutMapping("/{boardId}")
51+
public ResponseEntity<ResponseDto<BoardResponse>> updateBoard(
52+
@AuthenticationPrincipal final CustomUserDetails userDetails, @PathVariable final Long boardId,
53+
@Valid @RequestBody final BoardSaveRequest boardSaveRequest) {
54+
final BoardResponse response = boardService.updateBoard(boardSaveRequest, userDetails, boardId);
55+
return ResponseEntity.ok(new ResponseDto<>(SUCCESS.name(), "게시글 수정 성공", response));
56+
}
57+
58+
/**
59+
* 게시글 상세 조회
60+
*/
61+
@GetMapping("/{boardId}")
62+
public ResponseEntity<ResponseDto<BoardResponse>> getBoard(@PathVariable final Long boardId) {
63+
final BoardResponse response = boardService.getBoard(boardId);
64+
return ResponseEntity.ok(new ResponseDto<>(SUCCESS.name(), "게시글 조회 성공", response));
65+
}
66+
67+
/**
68+
* 게시글 삭제
69+
*/
70+
@DeleteMapping("/{boardId}")
71+
public ResponseEntity<ResponseDto<Void>> deleteBoard(@PathVariable final Long boardId,
72+
@AuthenticationPrincipal final CustomUserDetails userDetails) {
73+
boardService.deleteBoard(boardId, userDetails);
74+
return ResponseEntity.ok(new ResponseDto<>(SUCCESS.name(), "카테고리 삭제 성공", null));
75+
}
76+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package org.myteam.server.board.controller.reponse;
2+
3+
import java.time.LocalDateTime;
4+
import lombok.Getter;
5+
import lombok.Setter;
6+
import org.myteam.server.board.entity.Board;
7+
import org.myteam.server.board.entity.BoardCount;
8+
9+
@Getter
10+
@Setter
11+
public class BoardResponse {
12+
/**
13+
* 카테고리 부모 id
14+
*/
15+
private Long categoryParentId;
16+
/**
17+
* 카테고리 부모 명
18+
*/
19+
private String categoryParentName;
20+
/**
21+
* 카테고리 id
22+
*/
23+
private Long categoryId;
24+
/**
25+
* 카테고리명
26+
*/
27+
private String categoryName;
28+
/**
29+
* 게시글 id
30+
*/
31+
private Long boardId;
32+
/**
33+
* 작성자 id
34+
*/
35+
private Long authorId;
36+
/**
37+
* 작성자 IP
38+
*/
39+
private String clientIp;
40+
/**
41+
* 게시글 제목
42+
*/
43+
private String title;
44+
/**
45+
* 게시글 내용
46+
*/
47+
private String content;
48+
/**
49+
* 출처 링크
50+
*/
51+
private String link;
52+
/**
53+
* 좋아요 수
54+
*/
55+
private Integer likeCount;
56+
/**
57+
* 댓글 수
58+
*/
59+
private Integer commentCount;
60+
/**
61+
* 조회 수
62+
*/
63+
private Integer viewCount;
64+
/**
65+
* 작성 일시
66+
*/
67+
private LocalDateTime createdAt;
68+
/**
69+
* 수정 일시
70+
*/
71+
private LocalDateTime updatedAt;
72+
73+
public BoardResponse(Board board, BoardCount boardCount) {
74+
this.boardId = board.getId();
75+
this.categoryParentId = board.getCategory().getCategoryParentId();
76+
this.categoryParentName = board.getCategory().getParentCategoryName();
77+
this.categoryId = board.getCategory().getId();
78+
this.categoryName = board.getCategory().getName();
79+
this.authorId = board.getMember().getId();
80+
this.clientIp = board.getCreatedIp();
81+
this.title = board.getTitle();
82+
this.content = board.getContent();
83+
this.link = board.getLink();
84+
this.likeCount = boardCount.getLikeCount();
85+
this.commentCount = boardCount.getCommentCount();
86+
this.viewCount = boardCount.getViewCount();
87+
this.createdAt = board.getCreatedAt();
88+
this.updatedAt = board.getUpdatedAt();
89+
}
90+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.myteam.server.board.dto;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
import jakarta.validation.constraints.NotNull;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
import lombok.Setter;
8+
9+
@Getter
10+
@Setter
11+
@NoArgsConstructor
12+
public class BoardSaveRequest {
13+
/**
14+
* 카테고리 id
15+
*/
16+
@NotNull(message = "카테고리를 선택해주세요")
17+
private Long categoryId;
18+
/**
19+
* 제목
20+
*/
21+
@NotBlank(message = "제목을 입력해주세요")
22+
private String title;
23+
/**
24+
* 내용
25+
*/
26+
@NotBlank(message = "내용을 입력해주세요")
27+
private String content;
28+
/**
29+
* 출처 링크
30+
*/
31+
private String link;
32+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package org.myteam.server.board.entity;
2+
3+
import jakarta.persistence.CascadeType;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.FetchType;
6+
import jakarta.persistence.GeneratedValue;
7+
import jakarta.persistence.GenerationType;
8+
import jakarta.persistence.Id;
9+
import jakarta.persistence.JoinColumn;
10+
import jakarta.persistence.ManyToOne;
11+
import jakarta.persistence.OneToOne;
12+
import jakarta.persistence.Table;
13+
import java.time.LocalDateTime;
14+
import lombok.AccessLevel;
15+
import lombok.Builder;
16+
import lombok.Getter;
17+
import lombok.NoArgsConstructor;
18+
import org.myteam.server.board.dto.BoardSaveRequest;
19+
import org.myteam.server.member.entity.Member;
20+
21+
@Getter
22+
@Entity
23+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
24+
@Table(name = "p_board")
25+
public class Board {
26+
27+
@Id
28+
@GeneratedValue(strategy = GenerationType.IDENTITY)
29+
private Long id;
30+
31+
@ManyToOne(fetch = FetchType.LAZY)
32+
@JoinColumn(name = "member_id")
33+
private Member member;
34+
35+
@ManyToOne(fetch = FetchType.LAZY)
36+
@JoinColumn(name = "category_id")
37+
private Category category;
38+
39+
private String title;
40+
41+
private String content;
42+
43+
private String link;
44+
45+
private String createdIp;
46+
47+
private LocalDateTime createdAt;
48+
49+
private LocalDateTime updatedAt;
50+
51+
@OneToOne(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true)
52+
private BoardCount boardCount;
53+
54+
@Builder
55+
public Board(Member member, Category category, String title, String content, String link, String createdIp,
56+
BoardCount boardCount) {
57+
this.member = member;
58+
this.category = category;
59+
this.title = title;
60+
this.content = content;
61+
this.link = link;
62+
this.createdIp = createdIp;
63+
this.createdAt = LocalDateTime.now();
64+
this.updatedAt = LocalDateTime.now();
65+
this.boardCount = boardCount;
66+
}
67+
68+
public void updateBoard(BoardSaveRequest request, Category category) {
69+
this.category = category;
70+
this.title = request.getTitle();
71+
this.content = request.getContent();
72+
this.link = request.getLink();
73+
this.updatedAt = LocalDateTime.now();
74+
}
75+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.myteam.server.board.entity;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.FetchType;
6+
import jakarta.persistence.Id;
7+
import jakarta.persistence.JoinColumn;
8+
import jakarta.persistence.MapsId;
9+
import jakarta.persistence.OneToOne;
10+
import jakarta.persistence.Table;
11+
import lombok.AccessLevel;
12+
import lombok.AllArgsConstructor;
13+
import lombok.Builder;
14+
import lombok.Getter;
15+
import lombok.NoArgsConstructor;
16+
17+
@Getter
18+
@Entity
19+
@AllArgsConstructor
20+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
21+
@Table(name = "p_board_count")
22+
public class BoardCount {
23+
24+
@Id
25+
private Long boardId;
26+
27+
@OneToOne(fetch = FetchType.LAZY)
28+
@MapsId
29+
@JoinColumn(name = "board_id")
30+
private Board board;
31+
32+
@Column(name = "like_count", nullable = false)
33+
private int likeCount;
34+
35+
@Column(name = "view_count", nullable = false)
36+
private int viewCount;
37+
38+
@Column(name = "comment_count", nullable = false)
39+
private int commentCount;
40+
41+
@Builder
42+
public BoardCount(Board board, int likeCount, int commentCount, int viewCount) {
43+
this.board = board;
44+
this.likeCount = likeCount;
45+
this.commentCount = commentCount;
46+
this.viewCount = viewCount;
47+
}
48+
49+
public static BoardCount createBoardCount(Board board) {
50+
final int COUNT_SETTING_NUMBER = 0;
51+
52+
return BoardCount.builder()
53+
.board(board)
54+
.likeCount(COUNT_SETTING_NUMBER)
55+
.commentCount(COUNT_SETTING_NUMBER)
56+
.viewCount(COUNT_SETTING_NUMBER)
57+
.build();
58+
}
59+
}

0 commit comments

Comments
 (0)