Skip to content

Commit 78d129c

Browse files
committed
feat : 책 평가 등록
1 parent 9b0a7f7 commit 78d129c

File tree

6 files changed

+155
-0
lines changed

6 files changed

+155
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.dnd.sbooky.api.evaluation;
2+
3+
import com.dnd.sbooky.api.evaluation.request.RegisterEvaluationRequest;
4+
import com.dnd.sbooky.api.support.response.ApiResponse;
5+
import io.swagger.v3.oas.annotations.Parameter;
6+
import jakarta.validation.Valid;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
9+
import org.springframework.security.core.userdetails.UserDetails;
10+
import org.springframework.web.bind.annotation.PathVariable;
11+
import org.springframework.web.bind.annotation.PostMapping;
12+
import org.springframework.web.bind.annotation.RequestBody;
13+
import org.springframework.web.bind.annotation.RequestMapping;
14+
import org.springframework.web.bind.annotation.RestController;
15+
16+
17+
@RestController
18+
@RequestMapping("/api")
19+
@RequiredArgsConstructor
20+
public class RegisterEvaluationController {
21+
22+
private final RegisterEvaluationUseCase registerEvaluationUseCase;
23+
24+
@PostMapping("/books/{memberBookId}/evaluation")
25+
public ApiResponse<?> registerEvaluation(
26+
@PathVariable Long memberBookId,
27+
@Valid @RequestBody RegisterEvaluationRequest request,
28+
@Parameter(hidden = true) @AuthenticationPrincipal UserDetails user) {
29+
30+
registerEvaluationUseCase.register(memberBookId, extractMemberId(user), request);
31+
return ApiResponse.success();
32+
}
33+
34+
35+
private Long extractMemberId(UserDetails user) {
36+
return Long.valueOf(user.getUsername());
37+
}
38+
39+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.dnd.sbooky.api.evaluation;
2+
3+
import com.dnd.sbooky.api.book.exception.BookNotFoundException;
4+
import com.dnd.sbooky.api.evaluation.request.RegisterEvaluationRequest;
5+
import com.dnd.sbooky.api.support.error.ErrorType;
6+
import com.dnd.sbooky.core.book.MemberBookEntity;
7+
import com.dnd.sbooky.core.book.MemberBookRepository;
8+
import com.dnd.sbooky.core.evaluation.BookEvaluationEntity;
9+
import com.dnd.sbooky.core.evaluation.BookEvaluationRepository;
10+
import com.dnd.sbooky.core.evaluation.EvaluationRepository;
11+
import lombok.RequiredArgsConstructor;
12+
import org.springframework.stereotype.Service;
13+
import org.springframework.transaction.annotation.Transactional;
14+
15+
@Service
16+
@RequiredArgsConstructor
17+
@Transactional
18+
public class RegisterEvaluationUseCase {
19+
20+
private final MemberBookRepository memberBookRepository;
21+
private final BookEvaluationRepository bookEvaluationRepository;
22+
private final EvaluationRepository evaluationRepository;
23+
24+
public void register(Long memberBookId, Long memberId, RegisterEvaluationRequest request) {
25+
26+
MemberBookEntity memberBook =
27+
memberBookRepository
28+
.findById(memberBookId)
29+
.orElseThrow(() -> new BookNotFoundException(ErrorType.BOOK_NOT_FOUND));
30+
31+
request.keywordIds().forEach(keywordId -> {
32+
EvaluationevaluationRepository.findById(keywordId)
33+
.orElseThrow(() -> new EvaluationKeywordNotFoundException(ErrorType.EVALUATION_KEYWORD_NOT_FOUND));
34+
bookEvaluationRepository.save(BookEvaluationEntity.newInstance(memberBook, ))
35+
});
36+
37+
}
38+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.dnd.sbooky.api.evaluation.request;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotNull;
5+
import jakarta.validation.constraints.Size;
6+
import java.util.List;
7+
8+
@Schema(description = "평가 등록 요청 DTO")
9+
public record RegisterEvaluationRequest(
10+
@Schema(description = "평가 키워드 아이디 리스트")
11+
@NotNull
12+
@Size(min = 1, max = 6, message = "평가 키워드는 1개 이상 6개 이하로 등록해주세요.")
13+
List<Long> keywordIds
14+
) {
15+
16+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.dnd.sbooky.core.evaluation;
2+
3+
import com.dnd.sbooky.core.book.MemberBookEntity;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.FetchType;
6+
import jakarta.persistence.GeneratedValue;
7+
import jakarta.persistence.GenerationType;
8+
import jakarta.persistence.Id;
9+
import jakarta.persistence.JoinColumn;
10+
import jakarta.persistence.ManyToOne;
11+
import jakarta.persistence.Table;
12+
import lombok.AccessLevel;
13+
import lombok.Getter;
14+
import lombok.NoArgsConstructor;
15+
16+
17+
@Getter
18+
@Entity
19+
@Table(name = "book_evaluation")
20+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
21+
public class BookEvaluationEntity {
22+
23+
@Id
24+
@GeneratedValue(strategy = GenerationType.IDENTITY)
25+
private Long id;
26+
27+
@ManyToOne(fetch = FetchType.LAZY)
28+
@JoinColumn(name = "member_book_id")
29+
private MemberBookEntity memberBook;
30+
31+
@ManyToOne(fetch = FetchType.LAZY)
32+
@JoinColumn(name = "evaluation_id")
33+
private Evaluation evaluation;
34+
35+
private BookEvaluationEntity(MemberBookEntity memberBookEntity, Evaluation evaluation) {
36+
this.memberBook = memberBookEntity;
37+
this.evaluation = evaluation;
38+
}
39+
40+
public static BookEvaluationEntity newInstance(MemberBookEntity memberBookEntity, Evaluation evaluation) {
41+
return new BookEvaluationEntity(memberBookEntity, evaluation);
42+
}
43+
44+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.dnd.sbooky.core.evaluation;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
6+
public interface BookEvaluationRepository extends JpaRepository<BookEvaluationEntity, Long> {
7+
8+
}

core/src/main/java/com/dnd/sbooky/core/evaluation/EvaluationKeyword.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.dnd.sbooky.core.evaluation;
22

3+
import java.util.Arrays;
34
import lombok.Getter;
45

56
@Getter
@@ -29,4 +30,13 @@ public enum EvaluationKeyword {
2930
this.type = type;
3031
this.description = description;
3132
}
33+
34+
35+
public static EvaluationKeyword fromId(Long id) {
36+
return Arrays.stream(values())
37+
.filter(keyword -> keyword.getId().equals(id))
38+
.findFirst()
39+
.orElseThrow(() -> new IllegalArgumentException("Invalid evaluation ID: " + id));
40+
}
41+
3242
}

0 commit comments

Comments
 (0)