Skip to content

Commit

Permalink
Merge pull request #63 from dnd-side-project/feat/#57-book
Browse files Browse the repository at this point in the history
책을 삭제한다.
  • Loading branch information
f1v3-dev authored Feb 5, 2025
2 parents f2c2203 + 2ce554e commit f7ef46d
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.dnd.sbooky.api.book;

import com.dnd.sbooky.api.docs.spec.DeleteBookApiSpec;
import com.dnd.sbooky.api.support.response.ApiResponse;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class DeleteBookController implements DeleteBookApiSpec {

private final DeleteBookUseCase deleteBookUseCase;

@DeleteMapping("/books/{memberBookId}")
public ApiResponse<?> deleteBook(
@PathVariable Long memberBookId,
@Parameter(hidden = true) @AuthenticationPrincipal UserDetails user) {

deleteBookUseCase.delete(extractMemberId(user), memberBookId);
return ApiResponse.success();
}

private Long extractMemberId(UserDetails user) {
return Long.parseLong(user.getUsername());
}
}
30 changes: 30 additions & 0 deletions api/src/main/java/com/dnd/sbooky/api/book/DeleteBookUseCase.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.dnd.sbooky.api.book;

import com.dnd.sbooky.api.book.exception.BookForbiddenException;
import com.dnd.sbooky.api.book.exception.BookNotFoundException;
import com.dnd.sbooky.api.support.error.ErrorType;
import com.dnd.sbooky.core.book.MemberBookEntity;
import com.dnd.sbooky.core.book.MemberBookRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class DeleteBookUseCase {

private final MemberBookRepository memberBookRepository;

public void delete(Long memberId, Long memberBookId) {

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

if (!memberBook.isSameMember(memberId)) {
throw new BookForbiddenException(ErrorType.BOOK_ACCESS_FORBIDDEN);
}

memberBookRepository.delete(memberBook);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.dnd.sbooky.api.docs.spec;

import com.dnd.sbooky.api.support.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.core.userdetails.UserDetails;

@Tag(name = "[Book API]", description = "책 삭제에 관련된 API")
@SecurityRequirement(name = "access-token")
public interface DeleteBookApiSpec {

@Operation(summary = "책 삭제", description = "회원이 등록한 책을 삭제한다.")
ApiResponse<?> deleteBook(Long memberBookId, UserDetails user);
}

0 comments on commit f7ef46d

Please sign in to comment.