Skip to content

Commit 8954e83

Browse files
authored
Merge pull request #8 from UMC-9th-Spring-Boot/Feat/Chapter9
UMC 9주차 과제
2 parents 42f2f84 + 4623ff9 commit 8954e83

File tree

17 files changed

+333
-15
lines changed

17 files changed

+333
-15
lines changed

src/main/java/com/example/UMC/domain/mission/controller/MissionController.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
package com.example.UMC.domain.mission.controller;
22

33
import com.example.UMC.domain.mission.dto.response.MissionChallengeResponse;
4+
import com.example.UMC.domain.mission.dto.response.StoreMissionResponse;
5+
import com.example.UMC.domain.mission.dto.response.UserMissionInProgressResponse;
46
import com.example.UMC.domain.mission.service.MissionService;
7+
import com.example.UMC.global.annotation.ValidPage;
8+
import com.example.UMC.global.apiPayload.ApiResponse;
9+
import com.example.UMC.global.apiPayload.code.GeneralSucessCode;
10+
import io.swagger.v3.oas.annotations.Operation;
511
import lombok.RequiredArgsConstructor;
612
import org.springframework.http.ResponseEntity;
13+
import org.springframework.validation.annotation.Validated;
714
import org.springframework.web.bind.annotation.*;
815

16+
import java.util.List;
17+
918
@RestController
1019
@RequiredArgsConstructor
1120
@RequestMapping("/api/my/missions")
21+
@Validated
1222
public class MissionController {
1323

1424
private final MissionService missionService;
@@ -25,4 +35,30 @@ public ResponseEntity<MissionChallengeResponse> challengeMission(
2535
MissionChallengeResponse response = missionService.challengeMission(userId, missionId);
2636
return ResponseEntity.ok(response);
2737
}
38+
39+
@GetMapping("/stores/{storeId}")
40+
@Operation(summary = "특정 가게의 미션 목록 조회")
41+
public ApiResponse<List<StoreMissionResponse>> getStoreMissions(
42+
@PathVariable Long storeId,
43+
@RequestParam(defaultValue = "1") @ValidPage Integer page
44+
) {
45+
int pageIndex = page - 1;
46+
return ApiResponse.onSucess(
47+
GeneralSucessCode.OK,
48+
missionService.getStoreMissions(storeId, pageIndex)
49+
);
50+
}
51+
52+
@GetMapping("/me/in-progress")
53+
@Operation(summary = "내가 진행중인 미션 조회")
54+
public ApiResponse<List<UserMissionInProgressResponse>> getUserInProgress(
55+
@RequestParam Long userId,
56+
@RequestParam(defaultValue = "1") @ValidPage Integer page
57+
) {
58+
int pageIndex = page - 1;
59+
return ApiResponse.onSucess(
60+
GeneralSucessCode.OK,
61+
missionService.getUserInProgress(userId, pageIndex)
62+
);
63+
}
2864
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.example.UMC.domain.mission.converter;
2+
3+
import com.example.UMC.domain.mission.dto.response.StoreMissionResponse;
4+
import com.example.UMC.domain.mission.dto.response.UserMissionInProgressResponse;
5+
import com.example.UMC.domain.mission.entity.Mission;
6+
import com.example.UMC.domain.mission.entity.UserMission;
7+
import org.springframework.stereotype.Component;
8+
import org.springframework.data.domain.Page;
9+
10+
import java.util.List;
11+
import java.util.stream.Collectors;
12+
13+
@Component
14+
public class MissionConverter {
15+
16+
public List<StoreMissionResponse> toStoreMissionList(Page<Mission> missions) {
17+
return missions.getContent().stream()
18+
.map(m -> StoreMissionResponse.builder()
19+
.missionId(m.getId())
20+
.title(m.getTitle())
21+
.minSpend(m.getMinSpend())
22+
.point(m.getPoint())
23+
.build())
24+
.collect(Collectors.toList());
25+
}
26+
27+
public List<UserMissionInProgressResponse> toUserMissionList(Page<UserMission> missions) {
28+
return missions.getContent().stream()
29+
.map(um -> UserMissionInProgressResponse.builder()
30+
.userMissionId(um.getId())
31+
.missionTitle(um.getMission().getTitle())
32+
.status(um.getStatus())
33+
.build())
34+
.collect(Collectors.toList());
35+
}
36+
}
37+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.example.UMC.domain.mission.dto.response;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
@Getter
7+
@Builder
8+
public class StoreMissionResponse {
9+
private Long missionId;
10+
private String title;
11+
private Integer minSpend;
12+
private Integer point;
13+
}
14+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.example.UMC.domain.mission.dto.response;
2+
3+
import com.example.UMC.domain.enums.entity.MissionStatus;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
7+
@Getter
8+
@Builder
9+
public class UserMissionInProgressResponse {
10+
private Long userMissionId;
11+
private String missionTitle;
12+
private MissionStatus status;
13+
}
14+

src/main/java/com/example/UMC/domain/mission/repository/MissionRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,7 @@ public interface MissionRepository extends JpaRepository<Mission, Long> {
2323
ORDER BY m.endsAt ASC
2424
""")
2525
Page<Mission> findAllByRegion(@Param("region") Region region, Pageable pageable);
26+
27+
// 문제 2: 특정 가게의 미션 목록
28+
Page<Mission> findByStoreId(Long storeId, Pageable pageable);
2629
}

src/main/java/com/example/UMC/domain/mission/repository/UserMissionRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.example.UMC.domain.mission.repository;
22

33

4+
import com.example.UMC.domain.enums.entity.MissionStatus;
45
import com.example.UMC.domain.mission.entity.UserMission;
56
import com.example.UMC.domain.user.entity.User;
67
import org.springframework.data.domain.Page;
@@ -25,5 +26,8 @@ public interface UserMissionRepository extends JpaRepository<UserMission, Long>
2526
ORDER BY um.completedAt DESC
2627
""")
2728
Page<UserMission> findAllByUser(@Param("user") User user, Pageable pageable);
29+
30+
// 문제 3: 내가 진행 중인 미션 목록
31+
Page<UserMission> findByUserIdAndStatus(Long userId, MissionStatus status, Pageable pageable);
2832
}
2933

src/main/java/com/example/UMC/domain/mission/service/MissionService.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.example.UMC.domain.mission.service;
22

33
import com.example.UMC.domain.enums.entity.MissionStatus;
4+
import com.example.UMC.domain.mission.converter.MissionConverter;
45
import com.example.UMC.domain.mission.dto.response.MissionChallengeResponse;
6+
import com.example.UMC.domain.mission.dto.response.StoreMissionResponse;
7+
import com.example.UMC.domain.mission.dto.response.UserMissionInProgressResponse;
58
import com.example.UMC.domain.mission.entity.Mission;
69
import com.example.UMC.domain.mission.entity.UserMission;
710
import com.example.UMC.domain.mission.exception.MissionException;
@@ -13,17 +16,21 @@
1316
import com.example.UMC.domain.user.exception.code.UserErrorCode;
1417
import com.example.UMC.domain.user.repository.UserRepository;
1518
import lombok.RequiredArgsConstructor;
19+
import org.springframework.data.domain.PageRequest;
20+
import org.springframework.data.domain.Pageable;
1621
import org.springframework.stereotype.Service;
1722
import org.springframework.transaction.annotation.Transactional;
1823

1924
import java.time.LocalDateTime;
25+
import java.util.List;
2026

2127
@Service
2228
@RequiredArgsConstructor
2329
public class MissionService {
2430
private final MissionRepository missionRepository;
2531
private final UserRepository userRepository;
2632
private final UserMissionRepository userMissionRepository;
33+
private final MissionConverter converter;
2734

2835
/**
2936
* 미션 도전하기 API
@@ -72,4 +79,16 @@ public MissionChallengeResponse challengeMission(Long userId, Long missionId) {
7279
.status(saved.getStatus())
7380
.build();
7481
}
82+
83+
public List<StoreMissionResponse> getStoreMissions(Long storeId, int pageIndex) {
84+
Pageable pageable = PageRequest.of(pageIndex, 10);
85+
return converter.toStoreMissionList(missionRepository.findByStoreId(storeId, pageable));
86+
}
87+
88+
public List<UserMissionInProgressResponse> getUserInProgress(Long userId, int pageIndex) {
89+
Pageable pageable = PageRequest.of(pageIndex, 10);
90+
return converter.toUserMissionList(
91+
userMissionRepository.findByUserIdAndStatus(userId, MissionStatus.PROCESS, pageable)
92+
);
93+
}
7594
}

src/main/java/com/example/UMC/domain/review/controller/ReviewController.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,30 @@
11
package com.example.UMC.domain.review.controller;
22

33
import com.example.UMC.domain.review.dto.request.ReviewCreateRequest;
4+
import com.example.UMC.domain.review.dto.response.MyReviewResponse;
45
import com.example.UMC.domain.review.dto.response.ReviewResponse;
56
import com.example.UMC.domain.review.entity.Review;
67
import com.example.UMC.domain.review.repository.ReviewQueryRepository;
78
import com.example.UMC.domain.review.service.ReviewService;
9+
import com.example.UMC.global.annotation.ValidPage;
10+
import com.example.UMC.global.apiPayload.ApiResponse;
11+
import com.example.UMC.global.apiPayload.code.GeneralSucessCode;
12+
import io.swagger.v3.oas.annotations.Operation;
813
import jakarta.validation.Valid;
914
import lombok.RequiredArgsConstructor;
1015
import org.springframework.data.domain.Page;
1116
import org.springframework.data.domain.PageRequest;
1217
import org.springframework.data.domain.Pageable;
1318
import org.springframework.http.ResponseEntity;
19+
import org.springframework.validation.annotation.Validated;
1420
import org.springframework.web.bind.annotation.*;
1521

22+
import java.util.List;
23+
1624
@RestController
1725
@RequiredArgsConstructor
18-
@RequestMapping("/api/stores")
26+
@RequestMapping("/api/reviews")
27+
@Validated
1928
public class ReviewController {
2029

2130
private final ReviewQueryRepository reviewQueryRepository;
@@ -25,7 +34,7 @@ public class ReviewController {
2534
* [POST] /api/stores/{storeId}/reviews
2635
* 가게에 리뷰 작성 API
2736
*/
28-
@PostMapping("/{storeId}/reviews")
37+
@PostMapping("/stores/{storeId}")
2938
public ResponseEntity<ReviewResponse> createReview(
3039
@RequestHeader("X-USER-ID") Long userId,
3140
@PathVariable Long storeId,
@@ -40,7 +49,7 @@ public ResponseEntity<ReviewResponse> createReview(
4049
* 현재 이코드는 무한순회가 도는중 유저 - 리뷰 가 양방향 매핑이라 그래서 entity구조 그대로 하고 무한순회 안돌게
4150
* DTO사용이 필요해 보임.
4251
*/
43-
@GetMapping
52+
@GetMapping("/stores/test")
4453
public Page<Review> getReviews(
4554
@RequestParam(required = false) Long storeId,
4655
@RequestParam(required = false) String storeName,
@@ -53,5 +62,17 @@ public Page<Review> getReviews(
5362
Pageable pageable = PageRequest.of(page, size);
5463
return reviewQueryRepository.findReviews(storeId, storeName, regionId, star, pageable);
5564
}
65+
66+
@GetMapping("/me")
67+
@Operation(summary = "내가 작성한 리뷰 목록 조회")
68+
public ApiResponse<List<MyReviewResponse>> getMyReviews(
69+
@RequestParam Long userId,
70+
@RequestParam(defaultValue = "1") @ValidPage Integer page
71+
) {
72+
int pageIndex = page - 1;
73+
List<MyReviewResponse> result = reviewService.getMyReviews(userId, pageIndex);
74+
75+
return ApiResponse.onSucess(GeneralSucessCode.OK, result);
76+
}
5677
}
5778

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.example.UMC.domain.review.converter;
2+
3+
import com.example.UMC.domain.review.dto.response.MyReviewResponse;
4+
import com.example.UMC.domain.review.entity.Review;
5+
import org.springframework.data.domain.Page;
6+
import org.springframework.stereotype.Component;
7+
8+
import java.util.List;
9+
import java.util.stream.Collectors;
10+
11+
@Component
12+
public class ReviewConverter {
13+
14+
public List<MyReviewResponse> toMyReviews(Page<Review> reviewPage) {
15+
16+
return reviewPage.getContent()
17+
.stream()
18+
.map(r -> MyReviewResponse.builder()
19+
.reviewId(r.getId())
20+
.rating(r.getRating())
21+
.content(r.getContent())
22+
.storeName(r.getStore().getName())
23+
.createdAt(r.getCreatedAt())
24+
.build())
25+
.collect(Collectors.toList());
26+
}
27+
}
28+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.example.UMC.domain.review.dto.response;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
import java.time.LocalDateTime;
7+
8+
@Getter
9+
@Builder
10+
public class MyReviewResponse {
11+
private Long reviewId;
12+
private Integer rating;
13+
private String content;
14+
private String storeName;
15+
private LocalDateTime createdAt;
16+
}

0 commit comments

Comments
 (0)