Skip to content

Commit

Permalink
Merge pull request #76 from Nawabali-project/feature/bookmarkRefactor
Browse files Browse the repository at this point in the history
FIX : 유저 북마크 조회 시 무한 스크롤로 구현
  • Loading branch information
kyungmin1221 authored Apr 12, 2024
2 parents 59fcbc1 + 893d9b9 commit bf23411
Show file tree
Hide file tree
Showing 12 changed files with 190 additions and 79 deletions.
19 changes: 3 additions & 16 deletions .idea/dataSources.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ public class QBookMark extends EntityPathBase<BookMark> {

public static final QBookMark bookMark = new QBookMark("bookMark");

public final DateTimePath<java.time.LocalDateTime> createdAt = createDateTime("createdAt", java.time.LocalDateTime.class);

public final NumberPath<Long> id = createNumber("id", Long.class);

public final QPost post;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
package com.nawabali.nawabali.controller;

import com.nawabali.nawabali.dto.BookMarkDto;
import com.nawabali.nawabali.dto.querydsl.BookmarkDslDto;
import com.nawabali.nawabali.security.UserDetailsImpl;
import com.nawabali.nawabali.service.BookMarkService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
Expand All @@ -30,10 +37,20 @@ public ResponseEntity<BookMarkDto.ResponseDto> createBookMark(@PathVariable Long
return ResponseEntity.ok(responseDto);
}

@Operation(summary = "회원의 북마크 조회", description = "로그인 되어있는 사용자의 북마크를 조회")
@Operation(summary = "회원의 북마크 조회(무한 스크롤)",
description = "로그인 되어있는 사용자의 북마크를 조회",
parameters = {
@Parameter(name = "page", description = "페이지 번호 (0부터 시작)", example = "0"),
@Parameter(name = "size", description = "페이지 당 게시물 수", example = "10"),
@Parameter(name = "sort", description = "정렬 기준과 방향, 예: createdAt,desc(생성일 내림차순 정렬)", example = "createdAt,desc")
})
@GetMapping("/users")
public ResponseEntity<List<BookMarkDto.UserBookmarkDto>> getBookmarks(@AuthenticationPrincipal UserDetailsImpl userDetails) {
List<BookMarkDto.UserBookmarkDto> userBookmarkDto = bookMarkService.getBookmarks(userDetails.getUser());
public ResponseEntity<Slice<BookmarkDslDto.UserBookmarkDto>> getBookmarks(@AuthenticationPrincipal UserDetailsImpl userDetails,
@PageableDefault(
size = 10,
sort = "createdAt",
direction = Sort.Direction.DESC) Pageable pageable ){
Slice<BookmarkDslDto.UserBookmarkDto> userBookmarkDto = bookMarkService.getBookmarks(userDetails.getUser(), pageable);
return ResponseEntity.ok(userBookmarkDto);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.Sort;
Expand Down Expand Up @@ -65,7 +66,7 @@ public CommentDto.ResponseDto updateComment (@PathVariable("commentId") Long com
@Operation(summary = "게시물 댓글 삭제", description = "commentId 를 이용한 게시물에 댓글 삭제")
@DeleteMapping("/{commentId}")
public CommentDto.DeleteResponseDto deleteComment (@PathVariable("commentId") Long commentId,
@AuthenticationPrincipal UserDetails userDetails) {
@AuthenticationPrincipal UserDetails userDetails) {
return commentService.deleteComment (commentId, userDetails.getUsername());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.Sort;
Expand All @@ -34,10 +35,10 @@ public class PostController {

@Operation(summary = "게시물 생성" ,
description =
"""
- multipart/form-data 형식의 게시물 생성
- 이미지 파일 최대 5장
""")
"""
- multipart/form-data 형식의 게시물 생성
- 이미지 파일 최대 5장
""")
@PostMapping(consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE})
public ResponseEntity<PostDto.ResponseDto> createPost(
@AuthenticationPrincipal UserDetailsImpl userDetails,
Expand Down Expand Up @@ -103,8 +104,8 @@ public ResponseEntity<PostDto.ResponseDetailDto> getPost(@PathVariable Long post
@Operation(summary = "게시물 수정", description = "postId 를 이용한 게시물 수정")
@PatchMapping("/{postId}")
public ResponseEntity<PostDto.PatchDto> updatePost(@PathVariable Long postId,
@AuthenticationPrincipal UserDetailsImpl userDetails,
@RequestBody PostDto.PatchDto patchDto) {
@AuthenticationPrincipal UserDetailsImpl userDetails,
@RequestBody PostDto.PatchDto patchDto) {
PostDto.PatchDto responseDto = postService.updatePost(postId,userDetails.getUser(),patchDto);
return ResponseEntity.ok(responseDto);
}
Expand Down
11 changes: 10 additions & 1 deletion src/main/java/com/nawabali/nawabali/domain/BookMark.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.springframework.data.annotation.CreatedDate;

import java.time.LocalDateTime;

@Entity
@Getter
Expand All @@ -17,6 +21,10 @@ public class BookMark {

private boolean status;

@Column(updatable = false)
@CreatedDate
private LocalDateTime createdAt;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
Expand All @@ -27,10 +35,11 @@ public class BookMark {


@Builder
public BookMark(boolean status, User user, Post post) {
public BookMark(boolean status, User user, Post post,LocalDateTime createdAt) {
this.status = status;
this.user = user;
this.post = post;
this.createdAt = createdAt;
}

public void setStatus(boolean status) {
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/nawabali/nawabali/dto/BookMarkDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.nawabali.nawabali.domain.BookMark;
import lombok.*;

import java.time.LocalDateTime;

public class BookMarkDto {

@Getter
Expand All @@ -20,12 +22,15 @@ public static class ResponseDto {

private Long userId;

private LocalDateTime createdAt;

public ResponseDto(BookMark bookMark) {
this.status = bookMark.isStatus();
this.bookmarkId = bookMark.getId();
this.postId = bookMark.getPost().getId();
this.userId = bookMark.getUser().getId();
}

}

@Getter
Expand All @@ -41,5 +46,6 @@ public static class UserBookmarkDto {

private Long userId;

private LocalDateTime createdAt;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.nawabali.nawabali.dto.querydsl;

import lombok.*;

import java.time.LocalDateTime;
import java.util.List;

public class BookmarkDslDto {

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class UserBookmarkDto {

private Long userId;

private Long postId;

private String nickname;

private String contents;

private String category;

private String district;

private Double latitude;

private Double longitude;

private LocalDateTime createdAt;

private List<String> imageUrls;

private Long likesCount;

private Long localLikesCount;

private int commentCount;

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

import com.nawabali.nawabali.domain.User;
import com.nawabali.nawabali.dto.BookMarkDto;
import com.nawabali.nawabali.dto.querydsl.BookmarkDslDto;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;

import java.util.List;

public interface BookmarkDslRepositoryCustom {

List<BookMarkDto.UserBookmarkDto> getUserBookmarks(User user);
Slice<BookmarkDslDto.UserBookmarkDto> getUserBookmarks(User user, Pageable pageable);
}
Original file line number Diff line number Diff line change
@@ -1,40 +1,65 @@
package com.nawabali.nawabali.repository.querydsl.bookmark;

import com.nawabali.nawabali.domain.QBookMark;
import com.nawabali.nawabali.domain.QPost;
import com.nawabali.nawabali.domain.User;
import com.nawabali.nawabali.domain.*;
import com.nawabali.nawabali.domain.image.PostImage;
import com.nawabali.nawabali.dto.BookMarkDto;
import com.nawabali.nawabali.dto.querydsl.BookmarkDslDto;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.SliceImpl;
import org.springframework.stereotype.Repository;

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

@Repository
@RequiredArgsConstructor
public class BookmarkDslRepositoryCustomImpl implements BookmarkDslRepositoryCustom{

private final JPAQueryFactory queryFactory;

public List<BookMarkDto.UserBookmarkDto> getUserBookmarks(User user) {
public Slice<BookmarkDslDto.UserBookmarkDto> getUserBookmarks(User user, Pageable pageable) {
QBookMark bookMark = QBookMark.bookMark;
QPost post = QPost.post;
QUser quser = QUser.user;

List<BookMarkDto.UserBookmarkDto> bookmarks = queryFactory
.select(Projections.fields(BookMarkDto.UserBookmarkDto.class,
bookMark.id.as("bookmarkId"),
bookMark.post.id.as("postId"),
bookMark.user.id.as("userId") ))
.from(bookMark)
List<BookMark> bookmarks = queryFactory
.selectFrom(bookMark)
.where(bookMark.user.id.eq(user.getId()))
.join(bookMark.post, post)
.join(bookMark.post, post).fetchJoin()
.join(post.user ,quser).fetchJoin()
.orderBy(bookMark.createdAt.desc())
.offset(pageable.getOffset())
.limit(pageable.getPageSize()+1)
.fetch();

return bookmarks;
}
boolean hasNext = bookmarks.size() > pageable.getPageSize();
if(hasNext) {
bookmarks.remove(bookmarks.size() - 1);
}

List<BookmarkDslDto.UserBookmarkDto> responseDtos = bookmarks.stream()
.map(newBookmark -> BookmarkDslDto.UserBookmarkDto.builder()
.userId(newBookmark.getUser().getId())
.postId(newBookmark.getPost().getId())
.nickname(newBookmark.getUser().getNickname())
.contents(newBookmark.getPost().getContents())
.category(newBookmark.getPost().getCategory().name())
.district(newBookmark.getPost().getTown().getDistrict())
.latitude(newBookmark.getPost().getTown().getLatitude())
.longitude(newBookmark.getPost().getTown().getLongitude())
.createdAt(newBookmark.getCreatedAt())
.imageUrls(newBookmark.getPost().getImages().stream().map(PostImage::getImgUrl).collect(Collectors.toList()))
.commentCount(newBookmark.getPost().getComments().size())
.build())
.collect(Collectors.toList());

return new SliceImpl<>(responseDtos, pageable, hasNext);
}

}
Loading

0 comments on commit bf23411

Please sign in to comment.