Skip to content

Commit

Permalink
feat : getMissedInputs 관련하여 의존성을 드러내고 책임을 분리하여 직관적인 코드 작성
Browse files Browse the repository at this point in the history
  • Loading branch information
packdev937 committed Oct 11, 2023
1 parent 8393d98 commit 843087d
Showing 1 changed file with 46 additions and 36 deletions.
82 changes: 46 additions & 36 deletions src/main/java/com/umc/yourweather/service/WeatherService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.umc.yourweather.auth.CustomUserDetails;
import com.umc.yourweather.domain.MemoManager;
import com.umc.yourweather.domain.SystemDateProvider;
import com.umc.yourweather.domain.entity.Memo;
import com.umc.yourweather.domain.entity.User;
import com.umc.yourweather.domain.entity.Weather;
Expand All @@ -13,7 +14,6 @@
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -27,37 +27,42 @@ public class WeatherService {
private final WeatherRepository weatherRepository;
private final MemoRepository memoRepository;

private final SystemDateProvider dateProvider;


@Transactional
public MissedInputResponseDto getMissedInputs(CustomUserDetails userDetails) {

// 응답 변수 추가
MissedInputResponseDto missedInputResponseDto = new MissedInputResponseDto();
List<LocalDate> lastWeekDates = generateLastWeekDates();
List<Weather> lastWeekWeathers = weatherRepository.findWeatherByDateBetweenAndUser(
dateProvider.getOneWeekAgo(), dateProvider.getToday(),
userDetails.getUser());
List<LocalDate> missedDates = generateLastWeekMissedDates(lastWeekDates,
lastWeekWeathers);

// 현재의 날짜 GET
LocalDate current = LocalDate.now();
return new MissedInputResponseDto(missedDates);
}

// 1주 전의 날짜 GET
LocalDate oneWeekAgo = current.minusWeeks(1);
List<LocalDate> generateLastWeekDates() {
LocalDate startDate = dateProvider.getOneWeekAgo();
LocalDate endDate = dateProvider.getToday();
List<LocalDate> dates = new ArrayList<>();

LocalDate dateIterator = oneWeekAgo.plusDays(1);

while (!dateIterator.isAfter(current)) {
dates.add(dateIterator);
dateIterator = dateIterator.plusDays(1);
for (; !startDate.isAfter(endDate);
startDate = startDate.plusDays(1)) {
dates.add(startDate);
}
return dates;
}

List<Weather> weathers = weatherRepository.findWeatherByDateBetweenAndUser(oneWeekAgo, current, userDetails.getUser());

for (Weather weather : weathers) {
List<LocalDate> generateLastWeekMissedDates(List<LocalDate> lastWeekDates,
List<Weather> lastWeekWeather) {
for (Weather weather : lastWeekWeather) {
LocalDate localDate = weather.getDate();
dates.remove(localDate);
lastWeekDates.remove(localDate);
}

missedInputResponseDto.setLocalDates(dates);

return missedInputResponseDto;
return lastWeekDates;
}

public HomeResponseDto home(CustomUserDetails userDetails) {
Expand All @@ -66,21 +71,24 @@ public HomeResponseDto home(CustomUserDetails userDetails) {
LocalDate localDate = LocalDate.now();
MemoManager memoManager = new MemoManager();

Weather weather = weatherRepository.findByDateAndUser(localDate, user).orElseThrow(() -> new WeatherNotFoundException("오늘 날짜에 해당하는 날씨 객체가 존재하지 않습니다."));
Weather weather = weatherRepository.findByDateAndUser(localDate, user)
.orElseThrow(() -> new WeatherNotFoundException("오늘 날짜에 해당하는 날씨 객체가 존재하지 않습니다."));

List<Memo> memoList = weather.getMemos();
memoManager.isMemoListEmpty(memoList);
String imageName = memoManager.getImageName(memoList);

Memo lastMemo = memoList.get(memoList.size() - 1);
return HomeResponseDto.builder().nickname(user.getNickname()).status(lastMemo.getStatus()).temperature(lastMemo.getTemperature()).imageName(imageName).build();
return HomeResponseDto.builder().nickname(user.getNickname()).status(lastMemo.getStatus())
.temperature(lastMemo.getTemperature()).imageName(imageName).build();

}

@Transactional
public WeatherResponseDto delete(LocalDate localDate, CustomUserDetails userDetails) {
Weather weather = weatherRepository.findByDateAndUser(localDate, userDetails.getUser()) // User 파라미터를 추가해야 함
.orElseThrow(() -> new WeatherNotFoundException("해당 날짜에 대한 Weather 엔티티가 존재하지 않습니다."));
Weather weather = weatherRepository.findByDateAndUser(localDate,
userDetails.getUser()) // User 파라미터를 추가해야 함
.orElseThrow(() -> new WeatherNotFoundException("해당 날짜에 대한 Weather 엔티티가 존재하지 않습니다."));

WeatherResponseDto result = new WeatherResponseDto(weather);
weatherRepository.delete(weather);
Expand All @@ -91,7 +99,7 @@ public WeatherResponseDto delete(LocalDate localDate, CustomUserDetails userDeta
@Transactional
public String checkMemoAndDelete(Long weatherId) {
Weather weather = weatherRepository.findById(weatherId).orElseThrow(()
-> new WeatherNotFoundException("해당 아이디로 조회되는 Weather 엔티티가 존재하지 않습니다."));
-> new WeatherNotFoundException("해당 아이디로 조회되는 Weather 엔티티가 존재하지 않습니다."));

List<Memo> memoList = weather.getMemos();
if (memoList.size() > 0) {
Expand All @@ -103,9 +111,9 @@ public String checkMemoAndDelete(Long weatherId) {
return " (해당 날짜의 Memo가 전부 삭제되어 해당 날짜의 Weather 또한 같이 삭제되었습니다.)";
}

public void update(Long weatherId){
public void update(Long weatherId) {
Weather weather = weatherRepository.findById(weatherId).orElseThrow(()
-> new WeatherNotFoundException("해당 아이디로 조회되는 Weather 엔티티가 존재하지 않습니다."));
-> new WeatherNotFoundException("해당 아이디로 조회되는 Weather 엔티티가 존재하지 않습니다."));
List<Memo> memoList = weather.getMemos();

Memo memoWithHighestTemperature = memoList.get(0); // Initialize with the first memo
Expand All @@ -118,28 +126,30 @@ public void update(Long weatherId){
}

@Transactional(readOnly = true)
public WeatherMonthlyResponseDto getMonthlyList(int year, int month, CustomUserDetails userDetails) {
public WeatherMonthlyResponseDto getMonthlyList(int year, int month,
CustomUserDetails userDetails) {

LocalDate startDate = LocalDate.of(year, month, 1);
LocalDate lastDate = startDate.withDayOfMonth(startDate.lengthOfMonth());

List<WeatherItemResponseDto> weatherItemResponseDtoList = new ArrayList<>();
List<Weather> weatherList = weatherRepository.findByMonthAndUser(userDetails.getUser(), startDate, lastDate);
List<Weather> weatherList = weatherRepository.findByMonthAndUser(userDetails.getUser(),
startDate, lastDate);

for(Weather weather : weatherList){
for (Weather weather : weatherList) {

Memo highestMemo = memoRepository.findFirstByWeatherIdOrderByTemperatureDesc(weather.getId());
Memo highestMemo = memoRepository.findFirstByWeatherIdOrderByTemperatureDesc(
weather.getId());
WeatherItemResponseDto weatherItemResponseDto = WeatherItemResponseDto.builder()
.weatherId(weather.getId())
.date(weather.getDate())
.highestStatus(highestMemo.getStatus())
.highestTemperature(highestMemo.getTemperature())
.build();
.weatherId(weather.getId())
.date(weather.getDate())
.highestStatus(highestMemo.getStatus())
.highestTemperature(highestMemo.getTemperature())
.build();

weatherItemResponseDtoList.add(weatherItemResponseDto);
}


return new WeatherMonthlyResponseDto(weatherItemResponseDtoList);
}
}

0 comments on commit 843087d

Please sign in to comment.