diff --git a/src/main/java/com/petlog/docs/PetControllerDocs.java b/src/main/java/com/petlog/docs/PetControllerDocs.java index 5f6ee75..ab6c2d9 100644 --- a/src/main/java/com/petlog/docs/PetControllerDocs.java +++ b/src/main/java/com/petlog/docs/PetControllerDocs.java @@ -1,5 +1,6 @@ package com.petlog.docs; +import com.petlog.auth.resolver.Authenticated; import com.petlog.common.response.ApiResponse; import com.petlog.pet.controller.dto.request.UpdatePetProfileRequestDto; import com.petlog.pet.controller.dto.response.GetPetInfoResponseDto; @@ -14,7 +15,7 @@ public interface PetControllerDocs { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "반려동물 정보 조회에 성공하였습니다.") @Operation(summary = "반려동물 정보 조회 API") - ResponseEntity> getPetInfo(@PathVariable final Long groupId); + ResponseEntity> getPetInfo(@Authenticated final Long memberId, @PathVariable final Long groupId); @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "반려동물 정보 수정에 성공하였습니다.") @Operation(summary = "반려동물 정보 수정 API") diff --git a/src/main/java/com/petlog/pet/controller/PetController.java b/src/main/java/com/petlog/pet/controller/PetController.java index 42f198d..4a521f4 100644 --- a/src/main/java/com/petlog/pet/controller/PetController.java +++ b/src/main/java/com/petlog/pet/controller/PetController.java @@ -1,9 +1,11 @@ package com.petlog.pet.controller; +import com.petlog.auth.resolver.Authenticated; import com.petlog.common.response.ApiResponse; import com.petlog.docs.PetControllerDocs; import com.petlog.pet.controller.dto.request.UpdatePetProfileRequestDto; import com.petlog.pet.controller.dto.response.GetPetInfoResponseDto; +import com.petlog.pet.service.PetService; import com.petlog.pet.service.dto.GetFeedingInfoDto; import com.petlog.pet.service.dto.GetPetProfileDto; import com.petlog.pet.service.dto.GetPoopInfoDto; @@ -14,25 +16,28 @@ import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.time.LocalDateTime; - import static com.petlog.pet.controller.PetSuccessCode.GET_PET_INFO; import static com.petlog.pet.controller.PetSuccessCode.UPDATE_PET_PROFILE; @RequiredArgsConstructor +@RequestMapping("/api/groups") @RestController public class PetController implements PetControllerDocs { - @GetMapping("/api/groups/{groupId}/pet") + private final PetService petService; + + @GetMapping("/{groupId}/pet") public ResponseEntity> getPetInfo( + @Authenticated final Long memberId, @PathVariable final Long groupId ) { - final GetPetProfileDto profile = new GetPetProfileDto("https://여름.png", "여름", "4개월", "1kg", "FEMALE"); - final GetFeedingInfoDto feedingInfo = new GetFeedingInfoDto(6, LocalDateTime.now(), "서은", "밥 적당히 줄 것"); - final GetWateringInfoDto wateringInfo = new GetWateringInfoDto(6, LocalDateTime.now(), "서은", "밥 줄 때 같이"); - final GetPoopInfoDto poopInfo = new GetPoopInfoDto(3, "서은", "건강하네"); + final GetPetProfileDto profile = petService.getPetProfile(memberId, groupId); + final GetFeedingInfoDto feedingInfo = petService.getFeedingInfo(memberId, groupId); + final GetWateringInfoDto wateringInfo = petService.getWateringInfo(memberId, groupId); + final GetPoopInfoDto poopInfo = petService.getPoopInfo(memberId, groupId); final GetPetInfoResponseDto response = new GetPetInfoResponseDto(profile, feedingInfo, wateringInfo, poopInfo); @@ -41,7 +46,7 @@ public ResponseEntity> getPetInfo( ); } - @PatchMapping("/api/groups/{groupId}/pet") + @PatchMapping("/{groupId}/pet") public ResponseEntity> updatePetProfile( @PathVariable final Long groupId, @RequestBody final UpdatePetProfileRequestDto request diff --git a/src/main/java/com/petlog/pet/repository/FeedingDailyRecordRepository.java b/src/main/java/com/petlog/pet/repository/FeedingDailyRecordRepository.java index 4dcf276..718d90f 100644 --- a/src/main/java/com/petlog/pet/repository/FeedingDailyRecordRepository.java +++ b/src/main/java/com/petlog/pet/repository/FeedingDailyRecordRepository.java @@ -1,7 +1,10 @@ package com.petlog.pet.repository; import com.petlog.pet.entity.FeedingDailyRecord; +import com.petlog.pet.entity.PetProfile; import org.springframework.data.jpa.repository.JpaRepository; public interface FeedingDailyRecordRepository extends JpaRepository { + + FeedingDailyRecord findTopByPetProfileOrderByTimeDesc(final PetProfile petProfile); } diff --git a/src/main/java/com/petlog/pet/repository/PetProfileRepository.java b/src/main/java/com/petlog/pet/repository/PetProfileRepository.java index adcbeee..bf394d6 100644 --- a/src/main/java/com/petlog/pet/repository/PetProfileRepository.java +++ b/src/main/java/com/petlog/pet/repository/PetProfileRepository.java @@ -4,4 +4,6 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface PetProfileRepository extends JpaRepository { + + PetProfile findByPetGroupId(final Long groupId); } diff --git a/src/main/java/com/petlog/pet/repository/PoopDailyRecordRepository.java b/src/main/java/com/petlog/pet/repository/PoopDailyRecordRepository.java index b034269..7f1222b 100644 --- a/src/main/java/com/petlog/pet/repository/PoopDailyRecordRepository.java +++ b/src/main/java/com/petlog/pet/repository/PoopDailyRecordRepository.java @@ -1,7 +1,18 @@ package com.petlog.pet.repository; +import com.petlog.pet.entity.PetProfile; import com.petlog.pet.entity.PoopDailyRecord; import org.springframework.data.jpa.repository.JpaRepository; +import java.time.LocalDateTime; + public interface PoopDailyRecordRepository extends JpaRepository { + + PoopDailyRecord findTopByPetProfileOrderByTimeDesc(final PetProfile petProfile); + + int countByPetProfileAndTimeBetween( + final PetProfile petProfile, + final LocalDateTime start, + final LocalDateTime end + ); } diff --git a/src/main/java/com/petlog/pet/repository/WateringDailyRecordRepository.java b/src/main/java/com/petlog/pet/repository/WateringDailyRecordRepository.java index 1fe22d4..80e7e7a 100644 --- a/src/main/java/com/petlog/pet/repository/WateringDailyRecordRepository.java +++ b/src/main/java/com/petlog/pet/repository/WateringDailyRecordRepository.java @@ -1,7 +1,10 @@ package com.petlog.pet.repository; +import com.petlog.pet.entity.PetProfile; import com.petlog.pet.entity.WateringDailyRecord; import org.springframework.data.jpa.repository.JpaRepository; public interface WateringDailyRecordRepository extends JpaRepository { + + WateringDailyRecord findTopByPetProfileOrderByTimeDesc(final PetProfile petProfile); } diff --git a/src/main/java/com/petlog/pet/service/PetService.java b/src/main/java/com/petlog/pet/service/PetService.java new file mode 100644 index 0000000..e4c3a6f --- /dev/null +++ b/src/main/java/com/petlog/pet/service/PetService.java @@ -0,0 +1,125 @@ +package com.petlog.pet.service; + +import com.petlog.member.entity.Member; +import com.petlog.member.repository.MemberRepository; +import com.petlog.pet.entity.FeedingDailyRecord; +import com.petlog.pet.entity.PetProfile; +import com.petlog.pet.entity.PoopDailyRecord; +import com.petlog.pet.entity.WateringDailyRecord; +import com.petlog.pet.repository.FeedingDailyRecordRepository; +import com.petlog.pet.repository.PetProfileRepository; +import com.petlog.pet.repository.PoopDailyRecordRepository; +import com.petlog.pet.repository.WateringDailyRecordRepository; +import com.petlog.pet.service.dto.GetFeedingInfoDto; +import com.petlog.pet.service.dto.GetPetProfileDto; +import com.petlog.pet.service.dto.GetPoopInfoDto; +import com.petlog.pet.service.dto.GetWateringInfoDto; +import com.petlog.petgroup.entity.PetGroup; +import com.petlog.petgroup.entity.PetGroupMember; +import com.petlog.petgroup.repository.PetGroupMemberRepository; +import com.petlog.petgroup.repository.PetGroupRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@RequiredArgsConstructor +@Service +public class PetService { + + private final PetProfileRepository petProfileRepository; + private final MemberRepository memberRepository; + private final PetGroupRepository petGroupRepository; + private final PetGroupMemberRepository petGroupMemberRepository; + private final FeedingDailyRecordRepository feedingDailyRecordRepository; + private final WateringDailyRecordRepository wateringDailyRecordRepository; + private final PoopDailyRecordRepository poopDailyRecordRepository; + + public GetPetProfileDto getPetProfile(final Long memberId, final Long groupId) { + final Member member = getMember(memberId); + final PetGroup petGroup = getPetGroup(groupId); + getPetGroupMember(member, petGroup); + + final PetProfile petProfile = petProfileRepository.findByPetGroupId(groupId); + + return new GetPetProfileDto( + petProfile.getImageUrl(), + petProfile.getName(), + petProfile.getAge(), + petProfile.getGender(), + petProfile.getWeight() + ); + } + + private Member getMember(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 회원입니다.")); + } + + private PetGroup getPetGroup(final Long groupId) { + return petGroupRepository.findById(groupId) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 그룹입니다.")); + } + + private PetGroupMember getPetGroupMember(final Member member, final PetGroup petGroup) { + return petGroupMemberRepository.findByMemberAndPetGroup(member, petGroup) + .orElseThrow(() -> new IllegalArgumentException("그룹에 존재하지 않는 회원입니다.")); + } + + public GetFeedingInfoDto getFeedingInfo(final Long memberId, final Long groupId) { + final Member member = getMember(memberId); + final PetGroup petGroup = getPetGroup(groupId); + getPetGroupMember(member, petGroup); + + final PetProfile petProfile = petProfileRepository.findByPetGroupId(groupId); + final FeedingDailyRecord feedingDailyRecord = feedingDailyRecordRepository.findTopByPetProfileOrderByTimeDesc(petProfile); + + return new GetFeedingInfoDto( + petProfile.getFeedingCycle(), + feedingDailyRecord.getTime(), + feedingDailyRecord.getMember().getName(), + feedingDailyRecord.getMemo() + ); + } + + public GetWateringInfoDto getWateringInfo(final Long memberId, final Long groupId) { + final Member member = getMember(memberId); + final PetGroup petGroup = getPetGroup(groupId); + getPetGroupMember(member, petGroup); + + final PetProfile petProfile = petProfileRepository.findByPetGroupId(groupId); + final WateringDailyRecord wateringDailyRecord = wateringDailyRecordRepository.findTopByPetProfileOrderByTimeDesc(petProfile); + + return new GetWateringInfoDto( + petProfile.getWateringCycle(), + wateringDailyRecord.getTime(), + wateringDailyRecord.getMember().getName(), + wateringDailyRecord.getMemo() + ); + } + + public GetPoopInfoDto getPoopInfo(final Long memberId, final Long groupId) { + final Member member = getMember(memberId); + final PetGroup petGroup = getPetGroup(groupId); + getPetGroupMember(member, petGroup); + + final PetProfile petProfile = petProfileRepository.findByPetGroupId(groupId); + final int todayPoopCount = getTodayPoopRecordCount(petProfile); + final PoopDailyRecord poopDailyRecord = poopDailyRecordRepository.findTopByPetProfileOrderByTimeDesc(petProfile); + + return new GetPoopInfoDto( + todayPoopCount, + poopDailyRecord.getMember().getName(), + poopDailyRecord.getMemo() + ); + } + + private int getTodayPoopRecordCount(final PetProfile petProfile) { + final LocalDate today = LocalDate.now(); + final LocalDateTime start = today.atStartOfDay(); + final LocalDateTime end = today.plusDays(1).atStartOfDay(); + + return poopDailyRecordRepository.countByPetProfileAndTimeBetween(petProfile, start, end); + } +} diff --git a/src/main/java/com/petlog/pet/service/dto/GetPetProfileDto.java b/src/main/java/com/petlog/pet/service/dto/GetPetProfileDto.java index bdd3cdf..2249590 100644 --- a/src/main/java/com/petlog/pet/service/dto/GetPetProfileDto.java +++ b/src/main/java/com/petlog/pet/service/dto/GetPetProfileDto.java @@ -12,24 +12,25 @@ public record GetPetProfileDto( @Schema(description = "4글자 제한") String age, + @Schema(description = "FEMALE/MALE") + String gender, + @Schema(description = "6글자 제한") - String weight, + String weight - @Schema(description = "FEMALE/MALE") - String gender ) { public GetPetProfileDto( final String imageUrl, final String name, final String age, - final String weight, - final String gender + final String gender, + final String weight ) { this.imageUrl = imageUrl; this.name = name; this.age = age; - this.weight = weight; this.gender = gender; + this.weight = weight; } } diff --git a/src/main/java/com/petlog/petgroup/service/PetGroupService.java b/src/main/java/com/petlog/petgroup/service/PetGroupService.java index aa351e8..dcfe44f 100644 --- a/src/main/java/com/petlog/petgroup/service/PetGroupService.java +++ b/src/main/java/com/petlog/petgroup/service/PetGroupService.java @@ -124,8 +124,8 @@ public void leavePetGroup(final Long memberId, final Long groupId) { petGroupMemberRepository.deleteByMemberIdAndGroupId(memberId, groupId); } - private PetGroup getPetGroup(final Long petGroupId) { - return petGroupRepository.findById(petGroupId) + private PetGroup getPetGroup(final Long groupId) { + return petGroupRepository.findById(groupId) .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 그룹입니다.")); }