Skip to content

Commit 5542b9c

Browse files
authored
feat: 독서기록 목록조회 컬럼추가 (#62)
* [BOOK-189] feat: domain,infra - 독서기록목록조회 response에 썸네일,제목,저자 컬럼추가(#58) * [BOOK-189] refactor: infra - 알라딘 API조회 시 썸네일 cover big으로 화질좋은 썸네일 설정 (#58)
1 parent 46978d1 commit 5542b9c

File tree

6 files changed

+56
-9
lines changed

6 files changed

+56
-9
lines changed

apis/src/main/kotlin/org/yapp/apis/readingrecord/dto/response/ReadingRecordResponse.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,16 @@ data class ReadingRecordResponse private constructor(
3030
val createdAt: String,
3131

3232
@Schema(description = "수정 일시", example = "2023-01-01T12:00:00")
33-
val updatedAt: String
33+
val updatedAt: String,
34+
35+
@Schema(description = "도서 제목", example = "클린 코드")
36+
val bookTitle: String?,
37+
38+
@Schema(description = "출판사", example = "인사이트")
39+
val bookPublisher: String?,
40+
41+
@Schema(description = "도서 썸네일 URL", example = "https://example.com/book-cover.jpg")
42+
val bookCoverImageUrl: String?
3443
) {
3544
companion object {
3645
private val dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME
@@ -44,7 +53,10 @@ data class ReadingRecordResponse private constructor(
4453
review = readingRecordInfoVO.review.value,
4554
emotionTags = readingRecordInfoVO.emotionTags,
4655
createdAt = readingRecordInfoVO.createdAt.format(dateTimeFormatter),
47-
updatedAt = readingRecordInfoVO.updatedAt.format(dateTimeFormatter)
56+
updatedAt = readingRecordInfoVO.updatedAt.format(dateTimeFormatter),
57+
bookTitle = readingRecordInfoVO.bookTitle,
58+
bookPublisher = readingRecordInfoVO.bookPublisher,
59+
bookCoverImageUrl = readingRecordInfoVO.bookCoverImageUrl
4860
)
4961
}
5062
}

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

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,16 @@ import org.yapp.domain.readingrecordtag.ReadingRecordTag
77
import org.yapp.domain.readingrecordtag.ReadingRecordTagRepository
88
import org.yapp.domain.tag.Tag
99
import org.yapp.domain.tag.TagRepository
10+
import org.yapp.domain.userbook.UserBookRepository
1011
import org.yapp.globalutils.annotation.DomainService
1112
import java.util.UUID
1213

1314
@DomainService
1415
class ReadingRecordDomainService(
1516
private val readingRecordRepository: ReadingRecordRepository,
1617
private val tagRepository: TagRepository,
17-
private val readingRecordTagRepository: ReadingRecordTagRepository
18+
private val readingRecordTagRepository: ReadingRecordTagRepository,
19+
private val userBookRepository: UserBookRepository
1820
) {
1921

2022
fun createReadingRecord(
@@ -46,7 +48,15 @@ class ReadingRecordDomainService(
4648
}
4749
readingRecordTagRepository.saveAll(readingRecordTags)
4850

49-
return ReadingRecordInfoVO.newInstance(savedReadingRecord, tags.map { it.name })
51+
val userBook = userBookRepository.findById(userBookId)
52+
53+
return ReadingRecordInfoVO.newInstance(
54+
readingRecord = savedReadingRecord,
55+
emotionTags = tags.map { it.name },
56+
bookTitle = userBook?.title,
57+
bookPublisher = userBook?.publisher,
58+
bookCoverImageUrl = userBook?.coverImageUrl
59+
)
5060
}
5161

5262
fun findReadingRecordsByDynamicCondition(
@@ -55,11 +65,21 @@ class ReadingRecordDomainService(
5565
pageable: Pageable
5666
): Page<ReadingRecordInfoVO> {
5767
val page = readingRecordRepository.findReadingRecordsByDynamicCondition(userBookId, sort, pageable)
68+
69+
// Get the UserBook entity to get the book thumbnail, title, and publisher
70+
val userBook = userBookRepository.findById(userBookId)
71+
5872
return page.map { readingRecord ->
5973
val readingRecordTags = readingRecordTagRepository.findByReadingRecordId(readingRecord.id.value)
6074
val tagIds = readingRecordTags.map { it.tagId.value }
6175
val tags = tagRepository.findByIds(tagIds)
62-
ReadingRecordInfoVO.newInstance(readingRecord, tags.map { it.name })
76+
ReadingRecordInfoVO.newInstance(
77+
readingRecord = readingRecord,
78+
emotionTags = tags.map { it.name },
79+
bookTitle = userBook?.title,
80+
bookPublisher = userBook?.publisher,
81+
bookCoverImageUrl = userBook?.coverImageUrl
82+
)
6383
}
6484
}
6585

domain/src/main/kotlin/org/yapp/domain/readingrecord/vo/ReadingRecordInfoVO.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ data class ReadingRecordInfoVO private constructor(
1111
val review: ReadingRecord.Review,
1212
val emotionTags: List<String>,
1313
val createdAt: LocalDateTime,
14-
val updatedAt: LocalDateTime
14+
val updatedAt: LocalDateTime,
15+
val bookTitle: String? = null,
16+
val bookPublisher: String? = null,
17+
val bookCoverImageUrl: String? = null
1518
) {
1619
init {
1720
require(emotionTags.size <= 3) { "Maximum 3 emotion tags are allowed" }
@@ -23,7 +26,10 @@ data class ReadingRecordInfoVO private constructor(
2326
companion object {
2427
fun newInstance(
2528
readingRecord: ReadingRecord,
26-
emotionTags: List<String>
29+
emotionTags: List<String>,
30+
bookTitle: String? = null,
31+
bookPublisher: String? = null,
32+
bookCoverImageUrl: String? = null
2733
): ReadingRecordInfoVO {
2834
return ReadingRecordInfoVO(
2935
id = readingRecord.id,
@@ -33,7 +39,10 @@ data class ReadingRecordInfoVO private constructor(
3339
review = readingRecord.review,
3440
emotionTags = emotionTags,
3541
createdAt = readingRecord.createdAt ?: throw IllegalStateException("createdAt은 null일 수 없습니다."),
36-
updatedAt = readingRecord.updatedAt ?: throw IllegalStateException("updatedAt은 null일 수 없습니다.")
42+
updatedAt = readingRecord.updatedAt ?: throw IllegalStateException("updatedAt은 null일 수 없습니다."),
43+
bookTitle = bookTitle,
44+
bookPublisher = bookPublisher,
45+
bookCoverImageUrl = bookCoverImageUrl
3746
)
3847
}
3948
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ interface UserBookRepository {
1010
fun findByUserIdAndBookIsbn(userId: UUID, isbn: String): UserBook?
1111
fun findByBookIdAndUserId(bookId: UUID, userId: UUID): UserBook?
1212
fun findByIdAndUserId(id: UUID, userId: UUID): UserBook?
13+
fun findById(id: UUID): UserBook?
1314

1415
fun save(userBook: UserBook): UserBook
1516

infra/src/main/kotlin/org/yapp/infra/external/aladin/AladinApi.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ class AladinApi(
2222

2323
fun lookupBook(request: AladinBookLookupRequest): Result<AladinBookDetailResponse> {
2424
return runCatching {
25-
val aladinApiParams = request.toMap()
25+
val aladinApiParams = request.toMap().toMutableMap()
26+
aladinApiParams["Cover"] = "Big"
2627
aladinRestClient.itemLookUp(ttbKey, aladinApiParams) // Map으로 전달
2728
}
2829
}

infra/src/main/kotlin/org/yapp/infra/userbook/repository/impl/UserBookRepositoryImpl.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ class UserBookRepositoryImpl(
2828
return jpaUserBookRepository.findByIdAndUserId(id, userId)?.toDomain()
2929
}
3030

31+
override fun findById(id: UUID): UserBook? {
32+
return jpaUserBookRepository.findById(id).orElse(null)?.toDomain()
33+
}
34+
3135
override fun save(userBook: UserBook): UserBook {
3236
val savedEntity = jpaUserBookRepository.saveAndFlush(UserBookEntity.fromDomain(userBook))
3337
return savedEntity.toDomain()

0 commit comments

Comments
 (0)