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
Original file line number Diff line number Diff line change
Expand Up @@ -5,54 +5,89 @@
import ongi.health.entity.ExerciseRecord;
import ongi.health.service.HealthRecordService;
import ongi.security.CustomUserDetails;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.util.List;
import java.util.UUID;
import ongi.health.dto.PainRecordResponse;
import ongi.health.dto.ExerciseRecordResponse;
import ongi.family.service.FamilyService;
import ongi.family.dto.FamilyInfo;
import ongi.temperature.service.TemperatureService;
import ongi.health.dto.PainRecordRequest;
import ongi.health.dto.ExerciseRecordRequest;

@RestController
@RequestMapping("/health")
@RequiredArgsConstructor
public class HealthRecordController {
private final HealthRecordService healthRecordService;
private final FamilyService familyService;
private final TemperatureService temperatureService;

// 통증 기록 추가
@PostMapping("/pain")
@PostMapping("/pain/record")
public ResponseEntity<PainRecordResponse> addPainRecord(
@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date,
@RequestParam PainRecord.PainArea area,
@RequestParam PainRecord.PainLevel level
@RequestBody PainRecordRequest request
) {
PainRecord record = healthRecordService.addPainRecord(userDetails.getUser().getUuid(), date, area, level);

FamilyInfo familyInfo = familyService.getFamily(userDetails.getUser());
String familyId = familyInfo.code();

PainRecord record = healthRecordService.addPainRecord(
userDetails.getUser().getUuid(),
request.date(),
PainRecord.PainArea.valueOf(request.painArea()),
PainRecord.PainLevel.valueOf(request.painLevel())
);

// 온도 상승
temperatureService.increaseTemperatureForParentPainInput(userDetails.getUser().getUuid(), familyId);

PainRecordResponse response = new PainRecordResponse(record);
return ResponseEntity.ok(response);
}

// 운동 기록 추가
@PostMapping("/exercise")
@PostMapping("/exercise/record")
public ResponseEntity<ExerciseRecordResponse> addExerciseRecord(
@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date,
@RequestParam int duration
@RequestBody ExerciseRecordRequest request
) {
ExerciseRecord record = healthRecordService.addExerciseRecord(userDetails.getUser().getUuid(), date, duration);

FamilyInfo familyInfo = familyService.getFamily(userDetails.getUser());
String familyId = familyInfo.code();

ExerciseRecord record = healthRecordService.addExerciseRecord(
userDetails.getUser().getUuid(),
request.date(),
request.duration()
);

// 온도 상승
temperatureService.increaseTemperatureForParentExerciseInput(userDetails.getUser().getUuid(), familyId);

ExerciseRecordResponse response = new ExerciseRecordResponse(record);
return ResponseEntity.ok(response);
}

// 최근 7일간 통증 기록 조회
@GetMapping("/pain/view")
public ResponseEntity<List<PainRecordResponse>> getParentPainRecordsForLast7Days(
@RequestParam UUID parentId
@RequestParam UUID parentId,
@AuthenticationPrincipal CustomUserDetails userDetails
) {
List<PainRecordResponse> response = healthRecordService.getPainRecordsForLast7Days(parentId).stream()

FamilyInfo familyInfo = familyService.getFamily(userDetails.getUser());
String familyId = familyInfo.code();

// 온도 상승
temperatureService.increaseTemperatureForChildPainView(userDetails.getUser().getUuid(), familyId);

List<PainRecordResponse> response = healthRecordService.getParentPainRecordsForLast7Days(parentId).stream()
.map(PainRecordResponse::new)
.toList();
return ResponseEntity.ok(response);
Expand All @@ -61,9 +96,17 @@ public ResponseEntity<List<PainRecordResponse>> getParentPainRecordsForLast7Days
// 최근 7일간 운동 기록 조회
@GetMapping("/exercise/view")
public ResponseEntity<List<ExerciseRecordResponse>> getParentExerciseRecordsForLast7Days(
@RequestParam UUID parentId
@RequestParam UUID parentId,
@AuthenticationPrincipal CustomUserDetails userDetails
) {
List<ExerciseRecordResponse> response = healthRecordService.getExerciseRecordsForLast7Days(parentId).stream()

FamilyInfo familyInfo = familyService.getFamily(userDetails.getUser());
String familyId = familyInfo.code();

// 온도 상승
temperatureService.increaseTemperatureForChildExerciseView(userDetails.getUser().getUuid(), familyId);

List<ExerciseRecordResponse> response = healthRecordService.getParentExerciseRecordsForLast7Days(parentId).stream()
.map(ExerciseRecordResponse::new)
.toList();
return ResponseEntity.ok(response);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package ongi.health.dto;

import java.time.LocalDate;

public record ExerciseRecordRequest(
LocalDate date,
int duration
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ongi.health.dto;

import java.time.LocalDate;

public record PainRecordRequest(
LocalDate date,
String painArea,
String painLevel
) {}
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,6 @@ public PainRecord addPainRecord(UUID parentId, LocalDate date, PainRecord.PainAr
return painRecordRepository.save(record);
}

// 최근 7일간 통증 기록 조회
public List<PainRecord> getPainRecordsForLast7Days(UUID parentId) {
LocalDate endDate = LocalDate.now();
LocalDate startDate = endDate.minusDays(6); // 오늘 포함 7일
return painRecordRepository.findByParentIdAndDateBetweenOrderByDateDesc(parentId, startDate, endDate);
}

// 운동 기록 추가
@Transactional
public ExerciseRecord addExerciseRecord(UUID parentId, LocalDate date, int duration) {
Expand All @@ -48,8 +41,15 @@ public ExerciseRecord addExerciseRecord(UUID parentId, LocalDate date, int durat
return exerciseRecordRepository.save(record);
}

// 최근 7일간 통증 기록 조회
public List<PainRecord> getParentPainRecordsForLast7Days(UUID parentId) {
LocalDate endDate = LocalDate.now();
LocalDate startDate = endDate.minusDays(6); // 오늘 포함 7일
return painRecordRepository.findByParentIdAndDateBetweenOrderByDateDesc(parentId, startDate, endDate);
}

// 최근 7일간 운동 기록 조회
public List<ExerciseRecord> getExerciseRecordsForLast7Days(UUID parentId) {
public List<ExerciseRecord> getParentExerciseRecordsForLast7Days(UUID parentId) {
LocalDate endDate = LocalDate.now();
LocalDate startDate = endDate.minusDays(6); // 오늘 포함 7일
return exerciseRecordRepository.findByParentIdAndDateBetweenOrderByDateDesc(parentId, startDate, endDate);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class FamilyTemperatureContributionResponse {
@AllArgsConstructor
public static class Contribution {
private LocalDate date;
private UUID userId;
private String userName;
private Double contributed;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@
@Column(nullable = false)
private Double temperature;

@Column(nullable = false, length = 30)
private String reason;

@CreatedDate
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,19 @@ public interface TemperatureRepository extends JpaRepository<Temperature, Long>
@Query("SELECT SUM(t.temperature) FROM Temperature t WHERE t.familyId = :familyId")
Double getTotalTemperatureByFamilyId(@Param("familyId") String familyId);

// 최근 5일간 가족 온도 총합 (날짜별) - Object[]로 반환
// 최근 5일간 가족 온도 총합 (날짜별)
@Query("SELECT CAST(t.createdAt AS date), SUM(t.temperature) " +
"FROM Temperature t WHERE t.familyId = :familyId AND t.createdAt >= :fromDate " +
"GROUP BY CAST(t.createdAt AS date) ORDER BY CAST(t.createdAt AS date) DESC")
List<Object[]> getFamilyTemperatureDailyRaw(@Param("familyId") String familyId, @Param("fromDate") java.time.LocalDateTime fromDate);

// 최근 5일간 가족 구성원별 온도 기여 내역 - Object[]로 반환
// 최근 5일간 가족 구성원별 온도 기여 내역
@Query("SELECT CAST(t.createdAt AS date), t.userId, SUM(t.temperature) " +
"FROM Temperature t WHERE t.familyId = :familyId AND t.createdAt >= :fromDate " +
"GROUP BY CAST(t.createdAt AS date), t.userId ORDER BY CAST(t.createdAt AS date) DESC")
List<Object[]> getFamilyTemperatureContributionsRaw(@Param("familyId") String familyId, @Param("fromDate") java.time.LocalDateTime fromDate);

// 오늘 해당 유저가 특정 활동(reason)으로 온도 기록을 남겼는지 확인 (날짜 기준)
@Query("SELECT COUNT(t) > 0 FROM Temperature t WHERE t.userId = :userId AND t.familyId = :familyId AND t.reason = :reason AND FUNCTION('DATE', t.createdAt) = :date")
boolean existsByUserIdAndFamilyIdAndReasonAndDate(@Param("userId") java.util.UUID userId, @Param("familyId") String familyId, @Param("reason") String reason, @Param("date") java.time.LocalDate date);
}
Loading
Loading