Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Review Controller 마이그레이션을 진행 #27

Merged
merged 35 commits into from
Sep 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
fec9315
Refactor(#21): import 대상 변경
sjhjack Sep 15, 2024
e84f5d6
Refactor(#21): Object -> ReviewContent 변경
sjhjack Sep 15, 2024
ad21587
Refactor(#21): Schedule 컬럼 추가
sjhjack Sep 15, 2024
6e2f53e
Feat(#21): starter-web 추가
sjhjack Sep 15, 2024
f2ee49e
Chore(#21): SpringBootApplication 위치 변경
sjhjack Sep 15, 2024
9a54021
Chore(#21): Repository 어노테이션 추가
sjhjack Sep 15, 2024
4f7d11e
Chore(#21): wypl-core에 도메인 추가
sjhjack Sep 15, 2024
06e1f2b
Feat(#21): review request dto 추가
sjhjack Sep 15, 2024
db46347
Feat(#21): review response dto 추가
sjhjack Sep 15, 2024
f7f6b41
Feat(#21): review service interface 추가
sjhjack Sep 15, 2024
2e68e0b
Chore(#21): domain 단에서 web 제거
sjhjack Sep 15, 2024
9a835d0
Refactor(#21): Member Entity에 Getter 추가 및 import 스타일 변경
sjhjack Sep 21, 2024
02a7cfa
Feat(#21): Review Entity에 of, updateTitle 메서드 추가
sjhjack Sep 21, 2024
f894c6f
Feat(#21): ReviewContents Document에 of, updateContents 메서드 추가
sjhjack Sep 21, 2024
d2975f0
Refactor(#21): 파라미터 id값 타입 int -> long 변경
sjhjack Sep 21, 2024
1308d6e
Refactor(#21): ReviewResponse의 썸네일 타입 Object -> ReviewContent 변경
sjhjack Sep 21, 2024
e728b56
Refactor(#21): ReviewController 위치 변경
sjhjack Sep 21, 2024
e11edb9
Feat(#21): ReviewException 추가
sjhjack Sep 21, 2024
b514883
Feat(#21): Review Service, Repository 추가(MemberSchedule 제거)
sjhjack Sep 21, 2024
bf8f5cd
Refactor(#21): ReviewDetailResponse의 members 제거
sjhjack Sep 21, 2024
6ebb67c
Refactor(#21): ReviewServiceImpl에 ReviewUtils 적용
sjhjack Sep 21, 2024
1ed48db
Refactor(#21): getReviewsByScheduleId 내부 로직 수정
sjhjack Sep 21, 2024
abe2ec2
Refactor(#23): ReviewModifyService의 id 파라미터 long으로 변경
sjhjack Sep 22, 2024
c0876a7
Feat(#23): AuthMember 추가
sjhjack Sep 22, 2024
c1961e7
Refactor(#23): ReviewController return type WyplResponseEntity로 변경
sjhjack Sep 22, 2024
bfbb909
Refactor(#23): ReviewReadService 구현체 파라미터 변경
sjhjack Sep 22, 2024
2ed9ffa
Feat(#23): Athenticated annotation 추가
sjhjack Sep 22, 2024
d4b80e3
Feat(#23): AuthenticatedArgumentResolver 추가 및 등록
sjhjack Sep 22, 2024
0498840
Refactor(#23): ReviewController에 Authenticated annotation 적용
sjhjack Sep 22, 2024
5da993e
Feat(#23): H2, embedded MongoDB 설정 추가
sjhjack Sep 22, 2024
3de1fe7
Remove(#23): Test 삭제
sjhjack Sep 22, 2024
41fe063
Refactor(#23): Member entity의 id -> member_id 변경
sjhjack Sep 22, 2024
5071029
Refactor(#23): memberId, scheduleId -> member, schedule 로 파라미터 변경
sjhjack Sep 22, 2024
2e4f224
Refactor(#23): ReviewListResponse 줄바꿈
sjhjack Sep 22, 2024
b23936b
Merge branch 'dev' into feat/#23
sjhjack Sep 22, 2024
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
6 changes: 4 additions & 2 deletions application/wypl-core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ java {

dependencies {
implementation project(':application:application-common')
implementation project(':common')
implementation project(':domain:jpa-common')
implementation project(':domain:jpa-member-domain')
implementation project(':domain:mongo-common')
implementation project(':domain:jpamongo-review-domain')
implementation project(':domain:jpa-calendar-domain')
implementation project(':domain:jpa-member-domain')
implementation project(':common')
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

@SpringBootApplication
@EnableJpaRepositories(basePackages = {"com.wypl"})
@EnableMongoRepositories(basePackages = {"com.wypl"})
public class WyplCoreApplication {

public static void main(String[] args) {
SpringApplication.run(WyplCoreApplication.class, args);
}

public static void main(String[] args) {
SpringApplication.run(WyplCoreApplication.class, args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.wypl.wyplcore.auth.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Authenticated {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.wypl.wyplcore.auth.domain;

public record AuthMember(
long id
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.wypl.wyplcore.auth.utils;

import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import com.wypl.wyplcore.auth.annotation.Authenticated;
import com.wypl.wyplcore.auth.domain.AuthMember;

@Component
public class AuthenticatedArgumentResolver implements HandlerMethodArgumentResolver {

@Override
public boolean supportsParameter(MethodParameter parameter) {
boolean hasParameterAnnotation = parameter.hasParameterAnnotation(Authenticated.class);
boolean assignableFrom = AuthMember.class.isAssignableFrom(parameter.getParameterType());
return hasParameterAnnotation && assignableFrom;
}

@Override
public AuthMember resolveArgument(
MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory
) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.wypl.wyplcore.global.config;

import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.wypl.wyplcore.auth.utils.AuthenticatedArgumentResolver;

@Configuration
public class WebConfig implements WebMvcConfigurer {

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new AuthenticatedArgumentResolver());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package com.wypl.wyplcore.review.controller;

import java.time.LocalDate;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
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 com.wypl.applicationcommon.WyplResponseEntity;
import com.wypl.wyplcore.auth.annotation.Authenticated;
import com.wypl.wyplcore.auth.domain.AuthMember;
import com.wypl.wyplcore.review.data.request.ReviewCreateRequest;
import com.wypl.wyplcore.review.data.request.ReviewType;
import com.wypl.wyplcore.review.data.request.ReviewUpdateRequest;
import com.wypl.wyplcore.review.data.response.ReviewDetailResponse;
import com.wypl.wyplcore.review.data.response.ReviewIdResponse;
import com.wypl.wyplcore.review.data.response.ReviewListResponse;
import com.wypl.wyplcore.review.service.ReviewModifyService;
import com.wypl.wyplcore.review.service.ReviewReadService;

import lombok.RequiredArgsConstructor;

@RestController
@RequiredArgsConstructor
@RequestMapping("/review")
public class ReviewController {

private final ReviewModifyService reviewModifyService;
private final ReviewReadService reviewReadService;

@PostMapping
public WyplResponseEntity<ReviewIdResponse> createReview(
@Authenticated AuthMember authMember,
@RequestBody ReviewCreateRequest reviewCreateRequest
) {
ReviewIdResponse response = reviewModifyService.createReview(authMember.id(), reviewCreateRequest);
return WyplResponseEntity.created(response, "리뷰 등록에 성공했습니다.");
}

@PatchMapping("/{reviewId}")
public WyplResponseEntity<ReviewIdResponse> updateReview(
@Authenticated AuthMember authMember,
@PathVariable int reviewId,
@RequestBody ReviewUpdateRequest reviewUpdateRequest
) {
ReviewIdResponse response = reviewModifyService.updateReview(authMember.id(), reviewId, reviewUpdateRequest);
return WyplResponseEntity.ok(response, "리뷰 수정에 성공했습니다.");
}

@DeleteMapping("/{reviewId}")
public WyplResponseEntity<ReviewIdResponse> deleteReview(
@Authenticated AuthMember authMember,
@PathVariable("reviewId") int reviewId
) {
ReviewIdResponse response = reviewModifyService.deleteReview(authMember.id(), reviewId);
return WyplResponseEntity.ok(response, "리뷰 삭제에 성공 했습니다.");
}

@GetMapping("/detail/{reviewId}")
public WyplResponseEntity<ReviewDetailResponse> getDetailReview(
@Authenticated AuthMember authMember,
@PathVariable int reviewId
) {
ReviewDetailResponse response = reviewReadService.getDetailReview(authMember.id(), reviewId);
return WyplResponseEntity.ok(response, "리뷰 상세 조회에 성공했습니다.");
}

@GetMapping("/{type}")
public WyplResponseEntity<ReviewListResponse> getReviewsByMemberId(
@Authenticated AuthMember authMember,
@PathVariable("type") ReviewType reviewType,
@RequestParam(value = "lastReviewId", required = false) Long lastReviewId,
@RequestParam(value = "startDate", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
@RequestParam(value = "startDate", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate
) {
ReviewListResponse response = reviewReadService.getReviews(authMember.id(), lastReviewId, reviewType, startDate,
endDate);
return WyplResponseEntity.ok(response, "리뷰 목록 조회에 성공했습니다.");
}

@GetMapping("/{type}/{scheduleId}")
public WyplResponseEntity<ReviewListResponse> getReviewsBySchedule(
@Authenticated AuthMember authMember,
@PathVariable("type") ReviewType reviewType,
@PathVariable("scheduleId") long scheduleId
) {
ReviewListResponse response = reviewReadService.getReviewsByScheduleId(authMember.id(), scheduleId,
reviewType);
return WyplResponseEntity.ok(response, "일정 별 리뷰 조회에 성공했습니다.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.wypl.wyplcore.review.data.request;

import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.wypl.jpamongoreviewdomain.reviewcontents.domain.ReviewContent;

import lombok.Builder;

@Builder
public record ReviewCreateRequest(

String title,

@JsonProperty("schedule_id")
int scheduleId,

List<Map<String, ReviewContent>> contents

) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.wypl.wyplcore.review.data.request;

public enum ReviewType {
NEWEST,

OLDEST
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.wypl.wyplcore.review.data.request;

import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.wypl.jpamongoreviewdomain.reviewcontents.domain.ReviewContent;

public record ReviewUpdateRequest(
String title,

@JsonProperty("schedule_id")
int scheduleId,

List<Map<String, ReviewContent>> contents
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.wypl.wyplcore.review.data.response;

import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.wypl.jpacalendardomain.schedule.domain.Schedule;
import com.wypl.jpamongoreviewdomain.review.domain.Review;
import com.wypl.jpamongoreviewdomain.reviewcontents.domain.ReviewContent;

import lombok.Builder;

@Builder
public record ReviewDetailResponse(
@JsonProperty("review_id")
long reviewId,

String title,

// Todo : import 후 주석 해제
// ScheduleResponse schedule,

List<Map<String, ReviewContent>> contents
) {
public static ReviewDetailResponse of(Review review, Schedule schedule,
List<Map<String, ReviewContent>> reviewContents) {
return ReviewDetailResponse.builder()
.reviewId(review.getReviewId())
.title(review.getTitle())
// Todo : import 후 주석 해제
// .schedule(ScheduleResponse.from(schedule))
.contents(reviewContents)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.wypl.wyplcore.review.data.response;

import com.fasterxml.jackson.annotation.JsonProperty;

public record ReviewIdResponse(
@JsonProperty("review_id")
long reviewId
) {
public static ReviewIdResponse from(long reviewId) {
return new ReviewIdResponse(reviewId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.wypl.wyplcore.review.data.response;

import java.util.List;

import com.fasterxml.jackson.annotation.JsonProperty;

public record ReviewListResponse(

@JsonProperty("review_count")
int reviewCount,

List<ReviewResponse> reviews
) {
public static ReviewListResponse from(List<ReviewResponse> reviews) {
return new ReviewListResponse(reviews.size(), reviews);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.wypl.wyplcore.review.data.response;

import java.time.LocalDateTime;
import java.util.Map;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.wypl.jpamongoreviewdomain.review.domain.Review;
import com.wypl.jpamongoreviewdomain.reviewcontents.domain.ReviewContent;

import lombok.Builder;

@Builder
public record ReviewResponse(
@JsonProperty("review_id")
long reviewId,

@JsonProperty("created_at")
LocalDateTime createdAt,

String title,

@JsonProperty("thumbnail_content")
Map<String, ReviewContent> thumbnailContent
) {
public static ReviewResponse from(Review review, Map<String, ReviewContent> thumbnailContent) {
return ReviewResponse.builder()
.createdAt(LocalDateTime.now())
.reviewId(review.getReviewId())
.title(review.getTitle())
.thumbnailContent(thumbnailContent)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.wypl.wyplcore.review.exception;

import com.wypl.common.exception.ServerErrorCode;

import lombok.Getter;

@Getter
public enum ReviewErrorCode implements ServerErrorCode {
EMPTY_CONTENTS(500, "REVIEW_001", "작성된 내용이 없습니다."),
INVALID_TITLE(500, "REVIEW_002", "제목의 길이가 올바르지 않습니다."),
NO_SUCH_REVIEW(500, "REVIEW_003", "존재하지 않는 회고입니다.")
;

private final int statusCode;
private final String errorCode;
private final String message;

ReviewErrorCode(int statusCode, String errorCode, String message) {
this.statusCode = statusCode;
this.errorCode = errorCode;
this.message = message;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.wypl.wyplcore.review.exception;

import com.wypl.common.exception.ServerErrorCode;
import com.wypl.common.exception.WyplException;

public class ReviewException extends WyplException {
public ReviewException(ServerErrorCode serverErrorCode) {
super(serverErrorCode);
}
}
Loading
Loading