Skip to content

Commit abdc667

Browse files
committed
[feat] summary 요청 및 응답 변경
1 parent 66fad7c commit abdc667

File tree

4 files changed

+101
-72
lines changed

4 files changed

+101
-72
lines changed

src/main/java/nambang_swag/bada_on/controller/WeatherController.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,15 @@
2424
public class WeatherController {
2525

2626
private final WeatherService weatherService;
27-
27+
2828
@Operation(summary = "등록장소에서의 활동 추천도 조회", description = "입력된 위치의 활동 추천도 리스트를 조회")
2929
@GetMapping("/summary")
30-
public ResponseEntity<List<WeatherSummary>> getWeatherSummary(
31-
@Parameter(description = "등록 장소 ID")
32-
@RequestParam("id")
33-
Long id,
34-
@Parameter(description = "activity(스노클링 - snorkeling, 다이빙 - diving, 해수욕 - swimming, 서핑 - surfing, 카약/패들보드 - kayakingPaddleBoarding)")
35-
@RequestParam("category") String category) {
36-
return ResponseEntity.ok().body(weatherService.getWeatherSummary(id, category));
30+
public ResponseEntity<WeatherSummary> getWeatherSummary(
31+
@RequestParam("id") Long id,
32+
@RequestParam("date") int date,
33+
@RequestParam("hour") int hour
34+
) {
35+
return ResponseEntity.ok().body(weatherService.getWeatherSummary(id, date, hour));
3736
}
3837

3938
@Operation(summary = "등록장소의 세부 날씨 조회", description = "등록 장소의 세부 날씨 조회")

src/main/java/nambang_swag/bada_on/repository/TideRepository.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import java.util.Optional;
66

77
import org.springframework.data.jpa.repository.JpaRepository;
8+
import org.springframework.data.jpa.repository.Query;
9+
import org.springframework.data.repository.query.Param;
810

911
import nambang_swag.bada_on.constant.TideObservatory;
1012
import nambang_swag.bada_on.entity.TideRecord;
@@ -16,4 +18,8 @@ Optional<TideRecord> findByDateAndTideObservatoryAndTidalTime(int date, TideObse
1618

1719
List<TideRecord> findAllByDateAndTideObservatory(int date, TideObservatory tideObservatory);
1820

21+
@Query("SELECT t FROM TideRecord t WHERE t.date IN :dates AND t.tideObservatory = :tideObservatory")
22+
List<TideRecord> findAllByDatesAndTideObservatory(@Param("dates") List<Integer> dates,
23+
@Param("tideObservatory") TideObservatory tideObservatory);
24+
1925
}
Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,55 @@
11
package nambang_swag.bada_on.response;
22

3-
import lombok.Builder;
4-
import lombok.Getter;
3+
import java.util.List;
54

6-
@Getter
7-
public class WeatherSummary {
8-
private int date;
9-
private int hour;
10-
private int score;
11-
private String message;
5+
import nambang_swag.bada_on.constant.Activity;
6+
import nambang_swag.bada_on.entity.Weather;
127

13-
@Builder
14-
public WeatherSummary(int date, int hour, int score, String message) {
15-
this.date = date;
16-
this.hour = hour;
17-
this.score = score;
18-
this.message = message;
8+
public record WeatherSummary(
9+
int date,
10+
int hour,
11+
List<String> warning,
12+
Activity recommendActivity,
13+
String skyCondition,
14+
float temperature,
15+
String wind,
16+
float tideHeight,
17+
float waveHeight
18+
) {
19+
public static WeatherSummary of(Weather weather, List<String> warning, Activity recommendActivity,
20+
float tideHeight) {
21+
return new WeatherSummary(
22+
weather.getDate(),
23+
weather.getTime(),
24+
warning,
25+
recommendActivity,
26+
getSkyCondition(weather),
27+
weather.getHourlyTemperature(),
28+
getWindString(weather.getWindSpeed()),
29+
tideHeight,
30+
weather.getWaveHeight()
31+
);
32+
}
33+
34+
private static String getSkyCondition(Weather weather) {
35+
if (weather.getHourlySnowAccumulation() > 0) {
36+
return "눈";
37+
} else if (weather.getHourlyPrecipitation() > 0) {
38+
return "비";
39+
} else {
40+
return weather.getSkyCondition().getDescription();
41+
}
42+
}
43+
44+
private static String getWindString(float windSpeed) {
45+
if (windSpeed >= 0f && windSpeed < 2f) {
46+
return "매우 약함";
47+
} else if (windSpeed >= 2f && windSpeed < 4f) {
48+
return "약함";
49+
} else if (windSpeed >= 4f && windSpeed < 7f) {
50+
return "적당";
51+
} else {
52+
return "강함";
53+
}
1954
}
2055
}

src/main/java/nambang_swag/bada_on/service/WeatherService.java

Lines changed: 39 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package nambang_swag.bada_on.service;
22

3+
import static nambang_swag.bada_on.constant.Activity.*;
4+
35
import java.time.LocalDateTime;
46
import java.time.format.DateTimeFormatter;
57
import java.time.temporal.ChronoUnit;
68
import java.util.ArrayList;
79
import java.util.Comparator;
10+
import java.util.HashMap;
811
import java.util.List;
912
import java.util.Map;
1013
import java.util.stream.Collectors;
@@ -15,14 +18,14 @@
1518
import lombok.RequiredArgsConstructor;
1619
import lombok.extern.slf4j.Slf4j;
1720
import nambang_swag.bada_on.constant.Activity;
18-
import nambang_swag.bada_on.constant.Message;
1921
import nambang_swag.bada_on.constant.PrecipitationType;
2022
import nambang_swag.bada_on.constant.SkyCondition;
2123
import nambang_swag.bada_on.constant.TideObservatory;
2224
import nambang_swag.bada_on.entity.Place;
2325
import nambang_swag.bada_on.entity.TideRecord;
2426
import nambang_swag.bada_on.entity.Weather;
2527
import nambang_swag.bada_on.exception.PlaceNotFound;
28+
import nambang_swag.bada_on.exception.WeatherNotFound;
2629
import nambang_swag.bada_on.repository.PlaceRepository;
2730
import nambang_swag.bada_on.repository.TideRepository;
2831
import nambang_swag.bada_on.repository.WeatherRepository;
@@ -40,39 +43,22 @@ public class WeatherService {
4043
private final TideRepository tideRepository;
4144
private final PlaceRepository placeRepository;
4245

43-
public List<WeatherSummary> getWeatherSummary(Long id, String stringActivity) {
46+
public WeatherSummary getWeatherSummary(Long id, int date, int hour) {
4447
Place place = placeRepository.findById(id).orElseThrow(PlaceNotFound::new);
45-
Activity activity = Activity.from(stringActivity);
46-
LocalDateTime now = LocalDateTime.now();
47-
int today = Integer.parseInt(now.format(DateTimeFormatter.ofPattern("yyyyMMdd")));
48-
int yesterday = Integer.parseInt(now.minusDays(1).format(DateTimeFormatter.ofPattern("yyyyMMdd")));
49-
int tomorrow = Integer.parseInt(now.plusDays(1).format(DateTimeFormatter.ofPattern("yyyyMMdd")));
48+
Weather weather = weatherRepository.findByDateAndTimeAndPlace(date, hour * 100, place)
49+
.orElseThrow(WeatherNotFound::new);
5050

51+
List<Integer> relevantDates = calculateRelevantDates();
5152
TideObservatory tideObservatory = TideObservatory.findNearest(place.getLatitude(), place.getLongitude());
52-
List<TideRecord> todayTide = tideRepository.findAllByDateAndTideObservatory(today, tideObservatory);
53-
List<TideRecord> yesterdayTide = tideRepository.findAllByDateAndTideObservatory(yesterday, tideObservatory);
54-
List<TideRecord> tomorrowTide = tideRepository.findAllByDateAndTideObservatory(tomorrow, tideObservatory);
55-
List<TideRecord> tideRecords = new ArrayList<>();
56-
tideRecords.addAll(yesterdayTide);
57-
tideRecords.addAll(todayTide);
58-
tideRecords.addAll(tomorrowTide);
59-
60-
List<WeatherSummary> weatherSummaryList = new ArrayList<>();
61-
List<Weather> weathers = weatherRepository.findWeatherByPlaceIdWithDateGreaterThan(
62-
place.getId(), today);
63-
for (Weather weather : weathers) {
64-
int score = calculateScore(activity, weather, tideRecords);
65-
String message = Message.from(activity.getValue(), score);
66-
if (weather.isUpdated()) {
67-
weatherSummaryList.add(WeatherSummary.builder()
68-
.date(weather.getDate())
69-
.hour(weather.getTime() / 100)
70-
.score(score)
71-
.message(message)
72-
.build());
73-
}
74-
}
75-
return weatherSummaryList;
53+
List<TideRecord> tideRecords = tideRepository.findAllByDatesAndTideObservatory(relevantDates, tideObservatory);
54+
55+
int tidePercentage = calculateTidePercentage(tideRecords);
56+
return WeatherSummary.of(
57+
weather,
58+
new ArrayList<>(),
59+
getRecommendActivity(weather, tideRecords),
60+
tidePercentage
61+
);
7662
}
7763

7864
public List<WeatherDetail> getWeatherDetail(Long placeId) {
@@ -102,26 +88,19 @@ public List<WeatherDetail> getWeatherDetail(Long placeId) {
10288
return result;
10389
}
10490

105-
private int calculateScore(Activity activity, Weather weather, List<TideRecord> tideRecords) {
106-
switch (activity) {
107-
case SNORKELING -> {
108-
return calculateSnorkelingScore(weather, tideRecords);
109-
}
110-
case SURFING -> {
111-
return calculateSurfingScore(weather, tideRecords);
112-
}
113-
case DIVING -> {
114-
return calculateDivingScore(weather, tideRecords);
115-
}
116-
case SWIMMING -> {
117-
return calculateSwimmingScore(weather, tideRecords);
118-
}
119-
case KAYAKING_AND_PADDLE_BOARDING -> {
120-
return calculateKayakingPaddleBoardingScore(weather, tideRecords);
121-
}
122-
}
91+
private Activity getRecommendActivity(Weather weather, List<TideRecord> tideRecords) {
92+
Map<Activity, Integer> activityScores = new HashMap<>();
12393

124-
return 0;
94+
activityScores.put(SNORKELING, calculateSnorkelingScore(weather, tideRecords));
95+
activityScores.put(SWIMMING, calculateSwimmingScore(weather, tideRecords));
96+
activityScores.put(DIVING, calculateDivingScore(weather, tideRecords));
97+
activityScores.put(KAYAKING_AND_PADDLE_BOARDING, calculateKayakingPaddleBoardingScore(weather, tideRecords));
98+
activityScores.put(SURFING, calculateSurfingScore(weather, tideRecords));
99+
100+
return activityScores.entrySet().stream()
101+
.max(Map.Entry.comparingByValue())
102+
.orElseThrow(() -> new IllegalStateException("No activity scores available"))
103+
.getKey();
125104
}
126105

127106
// Calculate Point
@@ -601,5 +580,15 @@ public List<AvailableTime> getAvailableTime(Integer date, Integer hour) {
601580
))
602581
.toList();
603582
}
583+
584+
private List<Integer> calculateRelevantDates() {
585+
LocalDateTime now = LocalDateTime.now();
586+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
587+
return List.of(
588+
Integer.parseInt(now.minusDays(1).format(formatter)), // 어제
589+
Integer.parseInt(now.format(formatter)), // 오늘
590+
Integer.parseInt(now.plusDays(1).format(formatter)) // 내일
591+
);
592+
}
604593
}
605594

0 commit comments

Comments
 (0)