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 @@ -2,8 +2,10 @@

import jakarta.annotation.Nullable;
import java.time.LocalDate;
import java.util.List;
import lombok.RequiredArgsConstructor;
import ongi.security.CustomUserDetails;
import ongi.step.dto.FamilyStepRankResponse;
import ongi.step.dto.FamilyStepResponse;
import ongi.step.dto.StepUpsertRequest;
import ongi.step.service.StepService;
Expand Down Expand Up @@ -38,4 +40,11 @@ public ResponseEntity<FamilyStepResponse> getFamilySteps(
FamilyStepResponse response = stepService.getFamilySteps(userDetails.getUser(), date);
return ResponseEntity.ok(response);
}

@GetMapping("/rank")
public ResponseEntity<List<FamilyStepRankResponse>> getFamilyStepsRank(
@AuthenticationPrincipal CustomUserDetails userDetails){
List<FamilyStepRankResponse> responses = stepService.getFamilyStepRank(userDetails.getUser(), LocalDate.now());
return ResponseEntity.ok(responses);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ongi.step.dto;

public record FamilyStepRankResponse(
String familyName,
Integer averageSteps,
Boolean isOurFamily
) {

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,31 @@ public interface StepRepository extends JpaRepository<Step, Long> {
Optional<Step> findByCreatedByAndDate(User user, LocalDate date);

@Query("SELECT IFNULL(SUM(s.steps), 0) FROM Step s WHERE s.family = :family AND s.date = :date")
Integer getTotalStepsByFamilyAndDate(@Param("family") Family family, @Param("date") LocalDate date);

List<Step> findByFamilyAndDateBetween(Family family, LocalDate startDate, LocalDate endDate);

List<Integer> getTotalStepsByDateBetween(LocalDate startDate, LocalDate endDate);

List<Step> findByFamily(Family family);
Integer getTotalStepsByFamilyAndDate(@Param("family") Family family,
@Param("date") LocalDate date);

@Query("""
select
f.code as familyCode,
f.name as familyName,
coalesce(sum(s.steps), 0) as totalSteps,
count(distinct m) as memberCount
from Family f
left join f.members m
left join Step s
on s.family = f
and s.date between :start and :end
group by f.code, f.name
""")
List<FamilyStepsAndSizeView> findStepsAndSizeBetween(
@Param("start") LocalDate start,
@Param("end") LocalDate end
);

interface FamilyStepsAndSizeView {
String getFamilyCode();
String getFamilyName();
Long getTotalSteps();
Long getMemberCount();
}
}
50 changes: 25 additions & 25 deletions backend/ongi/src/main/java/ongi/step/service/StepService.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package ongi.step.service;

import java.time.temporal.TemporalAdjusters;
import java.util.Comparator;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import ongi.exception.EntityNotFoundException;
import ongi.family.entity.Family;
import ongi.family.repository.FamilyRepository;
import ongi.step.dto.FamilyStepRankingResponse;
import ongi.step.dto.FamilyStepRankResponse;
import ongi.step.dto.FamilyStepResponse;
import ongi.step.dto.FamilyStepResponse.MemberStepInfo;
import ongi.step.dto.StepUpsertRequest;
Expand Down Expand Up @@ -50,21 +51,21 @@ public void upsertStep(User user, StepUpsertRequest request) {
}
}

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

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


List<MemberStepInfo> memberSteps = family.getMembers().stream().map(uuid ->
new MemberStepInfo(uuid, userRepository.findByUuid(uuid).get().getName(),
familySteps.stream()
.filter(step -> step.getCreatedBy().getUuid().equals(uuid))
.findFirst()
.map(Step::getSteps)
.orElse(0))).toList();
familySteps.stream()
.filter(step -> step.getCreatedBy().getUuid().equals(uuid))
.findFirst()
.map(Step::getSteps)
.orElse(0))).toList();

return new FamilyStepResponse(
totalSteps,
Expand All @@ -73,26 +74,25 @@ public FamilyStepResponse getFamilySteps(User user, LocalDate date) {
);
}


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

// TODO
return null;
}

private int get7DaysAverageSteps(Family family) {
LocalDate today = LocalDate.now();
List<Step> familySteps = stepRepository.findByFamilyAndDateBetween(family, today,
getThisWeekMonday(today));

int totalSteps = familySteps.stream()
.mapToInt(Step::getSteps)
.sum();

return totalSteps / family.getMembers().size();
return stepRepository.findStepsAndSizeBetween(getThisWeekMonday(date), date).stream()
.map(v -> {
long cnt = v.getMemberCount();
long total = v.getTotalSteps() ;
int perMemberWeeklyTotal = (cnt == 0) ? 0 : (int)Math.round((double) total / cnt);

return new FamilyStepRankResponse(
v.getFamilyName(),
perMemberWeeklyTotal,
v.getFamilyCode().equals(ourFamily.getCode())
);
})
.sorted(Comparator.comparingInt(FamilyStepRankResponse::averageSteps).reversed())
.toList();
}

public LocalDate getThisWeekMonday(LocalDate date) {
Expand Down
Loading