Skip to content

Commit a27f214

Browse files
authored
feat: 내서제 도서 삭제 기능을 개발합니다. (#95)
* feat: apis - 내서재 삭제 기능 개발(#92) * feat: domain - 내서재 삭제 기능 개발(#92) * feat: infra - 내서재 삭제 기능 개발(#92) * [BOOK-261] refactor: apis,domain recordingDomainservice 분리 (#95) * [BOOK-261] refactor: aps - 책 기록 먼저 삭제(#95)
1 parent c0bbc2e commit a27f214

File tree

13 files changed

+75
-4
lines changed

13 files changed

+75
-4
lines changed

apis/src/main/kotlin/org/yapp/apis/book/controller/BookController.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ import org.springframework.data.domain.Sort
66
import org.springframework.data.web.PageableDefault
77
import org.springframework.http.ResponseEntity
88
import org.springframework.security.core.annotation.AuthenticationPrincipal
9+
import org.springframework.web.bind.annotation.DeleteMapping
910
import org.springframework.web.bind.annotation.GetMapping
1011
import org.springframework.web.bind.annotation.ModelAttribute
12+
import org.springframework.web.bind.annotation.PathVariable
1113
import org.springframework.web.bind.annotation.PutMapping
1214
import org.springframework.web.bind.annotation.RequestBody
1315
import org.springframework.web.bind.annotation.RequestMapping
@@ -70,4 +72,13 @@ class BookController(
7072
return ResponseEntity.ok(response)
7173
}
7274

75+
@DeleteMapping("/my-library/{userBookId}")
76+
override fun deleteBookFromMyLibrary(
77+
@AuthenticationPrincipal userId: UUID,
78+
@PathVariable userBookId: UUID,
79+
): ResponseEntity<Unit> {
80+
bookUseCase.deleteBookFromMyLibrary(userId, userBookId)
81+
return ResponseEntity.noContent().build()
82+
}
83+
7384
}

apis/src/main/kotlin/org/yapp/apis/book/controller/BookControllerApi.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,24 @@ interface BookControllerApi {
140140
@PageableDefault(size = 10, sort = ["createdAt"], direction = Sort.Direction.DESC)
141141
pageable: Pageable
142142
): ResponseEntity<UserBookPageResponse>
143+
144+
@Operation(summary = "내 서재에 저장한 도서 삭제", description = "내 서재에 저장한 도서를 삭제합니다.")
145+
@ApiResponses(
146+
value = [
147+
ApiResponse(
148+
responseCode = "204",
149+
description = "성공적으로 도서를 삭제했습니다."
150+
),
151+
ApiResponse(
152+
responseCode = "404",
153+
description = "해당하는 도서를 찾을 수 없습니다.",
154+
content = [Content(schema = Schema(implementation = ErrorResponse::class))]
155+
)
156+
]
157+
)
158+
@DeleteMapping("/my-library/{userBookId}")
159+
fun deleteBookFromMyLibrary(
160+
@AuthenticationPrincipal userId: UUID,
161+
@Parameter(description = "삭제할 도서 ID") @PathVariable userBookId: UUID
162+
): ResponseEntity<Unit>
143163
}

apis/src/main/kotlin/org/yapp/apis/book/service/UserBookService.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,9 @@ class UserBookService(
8383
completedCount = userBookStatusCountsVO.completedCount
8484
)
8585
}
86+
87+
fun deleteUserBook(userBookId: UUID, userId: UUID) {
88+
validateUserBookExists(userBookId, userId)
89+
userBookDomainService.deleteById(userBookId)
90+
}
8691
}

apis/src/main/kotlin/org/yapp/apis/book/usecase/BookUseCase.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import org.yapp.apis.book.dto.response.UserBookResponse
1313
import org.yapp.apis.book.service.BookManagementService
1414
import org.yapp.apis.book.service.BookQueryService
1515
import org.yapp.apis.book.service.UserBookService
16+
import org.yapp.apis.readingrecord.service.ReadingRecordService
1617
import org.yapp.apis.user.service.UserService
1718
import org.yapp.domain.userbook.BookStatus
1819
import org.yapp.domain.userbook.UserBookSortType
@@ -26,7 +27,8 @@ class BookUseCase(
2627
private val bookQueryService: BookQueryService,
2728
private val userService: UserService,
2829
private val userBookService: UserBookService,
29-
private val bookManagementService: BookManagementService
30+
private val bookManagementService: BookManagementService,
31+
private val readingRecordService: ReadingRecordService
3032
) {
3133
fun searchBooks(
3234
request: BookSearchRequest
@@ -84,6 +86,16 @@ class BookUseCase(
8486
return userBookService.findUserBooksByDynamicConditionWithStatusCounts(userId, status, sort, title, pageable)
8587
}
8688

89+
@Transactional
90+
fun deleteBookFromMyLibrary(
91+
userId: UUID,
92+
userBookId: UUID
93+
) {
94+
userService.validateUserExists(userId)
95+
readingRecordService.deleteAllByUserBookId(userBookId)
96+
userBookService.deleteUserBook(userBookId, userId)
97+
}
98+
8799
private fun mergeWithUserBookStatus(
88100
searchedBooks: List<BookSummary>,
89101
userId: UUID?

apis/src/main/kotlin/org/yapp/apis/readingrecord/service/ReadingRecordService.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ class ReadingRecordService(
4747
return page.map { ReadingRecordResponse.from(it) }
4848
}
4949

50+
fun deleteAllByUserBookId(userBookId: UUID) {
51+
readingRecordDomainService.deleteAllByUserBookId(userBookId)
52+
}
5053
fun updateReadingRecord(
5154
readingRecordId: UUID,
5255
request: UpdateReadingRecordRequest

apis/src/main/kotlin/org/yapp/apis/readingrecord/usecase/ReadingRecordUseCase.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.yapp.apis.readingrecord.usecase
22

3-
import org.springframework.data.domain.Page
43
import org.springframework.data.domain.Pageable
54
import org.springframework.transaction.annotation.Transactional
65
import org.yapp.apis.book.service.UserBookService

domain/src/main/kotlin/org/yapp/domain/readingrecord/ReadingRecordDomainService.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@ class ReadingRecordDomainService(
146146
return buildReadingRecordInfoVO(savedReadingRecord)
147147
}
148148

149+
fun deleteAllByUserBookId(userBookId: UUID) {
150+
readingRecordRepository.deleteAllByUserBookId(userBookId)
151+
}
149152
fun deleteReadingRecord(readingRecordId: UUID) {
150153
val readingRecord = readingRecordRepository.findById(readingRecordId)
151154
?: throw ReadingRecordNotFoundException(

domain/src/main/kotlin/org/yapp/domain/readingrecord/ReadingRecordRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ interface ReadingRecordRepository {
99

1010
fun save(readingRecord: ReadingRecord): ReadingRecord
1111

12+
fun deleteAllByUserBookId(userBookId: UUID)
1213

1314
fun findById(id: UUID): ReadingRecord?
1415

domain/src/main/kotlin/org/yapp/domain/userbook/UserBookDomainService.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ import org.yapp.domain.userbook.vo.HomeBookVO
66
import org.yapp.domain.userbook.vo.UserBookInfoVO
77
import org.yapp.domain.userbook.vo.UserBookStatusCountsVO
88
import org.yapp.globalutils.annotation.DomainService
9+
import org.yapp.domain.readingrecord.ReadingRecordRepository
910
import java.util.*
1011

1112
@DomainService
1213
class UserBookDomainService(
13-
private val userBookRepository: UserBookRepository
14+
private val userBookRepository: UserBookRepository,
1415
) {
1516
fun upsertUserBook(
1617
userId: UUID,
@@ -77,6 +78,10 @@ class UserBookDomainService(
7778
return userBookRepository.existsByIdAndUserId(userBookId, userId)
7879
}
7980

81+
fun deleteById(userBookId: UUID) {
82+
userBookRepository.deleteById(userBookId)
83+
}
84+
8085
fun findBooksWithRecordsOrderByLatest(userId: UUID): List<HomeBookVO> {
8186
val resultTriples = userBookRepository.findRecordedBooksSortedByRecency(userId)
8287

@@ -103,7 +108,8 @@ class UserBookDomainService(
103108
return userBooks.map { userBook ->
104109
HomeBookVO.newInstance(
105110
userBook = userBook,
106-
lastRecordedAt = userBook.updatedAt ?: throw IllegalStateException("UserBook의 updatedAt이 null입니다: ${userBook.id}"),
111+
lastRecordedAt = userBook.updatedAt
112+
?: throw IllegalStateException("UserBook의 updatedAt이 null입니다: ${userBook.id}"),
107113
recordCount = 0
108114
)
109115
}

domain/src/main/kotlin/org/yapp/domain/userbook/UserBookRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ interface UserBookRepository {
1212
fun existsByIdAndUserId(id: UUID, userId: UUID): Boolean
1313
fun findById(id: UUID): UserBook?
1414
fun save(userBook: UserBook): UserBook
15+
fun deleteById(id: UUID)
1516
fun findAllByUserId(userId: UUID): List<UserBook>
1617
fun findAllByUserIdAndBookIsbn13In(userId: UUID, bookIsbn13s: List<String>): List<UserBook>
1718
fun findUserBooksByDynamicCondition(

0 commit comments

Comments
 (0)