Skip to content

Commit ab894f6

Browse files
authored
feat: 상세 게시글 조회 API 구현 (#116)
* refactor: 게시글 관련 repository 파일 패키징 변경 * refactor: 게시판 이름 가져오는 로직 추출 * feat: 게시글 이미지 데이터 문자열로 변환하는 로직 구현 * feat: 상세 게시글 dto 정의 * feat: 상세 게시글 조회 서비스 로직 구현 * feat: 상세 게시글 조회 API 구현 * test: 상세 게시글 조회 서비스 로직, api 테스트 케이스 작성
1 parent d810483 commit ab894f6

28 files changed

+390
-134
lines changed

src/main/java/com/flint/flint/community/controller/PostGetController.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package com.flint.flint.community.controller;
22

33
import com.flint.flint.common.ResponseForm;
4+
import com.flint.flint.community.dto.response.DetailPostResponse;
45
import com.flint.flint.community.dto.response.PostResponse;
56
import com.flint.flint.community.service.PostGetService;
7+
import com.flint.flint.security.auth.dto.AuthorityMemberDTO;
68
import lombok.RequiredArgsConstructor;
79
import org.springframework.data.domain.Pageable;
810
import org.springframework.data.web.PageableDefault;
9-
import org.springframework.web.bind.annotation.GetMapping;
10-
import org.springframework.web.bind.annotation.RequestMapping;
11-
import org.springframework.web.bind.annotation.RequestParam;
12-
import org.springframework.web.bind.annotation.RestController;
11+
import org.springframework.security.access.prepost.PreAuthorize;
12+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
13+
import org.springframework.web.bind.annotation.*;
1314

1415
import java.util.List;
1516

@@ -43,4 +44,20 @@ public ResponseForm<List<PostResponse>> searchInSpecificBoard(@RequestParam Stri
4344
@PageableDefault(size = 10) Pageable pageable) {
4445
return new ResponseForm<>(postGetService.searchInSpecificBoard(boardName, keyword, pageable));
4546
}
47+
48+
/**
49+
* 게시물 상세 조회
50+
*
51+
* @param memberDTO 조회 유저
52+
* @param postId 조회할 게시글 ID
53+
* @return 게시글 관련 모든 메타데이터 및 데이터 정보
54+
*/
55+
@PreAuthorize("isAuthenticated()")
56+
@GetMapping("/{postId}")
57+
public ResponseForm<DetailPostResponse> getDetailPost(
58+
@AuthenticationPrincipal AuthorityMemberDTO memberDTO,
59+
@PathVariable("postId") Long postId
60+
) {
61+
return new ResponseForm<>(postGetService.getDetailPost(postId));
62+
}
4663
}

src/main/java/com/flint/flint/community/domain/post/Post.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,10 @@ public void addPostLike(PostLike postLike) {
7070
this.postLikes.add(postLike);
7171
postLike.changePost(this);
7272
}
73+
74+
public List<String> convertImagesToString() {
75+
return this.postImages.stream()
76+
.map(PostImage::getImgUrl)
77+
.toList();
78+
}
7379
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.flint.flint.community.dto.response;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.time.LocalDateTime;
9+
import java.util.List;
10+
11+
@Data
12+
@Builder
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
public class DetailPostResponse {
16+
private Long postId;
17+
private String boardName;
18+
private WriterResponse writer;
19+
private String title;
20+
private String contents;
21+
private LocalDateTime createAt;
22+
private int likeCount;
23+
private int scrapCount;
24+
private int commentCount;
25+
private List<String> images;
26+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.flint.flint.community.dto.response;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
@Data
9+
@Builder
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
public class WriterResponse {
13+
private Long memberId;
14+
private String universityLogoUrl;
15+
private String universityName;
16+
private String major;
17+
}

src/main/java/com/flint/flint/community/repository/PostRepositoryCustom.java

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/main/java/com/flint/flint/community/repository/impl/PostRepositoryImpl.java

Lines changed: 0 additions & 65 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
package com.flint.flint.community.repository;
1+
package com.flint.flint.community.repository.post;
22

33
import com.flint.flint.community.domain.post.Post;
4-
import com.flint.flint.community.repository.custom.PostRepositoryCustom;
54
import org.springframework.data.jpa.repository.JpaRepository;
65

7-
86
public interface PostRepository extends JpaRepository<Post, Long>, PostRepositoryCustom {
97
}

src/main/java/com/flint/flint/community/repository/custom/PostRepositoryCustom.java renamed to src/main/java/com/flint/flint/community/repository/post/PostRepositoryCustom.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
package com.flint.flint.community.repository.custom;
1+
package com.flint.flint.community.repository.post;
22

33
import com.flint.flint.community.domain.post.Post;
4+
import com.flint.flint.community.dto.response.PostListResponse;
5+
import com.flint.flint.community.spec.SortStrategy;
46
import org.springframework.data.domain.Page;
57
import org.springframework.data.domain.Pageable;
68

9+
import java.util.List;
710

8-
/**
9-
* @author 정순원
10-
* @since 2023-11-06
11-
*/
1211
public interface PostRepositoryCustom {
12+
List<PostListResponse> findPostsWithBoardByPaging(Long boardId, Post cursorPost, Long size, SortStrategy sort);
1313

1414
/**
1515
* 전체게시판에서

src/main/java/com/flint/flint/community/repository/PostRepositoryCustomImpl.java renamed to src/main/java/com/flint/flint/community/repository/post/PostRepositoryCustomImpl.java

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
package com.flint.flint.community.repository;
1+
package com.flint.flint.community.repository.post;
22

33
import com.flint.flint.community.domain.post.Post;
44
import com.flint.flint.community.dto.response.PostListResponse;
55
import com.flint.flint.community.spec.SortStrategy;
66
import com.querydsl.core.types.*;
7+
import com.querydsl.core.types.dsl.BooleanExpression;
78
import com.querydsl.jpa.impl.JPAQueryFactory;
89
import lombok.RequiredArgsConstructor;
10+
import org.springframework.data.domain.Page;
11+
import org.springframework.data.domain.PageImpl;
12+
import org.springframework.data.domain.Pageable;
913

1014
import java.util.List;
1115
import java.util.Optional;
@@ -41,8 +45,50 @@ public List<PostListResponse> findPostsWithBoardByPaging(Long boardId, Post curs
4145
.toList();
4246
}
4347

48+
/**
49+
* 전체게시판에서
50+
* 제목이나 내용에 키워드가 포함된 글 최신순으로 가져오기
51+
*/
52+
@Override
53+
public Page<Post> findByTitleOrContentsContaining(String keyword, Pageable pageable) {
54+
List<Post> posts = queryFactory.selectFrom(post)
55+
.where(containsTitleOrContent(keyword))
56+
.orderBy(post.createdAt.desc())
57+
.offset(pageable.getOffset())
58+
.limit(pageable.getPageSize())
59+
.fetch();
60+
61+
return new PageImpl<>(posts, pageable, posts.size());
62+
}
63+
64+
65+
/**
66+
* 특정 게시판에서
67+
* 제목이나 내용에 키워드가 포함된 글 최신순으로 가져오기
68+
*/
69+
@Override
70+
public Page<Post> findByTitleOrContentsContainingAndBoard(long boardId, String keyword, Pageable pageable) {
71+
72+
List<Post> posts = queryFactory.selectFrom(post)
73+
.where(containsTitleOrContent(keyword).and(isBoard(boardId)))
74+
.orderBy(post.createdAt.desc())
75+
.offset(pageable.getOffset())
76+
.limit(pageable.getPageSize())
77+
.fetch();
78+
79+
return new PageImpl<>(posts, pageable, posts.size());
80+
}
81+
82+
private BooleanExpression containsTitleOrContent(String keyword) {
83+
return post.title.contains(keyword).or(post.contents.contains(keyword));
84+
}
85+
86+
private BooleanExpression isBoard(Long boardId) {
87+
return post.board.id.eq(boardId);
88+
}
89+
4490
private Predicate filterBoard(Long boardId) {
45-
return Optional.of(boardId)
91+
return Optional.ofNullable(boardId)
4692
.map(post.board.id::eq)
4793
.orElse(null);
4894
}

src/main/java/com/flint/flint/community/repository/PostCommentRepository.java renamed to src/main/java/com/flint/flint/community/repository/post_comment/PostCommentRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.flint.flint.community.repository;
1+
package com.flint.flint.community.repository.post_comment;
22

33
import com.flint.flint.community.domain.post.PostComment;
44
import org.springframework.data.jpa.repository.JpaRepository;

0 commit comments

Comments
 (0)