Skip to content
Merged
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
6916bb7
refactor: 산책 엔티티 수정
2dhhh Mar 19, 2025
a390545
refactor: 산책 v1 서비스 코드 수정
2dhhh Mar 19, 2025
9f2a7da
refactor: 산책 V1 엔티티 수정
2dhhh Apr 8, 2025
4bc0aca
refactor: 산책 V1 서비스계층 수정
2dhhh Apr 8, 2025
89dd4df
refactor: 산책 V1 컨트롤러 계층 수정
2dhhh Apr 8, 2025
6dfa8e5
refactor: 산책 V1 서비스 계층 수정
2dhhh Apr 8, 2025
774103e
refactor: 산책 V1 레포지토리 쿼리 수정
2dhhh Apr 8, 2025
0bdb769
refactor: 산책 V1 레포지토리 쿼리 수정
2dhhh Apr 8, 2025
6ffd82b
refactor: MemberRepository getById 매개 타입 수정
2dhhh Apr 15, 2025
e73dab5
feat: 산책 기록 요청 및 응답 DTO 생성
2dhhh Apr 15, 2025
32b3d68
feat: 시간 포맷 유틸
2dhhh Apr 15, 2025
9e76dea
feat: 산책 기록하기
2dhhh Apr 15, 2025
14d32e0
feat: 산책 Version2 엔티티 생성자 추가
2dhhh Apr 15, 2025
744f4fd
feat: 산책 최근 산책 데이터 가져오기 DTO
2dhhh Apr 17, 2025
d4942cd
feat: 산책 최근 산책 데이터 가져오기 Repo 메소드
2dhhh Apr 17, 2025
af1870d
feat: 최신 산책 기능
2dhhh Apr 17, 2025
1f898a3
feat: 일일 산책 DTO
2dhhh Apr 17, 2025
f7ae955
feat: 일일 산책 조회V2 추가
2dhhh Apr 17, 2025
86e0c9a
chore: 불필요 import문 삭제
2dhhh Apr 17, 2025
d9317f7
feat: V2 월간 달력 산책 기록 조회 기능
2dhhh Apr 17, 2025
e445e64
refactor: 불필요 쿼리 메소드 삭제
2dhhh Apr 17, 2025
151cd30
refactor: repo 쿼리메소드명 변경
2dhhh Apr 17, 2025
ccd1d87
refactor: 응답 DTO 타입 변경
2dhhh Apr 17, 2025
91f5e7e
refactor: 응답 DTO 타입 변경에 대한 서비스 코드 수정
2dhhh Apr 17, 2025
e86a11a
feat: 주간 산책 데이터 조회V2 추가
2dhhh Apr 17, 2025
612c551
refactor: 공통응답 DTO 이름 수정
2dhhh Apr 17, 2025
4f38d68
fix: 엔티티 변경으로 산책 repo 메소드 수정
2dhhh Apr 17, 2025
e4a07d3
refactor: 포인트 도메인 리펙토링 (#231)
Seungcode Mar 28, 2025
661125c
fix: 산책 컨트롤러 uri 수정
2dhhh May 8, 2025
2abe974
refactor: OwnedPetRepository 불필요 코드 제거
2dhhh May 8, 2025
5191658
refactor: Member 레포 파라미터 타입변경
2dhhh May 8, 2025
f26e152
refactor: 백신 도메인 리펙토링 (#230)
parkhs21 May 9, 2025
9defe2f
refactor: 리워드 엔티티 리팩토링 (#224)
jun23314 Mar 19, 2025
dfbd430
fea: 리워드 등록 API 작성
jun23314 Mar 20, 2025
b95eab1
fix: 리워드 등록 controller명 변경
jun23314 Mar 20, 2025
1035d62
fix: JPA 네이밍 규칙 적용
jun23314 Mar 20, 2025
0836d0f
feat: 리워드 내역 전체 조회 API 작성
jun23314 Mar 20, 2025
31d4cd4
feat: 리워드 내역 단일 조회 API 작성
jun23314 Mar 20, 2025
93b872b
feat: 리워드 수정 API 작성
jun23314 Mar 20, 2025
0f9a0c2
feat: 리워드 삭제 API 작성
jun23314 Mar 20, 2025
54736b2
fix: 리워드 조회 시 생성/수정/삭제 일자 추가
jun23314 Mar 20, 2025
f1bb47c
fix: 리워드 soft delete 적용
jun23314 Mar 20, 2025
7f42878
fix: 삭제된 리워드는 수정 불가하게 변경
jun23314 Mar 20, 2025
3ec123d
chore: TODO 사용
jun23314 Mar 28, 2025
10c9b37
fix: rewards가 비어있는 경우 처리 제거
jun23314 Apr 2, 2025
70cf855
feat: 안구질환 테이블 생성
jun23314 Mar 31, 2025
112e0e6
feat: 안구질환 분석 api 작성
jun23314 Mar 31, 2025
ca7c968
refactor: AIModelClient 위치 변경 및 서버 주소 env 처리
jun23314 Mar 17, 2025
f6547d1
refactor: S3 서비스 통합
jun23314 Mar 17, 2025
87fa8e4
rename: 패키지 명 변경
jun23314 Mar 17, 2025
4a6fa54
feat: application-local.yml에 ai 모델 주소 관련 코드 추가
jun23314 Mar 17, 2025
4b002ba
fix: url 변수 변경
jun23314 Mar 19, 2025
ccc759b
fix: 기본 실행 prod로 변경
jun23314 Mar 19, 2025
7a67480
chore: git pull에 의한 import문 변경
jun23314 Mar 31, 2025
d10afe6
feat: 안구질환 분석 정보 db 저장 로직 생성
jun23314 Apr 2, 2025
4562a7f
refactor: 강아지/고양이 안구질환 결과 엔티티 분리
jun23314 Apr 11, 2025
339bfe0
fix: 강아지 고양이 반환값 분리
jun23314 Apr 11, 2025
edd0def
feat : feed 도메인 리팩토링 (#238)
Seungcode May 9, 2025
285e776
feat : feed 도메인 리팩토링 (#238)
Seungcode May 9, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public interface MemberRepository extends JpaRepository<Member, Long> {
void updateRefreshTokenByMemberId(@Param("memberId") Long memberId,
@Param("refreshToken") String refreshToken);

default Member getById(long id) {
default Member getById(Long id) {
return findById(id).orElseThrow(MemberNotFoundException::new);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.kau.capstone.entity.member.Member;
import com.kau.capstone.entity.member.OwnedPet;
import com.kau.capstone.entity.pet.Pet;
import com.kau.capstone.v2.walk.exception.PetOwnershipException;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
Expand All @@ -19,7 +20,9 @@ public interface OwnedPetRepository extends JpaRepository<OwnedPet, Long> {
@Query("SELECT op.pet FROM OwnedPet op WHERE op.member.id = :memberId AND op.pet.id = :petId")
Optional<Pet> findPetByMemberAndPetId(@Param("memberId") Long memberId, @Param("petId") Long petId);

@Query("SELECT COUNT(o) > 0 FROM OwnedPet o WHERE o.member = :member AND o.pet = :pet")
Boolean existsByMemberAndPet(@Param("member") Member member, @Param("pet") Pet pet);
List<OwnedPet> pet(Pet pet);

default Pet getPetByMemberAndPetId(Member member, Long petId) {
return findPetByMemberAndPetId(member.getId(), petId).orElseThrow(PetOwnershipException::new);
}
}
115 changes: 66 additions & 49 deletions src/main/java/com/kau/capstone/entity/walk/Walk.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,94 +3,111 @@
import com.kau.capstone.entity.member.Member;
import com.kau.capstone.entity.pet.Pet;
import com.kau.capstone.global.common.BaseEntity;
import com.kau.capstone.v1.walk.dto.request.WalkRequest;
import com.kau.capstone.v2.walk.dto.request.WalkCreateReqV2;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.*;
import org.hibernate.annotations.Comment;

import java.time.LocalDate;
import java.time.Duration;
import java.time.LocalDateTime;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Comment;


@Entity
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Walk extends BaseEntity {

private static final Double UNIT_STEP_PER_METER = 1.2; // 1M당 1.2보로 측정
private static final Double UNIT_KCAL_PER_STEP = 0.04; // 한 걸음당 0.04kcal로 측정
private static final double UNIT_STEP_PER_METER = 2.0; // 1M당 2보로 측정
private static final double UNIT_KCAL_PER_STEP = 0.04; // 한 걸음당 0.04kcal로 측정

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Comment("산책한 사용자 식별자")
@ManyToOne(fetch = FetchType.LAZY)
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
@JoinColumn(name = "member_id")
private Member member;

@ManyToOne(fetch = FetchType.LAZY)
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
@JoinColumn(name = "pet_id")
private Pet pet;

@Comment("측정 일자")
private LocalDate dataIntDt;
@Comment("산책 시작 시간")
private LocalDateTime startTime;

@Comment("산책 종료 시간")
private LocalDateTime endTime;

@Comment("산책 시간")
private long duration;

@Comment("이동 거리")
private Double distance;
private double distance;

@Comment("소모 칼로리")
private Double kcal;
private double kcal;

@Comment("걸음 수")
private Long step;

@Comment("산책 시간")
private Long walkingTime;

@Comment("누적 조도량")
private Double tLux;
private long step;


// V1 생성자
private Walk(Member member, Pet pet, WalkRequest walkReq) {
this.member = member;
this.pet = pet;
this.startTime = walkReq.getStartTime();
this.endTime = walkReq.getEndTime();
this.duration = Duration.between(startTime, endTime).getSeconds();
this.distance = walkReq.getDistance();
this.kcal = calcKcal(walkReq.getDistance());
this.step = calcStep(walkReq.getDistance());
}

@Comment("평균 색온도")
private Double avgK;
// V2 생성자
private Walk(Member member, Pet pet, WalkCreateReqV2 walkCreateReq) {
this.member = member;
this.pet = pet;
this.startTime = walkCreateReq.startTime();
this.endTime = walkCreateReq.endTime();
this.duration = Duration.between(startTime, endTime).getSeconds();
this.distance = walkCreateReq.distance();
this.kcal = calcKcal(walkCreateReq.distance());
this.step = calcStep(walkCreateReq.distance());
}

@Comment("평균 조도량")
private Double avgLux;
// V1 생성자 메소드
public static Walk of(Member member, Pet pet, WalkRequest walkReq) {
return new Walk(member, pet, walkReq);
}

@Comment("산책 시작 시간")
private LocalDateTime startTime;
// V2 생성자 메소드
public static Walk of(Member member, Pet pet, WalkCreateReqV2 walkCreateReq) {
return new Walk(member, pet, walkCreateReq);
}

@Comment("산책 종료 시간")
private LocalDateTime endTime;
// 걸음수 계산 메소드
private static long calcStep(double distance){
return (long)(distance * UNIT_STEP_PER_METER);
}

private static Double calculateKcal(Long step) {
return step * UNIT_KCAL_PER_STEP;
// 칼로리 계산 메소드
private static double calcKcal(double distance) {
return calcStep(distance) * UNIT_KCAL_PER_STEP;
}

public static Walk create(Member member, Pet pet, LocalDate dataIntDt, Double distance, Long step, Long walkingTime, Double tLux, Double avgK, Double avgLux, LocalDateTime startTime, LocalDateTime endTime) {
Double kcal = calculateKcal(step);
return Walk.builder()
.member(member)
.pet(pet)
.dataIntDt(dataIntDt)
.distance(distance)
.step(step)
.walkingTime(walkingTime)
.tLux(tLux)
.avgK(avgK)
.avgLux(avgLux)
.startTime(startTime)
.endTime(endTime)
.kcal(kcal)
.build();
// 산책 시간 계산 메소드
public static long calcWalkTime(LocalDateTime startTime, LocalDateTime endTime) {
Duration duration = Duration.between(startTime, endTime);
return duration.getSeconds();
}

}
Original file line number Diff line number Diff line change
@@ -1,28 +1,49 @@
package com.kau.capstone.entity.walk.repository;

import com.kau.capstone.entity.member.Member;
import com.kau.capstone.entity.pet.Pet;
import com.kau.capstone.entity.walk.Walk;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.time.LocalDate;
import java.util.List;
import java.util.Optional;

public interface WalkRepository extends JpaRepository<Walk,Long> {
Optional<Walk> findTopByPetOrderByDataIntDtDesc(Pet pet);

List<Walk> findByPetAndDataIntDt(Pet pet, LocalDate dataIntDt);

@Query("SELECT w FROM Walk w WHERE w.pet = :pet AND YEAR(w.dataIntDt) = :year AND MONTH(w.dataIntDt) = :month")
@Query("SELECT w FROM Walk w WHERE w.pet = :pet AND YEAR(w.startTime) = :year AND MONTH(w.startTime) = :month")
List<Walk> findByPetAndYearAndMonth(@Param("pet") Pet pet, @Param("year") int year, @Param("month") int month);

@Query("SELECT w FROM Walk w WHERE w.pet = :pet AND w.dataIntDt BETWEEN :startDate AND :endDate")
List<Walk> findByPetAndDateBetween(@Param("pet") Pet pet, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);

@Query("SELECT w FROM Walk w WHERE w.pet = :pet ORDER BY w.dataIntDt DESC")
@Query("SELECT w FROM Walk w WHERE w.pet = :pet ORDER BY w.startTime DESC")
List<Walk> findTop5ByPetOrderByDataIntDtDesc(@Param("pet") Pet pet, Pageable pageable);

@Query("SELECT w FROM Walk w WHERE w.pet = :pet AND FUNCTION('DATE', w.startTime) = :walkDate")
List<Walk> findDailyWalksByPetAndWalkDate(@Param("pet") Pet pet, @Param("walkDate") LocalDate walkDate);

@Query("SELECT w FROM Walk w WHERE w.pet = :pet AND w.startTime BETWEEN :startDateTime AND :endDateTime")
List<Walk> findWeeklyWalks(@Param("pet") Pet pet, @Param("startDateTime") LocalDateTime startDateTime, @Param("endDateTime") LocalDateTime endDateTime
);

List<Walk> findTop20ByMemberOrderByStartTimeDesc(Member member);



default List<Walk> getRecentWalks(Member member) {
return findTop20ByMemberOrderByStartTimeDesc(member);
}

default List<Walk> getDailyWalks(Pet pet, LocalDate walkDate) {
return findDailyWalksByPetAndWalkDate(pet, walkDate);
}

default List<Walk> getWalkCalendar(Pet pet, int year, int month) {
return findByPetAndYearAndMonth(pet, year, month);
}

default List<Walk> getWeeklyWalks(Pet pet, LocalDateTime monday, LocalDateTime sunday){
return findWeeklyWalks(pet, monday, sunday);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -30,25 +30,31 @@ public class WalkController {

// 산책 기록하기
@PostMapping("/register/{petId}")
public ResponseEntity<WalkResponse> registerWalk(@RequestBody @Valid WalkRequest walkData,
public ResponseEntity<WalkResponse> registerWalk(
@RequestBody @Valid WalkRequest walkData,
@LoginUser LoginInfo loginUser,
@PathVariable Long petId) {
@PathVariable Long petId
) {
WalkResponse response = walkService.saveWalkData(walkData, loginUser.memberId(), petId);
return ResponseEntity.ok(response);
}

// 최근 산책 기록 가져오기
@GetMapping("/recent")
public ResponseEntity<WalkRecentDataListResponse> latestWalk(@LoginUser LoginInfo loginUser) {
public ResponseEntity<WalkRecentDataListResponse> latestWalk(
@LoginUser LoginInfo loginUser
) {
WalkRecentDataListResponse response = walkService.getWalkRecentData(loginUser.memberId());
return ResponseEntity.ok(response);
}

// 일간 산책 기록 가져오기
@GetMapping("/daily/{petId}")
public ResponseEntity<WalkDailySummaryResponse> dailyWalk(@LoginUser LoginInfo loginUser,
public ResponseEntity<WalkDailySummaryResponse> dailyWalk(
@LoginUser LoginInfo loginUser,
@PathVariable Long petId,
@RequestParam LocalDate date) {
@RequestParam LocalDate date
) {

WalkDailySummaryResponse response = walkService.getDailySummary(loginUser.memberId(), petId,
date);
Expand Down
Loading