Skip to content

Commit 571ac5d

Browse files
authored
Merge pull request #346 from prgrms-web-devcourse-final-project/develop
Feat : 좋아요 상태 추가 (#344)
2 parents e438641 + cafece7 commit 571ac5d

9 files changed

Lines changed: 79 additions & 23 deletions

File tree

back/src/main/java/com/back/domain/mentoring/mentoring/repository/ReviewRepository.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ Double calculateMentoringAverageRating(
3434
SELECT r
3535
FROM Review r
3636
WHERE r.reservation.mentoring.id = :mentoringId
37-
ORDER BY r.createDate DESC
3837
""")
3938
Page<Review> findAllByMentoringId(
4039
@Param("mentoringId") Long mentoringId,

back/src/main/java/com/back/domain/mentoring/mentoring/service/ReviewService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.springframework.data.domain.Page;
1515
import org.springframework.data.domain.PageRequest;
1616
import org.springframework.data.domain.Pageable;
17+
import org.springframework.data.domain.Sort;
1718
import org.springframework.stereotype.Service;
1819
import org.springframework.transaction.annotation.Transactional;
1920

@@ -26,7 +27,11 @@ public class ReviewService {
2627

2728
@Transactional(readOnly = true)
2829
public Page<ReviewResponse> getReviews(Long mentoringId, int page, int size) {
29-
Pageable pageable = PageRequest.of(page, size);
30+
Pageable pageable = PageRequest.of(
31+
page,
32+
size,
33+
Sort.by(Sort.Direction.DESC, "createDate")
34+
);
3035

3136
return reviewRepository.findAllByMentoringId(mentoringId, pageable)
3237
.map(ReviewResponse::from);

back/src/main/java/com/back/domain/mentoring/reservation/repository/ReservationRepository.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ Optional<Reservation> findByIdAndMember(
3333
SELECT r
3434
FROM Reservation r
3535
WHERE r.mentor.member.id = :memberId
36-
ORDER BY r.mentorSlot.startDateTime DESC
3736
""")
3837
Page<Reservation> findAllByMentorMember(
3938
@Param("memberId") Long memberId,
@@ -44,7 +43,6 @@ Page<Reservation> findAllByMentorMember(
4443
SELECT r
4544
FROM Reservation r
4645
WHERE r.mentee.member = :member
47-
ORDER BY r.mentorSlot.startDateTime DESC
4846
""")
4947
Page<Reservation> findAllByMenteeMember(
5048
@Param("member") Member member,

back/src/main/java/com/back/domain/mentoring/reservation/service/ReservationService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.data.domain.Page;
2424
import org.springframework.data.domain.PageRequest;
2525
import org.springframework.data.domain.Pageable;
26+
import org.springframework.data.domain.Sort;
2627
import org.springframework.stereotype.Service;
2728
import org.springframework.transaction.annotation.Transactional;
2829

@@ -39,7 +40,11 @@ public class ReservationService {
3940

4041
@Transactional(readOnly = true)
4142
public Page<ReservationDto> getReservations(Member member, int page, int size) {
42-
Pageable pageable = PageRequest.of(page, size);
43+
Pageable pageable = PageRequest.of(
44+
page,
45+
size,
46+
Sort.by(Sort.Direction.DESC, "mentorSlot.startDateTime")
47+
);
4348

4449
Page<Reservation> reservations;
4550

back/src/main/java/com/back/domain/mentoring/slot/service/MentorSlotService.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,13 @@ private LocalDate findNextOrSameDayOfWeek(LocalDate startDate, DayOfWeek targetD
157157
* 매 시간 30분에 지난 슬롯 만기 처리
158158
* - AVAILABLE -> EXPIRED
159159
*/
160-
@Scheduled(cron = "0 */30 * * * *")
160+
@Scheduled(cron = "0 */30 * * * *", zone = "Asia/Seoul")
161161
@Transactional
162162
public void expirePassedSlots() {
163163
LocalDateTime now = LocalDateTime.now();
164-
165164
int updateCount = mentorSlotRepository.expirePassedSlots(now);
166-
if (updateCount > 0) {
167-
log.info("만료된 슬롯 {}개 업데이트 완료 at {}", updateCount, now);
168-
}
165+
166+
log.info("만료된 슬롯 {}개 업데이트 완료 at {}", updateCount, now);
169167
}
170168

171169

back/src/main/java/com/back/domain/news/like/service/NewsLikeService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,10 @@ public long getLikeCount(Long newsId) {
3333
.orElseThrow(() -> new ServiceException("404", "해당 뉴스를 찾을 수 없습니다."));
3434
return newsLikeRepository.countByNews(news);
3535
}
36+
37+
public boolean hasUserLikedNews(Member member, Long newsId) {
38+
News news = newsRepository.findById(newsId)
39+
.orElseThrow(() -> new ServiceException("404", "해당 뉴스를 찾을 수 없습니다."));
40+
return newsLikeRepository.findByMemberAndNews(member, news).isPresent();
41+
}
3642
}

back/src/main/java/com/back/domain/news/news/controller/NewsController.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,19 @@ public RsData<NewsCreateResponse> createNews(@RequestBody NewsCreateRequest requ
4343

4444
@GetMapping("{newsId}")
4545
@Operation(summary = "뉴스 단건 조회", description = "특정 ID의 뉴스를 읽어옵니다.")
46-
public RsData<NewsGetResponse> getNews(@PathVariable("newsId") Long newsId) {
46+
public RsData<NewsGetWithLikeResponse> getNews(@PathVariable("newsId") Long newsId) {
47+
Member member = rq.getActorFromDb().get();
48+
if (member == null) {
49+
return new RsData<>("401", "로그인 후 이용해주세요.", null);
50+
}
51+
if (member.getRole() != Member.Role.ADMIN) {
52+
return new RsData<>("403", "권한이 없습니다.", null);
53+
}
54+
boolean hasUserLikedNews = newsLikeService.hasUserLikedNews(member, newsId);
55+
4756
News news = newsService.getNewsById(newsId);
4857
newsService.incrementViews(news);
49-
NewsGetResponse response = new NewsGetResponse(news);
58+
NewsGetWithLikeResponse response = new NewsGetWithLikeResponse(news, hasUserLikedNews);
5059
return new RsData<>("200", "뉴스 읽어오기 완료", response);
5160
}
5261

@@ -55,6 +64,13 @@ public RsData<NewsGetResponse> getNews(@PathVariable("newsId") Long newsId) {
5564
public RsData<List<NewsGetResponse>> getNewsList(
5665
@RequestParam(defaultValue = "0") int page,
5766
@RequestParam(defaultValue = "10") int size) {
67+
Member member = rq.getActorFromDb().get();
68+
if (member == null) {
69+
return new RsData<>("401", "로그인 후 이용해주세요.", null);
70+
}
71+
if (member.getRole() != Member.Role.ADMIN) {
72+
return new RsData<>("403", "권한이 없습니다.", null);
73+
}
5874

5975
Page<News> newsPage = newsService.getNewsByPage(page, size);
6076

@@ -106,7 +122,7 @@ public RsData<NewsUpdateResponse> modifyNews(@PathVariable("newsId") Long newsId
106122
@Operation(summary = "뉴스 삭제", description = "특정 ID의 뉴스를 삭제합니다. ADMIN 사용자만 접근할 수 있습니다.")
107123
public RsData<?> deleteNews(@PathVariable("newsId") Long newsId) {
108124
Member member = rq.getActorFromDb().get();
109-
if (member == null){
125+
if (member == null) {
110126
return new RsData<>("401", "로그인 후 이용해주세요.", null);
111127
}
112128
if (member.getRole() != Member.Role.ADMIN) {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.back.domain.news.news.dto;
2+
3+
import com.back.domain.news.news.entity.News;
4+
5+
import java.time.LocalDateTime;
6+
7+
public record NewsGetWithLikeResponse(
8+
Long id,
9+
String title,
10+
String videoUuid,
11+
String content,
12+
String authorId,
13+
boolean userLikeStatus,
14+
LocalDateTime createdAt,
15+
LocalDateTime updatedAt
16+
) {
17+
public NewsGetWithLikeResponse(News news, boolean userLikeStatus) {
18+
this(
19+
news.getId(),
20+
news.getTitle(),
21+
news.getVideo().getUuid(),
22+
news.getContent(),
23+
news.getMember().getName(),
24+
userLikeStatus,
25+
news.getCreateDate(),
26+
news.getModifyDate()
27+
);
28+
}
29+
}

back/src/test/java/com/back/domain/mentoring/reservation/service/ReservationServiceTest.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,7 @@
3333
import org.mockito.InjectMocks;
3434
import org.mockito.Mock;
3535
import org.mockito.junit.jupiter.MockitoExtension;
36-
import org.springframework.data.domain.Page;
37-
import org.springframework.data.domain.PageImpl;
38-
import org.springframework.data.domain.PageRequest;
39-
import org.springframework.data.domain.Pageable;
36+
import org.springframework.data.domain.*;
4037
import org.springframework.test.util.ReflectionTestUtils;
4138

4239
import java.time.LocalDateTime;
@@ -96,16 +93,16 @@ void getReservations() {
9693
// given
9794
int page = 1;
9895
int size = 5;
99-
Pageable pageable = PageRequest.of(page, size);
100-
10196
Page<Reservation> reservationPage = new PageImpl<>(
10297
List.of(reservation),
103-
pageable,
98+
PageRequest.of(page, size),
10499
10
105100
);
106101

107-
when(reservationRepository.findAllByMentorMember(mentor.getMember().getId(), pageable))
108-
.thenReturn(reservationPage);
102+
when(reservationRepository.findAllByMentorMember(
103+
eq(mentor.getMember().getId()),
104+
any(Pageable.class)
105+
)).thenReturn(reservationPage);
109106

110107
// when
111108
Page<ReservationDto> result = reservationService.getReservations(
@@ -119,7 +116,10 @@ void getReservations() {
119116
assertThat(result.getSize()).isEqualTo(5);
120117
assertThat(result.getTotalElements()).isEqualTo(10);
121118
assertThat(result.getTotalPages()).isEqualTo(2);
122-
verify(reservationRepository).findAllByMentorMember(mentor.getMember().getId(), pageable);
119+
verify(reservationRepository).findAllByMentorMember(
120+
eq(mentor.getMember().getId()),
121+
any(Pageable.class)
122+
);
123123
}
124124
}
125125

0 commit comments

Comments
 (0)