Skip to content

Commit

Permalink
feat : 책 평가 등록
Browse files Browse the repository at this point in the history
  • Loading branch information
f1v3-dev committed Feb 7, 2025
1 parent 9b0a7f7 commit 78d129c
Show file tree
Hide file tree
Showing 6 changed files with 155 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.dnd.sbooky.api.evaluation;

import com.dnd.sbooky.api.evaluation.request.RegisterEvaluationRequest;
import com.dnd.sbooky.api.support.response.ApiResponse;
import io.swagger.v3.oas.annotations.Parameter;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
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.RestController;


@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class RegisterEvaluationController {

private final RegisterEvaluationUseCase registerEvaluationUseCase;

@PostMapping("/books/{memberBookId}/evaluation")
public ApiResponse<?> registerEvaluation(
@PathVariable Long memberBookId,
@Valid @RequestBody RegisterEvaluationRequest request,
@Parameter(hidden = true) @AuthenticationPrincipal UserDetails user) {

registerEvaluationUseCase.register(memberBookId, extractMemberId(user), request);
return ApiResponse.success();
}


private Long extractMemberId(UserDetails user) {
return Long.valueOf(user.getUsername());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.dnd.sbooky.api.evaluation;

import com.dnd.sbooky.api.book.exception.BookNotFoundException;
import com.dnd.sbooky.api.evaluation.request.RegisterEvaluationRequest;
import com.dnd.sbooky.api.support.error.ErrorType;
import com.dnd.sbooky.core.book.MemberBookEntity;
import com.dnd.sbooky.core.book.MemberBookRepository;
import com.dnd.sbooky.core.evaluation.BookEvaluationEntity;
import com.dnd.sbooky.core.evaluation.BookEvaluationRepository;
import com.dnd.sbooky.core.evaluation.EvaluationRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional
public class RegisterEvaluationUseCase {

private final MemberBookRepository memberBookRepository;
private final BookEvaluationRepository bookEvaluationRepository;
private final EvaluationRepository evaluationRepository;

public void register(Long memberBookId, Long memberId, RegisterEvaluationRequest request) {

MemberBookEntity memberBook =
memberBookRepository
.findById(memberBookId)
.orElseThrow(() -> new BookNotFoundException(ErrorType.BOOK_NOT_FOUND));

request.keywordIds().forEach(keywordId -> {
EvaluationevaluationRepository.findById(keywordId)
.orElseThrow(() -> new EvaluationKeywordNotFoundException(ErrorType.EVALUATION_KEYWORD_NOT_FOUND));
bookEvaluationRepository.save(BookEvaluationEntity.newInstance(memberBook, ))
});

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.dnd.sbooky.api.evaluation.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.util.List;

@Schema(description = "평가 등록 요청 DTO")
public record RegisterEvaluationRequest(
@Schema(description = "평가 키워드 아이디 리스트")
@NotNull
@Size(min = 1, max = 6, message = "평가 키워드는 1개 이상 6개 이하로 등록해주세요.")
List<Long> keywordIds
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.dnd.sbooky.core.evaluation;

import com.dnd.sbooky.core.book.MemberBookEntity;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;


@Getter
@Entity
@Table(name = "book_evaluation")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class BookEvaluationEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_book_id")
private MemberBookEntity memberBook;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "evaluation_id")
private Evaluation evaluation;

private BookEvaluationEntity(MemberBookEntity memberBookEntity, Evaluation evaluation) {
this.memberBook = memberBookEntity;
this.evaluation = evaluation;
}

public static BookEvaluationEntity newInstance(MemberBookEntity memberBookEntity, Evaluation evaluation) {
return new BookEvaluationEntity(memberBookEntity, evaluation);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.dnd.sbooky.core.evaluation;

import org.springframework.data.jpa.repository.JpaRepository;


public interface BookEvaluationRepository extends JpaRepository<BookEvaluationEntity, Long> {

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.dnd.sbooky.core.evaluation;

import java.util.Arrays;
import lombok.Getter;

@Getter
Expand Down Expand Up @@ -29,4 +30,13 @@ public enum EvaluationKeyword {
this.type = type;
this.description = description;
}


public static EvaluationKeyword fromId(Long id) {
return Arrays.stream(values())
.filter(keyword -> keyword.getId().equals(id))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("Invalid evaluation ID: " + id));
}

}

0 comments on commit 78d129c

Please sign in to comment.