Skip to content

Commit 53ef2b2

Browse files
authored
feat: 7일간 가족 걸음 수 랭킹 API 구현 (#149)
1 parent 38210b7 commit 53ef2b2

File tree

5 files changed

+70
-37
lines changed

5 files changed

+70
-37
lines changed

backend/ongi/src/main/java/ongi/step/controller/StepController.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import jakarta.annotation.Nullable;
44
import java.time.LocalDate;
5+
import java.util.List;
56
import lombok.RequiredArgsConstructor;
67
import ongi.security.CustomUserDetails;
8+
import ongi.step.dto.FamilyStepRankResponse;
79
import ongi.step.dto.FamilyStepResponse;
810
import ongi.step.dto.StepUpsertRequest;
911
import ongi.step.service.StepService;
@@ -38,4 +40,11 @@ public ResponseEntity<FamilyStepResponse> getFamilySteps(
3840
FamilyStepResponse response = stepService.getFamilySteps(userDetails.getUser(), date);
3941
return ResponseEntity.ok(response);
4042
}
43+
44+
@GetMapping("/rank")
45+
public ResponseEntity<List<FamilyStepRankResponse>> getFamilyStepsRank(
46+
@AuthenticationPrincipal CustomUserDetails userDetails){
47+
List<FamilyStepRankResponse> responses = stepService.getFamilyStepRank(userDetails.getUser(), LocalDate.now());
48+
return ResponseEntity.ok(responses);
49+
}
4150
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package ongi.step.dto;
2+
3+
public record FamilyStepRankResponse(
4+
String familyName,
5+
Integer averageSteps,
6+
Boolean isOurFamily
7+
) {
8+
9+
}

backend/ongi/src/main/java/ongi/step/dto/FamilyStepRankingResponse.java

Lines changed: 0 additions & 5 deletions
This file was deleted.

backend/ongi/src/main/java/ongi/step/repository/StepRepository.java

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,31 @@ public interface StepRepository extends JpaRepository<Step, Long> {
2020
Optional<Step> findByCreatedByAndDate(User user, LocalDate date);
2121

2222
@Query("SELECT IFNULL(SUM(s.steps), 0) FROM Step s WHERE s.family = :family AND s.date = :date")
23-
Integer getTotalStepsByFamilyAndDate(@Param("family") Family family, @Param("date") LocalDate date);
24-
25-
List<Step> findByFamilyAndDateBetween(Family family, LocalDate startDate, LocalDate endDate);
26-
27-
List<Integer> getTotalStepsByDateBetween(LocalDate startDate, LocalDate endDate);
28-
29-
List<Step> findByFamily(Family family);
23+
Integer getTotalStepsByFamilyAndDate(@Param("family") Family family,
24+
@Param("date") LocalDate date);
25+
26+
@Query("""
27+
select
28+
f.code as familyCode,
29+
f.name as familyName,
30+
coalesce(sum(s.steps), 0) as totalSteps,
31+
count(distinct m) as memberCount
32+
from Family f
33+
left join f.members m
34+
left join Step s
35+
on s.family = f
36+
and s.date between :start and :end
37+
group by f.code, f.name
38+
""")
39+
List<FamilyStepsAndSizeView> findStepsAndSizeBetween(
40+
@Param("start") LocalDate start,
41+
@Param("end") LocalDate end
42+
);
43+
44+
interface FamilyStepsAndSizeView {
45+
String getFamilyCode();
46+
String getFamilyName();
47+
Long getTotalSteps();
48+
Long getMemberCount();
49+
}
3050
}

backend/ongi/src/main/java/ongi/step/service/StepService.java

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package ongi.step.service;
22

33
import java.time.temporal.TemporalAdjusters;
4+
import java.util.Comparator;
45
import java.util.Optional;
56
import lombok.RequiredArgsConstructor;
67
import ongi.exception.EntityNotFoundException;
78
import ongi.family.entity.Family;
89
import ongi.family.repository.FamilyRepository;
9-
import ongi.step.dto.FamilyStepRankingResponse;
10+
import ongi.step.dto.FamilyStepRankResponse;
1011
import ongi.step.dto.FamilyStepResponse;
1112
import ongi.step.dto.FamilyStepResponse.MemberStepInfo;
1213
import ongi.step.dto.StepUpsertRequest;
@@ -50,21 +51,21 @@ public void upsertStep(User user, StepUpsertRequest request) {
5051
}
5152
}
5253

54+
@Transactional
5355
public FamilyStepResponse getFamilySteps(User user, LocalDate date) {
5456
Family family = familyRepository.findByMembersContains(user.getUuid())
5557
.orElseThrow(() -> new EntityNotFoundException("가족을 찾을 수 없습니다."));
5658

5759
List<Step> familySteps = stepRepository.findByFamilyAndDate(family, date);
5860
Integer totalSteps = stepRepository.getTotalStepsByFamilyAndDate(family, date);
5961

60-
6162
List<MemberStepInfo> memberSteps = family.getMembers().stream().map(uuid ->
6263
new MemberStepInfo(uuid, userRepository.findByUuid(uuid).get().getName(),
63-
familySteps.stream()
64-
.filter(step -> step.getCreatedBy().getUuid().equals(uuid))
65-
.findFirst()
66-
.map(Step::getSteps)
67-
.orElse(0))).toList();
64+
familySteps.stream()
65+
.filter(step -> step.getCreatedBy().getUuid().equals(uuid))
66+
.findFirst()
67+
.map(Step::getSteps)
68+
.orElse(0))).toList();
6869

6970
return new FamilyStepResponse(
7071
totalSteps,
@@ -73,26 +74,25 @@ public FamilyStepResponse getFamilySteps(User user, LocalDate date) {
7374
);
7475
}
7576

76-
77-
/// TODO ///
78-
public List<FamilyStepRankingResponse> getFamilyStepRanking(User user, LocalDate date) {
79-
Family family = familyRepository.findByMembersContains(user.getUuid())
77+
@Transactional
78+
public List<FamilyStepRankResponse> getFamilyStepRank(User user, LocalDate date) {
79+
Family ourFamily = familyRepository.findByMembersContains(user.getUuid())
8080
.orElseThrow(() -> new EntityNotFoundException("가족을 찾을 수 없습니다."));
8181

82-
// TODO
83-
return null;
84-
}
85-
86-
private int get7DaysAverageSteps(Family family) {
87-
LocalDate today = LocalDate.now();
88-
List<Step> familySteps = stepRepository.findByFamilyAndDateBetween(family, today,
89-
getThisWeekMonday(today));
90-
91-
int totalSteps = familySteps.stream()
92-
.mapToInt(Step::getSteps)
93-
.sum();
94-
95-
return totalSteps / family.getMembers().size();
82+
return stepRepository.findStepsAndSizeBetween(getThisWeekMonday(date), date).stream()
83+
.map(v -> {
84+
long cnt = v.getMemberCount();
85+
long total = v.getTotalSteps() ;
86+
int perMemberWeeklyTotal = (cnt == 0) ? 0 : (int)Math.round((double) total / cnt);
87+
88+
return new FamilyStepRankResponse(
89+
v.getFamilyName(),
90+
perMemberWeeklyTotal,
91+
v.getFamilyCode().equals(ourFamily.getCode())
92+
);
93+
})
94+
.sorted(Comparator.comparingInt(FamilyStepRankResponse::averageSteps).reversed())
95+
.toList();
9696
}
9797

9898
public LocalDate getThisWeekMonday(LocalDate date) {

0 commit comments

Comments
 (0)