Skip to content

Commit

Permalink
Merge pull request #61 from Book-Mile/refactor/#60
Browse files Browse the repository at this point in the history
[Refactor/#60] 인터페이스 주입, 토큰사용, 사진 2 글 2 랜덤
  • Loading branch information
82everywin authored Jan 28, 2025
2 parents e9f03f3 + 29bc6c8 commit b335d04
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,16 @@
import com.bookmile.backend.domain.record.dto.req.UpdateRecordReqDto;
import com.bookmile.backend.domain.record.dto.res.RecentRecordResDto;
import com.bookmile.backend.domain.record.dto.res.RecordListResDto;
import com.bookmile.backend.domain.record.service.Impl.RecordServiceImpl;
import com.bookmile.backend.domain.record.service.RecordService;
import com.bookmile.backend.global.common.CommonResponse;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.Valid;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
Expand All @@ -31,24 +33,26 @@
@RequestMapping("/api/v1/records")
@RequiredArgsConstructor
public class RecordController {
private final RecordServiceImpl recordServiceImpl;
private final RecordService recordService;

@Operation(summary = "기록 리스트 조회", description = "해당 그룹의 기록 목록을 조회합니다.")
@GetMapping
public ResponseEntity<CommonResponse<List<RecordListResDto>>> viewRecordList(@RequestParam Long groupId,
@RequestParam Long userId) {
List<RecordListResDto> records = recordServiceImpl.viewRecordList(groupId, userId);
@AuthenticationPrincipal UserDetails userDetails) {
String userEmail = userDetails.getUsername();
List<RecordListResDto> records = recordService.viewRecordList(groupId, userEmail);
return ResponseEntity.status(VIEW_RECORD.getStatus())
.body(CommonResponse.from(VIEW_RECORD.getMessage(), records));
}

@Operation(summary = "기록 작성", description = "해당 그룹의 기록을 작성합니다.")
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<CommonResponse<Long>> createRecord(@RequestParam(name="groupId") Long groupId,
@RequestParam(name = "userId") Long userId,
public ResponseEntity<CommonResponse<Long>> createRecord(@RequestParam(name = "groupId") Long groupId,
@AuthenticationPrincipal UserDetails userDetails,
@RequestPart(value = "jsonData") @Valid RecordReqDto recordReqDto,
@RequestPart(value = "images", required = false) List<MultipartFile> files){
Long recordId = recordServiceImpl.createRecord(groupId, userId, files, recordReqDto);
@RequestPart(value = "images", required = false) List<MultipartFile> files) {
String userEmail = userDetails.getUsername();
Long recordId = recordService.createRecord(groupId, userEmail, files, recordReqDto);
return ResponseEntity.status(CREATE_RECORD.getStatus())
.body(CommonResponse.from(CREATE_RECORD.getMessage(), recordId));
}
Expand All @@ -57,15 +61,15 @@ public ResponseEntity<CommonResponse<Long>> createRecord(@RequestParam(name="gro
@PutMapping("/{recordId}")
public ResponseEntity<CommonResponse<Long>> updateRecord(@PathVariable Long recordId,
@Valid @RequestBody UpdateRecordReqDto updateRecordReqDto) {
Long updateRecord = recordServiceImpl.updateRecord(recordId, updateRecordReqDto);
Long updateRecord = recordService.updateRecord(recordId, updateRecordReqDto);
return ResponseEntity.status(UPDATE_RECORD.getStatus())
.body(CommonResponse.from(UPDATE_RECORD.getMessage(), updateRecord));
}

@Operation(summary = "글 2 사진 2", description = "해당 그룹의 랜덤한 사람의 랜덤한 기록의 사진과 글들 반환합니다")
@GetMapping("/random")
public ResponseEntity<CommonResponse<List<RecentRecordResDto>>> viewRandomRecord(@RequestParam Long groupId) {
List<RecentRecordResDto> recentRecordResDtos = recordServiceImpl.viewRandomRecord(groupId);
List<RecentRecordResDto> recentRecordResDtos = recordService.viewRandomRecord(groupId);
return ResponseEntity.status(VIEW_RECORD.getStatus())
.body(CommonResponse.from(VIEW_RECORD.getMessage(), recentRecordResDtos));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ public class RecordServiceImpl implements RecordService {
private final ImageServiceImpl imageService;

@Override
public List<RecordListResDto> viewRecordList(Long groupId, Long userId) {
public List<RecordListResDto> viewRecordList(Long groupId, String userEmail) {
Group group = findGroupById(groupId);
User user = findUserById(userId);
User user = findUserByEmail(userEmail);

UserGroup userGroup = getUserGroup(user.getId(), group.getId());

Expand All @@ -62,9 +62,9 @@ public List<RecordListResDto> viewRecordList(Long groupId, Long userId) {

@Override
@Transactional
public Long createRecord(Long groupId, Long userId, List<MultipartFile> files, RecordReqDto recordReqDto) {
public Long createRecord(Long groupId, String userEmail, List<MultipartFile> files, RecordReqDto recordReqDto) {
Group group = findGroupById(groupId);
User user = findUserById(userId);
User user = findUserByEmail(userEmail);

UserGroup userGroup = getUserGroup(user.getId(), group.getId());

Expand Down Expand Up @@ -98,10 +98,10 @@ public Long updateRecord(Long recordId, UpdateRecordReqDto updateRecordReqDto) {
* */
@Override
public List<RecentRecordResDto> viewRandomRecord(Long groupId) {
List<Long> userIds = userGroupRepository.findUserRandomSortByGroupId(groupId);
List<String> userEmails = userGroupRepository.findUserEmailRandomSortByGroupId(groupId);
List<User> users = new ArrayList<>();
for (Long userId : userIds) {
users.add(findUserById(userId));
for (String userEmail : userEmails) {
users.add(findUserByEmail(userEmail));
}
List<RecentRecordResDto> recentRecordResDtos = new ArrayList<>();
Random random = new Random();
Expand Down Expand Up @@ -134,8 +134,8 @@ private Group findGroupById(Long groupId) {
.orElseThrow(() -> new CustomException(GROUP_NOT_FOUND));
}

private User findUserById(Long userId) {
return userRepository.findById(userId)
private User findUserByEmail(String userEmail) {
return userRepository.findByEmail(userEmail)
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
import org.springframework.web.multipart.MultipartFile;

public interface RecordService {
List<RecordListResDto> viewRecordList(Long groupId, Long userId);
List<RecordListResDto> viewRecordList(Long groupId, String userEmail);

Long createRecord(Long groupId, Long userId, List<MultipartFile> files, RecordReqDto recordReqDto);
Long createRecord(Long groupId, String userEmail, List<MultipartFile> files, RecordReqDto recordReqDto);

Long updateRecord(Long recordId, UpdateRecordReqDto updateRecordReqDto);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,16 @@
import com.bookmile.backend.domain.review.dto.req.ReviewReqDto;
import com.bookmile.backend.domain.review.dto.res.RecentReviewListResDto;
import com.bookmile.backend.domain.review.dto.res.ReviewListResDto;
import com.bookmile.backend.domain.review.service.Impl.ReviewServiceImpl;
import com.bookmile.backend.domain.review.service.ReviewService;
import com.bookmile.backend.global.common.CommonResponse;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.Valid;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
Expand All @@ -31,32 +33,34 @@
@RequestMapping("/api/v1/reviews")
@RequiredArgsConstructor
public class ReviewController {
private final ReviewServiceImpl reviewServiceImpl;
private final ReviewService reviewService;

@Operation(summary = "리뷰 리스트 조회", description = "해당 책의 모든 사용자 리뷰 목록을 페이지별로 조회합니다."
+ "pageNumber은 1부터 사용해주시면 될 것 같습니다!")
@GetMapping
public ResponseEntity<CommonResponse<Page<ReviewListResDto>>> viewReviewList(@RequestParam Long bookId,
@RequestParam Integer pageNumber,
@RequestParam Integer pageSize) {
Page<ReviewListResDto> reviews = reviewServiceImpl.viewReviewList(bookId, pageNumber, pageSize);
Page<ReviewListResDto> reviews = reviewService.viewReviewList(bookId, pageNumber, pageSize);
return ResponseEntity.status(VIEW_REVIEW.getStatus())
.body(CommonResponse.from(VIEW_REVIEW.getMessage(), reviews));
}

@Operation(summary = "최신 리뷰 2개 조회", description = "해당 책의 가장 최근 리뷰 2개를 반환합니다.")
@GetMapping("/recent-reviews")
public ResponseEntity<CommonResponse<List<RecentReviewListResDto>>> recentReviewList(@RequestParam Long bookId) {
List<RecentReviewListResDto> reviews = reviewServiceImpl.viewRecentReviewList(bookId);
List<RecentReviewListResDto> reviews = reviewService.viewRecentReviewList(bookId);
return ResponseEntity.status(VIEW_REVIEW.getStatus())
.body(CommonResponse.from(VIEW_REVIEW.getMessage(), reviews));
}

@Operation(summary = "리뷰 작성", description = "해당 책의 리뷰를 작성합니다.")
@PostMapping
public ResponseEntity<CommonResponse<Long>> createReview(@RequestParam Long bookId, @RequestParam Long userId,
public ResponseEntity<CommonResponse<Long>> createReview(@RequestParam Long bookId,
@AuthenticationPrincipal UserDetails userDetails,
@Valid @RequestBody ReviewReqDto reviewReqDto) {
Long createReview = reviewServiceImpl.createReview(bookId, userId, reviewReqDto);
String userEmail = userDetails.getUsername();
Long createReview = reviewService.createReview(bookId, userEmail, reviewReqDto);
return ResponseEntity.status(CREATE_REVIEW.getStatus())
.body(CommonResponse.from(CREATE_REVIEW.getMessage(), createReview));
}
Expand All @@ -65,23 +69,23 @@ public ResponseEntity<CommonResponse<Long>> createReview(@RequestParam Long book
@PutMapping("/{reviewId}")
public ResponseEntity<CommonResponse<Long>> updateReview(@PathVariable Long reviewId,
@Valid @RequestBody ReviewReqDto reviewReqDto) {
Long updateReview = reviewServiceImpl.updateReview(reviewId, reviewReqDto);
Long updateReview = reviewService.updateReview(reviewId, reviewReqDto);
return ResponseEntity.status(UPDATE_REVIEW.getStatus())
.body(CommonResponse.from(UPDATE_REVIEW.getMessage(), updateReview));
}

@Operation(summary = "리뷰 삭제", description = "해당 리뷰를 삭제합니다.")
@DeleteMapping("/{reviewId}")
public ResponseEntity<CommonResponse<Long>> deleteReview(@PathVariable Long reviewId) {
Long deleteReview = reviewServiceImpl.deleteReview(reviewId);
Long deleteReview = reviewService.deleteReview(reviewId);
return ResponseEntity.status(DELETE_REVIEW.getStatus())
.body(CommonResponse.from(DELETE_REVIEW.getMessage(), deleteReview));
}

@Operation(summary = "해당 책의 리뷰 전체 평점 반환", description = "책의 리뷰 전체 평점을 조회합니다.")
@GetMapping("/{bookId}/total-rate")
public ResponseEntity<CommonResponse<Double>> totalRateView(@PathVariable Long bookId) {
Double bookTotalRate = reviewServiceImpl.totalRate(bookId);
Double bookTotalRate = reviewService.totalRate(bookId);
return ResponseEntity.status(VIEW_BOOK_REVIEW_RATE.getStatus())
.body(CommonResponse.from(VIEW_BOOK_REVIEW_RATE.getMessage(), bookTotalRate));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ public List<RecentReviewListResDto> viewRecentReviewList(Long bookId) {
}

@Override
public Long createReview(Long bookId, Long userId, ReviewReqDto reviewReqDto) {
public Long createReview(Long bookId, String userEmail, ReviewReqDto reviewReqDto) {
Book book = findBookById(bookId);
User user = findUserById(userId);
User user = findUserByEmail(userEmail);

Review review = Review.from(user, book, reviewReqDto);

Expand Down Expand Up @@ -97,8 +97,8 @@ private Book findBookById(Long bookId) {
.orElseThrow(() -> new CustomException(BOOK_NOT_FOUND));
}

private User findUserById(Long userId) {
return userRepository.findById(userId)
private User findUserByEmail(String userEmail) {
return userRepository.findByEmail(userEmail)
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public interface ReviewService {

List<RecentReviewListResDto> viewRecentReviewList(Long bookId);

Long createReview(Long bookId, Long userId, ReviewReqDto reviewReqDto);
Long createReview(Long bookId, String userEmail, ReviewReqDto reviewReqDto);

Long updateReview(Long reviewId, ReviewReqDto reviewReqDto);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,16 @@ public interface UserGroupRepository extends JpaRepository<UserGroup, Long> {

// 순서상 userId, groupId로 검사하여 -> 404 에러가 뜰 경우 있음
// @Param으로 명서
Optional<UserGroup> findByUserIdAndGroupId(@Param("userId")Long userId, @Param("groupId")Long groupId);
Optional<UserGroup> findByUserIdAndGroupId(@Param("userId") Long userId, @Param("groupId") Long groupId);

@Query("SELECT ug FROM UserGroup ug WHERE ug.group.id = :groupId AND ug.role = 'MASTER'")
Optional<UserGroup> findMasterByGroupId(@Param("groupId") Long groupId);

@Query(value = "SELECT user_id FROM user_group WHERE group_id = :groupId ORDER BY RAND()", nativeQuery = true)
List<Long> findUserRandomSortByGroupId(Long groupId);

@Query("SELECT ug FROM UserGroup ug JOIN ug.group g WHERE ug.user.email = :userEmail AND g.status = :status")
List<UserGroup> findGroupsByUserEmailAndStatus(@Param("userEmail") String userEmail, @Param("status") GroupStatus status);
List<UserGroup> findGroupsByUserEmailAndStatus(@Param("userEmail") String userEmail,
@Param("status") GroupStatus status);

@Query(value = "SELECT email FROM user_group WHERE group_id = :groupId ORDER BY RAND()", nativeQuery = true)
List<String> findUserEmailRandomSortByGroupId(Long groupId);

}

0 comments on commit b335d04

Please sign in to comment.