Skip to content

Commit b3d40de

Browse files
authored
Merge pull request #210 from TwoSSome/poompoomlog
사이드바 품품로그 & 월별 품품로그
2 parents e6017a3 + 57d9ca5 commit b3d40de

11 files changed

Lines changed: 199 additions & 13 deletions

src/main/java/towssome/server/advice/ExceptionAdvice.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,10 @@ public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgu
109109
return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
110110
}
111111

112+
@ExceptionHandler
113+
public ResponseEntity<ErrorResult> invalidMonthException(InvalidMonthException e) {
114+
ErrorResult errorResult = new ErrorResult("InvalidMonthException", e.getMessage());
115+
return new ResponseEntity<>(errorResult, HttpStatus.BAD_REQUEST);
116+
}
117+
112118
}

src/main/java/towssome/server/controller/CalendarController.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
import towssome.server.advice.PhotoAdvice;
1818
import towssome.server.dto.*;
1919
import towssome.server.entity.*;
20+
import towssome.server.exception.InvalidMonthException;
2021
import towssome.server.exception.NotFoundEntityException;
22+
import towssome.server.exception.PageException;
2123
import towssome.server.exception.UnauthorizedActionException;
2224
import towssome.server.service.CalendarServiceInterface;
2325

@@ -443,4 +445,40 @@ public CursorResult<CPCRes> getComments(@PathVariable Long postId,
443445
@RequestParam(value = "size", defaultValue = "20", required = false) Integer size) {
444446
return calendarService.getCalendarPostComments(postId, cursorId, sort, PageRequest.of(0, size));
445447
}
448+
449+
@Operation(summary = "품품로그 조회 API",
450+
description = "품품로그를 일정의 내림차순으로 조회합니다. 쿼리스트링을 입력하지 않을 경우, 사이드바의 품품로그에 필요한 만큼 반환됩니다.",
451+
parameters = {
452+
@Parameter(name = "cursorId", description = "다음 스크롤의 id, 미입력 시 첫 페이지에 해당되는 품품로그 반환.(0이 아닌 1부터 시작)"),
453+
@Parameter(name = "size", description = "한 스크롤 당 반환되는 품품로그 수(기본값: 6)")
454+
})
455+
@ApiResponses(value = {
456+
@ApiResponse(responseCode = "404", description = "페이지 번호(cursorId)가 잘못됨.",
457+
content = @Content(schema = @Schema(implementation = ErrorResult.class)))
458+
})
459+
@GetMapping("/poompoomlog")
460+
public CursorResult<PoomPoomLogInfo> getPoomPoomLogs(@RequestParam(value = "cursorId", defaultValue = "1") int cursorId,
461+
@RequestParam(value = "size", defaultValue = "6") Integer size){
462+
if (cursorId <= 0) {
463+
throw new PageException("페이지 번호는 0보다 커야 합니다");
464+
}
465+
return calendarService.getPoomPoomLogs(cursorId, size);
466+
}
467+
468+
@Operation(summary = "월별 품품로그 조회 API",
469+
description = "선택한 월의 품품로그를 일정의 오름차순으로 조회합니다.",
470+
parameters = {
471+
@Parameter(name = "month", description = "월별 품품로그를 조회할 월")
472+
})
473+
@ApiResponses(value = {
474+
@ApiResponse(responseCode = "400", description = "월(month)의 값이 잘못됨.",
475+
content = @Content(schema = @Schema(implementation = ErrorResult.class)))
476+
})
477+
@GetMapping("/poompoomlog/monthly")
478+
public List<PoomPoomLogInfo> getMonthlyPoomPoomLogs(@RequestParam(value = "month") int month){
479+
if (month < 1 || month > 12) {
480+
throw new InvalidMonthException("월(month)은 1~12의 값만 허용합니다.");
481+
}
482+
return calendarService.getMonthlyPoomPoomLogs(month);
483+
}
446484
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package towssome.server.dto;
2+
3+
import java.time.LocalDate;
4+
5+
public record PoomPoomLogInfo(
6+
Long postId,
7+
PhotoInPost photoInPost,
8+
LocalDate startDate,
9+
LocalDate endDate
10+
) {
11+
}

src/main/java/towssome/server/dto/SearchPoomPoomLogDTO.java

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

src/main/java/towssome/server/dto/SearchPoomPoomLogInfo.java

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package towssome.server.exception;
2+
3+
public class InvalidMonthException extends RuntimeException {
4+
5+
public InvalidMonthException() {
6+
super();
7+
}
8+
9+
public InvalidMonthException(String message) {
10+
super(message);
11+
}
12+
13+
public InvalidMonthException(String message, Throwable cause) {
14+
super(message, cause);
15+
}
16+
17+
public InvalidMonthException(Throwable cause) {
18+
super(cause);
19+
}
20+
21+
protected InvalidMonthException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
22+
super(message, cause, enableSuppression, writableStackTrace);
23+
}
24+
}

src/main/java/towssome/server/repository/CalendarPostRepository.java renamed to src/main/java/towssome/server/repository/calendar_post/CalendarPostRepository.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package towssome.server.repository;
1+
package towssome.server.repository.calendar_post;
22

33
import org.springframework.data.jpa.repository.JpaRepository;
44
import towssome.server.entity.CalendarPost;
55
import towssome.server.entity.CalendarSchedule;
66

77
import java.util.List;
88

9-
public interface CalendarPostRepository extends JpaRepository<CalendarPost,Long> {
9+
public interface CalendarPostRepository extends JpaRepository<CalendarPost,Long>, CalendarPostRepositoryCustom {
1010

1111
List<CalendarPost> findAllByCalendarSchedule(CalendarSchedule calendarSchedule);
1212
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package towssome.server.repository.calendar_post;
2+
3+
import org.springframework.data.domain.Pageable;
4+
import towssome.server.dto.CursorResult;
5+
import towssome.server.dto.PoomPoomLogInfo;
6+
import towssome.server.entity.Member;
7+
8+
import java.util.List;
9+
10+
public interface CalendarPostRepositoryCustom {
11+
CursorResult<PoomPoomLogInfo> findPoomPoomLogs(Member jwtMember, int page, int size);
12+
List<PoomPoomLogInfo> findPoomPoomLogsByMonth(Member jwtMember, int month);
13+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package towssome.server.repository.calendar_post;
2+
3+
import com.querydsl.core.types.Projections;
4+
import com.querydsl.core.types.dsl.*;
5+
import com.querydsl.jpa.impl.JPAQueryFactory;
6+
import lombok.RequiredArgsConstructor;
7+
import towssome.server.dto.CursorResult;
8+
import towssome.server.dto.PhotoInPost;
9+
import towssome.server.dto.PoomPoomLogInfo;
10+
import towssome.server.entity.Member;
11+
import towssome.server.enumrated.PostType;
12+
13+
import java.util.List;
14+
15+
import static towssome.server.entity.QCalendar.calendar;
16+
import static towssome.server.entity.QCalendarPost.calendarPost;
17+
import static towssome.server.entity.QCalendarSchedule.calendarSchedule;
18+
import static towssome.server.entity.QPhoto.photo;
19+
20+
@RequiredArgsConstructor
21+
public class CalendarPostRepositoryImpl implements CalendarPostRepositoryCustom {
22+
private final JPAQueryFactory QueryFactory;
23+
24+
@Override
25+
public CursorResult<PoomPoomLogInfo> findPoomPoomLogs(Member jwtMember, int page, int size) {
26+
StringExpression profilePhotoPath = Expressions.stringTemplate("{0}", photo.s3Path);
27+
BooleanExpression condition = calendar.authMember1.eq(jwtMember).not()
28+
.and(calendarPost.author.eq(calendar.authMember2))
29+
.or(calendar.authMember2.eq(jwtMember)
30+
.and(calendarPost.author.eq(calendar.authMember1)));
31+
32+
List<PoomPoomLogInfo> content = QueryFactory
33+
.select(Projections.constructor(PoomPoomLogInfo.class,
34+
calendarPost.id,
35+
Projections.constructor(PhotoInPost.class, photo.id, profilePhotoPath),
36+
calendarSchedule.startDate,
37+
calendarSchedule.endDate))
38+
.from(calendarPost)
39+
.leftJoin(calendar).on(calendarPost.author.eq(calendar.authMember1))
40+
.leftJoin(photo).on(calendarPost.eq(photo.calendarPost))
41+
.leftJoin(calendarSchedule).on(calendarPost.calendarSchedule.eq(calendarSchedule))
42+
.where(calendarPost.postType.eq(PostType.MEMOIR)
43+
.and(
44+
calendarPost.author.eq(jwtMember)
45+
.or(condition)
46+
)
47+
)
48+
.offset((long) page * size)
49+
.limit(size + 1)
50+
.orderBy(calendarSchedule.startDate.desc(), calendarPost.createDate.desc())
51+
.fetch();
52+
53+
boolean hasNext = content.size() > size;
54+
if (hasNext) {
55+
content.remove(content.size() - 1);
56+
}
57+
58+
return new CursorResult<>(content, (long)page + 2, hasNext);
59+
}
60+
61+
@Override
62+
public List<PoomPoomLogInfo> findPoomPoomLogsByMonth(Member jwtMember, int month) {
63+
StringExpression profilePhotoPath = Expressions.stringTemplate("{0}", photo.s3Path);
64+
NumberExpression<Integer> targetMonth = Expressions.numberTemplate(Integer.class, "{0}", month);
65+
BooleanExpression condition = calendar.authMember1.eq(jwtMember).not()
66+
.and(calendarPost.author.eq(calendar.authMember2))
67+
.or(calendar.authMember2.eq(jwtMember)
68+
.and(calendarPost.author.eq(calendar.authMember1)));
69+
70+
return QueryFactory
71+
.select(Projections.constructor(PoomPoomLogInfo.class,
72+
calendarPost.id,
73+
Projections.constructor(PhotoInPost.class, photo.id, profilePhotoPath),
74+
calendarSchedule.startDate,
75+
calendarSchedule.endDate))
76+
.from(calendarPost)
77+
.leftJoin(calendar).on(calendarPost.author.eq(calendar.authMember1))
78+
.leftJoin(photo).on(calendarPost.eq(photo.calendarPost))
79+
.leftJoin(calendarSchedule).on(calendarPost.calendarSchedule.eq(calendarSchedule))
80+
.where(calendarPost.postType.eq(PostType.MEMOIR)
81+
.and(targetMonth.between(calendarSchedule.startDate.month(), calendarSchedule.endDate.month()))
82+
.and(
83+
calendarPost.author.eq(jwtMember)
84+
.or(condition)
85+
)
86+
)
87+
.orderBy(calendarSchedule.startDate.asc(), calendarPost.createDate.desc())
88+
.fetch();
89+
}
90+
91+
}

src/main/java/towssome/server/service/CalendarService.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import lombok.RequiredArgsConstructor;
44
import lombok.extern.slf4j.Slf4j;
55
import org.springframework.data.domain.Page;
6+
import org.springframework.data.domain.PageRequest;
67
import org.springframework.data.domain.Pageable;
78
import org.springframework.stereotype.Service;
89
import org.springframework.transaction.annotation.Transactional;
@@ -15,6 +16,7 @@
1516
import towssome.server.exception.NotFoundEntityException;
1617
import towssome.server.exception.UnauthorizedActionException;
1718
import towssome.server.repository.*;
19+
import towssome.server.repository.calendar_post.CalendarPostRepository;
1820
import towssome.server.repository.calendar_post_comment.CalendarPostCommentRepository;
1921

2022
import java.util.ArrayList;
@@ -277,8 +279,15 @@ public CursorResult<CPCRes> getCalendarPostComments(Long postId, Long cursorId,
277279
//=============================================================================================================
278280

279281
@Override
280-
public List<SearchPoomPoomLogInfo> searchPoomPoomLogs(SearchPoomPoomLogDTO dto) {
281-
return List.of();
282+
public CursorResult<PoomPoomLogInfo> getPoomPoomLogs(int page, int size) {
283+
Member jwtMember = memberAdvice.findJwtMember();
284+
return calendarPostRepository.findPoomPoomLogs(jwtMember,page-1, size);
285+
}
286+
287+
@Override
288+
public List<PoomPoomLogInfo> getMonthlyPoomPoomLogs(int month) {
289+
Member jwtMember = memberAdvice.findJwtMember();
290+
return calendarPostRepository.findPoomPoomLogsByMonth(jwtMember, month);
282291
}
283292

284293
@Override

0 commit comments

Comments
 (0)