Skip to content

Commit

Permalink
[FEAT #33] 성지순례 인증하기 api 개발 및 CompleteRally 엔티티 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
ppparkta committed Jan 28, 2024
1 parent d281a53 commit 9bc7674
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 19 deletions.
13 changes: 13 additions & 0 deletions src/main/java/com/favoriteplace/app/domain/enums/RallyVersion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.favoriteplace.app.domain.enums;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.time.LocalDateTime;

@Getter
@RequiredArgsConstructor
public enum RallyVersion {
v1("BETA 1.0");
private final String version;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.favoriteplace.app.domain.travel;

import com.favoriteplace.app.domain.Member;
import com.favoriteplace.app.domain.common.BaseTimeEntity;
import com.favoriteplace.app.domain.enums.RallyVersion;
import jakarta.persistence.*;
import lombok.*;

@Entity
@Getter
@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class CompleteRally extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="complete_rally_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "rally_id", nullable = false)
private Rally rally;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id", nullable = false)
private Member member;
@Enumerated(EnumType.STRING)
private RallyVersion version;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.favoriteplace.app.repository;

import com.favoriteplace.app.domain.Member;
import com.favoriteplace.app.domain.travel.CompleteRally;
import com.favoriteplace.app.domain.travel.Rally;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface CompleteRallyRepository extends JpaRepository<CompleteRally, Long> {
CompleteRally findByMemberAndRally(Member member, Rally rally);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@
import com.favoriteplace.app.converter.PointHistoryConverter;
import com.favoriteplace.app.domain.Member;
import com.favoriteplace.app.domain.enums.PointType;
import com.favoriteplace.app.domain.enums.RallyVersion;
import com.favoriteplace.app.domain.item.AcquiredItem;
import com.favoriteplace.app.domain.item.PointHistory;
import com.favoriteplace.app.domain.travel.LikedRally;
import com.favoriteplace.app.domain.travel.Pilgrimage;
import com.favoriteplace.app.domain.travel.Rally;
import com.favoriteplace.app.domain.travel.VisitedPilgrimage;
import com.favoriteplace.app.domain.travel.*;
import com.favoriteplace.app.dto.CommonResponseDto;
import com.favoriteplace.app.dto.travel.PilgrimageDto;
import com.favoriteplace.app.repository.*;
Expand All @@ -29,6 +28,8 @@ public class PilgrimageCommandService {
private final LikedRallyRepository likedRallyRepository;
private final VisitedPilgrimageRepository visitedPilgrimageRepository;
private final PointHistoryRepository pointHistoryRepository;
private final CompleteRallyRepository completeRallyRepository;
private final AcquiredItemRepository acquiredItemRepository;

/***
* 랠리 찜하기
Expand All @@ -42,10 +43,7 @@ public CommonResponseDto.PostResponseDto likeToRally(Long rallyId, Member member
LikedRally likedRally = likedRallyRepository.findByRallyAndMember(rally, member);

if (likedRally == null) {
LikedRally newLikedRally = LikedRally.builder()
.rally(rally)
.member(member)
.build();
LikedRally newLikedRally = LikedRally.builder().rally(rally).member(member).build();
likedRallyRepository.save(newLikedRally);
return CommonConverter.toPostResponseDto(true, "찜 목록에 추가됐습니다.");
} else {
Expand All @@ -64,29 +62,57 @@ public CommonResponseDto.PostResponseDto certifyToPilgrimage(Long pilgrimageId,
Member member,
PilgrimageDto.PilgrimageCertifyRequestDto form) {
Pilgrimage pilgrimage = pilgrimageRepository.findById(pilgrimageId).orElseThrow(
()->new RestApiException(ErrorCode.PILGRIMAGE_NOT_FOUND));
() -> new RestApiException(ErrorCode.PILGRIMAGE_NOT_FOUND));


// 24시간 이내 방문이력 확인
List<VisitedPilgrimage> visitedPilgrimages = visitedPilgrimageRepository
.findByPilgrimageAndMemberOrderByCreatedAtDesc(pilgrimage, member);

// 24시간 이내 방문이력 확인
if (visitedPilgrimages.isEmpty()
|| (!visitedPilgrimages.isEmpty() && visitedPilgrimages.get(0).getPilgrimage().getCreatedAt().plusHours(24L).isBefore(LocalDateTime.now()))) {
// 현재 좌표가 성지순례 장소 좌표 기준 +-0.00135 이내인지 확인
if (pilgrimage.getLatitude() + 0.00135 < form.getLatitude() || pilgrimage.getLatitude() - 0.00135 > form.getLatitude()
|| pilgrimage.getLongitude() + 0.00135 < form.getLongitude() || pilgrimage.getLongitude() - 0.00135 > form.getLongitude())
if (checkCoordinate(form, pilgrimage))
throw new RestApiException(ErrorCode.PILGRIMAGE_CAN_NOT_CERTIFIED);

// 성공 시 포인트 지급 -> 15p & visitedPilgrimage 추가
VisitedPilgrimage newVisited = VisitedPilgrimage.builder().pilgrimage(pilgrimage).member(member).build();
visitedPilgrimageRepository.save(newVisited);
pointHistoryRepository.save(PointHistoryConverter.toPointHistory(member, 15L, PointType.ACQUIRE));
successVisitedAndPointProcess(member, pilgrimage);

// 전체 랠리를 성공했는지 조회 후 맞다면... ->
Long completeCount = visitedPilgrimageRepository.findByDistinctCount(member.getId(), pilgrimage.getRally().getId());
// 랠리를 완료했는지 확인
if (checkCompleteRally(member, pilgrimage, completeCount))
return CommonConverter.toPostResponseDto(true, "모든 랠리를 완료했습니다.");
} else
throw new RestApiException(ErrorCode.PILGRIMAGE_ALREADY_CERTIFIED);
return CommonConverter.toPostResponseDto(true, "인증에 성공했습니다.");
}

private boolean checkCompleteRally(Member member, Pilgrimage pilgrimage, Long completeCount) {
if (completeCount == pilgrimage.getRally().getPilgrimageNumber()) {
CompleteRally completeRally = completeRallyRepository.findByMemberAndRally(member, pilgrimage.getRally());
// 이전에 이미 랠리를 완료한 상태인지 확인
if (completeRally == null || !completeRally.getVersion().getVersion().equals(RallyVersion.v1)) {
// 최초 완료에 한해 칭호 획득
if (completeRally == null)
acquiredItemRepository.save(AcquiredItem.builder().item(pilgrimage.getRally().getItem()).member(member).build());
// 포인트 획득
pointHistoryRepository.save(PointHistoryConverter.toPointHistory(member, 100L, PointType.ACQUIRE));
// 완료 랠리 추가
completeRallyRepository.save(CompleteRally.builder().rally(pilgrimage.getRally()).member(member).version(RallyVersion.v1).build());
return true;
}
}
return false;
}

private boolean checkCoordinate(PilgrimageDto.PilgrimageCertifyRequestDto form, Pilgrimage pilgrimage) {
return pilgrimage.getLatitude() + 0.00135 < form.getLatitude() || pilgrimage.getLatitude() - 0.00135 > form.getLatitude()
|| pilgrimage.getLongitude() + 0.00135 < form.getLongitude() || pilgrimage.getLongitude() - 0.00135 > form.getLongitude();
}

return CommonConverter.toPostResponseDto(true, "인증에 성공했습니다.");
} else throw new RestApiException(ErrorCode.PILGRIMAGE_ALREADY_CERTIFIED);
private void successVisitedAndPointProcess(Member member, Pilgrimage pilgrimage) {
VisitedPilgrimage newVisited = VisitedPilgrimage.builder().pilgrimage(pilgrimage).member(member).build();
visitedPilgrimageRepository.save(newVisited);
pointHistoryRepository.save(PointHistoryConverter.toPointHistory(member, 15L, PointType.ACQUIRE));
}

/***
Expand Down

0 comments on commit 9bc7674

Please sign in to comment.