Skip to content

Commit

Permalink
Merge pull request #101 from Mile-Writings/feat/#84
Browse files Browse the repository at this point in the history
#84 GET - 베스트 활동 모임 및 모임별 글 조회
  • Loading branch information
parkheeddong authored Jan 12, 2024
2 parents a4cc153 + 81d5bb3 commit 7eb94bc
Show file tree
Hide file tree
Showing 18 changed files with 211 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.mile.dto.SuccessResponse;
import com.mile.exception.message.SuccessMessage;
import com.mile.moim.service.MoimService;
import com.mile.moim.service.dto.BestMoimListResponse;
import com.mile.moim.service.dto.CategoryListResponse;
import com.mile.moim.service.dto.ContentListResponse;
import com.mile.moim.service.dto.MoimAuthenticateResponse;
Expand All @@ -11,14 +12,13 @@
import com.mile.moim.service.dto.MoimTopicResponse;
import com.mile.moim.service.dto.TemporaryPostExistResponse;
import com.mile.writerName.service.dto.PopularWriterListResponse;
import java.security.Principal;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.security.Principal;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/moim")
Expand Down Expand Up @@ -86,6 +86,11 @@ public SuccessResponse<MoimCuriousPostListResponse> getMostCuriousPostByMoim(
return SuccessResponse.of(SuccessMessage.MOIM_TOP_2_POST_GET_SUCCESS, moimService.getMostCuriousPostFromMoim(moimId));
}

@GetMapping("/best")
public SuccessResponse<BestMoimListResponse> getBestMoimAndPostList() {
return SuccessResponse.of(SuccessMessage.BEST_MOIM_POSTS_GET_SUCCESS, moimService.getBestMoimAndPostList());
}

@Override
@GetMapping("/{moimId}/temporary")
public SuccessResponse<TemporaryPostExistResponse> getTemporaryPost(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.mile.dto.ErrorResponse;
import com.mile.dto.SuccessResponse;
import com.mile.moim.service.dto.BestMoimListResponse;
import com.mile.moim.service.dto.CategoryListResponse;
import com.mile.moim.service.dto.ContentListResponse;
import com.mile.moim.service.dto.MoimCuriousPostListResponse;
Expand Down Expand Up @@ -123,6 +124,17 @@ SuccessResponse<CategoryListResponse> getCategoryList(
@PathVariable final Long moimId
);

@Operation(summary = "베스트 활동 모임 및 글 리스트 조회")
@ApiResponses(
value = {
@ApiResponse(responseCode = "200", description = "베스트 활동 모임과 글 리스트 조회가 완료되었습니다."),
@ApiResponse(responseCode = "500", description = "서버 내부 오류입니다.",
content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
}
)
SuccessResponse<BestMoimListResponse> getBestMoimAndPostList();


@Operation(summary = "임시 저장 글 존재 여부 조회")
@ApiResponses(
value = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public enum SuccessMessage {
MOIM_TOP_2_POST_GET_SUCCESS(HttpStatus.OK.value(), "궁금해요 상위 2개의 글이 조회 완료되었습니다."),
POST_GET_SUCCESS(HttpStatus.OK.value(), "글 조회가 완료되었습니다."),
MOIM_POST_GET_SUCCESS(HttpStatus.OK.value(), "카테고리별 글 리스트 조회가 완료되었습니다."),
BEST_MOIM_POSTS_GET_SUCCESS(HttpStatus.OK.value(), "베스트 활동 모임과 글 조회가 완료되었습니다."),
IS_TEMPORARY_POST_EXIST_GET_SUCCESS(HttpStatus.OK.value(), "임시저장 글 존재 여부 조회가 완료되었습니다."),
/*
201 CREATED
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

import com.mile.moim.domain.Moim;
import com.mile.post.domain.Post;
import java.time.LocalDateTime;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface MoimRepository extends JpaRepository<Moim, Long> {
public interface MoimRepository extends JpaRepository<Moim, Long>, MoimRepositoryCustom {
List<Post> getPostsById(final Long id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.mile.moim.repository;

import com.mile.moim.domain.Moim;
import java.util.List;

public interface MoimRepositoryCustom {

List<Moim> findTop3MoimsByPostCount();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.mile.moim.repository;

import static com.mile.moim.domain.QMoim.moim;
import static com.mile.post.domain.QPost.post;

import com.mile.moim.domain.Moim;
import com.querydsl.jpa.impl.JPAQueryFactory;
import java.time.LocalDateTime;
import java.util.List;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class MoimRepositoryCustomImpl implements MoimRepositoryCustom {
private final JPAQueryFactory queryFactory;

public List<Moim> findTop3MoimsByPostCount() {

LocalDateTime oneWeekAgo = LocalDateTime.now().minusWeeks(1);

List<Moim> result = queryFactory
.select(moim)
.from(moim)
.leftJoin(post).on(moim.eq(post.topic.moim))
.where(post.createdAt.after(oneWeekAgo))
.groupBy(moim)
.orderBy(post.id.count().desc())
.limit(3)
.fetch();

return result;
}
}
34 changes: 28 additions & 6 deletions module-domain/src/main/java/com/mile/moim/service/MoimService.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,32 @@
import com.mile.exception.model.NotFoundException;
import com.mile.moim.domain.Moim;
import com.mile.moim.repository.MoimRepository;
import com.mile.moim.service.dto.BestMoimListResponse;
import com.mile.moim.service.dto.CategoryListResponse;
import com.mile.moim.service.dto.ContentListResponse;
import com.mile.moim.service.dto.MoimAuthenticateResponse;
import com.mile.moim.service.dto.MoimCuriousPostListResponse;
import com.mile.moim.service.dto.MoimInfoResponse;
import com.mile.moim.service.dto.MoimTopicResponse;
import com.mile.moim.service.dto.TemporaryPostExistResponse;
import com.mile.post.domain.Post;
import com.mile.post.service.PostAuthenticateService;
import com.mile.post.service.PostCuriousService;
import com.mile.post.service.PostGetService;
import com.mile.post.service.PostService;
import com.mile.post.service.PostTemporaryService;
import com.mile.topic.service.TopicService;
import com.mile.utils.DateUtil;
import com.mile.writerName.domain.WriterName;

import java.util.List;

import com.mile.writerName.service.WriterNameService;
import com.mile.writerName.service.dto.PopularWriterListResponse;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@RequiredArgsConstructor
public class MoimService {
Expand All @@ -36,15 +39,17 @@ public class MoimService {
private final TopicService topicService;
private final MoimRepository moimRepository;
private final PostCuriousService postCuriousService;
private final PostAuthenticateService postAuthenticateService;
private final PostTemporaryService postTemporaryService;
private final PostGetService postGetService;

private static final int NUMBER_OF_MOST_CURIOUS_WRITERS = 2;

public ContentListResponse getContentsFromMoim(
final Long moimId,
final Long userId
) {
authenticateUserOfMoim(moimId, userId);
postAuthenticateService.authenticateUserOfMoim(moimId, userId);
return ContentListResponse.of(topicService.getContentsFromMoim(moimId));
}

Expand Down Expand Up @@ -118,6 +123,23 @@ public CategoryListResponse getCategoryList(
) {
return CategoryListResponse.of(topicService.getKeywordsFromMoim(moimId));
}

public List<Moim> getBestMoimByPostNumber() {
LocalDateTime beforeWeek = LocalDateTime.now().minusWeeks(1);
List<Moim> moims = moimRepository.findTop3MoimsByPostCount();
return moims;
}

public BestMoimListResponse getBestMoimAndPostList() {
Map<Moim, List<Post>> BestMoimAndPost = new HashMap<>();
List<Moim> bestMoimsByPostNumber = getBestMoimByPostNumber();
for (Moim moim : bestMoimsByPostNumber) {
List<Post> latestPosts = postGetService.getLatestPostsByMoim(moim);
BestMoimAndPost.put(moim, latestPosts);
}
return BestMoimListResponse.of(BestMoimAndPost);
}

public TemporaryPostExistResponse getTemporaryPost(
final Long moimId,
final Long userId
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.mile.moim.service.dto;

import com.mile.moim.domain.Moim;
import com.mile.post.domain.Post;
import java.util.List;
import java.util.stream.Collectors;

public record BestMoimInfoResponse(Long moimId, String moimName, List<BestMoimPostResponse> moimPosts) {
public static BestMoimInfoResponse of(Moim moim, final List<Post> posts) {
return new BestMoimInfoResponse(
moim.getId(),
moim.getName(),
posts.stream()
.map(BestMoimPostResponse::of)
.collect(Collectors.toList())
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.mile.moim.service.dto;

import com.mile.moim.domain.Moim;
import com.mile.post.domain.Post;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public record BestMoimListResponse(List<BestMoimInfoResponse> moim) {
public static BestMoimListResponse of(Map<Moim, List<Post>> BestMoimAndPost) {
List<BestMoimInfoResponse> bestMoims = new ArrayList<>();
for (Moim moim : BestMoimAndPost.keySet()) {
bestMoims.add(BestMoimInfoResponse.of(moim, BestMoimAndPost.get(moim)));
}
return new BestMoimListResponse(bestMoims);

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.mile.moim.service.dto;

import com.mile.post.domain.Post;
import org.jsoup.Jsoup;
import org.jsoup.safety.Whitelist;

public record BestMoimPostResponse(String topicName, String imageUrl, String postTitle, String postContent) {
private static final int SUBSTRING_START = 0;
private static final int SUBSTRING_END = 200;

public static BestMoimPostResponse of(Post post) {

return new BestMoimPostResponse(
post.getTopic().getContent(),
post.getImageUrl(),
post.getTitle(),
getSubStringOfCleanContent(post.getContent())
);
}

private static String getSubStringOfCleanContent(
String content
) {
String cleanContent = Jsoup.clean(content, Whitelist.none());
if (cleanContent.length() >= SUBSTRING_END) {
return cleanContent.substring(SUBSTRING_START, SUBSTRING_END);
} else {
return cleanContent;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ public static MoimMostCuriousPostResponse of(
private static String getSubStringOfCleanContent(
String content
) {
return Jsoup.clean(content, Whitelist.none()).substring(SUBSTRING_START, SUBSTRING_END);
String cleanContent = Jsoup.clean(content, Whitelist.none());
if (cleanContent.length() >= SUBSTRING_END) {
return cleanContent.substring(SUBSTRING_START, SUBSTRING_END);
} else {
return cleanContent;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,11 @@

import com.mile.post.domain.Post;
import com.mile.topic.domain.Topic;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;

public interface PostRepository extends JpaRepository<Post, Long>, PostRepositoryCustom {
boolean existsPostByIdAndWriterNameId(final Long postId, final Long userId);

List<Post> findByTopic(final Topic topic);

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

public interface PostRepositoryCustom {
List<Post> findTop2ByMoimOrderByCuriousCountDesc(final Moim requestMoim);

List<Post> findLatest4PostsByMoim(Moim moim);
List<Post> findByMoimAndWriterNameWhereIsTemporary(final Moim moim, final WriterName writerName);
}

Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package com.mile.post.repository;

import static com.mile.moim.domain.QMoim.moim;
import static com.mile.post.domain.QPost.post;
import static com.mile.writerName.domain.QWriterName.writerName;

import com.mile.moim.domain.Moim;
import com.mile.post.domain.Post;
import com.mile.post.domain.QPost;
import com.mile.writerName.domain.WriterName;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;

import java.util.List;
import java.util.stream.Collectors;

import static com.mile.moim.domain.QMoim.moim;
import static com.mile.post.domain.QPost.post;
import static com.mile.writerName.domain.QWriterName.writerName;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class PostRepositoryImpl implements PostRepositoryCustom {
Expand All @@ -26,6 +26,19 @@ public List<Post> findTop2ByMoimOrderByCuriousCountDesc(final Moim requestMoim)
.stream().limit(2).collect(Collectors.toList());
}

public List<Post> findLatest4PostsByMoim(Moim moim) {

List<Post> result = jpaQueryFactory
.select(post)
.from(post)
.where(post.topic.moim.eq(moim))
.orderBy(post.createdAt.desc())
.limit(4)
.fetch();

return result;
}

public List<Post> findByMoimAndWriterNameWhereIsTemporary(final Moim requestMoim, final WriterName requestWriterName) {
return jpaQueryFactory.selectFrom(post)
.join(moim)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,15 @@
import com.mile.exception.message.ErrorMessage;
import com.mile.exception.model.ForbiddenException;
import com.mile.exception.model.NotFoundException;
import com.mile.moim.service.MoimService;
import com.mile.post.domain.Post;
import com.mile.post.repository.PostRepository;
import com.mile.writerName.domain.WriterName;
import com.mile.writerName.service.WriterNameService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class PostAuthenticateService {
private final MoimService moimService;
private final PostRepository postRepository;
private final WriterNameService writerNameService;

Expand All @@ -31,7 +28,16 @@ public void authenticateUserWithPost(
final Long userId
) {
Long moimId = post.getTopic().getMoim().getId();
moimService.authenticateUserOfMoim(moimId, userId);
authenticateUserOfMoim(moimId, userId);
}

public void authenticateUserOfMoim(
final Long moimId,
final Long userId
) {
if (!writerNameService.isUserInMoim(moimId, userId)) {
throw new ForbiddenException(ErrorMessage.USER_AUTHENTICATE_ERROR);
}
}

private Post findById(
Expand Down
Loading

0 comments on commit 7eb94bc

Please sign in to comment.