Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/main/java/umc/apiPayload/code/status/ErrorStatus.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public enum ErrorStatus implements BaseErrorCode {
// 미션 관련 에러
MISSION_NOT_FOUND(HttpStatus.BAD_REQUEST, "MISSION4001", "미션이 존재하지 않습니다"),
MISSION_ALREADY_EXIST(HttpStatus.BAD_REQUEST, "MISSION4002", "해당 미션을 수행 중 또는 수행 완료했습니다."),
USERMISSION_NOT_FOUND(HttpStatus.BAD_REQUEST, "MISSION4003", "유저 미션이 존재하지 않습니다."),

// For test
TEMP_EXCEPTION(HttpStatus.BAD_REQUEST, "TEMP4001", "이거는 테스트"),
Expand Down
64 changes: 64 additions & 0 deletions src/main/java/umc/converter/MissionConverter.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
package umc.converter;

import org.springframework.data.domain.Page;
import umc.converter.user.UserMissionConverter;
import umc.domain.Location;
import umc.domain.Mission;
import umc.domain.Restaurant;
import umc.domain.Review;
import umc.domain.mapping.UserMission;
import umc.web.dto.mission.MissionRequestDTO;
import umc.web.dto.mission.MissionResponseDTO;
import umc.web.dto.restaurant.RestaurantRequestDTO;
import umc.web.dto.review.ReviewResponseDTO;

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

public class MissionConverter {

Expand All @@ -18,4 +27,59 @@ public static Mission toMission(MissionRequestDTO.createMissionDTO request, Rest
.location(restaurant.getLocation())
.build();
}

public static MissionResponseDTO.MissionDTO toMissionDTO(Mission mission){

return MissionResponseDTO.MissionDTO.builder()
.missionName(mission.getName())
.contents(mission.getContents())
.points(mission.getPoints())
.restaurantId(mission.getRestaurant().getId())
.createdAt(mission.getCreatedAt().toLocalDate())
.build();
}

public static MissionResponseDTO.MissionDTO toMissionDTO(UserMission userMission){

return MissionResponseDTO.MissionDTO.builder()
.missionName(userMission.getMission().getName())
.contents(userMission.getMission().getContents())
.points(userMission.getMission().getPoints())
.restaurantId(userMission.getMission().getRestaurant().getId())
.createdAt(userMission.getMission().getCreatedAt().toLocalDate())
.build();
}



public static MissionResponseDTO.MissionListDTO toMissionListDTO(Page<Mission> missionList){

List<MissionResponseDTO.MissionDTO> missionDTOList = missionList.stream()
.map(MissionConverter::toMissionDTO).collect(Collectors.toList());

return MissionResponseDTO.MissionListDTO.builder()
.isLast(missionList.isLast())
.isFirst(missionList.isFirst())
.totalPage(missionList.getTotalPages())
.totalElements(missionList.getTotalElements())
.listSize(missionDTOList.size())
.missionDTOList(missionDTOList)
.build();
}

public static MissionResponseDTO.MissionListDTO toUserMissionListDTO(Page<UserMission> userMissionList) {

List<MissionResponseDTO.MissionDTO> userMissionDTOList = userMissionList.stream()
.map(MissionConverter::toMissionDTO).collect(Collectors.toList());
Comment on lines +72 to +73
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이거 리스트로 안 받고, Page로 받으면 밑에서 따로 Page 관련 값들 세팅 안 해도 돼서 더 효율적일 것 같아요 !

Page<MissionResponseDTO.MissionDTO> userMissionDTOPage = userMissionList.map(MissionConverter::toMissionDTO);


return MissionResponseDTO.MissionListDTO.builder()
.isLast(userMissionList.isLast())
.isFirst(userMissionList.isFirst())
.totalPage(userMissionList.getTotalPages())
.totalElements(userMissionList.getTotalElements())
.listSize(userMissionDTOList.size())
.missionDTOList(userMissionDTOList)
.build();

}
}
30 changes: 30 additions & 0 deletions src/main/java/umc/converter/ReviewConverter.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package umc.converter;

import org.springframework.data.domain.Page;
import umc.domain.Location;
import umc.domain.Restaurant;
import umc.domain.Review;
import umc.domain.User;
import umc.web.dto.restaurant.RestaurantRequestDTO;
import umc.web.dto.review.ReviewRequestDTO;
import umc.web.dto.review.ReviewResponseDTO;

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

public class ReviewConverter {

Expand All @@ -19,4 +24,29 @@ public static Review toReview(ReviewRequestDTO.createReviewDTO reviewDTO, Restau
.build();
}

public static ReviewResponseDTO.ReviewPreViewDTO toReviewPreViewDTO(Review review){

return ReviewResponseDTO.ReviewPreViewDTO.builder()
.ownerNickname(review.getUser().getNickname())
.stars(review.getStars())
.createdAt(review.getCreatedAt().toLocalDate())
.content(review.getContent())
.build();
}

public static ReviewResponseDTO.ReviewPreViewListDTO toReviewPreViewListDTO(Page<Review> reviewList){

List<ReviewResponseDTO.ReviewPreViewDTO> reviewPreViewDTOList = reviewList.stream()
.map(ReviewConverter::toReviewPreViewDTO).collect(Collectors.toList());

return ReviewResponseDTO.ReviewPreViewListDTO.builder()
.isLast(reviewList.isLast())
.isFirst(reviewList.isFirst())
.totalPage(reviewList.getTotalPages())
.totalElements(reviewList.getTotalElements())
.listSize(reviewPreViewDTOList.size())
.reviewList(reviewPreViewDTOList)
.build();
}

}
5 changes: 5 additions & 0 deletions src/main/java/umc/domain/mapping/UserMission.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,9 @@ public class UserMission extends BaseEntity {
@JoinColumn(name = "user_id")
private User user;

public void changeIsCompleted(Boolean isCompleted) {
this.isCompleted = isCompleted;
}


}
9 changes: 9 additions & 0 deletions src/main/java/umc/repository/mission/MissionRepository.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
package umc.repository.mission;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import umc.domain.Mission;
import umc.domain.Restaurant;
import umc.domain.User;

public interface MissionRepository extends JpaRepository<Mission, Long> {

Page<Mission> findAllByRestaurant(Restaurant restaurant, Pageable pageable);


}
12 changes: 12 additions & 0 deletions src/main/java/umc/repository/review/ReviewRepository.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
package umc.repository.review;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.repository.JpaRepository;
import umc.domain.Restaurant;
import umc.domain.Review;
import umc.domain.User;

public interface ReviewRepository extends JpaRepository<Review, Long> {

Page<Review> findAllByRestaurant(Restaurant restaurant, Pageable pageable);

Page<Review> findAllByUser(User user, Pageable pageable);
Slice<Review> findReviewsByUser(User user, Pageable pageable);
//Page<Review> findAllByRestaurant(Restaurant restaurant, Pageable pageable);

}
24 changes: 24 additions & 0 deletions src/main/java/umc/repository/user/UserMissionRepository.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,36 @@
package umc.repository.user;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import umc.domain.Mission;
import umc.domain.User;
import umc.domain.mapping.UserMission;

import java.util.Optional;

public interface UserMissionRepository extends JpaRepository<UserMission, Long> {

Boolean existsUserMissionByUserAndMission(User user, Mission mission);

@Query(
value = "SELECT um " +
"FROM UserMission um " +
"JOIN FETCH um.mission m " +
"WHERE um.user.id = :userId " +
" AND um.isCompleted = false",
countQuery = "SELECT COUNT(um) " +
"FROM UserMission um " +
"WHERE um.user.id = :userId " +
" AND um.isCompleted = false"
)
Page<UserMission> findOngoingByUserId(
@Param("userId") Long userId,
Pageable pageable
);

Optional<UserMission> findByUserAndMission(User user, Mission mission);

}
2 changes: 2 additions & 0 deletions src/main/java/umc/service/mission/MissionCommandService.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@

public interface MissionCommandService {
void createMission(MissionRequestDTO.createMissionDTO request, Long restaurantId);

void changeMissionStatus(Long userId, Long missionId);
}
30 changes: 30 additions & 0 deletions src/main/java/umc/service/mission/MissionCommandServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@
import umc.converter.MissionConverter;
import umc.domain.Mission;
import umc.domain.Restaurant;
import umc.domain.User;
import umc.domain.mapping.UserMission;
import umc.repository.mission.MissionRepository;
import umc.repository.restaurant.RestaurantRepository;
import umc.repository.user.UserMissionRepository;
import umc.repository.user.UserRepository;
import umc.web.dto.mission.MissionRequestDTO;

@Service
Expand All @@ -19,6 +23,8 @@ public class MissionCommandServiceImpl implements MissionCommandService {

private final MissionRepository missionRepository;
private final RestaurantRepository restaurantRepository;
private final UserMissionRepository userMissionRepository;
private final UserRepository userRepository;

@Override
public void createMission(MissionRequestDTO.createMissionDTO request, Long restaurantId) {
Expand All @@ -33,4 +39,28 @@ public void createMission(MissionRequestDTO.createMissionDTO request, Long resta
missionRepository.save(mission);

}

@Override
public void changeMissionStatus(Long userId, Long missionId) {

Mission mission = missionRepository.findById(missionId).orElseThrow(
() -> new GeneralException(ErrorStatus.MISSION_NOT_FOUND)
);

User user = userRepository.findById(userId).orElseThrow(
() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)
);

UserMission userMission = userMissionRepository.findByUserAndMission(user, mission).orElseThrow(
() -> new GeneralException(ErrorStatus.USERMISSION_NOT_FOUND)
Comment on lines +46 to +55
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

엔티티 대신 storeId, memberId로 조회하는 게 더 효율적일 것 같아요 !

findByUserIdAndMissionid(userId, missionId)

);

if(userMission.getIsCompleted()){
userMission.changeIsCompleted(false);
}else{
userMission.changeIsCompleted(true);
}

userMissionRepository.save(userMission);
}
}
12 changes: 12 additions & 0 deletions src/main/java/umc/service/mission/MissionQueryService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package umc.service.mission;

import org.springframework.data.domain.Page;
import umc.domain.Mission;
import umc.domain.mapping.UserMission;

public interface MissionQueryService {

Page<Mission> getMissionListByRestaurantId(Long restaurantId, Integer page);

Page<UserMission> getMissionListByUserId(Long userId, Integer page);
}
53 changes: 53 additions & 0 deletions src/main/java/umc/service/mission/MissionQueryServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package umc.service.mission;

import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import umc.apiPayload.code.status.ErrorStatus;
import umc.apiPayload.exception.GeneralException;
import umc.domain.Mission;
import umc.domain.Restaurant;
import umc.domain.User;
import umc.domain.mapping.UserMission;
import umc.repository.mission.MissionRepository;
import umc.repository.restaurant.RestaurantRepository;
import umc.repository.user.UserMissionRepository;
import umc.repository.user.UserRepository;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MissionQueryServiceImpl implements MissionQueryService {

private final MissionRepository missionRepository;
private final RestaurantRepository restaurantRepository;
private final UserRepository userRepository;
private final UserMissionRepository userMissionRepository;

@Override
public Page<Mission> getMissionListByRestaurantId(Long restaurantId, Integer page) {

Restaurant restaurant = restaurantRepository.findById(restaurantId).orElseThrow(
() -> new GeneralException(ErrorStatus.RESTAURANT_NOT_FOUND)
);

Page<Mission> missionPage = missionRepository.findAllByRestaurant(restaurant, PageRequest.of(page, 10));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

페이징 기본 크기가 10이긴 한데, 프론트에서 혹시 다른 값을 요청할 수도 있으니 size 값도 받는 게 좋을 것 같아요 !

return missionPage;
}

@Override
public Page<UserMission> getMissionListByUserId(Long userId, Integer page) {

User user = userRepository.findById(userId).orElseThrow(
() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)
);

Page<UserMission> userMissionPage = userMissionRepository.findOngoingByUserId(userId, PageRequest.of(page, 10));

return userMissionPage;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ public interface RestaurantQueryService {

Optional<Restaurant> findRestaurant(Long id);
List<Restaurant> findRestaurantsByNameAndScore(String name, Float score);

}
14 changes: 14 additions & 0 deletions src/main/java/umc/service/review/ReviewQueryService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package umc.service.review;

import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import umc.domain.Review;

public interface ReviewQueryService {
Page<Review> getReviewList(Long storeId, Integer page);

Page<Review> getReviewListByUserId(Long userId, Integer page);
}
Loading