Skip to content

Commit 888e70b

Browse files
committed
[J2KB-3rd-Season#13]feat: 게시글 조회시 비회원 채택글 제한기능 추가
1 parent ced6254 commit 888e70b

File tree

7 files changed

+83
-11
lines changed

7 files changed

+83
-11
lines changed

src/main/java/com/devin/dev/controller/post/PostController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,15 @@ public DefaultResponse<?> getPostList(@RequestParam(defaultValue = "-1") Long id
2727
@GetMapping("/postlist/{id}")
2828
public DefaultResponse<PostDetailsDto> getPostDetails(
2929
@PathVariable("id") Long postId,
30-
@RequestParam(defaultValue = "true", name = "sort_reply") boolean sort_reply) {
30+
@RequestParam(defaultValue = "true", name = "sort_reply") boolean sort_reply,
31+
HttpServletRequest request) {
3132
ReplyOrderCondition replyOrderCondition = new ReplyOrderCondition();
3233
if (!sort_reply) {
3334
replyOrderCondition.setLatestDate(true);
3435
} else {
3536
replyOrderCondition.setLikeCount(true);
3637
}
37-
return postService.getPost(postId, replyOrderCondition);
38+
return postService.getPost(postId, replyOrderCondition, request);
3839
}
3940

4041
@GetMapping("/postlist")

src/main/java/com/devin/dev/dto/post/PostDetailsDto.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.devin.dev.entity.post.Post;
44
import com.devin.dev.entity.post.PostImage;
55
import com.devin.dev.entity.post.PostStatus;
6+
import com.devin.dev.entity.reply.ReplyStatus;
7+
import com.devin.dev.entity.user.UserStatus;
68
import com.querydsl.core.annotations.QueryProjection;
79
import lombok.Data;
810

@@ -24,13 +26,14 @@ public class PostDetailsDto {
2426
private List<String> post_images;
2527
private List<String> post_tags;
2628
private boolean status_accept;
29+
private boolean like_post;
2730
private LocalDateTime date_create;
2831
private LocalDateTime date_update;
2932
private Integer reply_num;
3033
private List<PostReplyDto> reply;
3134

3235
@QueryProjection
33-
public PostDetailsDto(Long post_id, Long publisher_id, String publisher_name, String publisher_profile, Long publisher_exp, String title, String content, List<String> post_images, List<String> post_tags, boolean status_accept, boolean like_post, LocalDateTime date_create, LocalDateTime date_update, Integer reply_num, List<PostReplyDto> replyDtos) {
36+
public PostDetailsDto(Long post_id, Long publisher_id, String publisher_name, String publisher_profile, Long publisher_exp, String title, String content, List<String> post_images, List<String> post_tags, boolean status_accept, boolean like_post, LocalDateTime date_create, LocalDateTime date_update, Integer reply_num, List<PostReplyDto> reply) {
3437
this.post_id = post_id;
3538
this.publisher_id = publisher_id;
3639
this.publisher_name = publisher_name;
@@ -41,10 +44,11 @@ public PostDetailsDto(Long post_id, Long publisher_id, String publisher_name, St
4144
this.post_images = post_images;
4245
this.post_tags = post_tags;
4346
this.status_accept = status_accept;
47+
this.like_post = like_post;
4448
this.date_create = date_create;
4549
this.date_update = date_update;
4650
this.reply_num = reply_num;
47-
this.reply = replyDtos;
51+
this.reply = reply;
4852
}
4953

5054
public PostDetailsDto(Post post) {
@@ -58,9 +62,35 @@ public PostDetailsDto(Post post) {
5862
this.post_images = post.getImages().stream().map(PostImage::getPath).collect(Collectors.toList());
5963
this.post_tags = post.getPostTags();
6064
this.status_accept = post.getStatus() == PostStatus.SELECTED;
65+
this.like_post = post.getLikes().size() > 0;
6166
this.date_create = post.getCreatedDate();
6267
this.date_update = post.getLastModifiedDate();
6368
this.reply_num = post.getReplies().size();
6469
this.reply = post.getReplies().stream().map(PostReplyDto::new).collect(Collectors.toList());
6570
}
71+
72+
public PostDetailsDto(Post post, UserStatus status) {
73+
this.post_id = post.getId();
74+
this.publisher_id = post.getUser().getId();
75+
this.publisher_name = post.getUser().getName();
76+
this.publisher_profile = post.getUser().getProfile();
77+
this.publisher_exp = post.getUser().getExp();
78+
this.title = post.getTitle();
79+
this.content = post.getContent();
80+
this.post_images = post.getImages().stream().map(PostImage::getPath).collect(Collectors.toList());
81+
this.post_tags = post.getPostTags();
82+
this.status_accept = post.getStatus() == PostStatus.SELECTED;
83+
this.like_post = post.getLikes().size() > 0;
84+
this.date_create = post.getCreatedDate();
85+
this.date_update = post.getLastModifiedDate();
86+
this.reply_num = post.getReplies().size();
87+
this.reply = status == UserStatus.ACTIVE || status == UserStatus.ADMIN ?
88+
post.getReplies().stream().map(PostReplyDto::new).collect(Collectors.toList()) :
89+
post.getReplies().stream().map(PostReplyDto::new).peek(dto -> {
90+
if (dto.isStatus_accept()) {
91+
dto.setContent("비회원은 볼 수 없습니다.");
92+
dto.getReply_images().clear();
93+
}
94+
}).collect(Collectors.toList());
95+
}
6696
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package com.devin.dev.entity.user;
22

33
public enum UserStatus {
4-
ADMIN, ACTIVE, DORMANT, SUSPENDED, DELETED
4+
ADMIN, ACTIVE, DORMANT, SUSPENDED, DELETED, NON_MEMBERS
55
}

src/main/java/com/devin/dev/repository/post/PostRepositoryQuery.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.devin.dev.dto.post.PostSimpleDto;
88
import com.devin.dev.entity.post.Post;
99
import com.devin.dev.entity.user.User;
10+
import com.devin.dev.entity.user.UserStatus;
1011
import org.springframework.data.domain.Page;
1112
import org.springframework.data.domain.Pageable;
1213

@@ -23,5 +24,7 @@ public interface PostRepositoryQuery {
2324

2425
Page<Post> findAllByTagId(Long id, Pageable pageable);
2526

26-
Optional<PostDetailsDto> findPostDetailsById(Long id, ReplyOrderCondition condition);
27+
Optional<PostDetailsDto> findPostDetailsByIdWithUserType(Long id, UserStatus status, ReplyOrderCondition condition);
28+
29+
Optional<PostDetailsDto> findPostDetailsByIdWithUserType(Long id, ReplyOrderCondition condition);
2730
}

src/main/java/com/devin/dev/repository/post/PostRepositoryQueryImpl.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.devin.dev.entity.reply.QReplyImage;
99
import com.devin.dev.entity.reply.QReplyLike;
1010
import com.devin.dev.entity.user.User;
11+
import com.devin.dev.entity.user.UserStatus;
1112
import com.querydsl.core.QueryResults;
1213
import com.querydsl.core.types.OrderSpecifier;
1314
import com.querydsl.core.types.dsl.BooleanExpression;
@@ -136,6 +137,27 @@ public Optional<PostDetailsDto> findPostDetailsById(Long id, ReplyOrderCondition
136137

137138
Optional<PostDetailsDto> postDetailsDtoOptional;
138139

140+
postDetailsDtoOptional = result != null ? Optional.of(new PostDetailsDto(result, status)) : Optional.empty();
141+
142+
return postDetailsDtoOptional;
143+
}
144+
145+
@Override
146+
public Optional<PostDetailsDto> findPostDetailsByIdWithUserType(Long id, ReplyOrderCondition condition) {
147+
Post result = queryFactory
148+
.select(post)
149+
.from(post)
150+
.leftJoin(post.replies, reply).fetchJoin()
151+
.leftJoin(post.user, user).fetchJoin()
152+
.leftJoin(reply.user, user).fetchJoin()
153+
.where(post.id.eq(id))
154+
.orderBy(
155+
replyOrder(condition)
156+
)
157+
.fetchOne();
158+
159+
Optional<PostDetailsDto> postDetailsDtoOptional;
160+
139161
postDetailsDtoOptional = result != null ? Optional.of(new PostDetailsDto(result)) : Optional.empty();
140162

141163
return postDetailsDtoOptional;

src/main/java/com/devin/dev/service/PostService.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import com.devin.dev.dto.post.PostInfoDto;
88
import com.devin.dev.dto.reply.ReplyLikeDto;
99
import com.devin.dev.entity.post.*;
10-
import com.devin.dev.entity.reply.ReplyLike;
1110
import com.devin.dev.entity.user.User;
11+
import com.devin.dev.entity.user.UserStatus;
1212
import com.devin.dev.model.DefaultResponse;
1313
import com.devin.dev.repository.post.PostImageRepository;
1414
import com.devin.dev.repository.post.PostLikeRepository;
@@ -165,7 +165,26 @@ public DefaultResponse<?> editPost(Long userId, Long postId, String title, Strin
165165

166166
@Transactional(readOnly = true)
167167
public DefaultResponse<PostDetailsDto> getPost(Long postId, ReplyOrderCondition replyOrderCondition) {
168-
Optional<PostDetailsDto> postOptional = postRepository.findPostDetailsById(postId, replyOrderCondition);
168+
Optional<PostDetailsDto> postOptional = postRepository.findPostDetailsByIdWithUserType(postId, replyOrderCondition);
169+
if (postOptional.isEmpty()) {
170+
return new DefaultResponse<>(StatusCode.NOT_EXIST, ResponseMessage.NOT_FOUND_POST);
171+
}
172+
PostDetailsDto postDetailsDto = postOptional.get();
173+
174+
return new DefaultResponse<>(StatusCode.SUCCESS, ResponseMessage.FOUND_POST, postDetailsDto);
175+
}
176+
177+
@Transactional(readOnly = true)
178+
public DefaultResponse<PostDetailsDto> getPost(Long postId, ReplyOrderCondition replyOrderCondition, HttpServletRequest request) {
179+
String token = tokenProvider.parseToken(request);
180+
UserStatus userStatus;
181+
if (tokenProvider.validateToken(token)) {
182+
userStatus = UserStatus.ACTIVE;
183+
} else {
184+
userStatus = UserStatus.NON_MEMBERS;
185+
}
186+
187+
Optional<PostDetailsDto> postOptional = postRepository.findPostDetailsByIdWithUserType(postId, userStatus, replyOrderCondition);
169188
if (postOptional.isEmpty()) {
170189
return new DefaultResponse<>(StatusCode.NOT_EXIST, ResponseMessage.NOT_FOUND_POST);
171190
}

src/test/java/com/devin/dev/service/PostServiceTest.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@
1313
import org.junit.jupiter.api.Test;
1414
import org.springframework.beans.factory.annotation.Autowired;
1515
import org.springframework.boot.test.context.SpringBootTest;
16-
import org.springframework.mock.web.MockHttpServletRequest;
17-
import org.springframework.test.annotation.Rollback;
18-
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
1916
import org.springframework.transaction.annotation.Transactional;
2017

2118
import javax.persistence.EntityManager;

0 commit comments

Comments
 (0)