Skip to content

Commit

Permalink
refactor : Adventure API
Browse files Browse the repository at this point in the history
  • Loading branch information
redcarrot1 committed Feb 17, 2024
1 parent 3c9c202 commit c86a852
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 25 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.playkuround.playkuroundserver.domain.adventure.api;

import com.playkuround.playkuroundserver.domain.adventure.application.AdventureService;
import com.playkuround.playkuroundserver.domain.adventure.dto.AdventureSaveDto;
import com.playkuround.playkuroundserver.domain.adventure.dto.request.AdventureSaveRequest;
import com.playkuround.playkuroundserver.domain.adventure.dto.response.AdventureSaveResponse;
import com.playkuround.playkuroundserver.domain.score.domain.ScoreType;
import com.playkuround.playkuroundserver.global.common.response.ApiResponse;
import com.playkuround.playkuroundserver.global.security.UserDetailsImpl;
import com.playkuround.playkuroundserver.global.util.ApiUtils;
import com.playkuround.playkuroundserver.global.util.Location;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
Expand All @@ -25,10 +28,14 @@ public class AdventureApi {
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
@Operation(summary = "탐험하기", description = "탐험 점수를 저장합니다. 새롭게 얻은 뱃지가 있을 시 반환됩니다. " +
"뱃지는 DB에 자동 반영됩니다. scoreType은 별도 문서 참고")
"새로 추가된 뱃지는 DB에 자동 반영됩니다. scoreType은 별도 문서 참고")
public ApiResponse<AdventureSaveResponse> saveAdventure(@AuthenticationPrincipal UserDetailsImpl userDetails,
@RequestBody @Valid AdventureSaveRequest request) {
AdventureSaveResponse response = adventureService.saveAdventure(userDetails.getUser(), request);
ScoreType scoreType = ScoreType.fromString(request.getScoreType());
Location location = new Location(request.getLatitude(), request.getLongitude());
AdventureSaveDto adventureSaveDto
= new AdventureSaveDto(userDetails.getUser(), request.getLandmarkId(), location, request.getScore(), scoreType);
AdventureSaveResponse response = adventureService.saveAdventure(adventureSaveDto);
return ApiUtils.success(response);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.playkuround.playkuroundserver.domain.adventure.dao.AdventureRepository;
import com.playkuround.playkuroundserver.domain.adventure.domain.Adventure;
import com.playkuround.playkuroundserver.domain.adventure.dto.request.AdventureSaveRequest;
import com.playkuround.playkuroundserver.domain.adventure.dto.AdventureSaveDto;
import com.playkuround.playkuroundserver.domain.adventure.dto.response.AdventureSaveResponse;
import com.playkuround.playkuroundserver.domain.adventure.exception.InvalidLandmarkLocationException;
import com.playkuround.playkuroundserver.domain.badge.application.BadgeService;
Expand Down Expand Up @@ -31,28 +31,16 @@ public class AdventureService {
private final AdventureRepository adventureRepository;

@Transactional
public AdventureSaveResponse saveAdventure(User user, AdventureSaveRequest request) {
Landmark landmark = landmarkRepository.findById(request.getLandmarkId())
.orElseThrow(() -> new LandmarkNotFoundException(request.getLandmarkId()));
Location location = new Location(request.getLatitude(), request.getLongitude());
validateLocation(landmark, location);
public AdventureSaveResponse saveAdventure(AdventureSaveDto adventureSaveDto) {
Landmark landmark = landmarkRepository.findById(adventureSaveDto.landmarkId())
.orElseThrow(() -> new LandmarkNotFoundException(adventureSaveDto.landmarkId()));
validateLocation(landmark, adventureSaveDto.requestLocation());

ScoreType scoreType = ScoreType.fromString(request.getScoreType());
User user = adventureSaveDto.user();

// 1. Total Score 저장 및 최고 점수 갱신
Long myTotalScore = totalScoreService.incrementTotalScore(user, request.getScore());
user.getHighestScore().updateHighestTotalScore(myTotalScore);
user.getHighestScore().updateGameHighestScore(scoreType, request.getScore());
userRepository.save(user);

// 2. Adventure 저장
Adventure adventure = new Adventure(user, landmark, scoreType, request.getScore());
adventureRepository.save(adventure);

// 3. 랜드마크 최고 점수 갱신
updateUserScore(user, adventureSaveDto.scoreType(), adventureSaveDto.score());
saveAdventure(user, landmark, adventureSaveDto.scoreType(), adventureSaveDto.score());
updateLandmarkHighestScore(user, landmark);

// 4. 뱃지 저장
NewlyRegisteredBadge newlyRegisteredBadge = badgeService.updateNewlyAdventureBadges(user, landmark);

return AdventureSaveResponse.from(newlyRegisteredBadge);
Expand All @@ -66,8 +54,19 @@ private void validateLocation(Landmark landmark, Location location) {
}
}

private void updateUserScore(User user, ScoreType scoreType, long score) {
totalScoreService.incrementTotalScore(user, score);
user.getHighestScore().updateGameHighestScore(scoreType, score);
userRepository.save(user);
}

private void saveAdventure(User user, Landmark landmark, ScoreType scoreType, long score) {
Adventure adventure = new Adventure(user, landmark, scoreType, score);
adventureRepository.save(adventure);
}

private void updateLandmarkHighestScore(User user, Landmark landmark) {
long sumScore = adventureRepository.sumScoreByUserAndLandmark(user, landmark);
long sumScore = adventureRepository.getSumScoreByUserAndLandmark(user, landmark);
landmark.updateFirstUser(user, sumScore);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public interface AdventureRepository extends JpaRepository<Adventure, Long> {
Optional<RankAndScore> findMyRankByLandmarkId(@Param(value = "user") User user, @Param(value = "landmark") Long landmarkId);

@Query("SELECT SUM(a.score) FROM Adventure a WHERE a.user.id=:#{#user.id} AND a.landmark.id=:#{#landmark.id}")
long sumScoreByUserAndLandmark(@Param(value = "user") User user, @Param(value = "landmark") Landmark landmark);
long getSumScoreByUserAndLandmark(@Param(value = "user") User user, @Param(value = "landmark") Landmark landmark);

long countByUserAndLandmark(User user, Landmark requestSaveLandmark);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.playkuround.playkuroundserver.domain.adventure.dto;

import com.playkuround.playkuroundserver.domain.score.domain.ScoreType;
import com.playkuround.playkuroundserver.domain.user.domain.User;
import com.playkuround.playkuroundserver.global.util.Location;

public record AdventureSaveDto(User user, Long landmarkId, Location requestLocation, long score, ScoreType scoreType) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ public class Landmark {

public void updateFirstUser(User user, long score) {
if (score == 0) return;

if (firstUser == null || this.highestScore < score) {
this.firstUser = user;
this.highestScore = score;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public Long incrementTotalScore(User user, Long score) {
if (myTotalScore == null) {
return score; // 발생하지 않음
}
user.getHighestScore().updateHighestTotalScore(myTotalScore.longValue());
return myTotalScore.longValue();
}

Expand Down

0 comments on commit c86a852

Please sign in to comment.