Skip to content

Commit 7c8596b

Browse files
authored
Merge pull request #34 from kookmin-sw/BE
BE #18 #22 #25
2 parents e5bfc48 + 538fef0 commit 7c8596b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1026
-16
lines changed

backend/src/main/java/com/project/capstone/book/domain/Book.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.project.capstone.book.domain;
22

33
import com.project.capstone.club.domain.Club;
4+
import com.project.capstone.content.domain.Content;
5+
import com.project.capstone.quiz.domain.Quiz;
46
import jakarta.persistence.*;
57
import lombok.AllArgsConstructor;
68
import lombok.Builder;
@@ -32,4 +34,10 @@ public class Book {
3234

3335
@OneToMany(mappedBy = "book")
3436
private List<Club> clubs = new ArrayList<>();
37+
38+
@OneToMany(mappedBy = "book")
39+
private List<Content> contents = new ArrayList<>();
40+
41+
@OneToMany(mappedBy = "book")
42+
private List<Quiz> quizzes = new ArrayList<>();
3543
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.project.capstone.book.domain;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
import java.util.Optional;
6+
7+
public interface BookRepository extends JpaRepository<Book, Long> {
8+
Optional<Book> findBookById(Long id);
9+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.project.capstone.book.exception;
2+
3+
import com.project.capstone.common.exception.BaseException;
4+
import com.project.capstone.common.exception.ExceptionType;
5+
6+
public class BookException extends BaseException {
7+
public BookException(ExceptionType exceptionType) {
8+
super(exceptionType);
9+
}
10+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.project.capstone.book.exception;
2+
3+
import com.project.capstone.common.exception.ExceptionType;
4+
import lombok.AllArgsConstructor;
5+
import org.springframework.http.HttpStatus;
6+
7+
import static org.springframework.http.HttpStatus.NOT_FOUND;
8+
9+
@AllArgsConstructor
10+
public enum BookExceptionType implements ExceptionType {
11+
12+
BOOK_NOT_FOUND(NOT_FOUND, 801, "해당 책을 찾을 수 없습니다.")
13+
;
14+
15+
private final HttpStatus status;
16+
private final int exceptionCode;
17+
private final String message;
18+
19+
@Override
20+
public HttpStatus httpStatus() {
21+
return status;
22+
}
23+
24+
@Override
25+
public int exceptionCode() {
26+
return exceptionCode;
27+
}
28+
29+
@Override
30+
public String message() {
31+
return message;
32+
}
33+
}
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.project.capstone.club.controller.dto;
22

3+
import com.fasterxml.jackson.annotation.JsonIgnore;
34
import com.project.capstone.club.domain.Club;
45
import com.project.capstone.club.domain.PublicStatus;
6+
import com.project.capstone.post.domain.Post;
57

68
import java.time.LocalDateTime;
9+
import java.util.List;
710

811
public record ClubResponse (
912
Long id,
@@ -12,9 +15,11 @@ public record ClubResponse (
1215
String name,
1316
LocalDateTime createdAt,
1417
int maximum,
15-
PublicStatus publicstatus
18+
PublicStatus publicstatus,
19+
List<Post> posts
20+
1621
) {
1722
public ClubResponse(Club club) {
18-
this(club.getId(), club.getBook() == null ? null : club.getBook().getId(), club.getTopic(), club.getName(), club.getCreatedAt(), club.getMaximum(), club.getPublicStatus());
23+
this(club.getId(), club.getBook() == null ? null : club.getBook().getId(), club.getTopic(), club.getName(), club.getCreatedAt(), club.getMaximum(), club.getPublicStatus(), club.getPosts());
1924
}
2025
}

backend/src/main/java/com/project/capstone/club/domain/Club.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.project.capstone.club.domain;
22

3+
import com.fasterxml.jackson.annotation.JsonIgnore;
4+
import com.fasterxml.jackson.annotation.JsonManagedReference;
35
import com.project.capstone.book.domain.Book;
46
import com.project.capstone.memberclub.domain.MemberClub;
57
import com.project.capstone.content.domain.Content;
68
import com.project.capstone.post.domain.Post;
9+
import com.project.capstone.quiz.domain.Quiz;
710
import jakarta.persistence.*;
811
import lombok.AllArgsConstructor;
912
import lombok.Builder;
@@ -40,15 +43,22 @@ public class Club {
4043
private PublicStatus publicStatus;
4144
private Integer password;
4245

46+
@JsonManagedReference
4347
@OneToMany(mappedBy = "club")
4448
private List<Post> posts = new ArrayList<>();
4549

50+
@JsonManagedReference
4651
@OneToMany(mappedBy = "club")
4752
private List<MemberClub> members = new ArrayList<>();
4853

54+
@JsonManagedReference
4955
@OneToMany(mappedBy = "club")
5056
private List<Content> contents = new ArrayList<>();
5157

58+
@JsonManagedReference
59+
@OneToMany(mappedBy = "club")
60+
private List<Quiz> quizzes = new ArrayList<>();
61+
5262
@ManyToOne
5363
private Book book;
5464

backend/src/main/java/com/project/capstone/club/domain/PublicStatus.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public enum PublicStatus {
1313
private final String description;
1414

1515

16-
@JsonCreator
16+
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
1717
public static PublicStatus from(String status) {
1818
for (PublicStatus publicStatus : PublicStatus.values()) {
1919
if (publicStatus.getDescription().equals(status)) {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.project.capstone.comment.controller;
2+
3+
import com.project.capstone.auth.domain.PrincipalDetails;
4+
import com.project.capstone.comment.controller.dto.CommentResponse;
5+
import com.project.capstone.comment.controller.dto.CreateCommentRequest;
6+
import com.project.capstone.comment.service.CommentService;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
10+
import org.springframework.web.bind.annotation.*;
11+
12+
@RestController
13+
@RequiredArgsConstructor
14+
@RequestMapping("/comment")
15+
public class CommentController {
16+
17+
private final CommentService commentService;
18+
19+
@PostMapping("create")
20+
public ResponseEntity<?> createComment(@AuthenticationPrincipal PrincipalDetails details,
21+
@RequestParam Long postId, @RequestBody CreateCommentRequest request) {
22+
commentService.createPost(details.getUserId(), postId, request);
23+
return ResponseEntity.ok().body("댓글 생성 완료");
24+
}
25+
26+
@GetMapping("/{id}")
27+
public ResponseEntity<?> getComment(@AuthenticationPrincipal PrincipalDetails details,
28+
@PathVariable Long id) {
29+
CommentResponse commentResponse = commentService.getComment(details.getUserId(), id);
30+
return ResponseEntity.ok().body(commentResponse);
31+
}
32+
33+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.project.capstone.comment.controller.dto;
2+
3+
import com.project.capstone.comment.domain.Comment;
4+
5+
import java.time.LocalDateTime;
6+
import java.util.UUID;
7+
8+
public record CommentResponse(
9+
Long id,
10+
Long postId,
11+
UUID memberId,
12+
String body,
13+
LocalDateTime createdAt
14+
) {
15+
public CommentResponse(Comment comment) {
16+
this(comment.getId(), comment.getPost().getId(), comment.getMember().getId(), comment.getBody(), comment.getCreatedAt());
17+
}
18+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.project.capstone.comment.controller.dto;
2+
3+
public record CreateCommentRequest (
4+
String body
5+
) {
6+
}

backend/src/main/java/com/project/capstone/comment/domain/Comment.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.project.capstone.comment.domain;
22

3+
import com.fasterxml.jackson.annotation.JsonBackReference;
34
import com.project.capstone.member.domain.Member;
45
import com.project.capstone.post.domain.Post;
56
import jakarta.persistence.*;
@@ -27,9 +28,11 @@ public class Comment {
2728
@Column(name = "created_at")
2829
private LocalDateTime createdAt;
2930

31+
@JsonBackReference
3032
@ManyToOne
3133
private Member member;
3234

35+
@JsonBackReference
3336
@ManyToOne
3437
private Post post;
3538
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.project.capstone.comment.domain;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
import java.util.Optional;
6+
7+
public interface CommentRepository extends JpaRepository<Comment, Long> {
8+
Optional<Comment> findCommentById(Long id);
9+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.project.capstone.comment.exception;
2+
3+
import com.project.capstone.common.exception.BaseException;
4+
import com.project.capstone.common.exception.ExceptionType;
5+
6+
public class CommentException extends BaseException {
7+
public CommentException(ExceptionType exceptionType) {
8+
super(exceptionType);
9+
}
10+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.project.capstone.comment.exception;
2+
3+
import com.project.capstone.common.exception.ExceptionType;
4+
import lombok.AllArgsConstructor;
5+
import org.springframework.http.HttpStatus;
6+
7+
import static org.springframework.http.HttpStatus.NOT_FOUND;
8+
9+
@AllArgsConstructor
10+
public enum CommentExceptionType implements ExceptionType {
11+
COMMENT_NOT_FOUND(NOT_FOUND, 501, "해당 댓글을 찾을 수 없습니다.");
12+
;
13+
14+
private final HttpStatus status;
15+
private final int exceptionCode;
16+
private final String message;
17+
18+
@Override
19+
public HttpStatus httpStatus() {
20+
return status;
21+
}
22+
23+
@Override
24+
public int exceptionCode() {
25+
return exceptionCode;
26+
}
27+
28+
@Override
29+
public String message() {
30+
return message;
31+
}
32+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.project.capstone.comment.service;
2+
3+
import com.project.capstone.comment.controller.dto.CommentResponse;
4+
import com.project.capstone.comment.controller.dto.CreateCommentRequest;
5+
import com.project.capstone.comment.domain.Comment;
6+
import com.project.capstone.comment.domain.CommentRepository;
7+
import com.project.capstone.comment.exception.CommentException;
8+
import com.project.capstone.member.domain.Member;
9+
import com.project.capstone.member.domain.MemberRepository;
10+
import com.project.capstone.member.exception.MemberException;
11+
import com.project.capstone.post.domain.Post;
12+
import com.project.capstone.post.domain.PostRepository;
13+
import com.project.capstone.post.exception.PostException;
14+
import lombok.RequiredArgsConstructor;
15+
import lombok.extern.slf4j.Slf4j;
16+
import org.springframework.stereotype.Service;
17+
18+
import java.util.UUID;
19+
20+
import static com.project.capstone.comment.exception.CommentExceptionType.COMMENT_NOT_FOUND;
21+
import static com.project.capstone.member.exception.MemberExceptionType.MEMBER_NOT_FOUND;
22+
import static com.project.capstone.post.exception.PostExceptionType.POST_NOT_FOUND;
23+
24+
@Service
25+
@RequiredArgsConstructor
26+
@Slf4j
27+
public class CommentService {
28+
29+
private final CommentRepository commentRepository;
30+
private final MemberRepository memberRepository;
31+
private final PostRepository postRepository;
32+
33+
public void createPost(String userId, Long postId, CreateCommentRequest request) {
34+
Member member = memberRepository.findMemberById(UUID.fromString(userId)).orElseThrow(
35+
() -> new MemberException(MEMBER_NOT_FOUND)
36+
);
37+
38+
Post post = postRepository.findPostById(postId).orElseThrow(
39+
() -> new PostException(POST_NOT_FOUND)
40+
);
41+
42+
Comment saved = commentRepository.save(Comment.builder()
43+
.body(request.body())
44+
.member(member)
45+
.post(post)
46+
.build());
47+
48+
member.getComments().add(saved);
49+
post.getComments().add(saved);
50+
}
51+
52+
53+
public CommentResponse getComment(String userId, Long id) {
54+
if (memberRepository.findMemberById(UUID.fromString(userId)).isEmpty()) {
55+
throw new MemberException(MEMBER_NOT_FOUND);
56+
}
57+
Comment comment = commentRepository.findCommentById(id).orElseThrow(
58+
() -> new CommentException(COMMENT_NOT_FOUND)
59+
);
60+
return new CommentResponse(comment);
61+
}
62+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.project.capstone.content.controller;
2+
3+
import com.project.capstone.auth.domain.PrincipalDetails;
4+
import com.project.capstone.content.controller.dto.ContentCreateRequest;
5+
import com.project.capstone.content.controller.dto.ContentResponse;
6+
import com.project.capstone.content.service.ContentService;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
10+
import org.springframework.web.bind.annotation.*;
11+
12+
import java.util.List;
13+
14+
@RestController
15+
@RequiredArgsConstructor
16+
@RequestMapping("/content")
17+
public class ContentController {
18+
19+
private final ContentService contentService;
20+
21+
// 컨텐츠 생성
22+
@PostMapping("/create")
23+
public ResponseEntity<?> createContent(@AuthenticationPrincipal PrincipalDetails details,
24+
@RequestBody ContentCreateRequest request,
25+
@RequestParam Long bookId, @RequestParam(required = false) Long clubId) {
26+
contentService.createContent(details.getUserId(), request, bookId, clubId);
27+
return ResponseEntity.ok().body("컨텐츠 생성 완료");
28+
}
29+
30+
// 단일 컨텐츠 조회
31+
@GetMapping("/{id}")
32+
public ResponseEntity<ContentResponse> getContent(@PathVariable Long id) {
33+
ContentResponse contentResponse = contentService.getContent(id);
34+
return ResponseEntity.ok().body(contentResponse);
35+
}
36+
37+
// 컨텐츠 종류별 조회
38+
@GetMapping("/get")
39+
public ResponseEntity<List<ContentResponse>> getContents(@RequestParam String type) {
40+
List<ContentResponse> contentResponseList = contentService.getContents(type);
41+
return ResponseEntity.ok().body(contentResponseList);
42+
}
43+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.project.capstone.content.controller.dto;
2+
3+
import com.project.capstone.content.domain.ContentType;
4+
5+
public record ContentCreateRequest(
6+
ContentType contentType,
7+
String title,
8+
String body
9+
) {
10+
}

0 commit comments

Comments
 (0)