Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/main/java/com/petlog/docs/PetControllerDocs.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -14,7 +15,7 @@ public interface PetControllerDocs {

@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "반려동물 정보 조회에 성공하였습니다.")
@Operation(summary = "반려동물 정보 조회 API")
ResponseEntity<ApiResponse<GetPetInfoResponseDto>> getPetInfo(@PathVariable final Long groupId);
ResponseEntity<ApiResponse<GetPetInfoResponseDto>> getPetInfo(@Authenticated final Long memberId, @PathVariable final Long groupId);

@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "반려동물 정보 수정에 성공하였습니다.")
@Operation(summary = "반려동물 정보 수정 API")
Expand Down
21 changes: 13 additions & 8 deletions src/main/java/com/petlog/pet/controller/PetController.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<ApiResponse<GetPetInfoResponseDto>> 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);

Expand All @@ -41,7 +46,7 @@ public ResponseEntity<ApiResponse<GetPetInfoResponseDto>> getPetInfo(
);
}

@PatchMapping("/api/groups/{groupId}/pet")
@PatchMapping("/{groupId}/pet")
public ResponseEntity<ApiResponse<Void>> updatePetProfile(
@PathVariable final Long groupId,
@RequestBody final UpdatePetProfileRequestDto request
Expand Down
Original file line number Diff line number Diff line change
@@ -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, Long> {

FeedingDailyRecord findTopByPetProfileOrderByTimeDesc(final PetProfile petProfile);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@
import org.springframework.data.jpa.repository.JpaRepository;

public interface PetProfileRepository extends JpaRepository<PetProfile, Long> {

PetProfile findByPetGroupId(final Long groupId);
}
Original file line number Diff line number Diff line change
@@ -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, Long> {

PoopDailyRecord findTopByPetProfileOrderByTimeDesc(final PetProfile petProfile);

int countByPetProfileAndTimeBetween(
final PetProfile petProfile,
final LocalDateTime start,
final LocalDateTime end
);
}
Original file line number Diff line number Diff line change
@@ -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, Long> {

WateringDailyRecord findTopByPetProfileOrderByTimeDesc(final PetProfile petProfile);
}
125 changes: 125 additions & 0 deletions src/main/java/com/petlog/pet/service/PetService.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
13 changes: 7 additions & 6 deletions src/main/java/com/petlog/pet/service/dto/GetPetProfileDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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("존재하지 않는 그룹입니다."));
}

Expand Down
Loading