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
@@ -1,17 +1,21 @@
package ongi.maum_log.controller;

import jakarta.validation.Valid;
import java.time.YearMonth;
import lombok.AllArgsConstructor;
import ongi.maum_log.dto.MaumLogCalendarDto;
import ongi.maum_log.dto.MaumLogPresignedResponseDto;
import ongi.maum_log.dto.MaumLogUploadRequestDto;
import ongi.maum_log.service.MaumLogService;
import ongi.security.CustomUserDetails;
import org.springframework.http.ResponseEntity;
import org.springframework.lang.Nullable;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import software.amazon.awssdk.http.HttpStatusCode;

Expand All @@ -35,4 +39,15 @@ public ResponseEntity<Void> createMaumLog(
maumLogService.createMaumLog(userDetails, request);
return ResponseEntity.status(HttpStatusCode.CREATED).build();
}

@GetMapping("/calendar")
public ResponseEntity<MaumLogCalendarDto> getMaumLogCalendar(
@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestParam @Nullable YearMonth yearMonth) {
if (yearMonth == null) {
yearMonth = YearMonth.now();
}
MaumLogCalendarDto maumLogCalendarDto = maumLogService.getMaumLogCalendar(userDetails, yearMonth);
return ResponseEntity.ok(maumLogCalendarDto);
}
}
8 changes: 8 additions & 0 deletions backend/ongi/src/main/java/ongi/maum_log/dto/DateCount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package ongi.maum_log.dto;

import java.time.LocalDate;

public interface DateCount {
LocalDate getDate();
Integer getCount();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ongi.maum_log.dto;

import java.time.LocalDate;
import java.util.Map;

public record MaumLogCalendarDto(
Integer totalMemberCount,
Map<LocalDate, Integer> writtenMemberCount
) {
public static MaumLogCalendarDto from(Integer totalMemberCount, Map<LocalDate, Integer> writtenMemberCount) {
return new MaumLogCalendarDto(totalMemberCount, writtenMemberCount);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,29 @@
package ongi.maum_log.repository;

import java.time.LocalDate;
import java.util.List;
import java.util.UUID;
import ongi.maum_log.dto.DateCount;
import ongi.maum_log.entity.MaumLog;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface MaumLogRepository extends JpaRepository<MaumLog, Long> {

boolean existsByFileName(String fileName);

@Query(value = """
SELECT DATE(created_at) AS date, COUNT(*) AS count
FROM maum_log
WHERE created_by_uuid IN (:usersUuid)
AND created_at BETWEEN :startDate AND :endDate
GROUP BY DATE(created_at)
ORDER BY date
""", nativeQuery = true)
List<DateCount> countDiariesPerDayByUsersAndMonth(
@Param("usersUuid") List<UUID> users,
@Param("startDate") LocalDate startDate,
@Param("endDate") LocalDate endDate
);
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
package ongi.maum_log.service;

import java.net.URL;
import java.time.LocalDate;
import java.time.YearMonth;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor;
import ongi.exception.EntityAlreadyExistException;
import ongi.family.entity.Family;
import ongi.family.repository.FamilyRepository;
import ongi.family.service.FamilyService;
import ongi.maum_log.dto.DateCount;
import ongi.maum_log.dto.MaumLogCalendarDto;
import ongi.maum_log.dto.MaumLogPresignedResponseDto;
import ongi.maum_log.dto.MaumLogUploadRequestDto;
import ongi.maum_log.entity.MaumLog;
Expand All @@ -26,6 +36,7 @@ public class MaumLogService {
private final MaumLogRepository maumLogRepository;
private final TemperatureService temperatureService;
private final FamilyService familyService;
private final FamilyRepository familyRepository;

@Transactional
public void createMaumLog(CustomUserDetails userDetails, MaumLogUploadRequestDto request) {
Expand All @@ -51,6 +62,27 @@ public void createMaumLog(CustomUserDetails userDetails, MaumLogUploadRequestDto
maumLogRepository.save(maumLog);
}

public MaumLogCalendarDto getMaumLogCalendar(CustomUserDetails userDetails, YearMonth yearMonth) {
Family family = familyRepository.findByMembersContains(userDetails.getUser().getUuid())
.orElseThrow(() -> new IllegalArgumentException("가족 정보를 찾을 수 없습니다."));

LocalDate startDate = yearMonth.atDay(1);
LocalDate endDate = yearMonth.atEndOfMonth();

List<DateCount> dateCounts = maumLogRepository.countDiariesPerDayByUsersAndMonth(
family.getMembers(), startDate, yearMonth.atEndOfMonth());

Map<LocalDate, Integer> result = dateCounts.stream()
.collect(Collectors.toMap(DateCount::getDate, DateCount::getCount));

Map<LocalDate, Integer> fullResult = new LinkedHashMap<>();
for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
fullResult.put(date, result.getOrDefault(date, 0));
}

return MaumLogCalendarDto.from(family.getMembers().size(), fullResult);
}

public MaumLogPresignedResponseDto getPresignedPutUrl(CustomUserDetails userDetails) {
String fileName = UUID.randomUUID().toString();
URL presignedUrl = s3FileService.createSignedPutUrl(userDetails.getUser(), DIR_NAME,
Expand Down
Loading