Skip to content

Commit 8f62026

Browse files
authored
Merge pull request #158 from ItRecode/feature/BE-201
[BE-201] ๋ ˆ์ฝ”๋“œ ์“ด ๋‚ ์งœ ๋ฐ˜ํ™˜
2 parents 85a1195 + 4168e12 commit 8f62026

File tree

7 files changed

+165
-1
lines changed

7 files changed

+165
-1
lines changed

โ€Žsrc/main/java/com/recordit/server/controller/RecordController.javaโ€Ž

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import com.recordit.server.dto.record.RecordDetailResponseDto;
3232
import com.recordit.server.dto.record.WriteRecordRequestDto;
3333
import com.recordit.server.dto.record.WriteRecordResponseDto;
34+
import com.recordit.server.dto.record.WrittenRecordDayRequestDto;
35+
import com.recordit.server.dto.record.WrittenRecordDayResponseDto;
3436
import com.recordit.server.dto.record.memory.MemoryRecordRequestDto;
3537
import com.recordit.server.dto.record.memory.MemoryRecordResponseDto;
3638
import com.recordit.server.dto.record.mix.MixRecordResponseDto;
@@ -244,4 +246,11 @@ public ResponseEntity<RecordBySearchResponseDto> getRecordsBySearch(
244246
) {
245247
return ResponseEntity.ok().body(recordService.getRecordsBySearch(recordBySearchRequestDto));
246248
}
249+
250+
@GetMapping("/days")
251+
public ResponseEntity<WrittenRecordDayResponseDto> getWrittenRecordDays(
252+
@Valid WrittenRecordDayRequestDto writtenRecordDayRequestDto
253+
) {
254+
return ResponseEntity.ok(recordService.getWrittenRecordDays(writtenRecordDayRequestDto));
255+
}
247256
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.recordit.server.dto.record;
2+
3+
import java.time.YearMonth;
4+
5+
import javax.validation.constraints.NotNull;
6+
7+
import org.springframework.format.annotation.DateTimeFormat;
8+
9+
import io.swagger.annotations.ApiModel;
10+
import lombok.AccessLevel;
11+
import lombok.AllArgsConstructor;
12+
import lombok.Builder;
13+
import lombok.Getter;
14+
import lombok.ToString;
15+
16+
@Getter
17+
@ToString
18+
@ApiModel
19+
@AllArgsConstructor(access = AccessLevel.PROTECTED)
20+
@Builder
21+
public class WrittenRecordDayRequestDto {
22+
23+
@NotNull(message = "๋‚ ์งœ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.")
24+
@DateTimeFormat(pattern = "yyyy-MM")
25+
private YearMonth yearMonth;
26+
}
27+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.recordit.server.dto.record;
2+
3+
import java.util.Set;
4+
5+
import io.swagger.annotations.ApiParam;
6+
import lombok.Getter;
7+
import lombok.Setter;
8+
import lombok.ToString;
9+
10+
@Getter
11+
@Setter
12+
@ToString
13+
public class WrittenRecordDayResponseDto {
14+
@ApiParam(value = "๋‚ด๊ฐ€ ์“ด ๋ ˆ์ฝ”๋“œ ์ผ์ž ๋ชฉ๋ก", required = true)
15+
private Set<Integer> WrittenRecordDayDto;
16+
17+
private WrittenRecordDayResponseDto(Set<Integer> WrittenRecordDayDto) {
18+
this.WrittenRecordDayDto = WrittenRecordDayDto;
19+
}
20+
21+
public static WrittenRecordDayResponseDto of(Set<Integer> WrittenRecordDayDto) {
22+
return new WrittenRecordDayResponseDto(WrittenRecordDayDto);
23+
}
24+
}

โ€Žsrc/main/java/com/recordit/server/repository/RecordRepository.javaโ€Ž

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,10 @@ Page<Record> findByWriterAndTitleContaining(
7474
String searchKeyword,
7575
Pageable pageable
7676
);
77+
78+
List<Record> findAllByWriterAndCreatedAtBetween(
79+
Member writer,
80+
LocalDateTime startTime,
81+
LocalDateTime endTime
82+
);
7783
}

โ€Žsrc/main/java/com/recordit/server/service/RecordService.javaโ€Ž

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package com.recordit.server.service;
22

3+
import static com.recordit.server.util.DateTimeUtil.*;
4+
5+
import java.time.LocalDateTime;
36
import java.util.ArrayList;
47
import java.util.LinkedHashMap;
58
import java.util.List;
69
import java.util.Map;
710
import java.util.Random;
11+
import java.util.TreeSet;
812
import java.util.stream.Collectors;
913

1014
import org.springframework.data.domain.Page;
@@ -34,6 +38,8 @@
3438
import com.recordit.server.dto.record.RecordDetailResponseDto;
3539
import com.recordit.server.dto.record.WriteRecordRequestDto;
3640
import com.recordit.server.dto.record.WriteRecordResponseDto;
41+
import com.recordit.server.dto.record.WrittenRecordDayRequestDto;
42+
import com.recordit.server.dto.record.WrittenRecordDayResponseDto;
3743
import com.recordit.server.dto.record.memory.MemoryRecordRequestDto;
3844
import com.recordit.server.dto.record.memory.MemoryRecordResponseDto;
3945
import com.recordit.server.dto.record.mix.MixRecordDto;
@@ -153,7 +159,7 @@ public RecordByDateResponseDto getRecordBy(RecordByDateRequestDto recordByDateRe
153159

154160
Page<Record> findRecords = recordRepository.findAllByWriterAndCreatedAtBetweenOrderByCreatedAtDesc(
155161
member,
156-
DateTimeUtil.getStartOfDay(recordByDateRequestDto.getDate()),
162+
getStartOfDay(recordByDateRequestDto.getDate()),
157163
DateTimeUtil.getEndOfDay(recordByDateRequestDto.getDate()),
158164
PageRequest.of(
159165
recordByDateRequestDto.getPage(),
@@ -390,4 +396,25 @@ public RecordBySearchResponseDto getRecordsBySearch(
390396
.recordToNumOfComments(recordToNumOfComment)
391397
.build();
392398
}
399+
400+
public WrittenRecordDayResponseDto getWrittenRecordDays(
401+
WrittenRecordDayRequestDto writtenRecordDayRequestDto
402+
) {
403+
Long userIdBySession = sessionUtil.findUserIdBySession();
404+
log.info("์„ธ์…˜์—์„œ ์ฐพ์€ ์‚ฌ์šฉ์ž ID : {}", userIdBySession);
405+
406+
Member member = memberRepository.findById(userIdBySession)
407+
.orElseThrow(() -> new MemberNotFoundException("ํšŒ์› ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."));
408+
409+
LocalDateTime start = getFirstDayOfMonth(writtenRecordDayRequestDto.getYearMonth());
410+
LocalDateTime end = getLastDayOfMonth(writtenRecordDayRequestDto.getYearMonth());
411+
412+
TreeSet<Integer> writtenRecordDays =
413+
recordRepository.findAllByWriterAndCreatedAtBetween(member, start, end)
414+
.stream()
415+
.map(record -> record.getCreatedAt().getDayOfMonth())
416+
.collect(Collectors.toCollection(TreeSet::new));
417+
418+
return WrittenRecordDayResponseDto.of(writtenRecordDays);
419+
}
393420
}

โ€Žsrc/main/java/com/recordit/server/util/DateTimeUtil.javaโ€Ž

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.time.LocalDate;
44
import java.time.LocalDateTime;
55
import java.time.LocalTime;
6+
import java.time.YearMonth;
67

78
public class DateTimeUtil {
89

@@ -17,4 +18,22 @@ public static LocalDateTime getStartOfDay(LocalDate localDate) {
1718
public static LocalDateTime getEndOfDay(LocalDate localDate) {
1819
return LocalDateTime.of(localDate, LocalTime.MAX);
1920
}
21+
22+
public static LocalDateTime getFirstDayOfMonth(YearMonth yearMonth) {
23+
LocalDate standardDate = getStandardDate(yearMonth);
24+
return getStartOfDay(standardDate.withDayOfMonth(1));
25+
}
26+
27+
public static LocalDateTime getLastDayOfMonth(YearMonth yearMonth) {
28+
LocalDate standardDate = getStandardDate(yearMonth);
29+
return getEndOfDay(standardDate.withDayOfMonth(standardDate.lengthOfMonth()));
30+
}
31+
32+
private static LocalDate getStandardDate(YearMonth yearMonth) {
33+
return LocalDate.of(
34+
yearMonth.getYear(),
35+
yearMonth.getMonth(),
36+
1
37+
);
38+
}
2039
}

โ€Žsrc/test/java/com/recordit/server/service/RecordServiceTest.javaโ€Ž

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.recordit.server.service;
22

3+
import static com.recordit.server.util.DateTimeUtil.*;
34
import static org.assertj.core.api.Assertions.*;
45
import static org.junit.jupiter.api.Assertions.*;
56
import static org.mockito.BDDMockito.*;
67

78
import java.time.LocalDateTime;
9+
import java.time.YearMonth;
810
import java.util.ArrayList;
911
import java.util.Arrays;
1012
import java.util.Collections;
@@ -38,6 +40,8 @@
3840
import com.recordit.server.dto.record.RecordByDateRequestDto;
3941
import com.recordit.server.dto.record.RecordBySearchRequestDto;
4042
import com.recordit.server.dto.record.WriteRecordRequestDto;
43+
import com.recordit.server.dto.record.WrittenRecordDayRequestDto;
44+
import com.recordit.server.dto.record.WrittenRecordDayResponseDto;
4145
import com.recordit.server.dto.record.memory.MemoryRecordRequestDto;
4246
import com.recordit.server.exception.member.MemberNotFoundException;
4347
import com.recordit.server.exception.record.FixRecordNotExistException;
@@ -693,4 +697,52 @@ class ๊ฒ€์ƒ‰์œผ๋กœ_๋ ˆ์ฝ”๋“œ๋ฅผ_์กฐํšŒํ• _๋•Œ {
693697
.doesNotThrowAnyException();
694698
}
695699
}
700+
701+
@Nested
702+
@DisplayName("์ž‘์„ฑ๋œ ๋ ˆ์ฝ”๋“œ์˜ ์ผ์ž๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ์กฐํšŒํ•  ๋•Œ")
703+
class ์ž‘์„ฑ๋œ_๋ ˆ์ฝ”๋“œ์˜_์ผ์ž๋ฅผ_๋ฆฌ์ŠคํŠธ๋กœ_์กฐํšŒํ• _๋•Œ {
704+
WrittenRecordDayRequestDto writtenRecordDayRequestDto = WrittenRecordDayRequestDto.builder()
705+
.yearMonth(YearMonth.of(2023, 01))
706+
.build();
707+
708+
@Test
709+
@DisplayName("ํšŒ์›_์ •๋ณด๋ฅผ_์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค")
710+
void ํšŒ์›_์ •๋ณด๋ฅผ_์ฐพ์„_์ˆ˜_์—†๋‹ค๋ฉด_์˜ˆ์™ธ๋ฅผ_๋˜์ง„๋‹ค() {
711+
// given
712+
given(memberRepository.findById(anyLong()))
713+
.willReturn(Optional.empty());
714+
715+
// when, then
716+
assertThatThrownBy(() -> recordService.getWrittenRecordDays(writtenRecordDayRequestDto))
717+
.isInstanceOf(MemberNotFoundException.class)
718+
.hasMessage("ํšŒ์› ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
719+
}
720+
721+
@Test
722+
@DisplayName("์ •์ƒ์ ์ด๋ผ๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง€์ง€ ์•Š๋Š”๋‹ค")
723+
void ์ •์ƒ์ ์ด๋ผ๋ฉด_์˜ˆ์™ธ๋ฅผ_๋˜์ง€์ง€_์•Š๋Š”๋‹ค() {
724+
// given
725+
given(memberRepository.findById(anyLong()))
726+
.willReturn(Optional.of(mockMember));
727+
728+
LocalDateTime start = getFirstDayOfMonth(writtenRecordDayRequestDto.getYearMonth());
729+
LocalDateTime end = getLastDayOfMonth(writtenRecordDayRequestDto.getYearMonth());
730+
731+
given(recordRepository.findAllByWriterAndCreatedAtBetween(mockMember, start, end))
732+
.willReturn(List.of(mockRecord));
733+
given(mockRecord.getCreatedAt())
734+
.willReturn(mock(LocalDateTime.class));
735+
given(mockRecord.getCreatedAt().getDayOfMonth())
736+
.willReturn(2);
737+
738+
// when
739+
WrittenRecordDayResponseDto writtenRecordDays = recordService.getWrittenRecordDays(
740+
writtenRecordDayRequestDto);
741+
742+
// then
743+
assertThatCode(() -> recordService.getWrittenRecordDays(writtenRecordDayRequestDto))
744+
.doesNotThrowAnyException();
745+
assertThat(writtenRecordDays.getWrittenRecordDayDto().contains(2)).isTrue();
746+
}
747+
}
696748
}

0 commit comments

Comments
ย (0)