Skip to content

Commit ecbfa0b

Browse files
authored
Merge pull request #104 from YAPP-Github/BOOK-212-feature/#98
feat: 도서 상세화면 API 연동
2 parents 685e51e + e4074b3 commit ecbfa0b

File tree

68 files changed

+976
-619
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+976
-619
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ dependencies {
8686
projects.feature.screens,
8787
projects.feature.search,
8888
projects.feature.settings,
89+
projects.feature.splash,
8990
projects.feature.webview,
9091

9192
libs.androidx.activity.compose,

core/common/src/main/kotlin/com/ninecraft/booket/core/common/extensions/Emotion.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ fun Emotion.toTextColor(): Color {
77
return when (this) {
88
Emotion.WARM -> Color(0xFFE3931B)
99
Emotion.JOY -> Color(0xFFEE6B33)
10-
Emotion.TENSION -> Color(0xFF9A55E4)
11-
Emotion.SADNESS -> Color(0xFF2872E9)
10+
Emotion.SAD -> Color(0xFF9A55E4)
11+
Emotion.INSIGHT -> Color(0xFF2872E9)
1212
}
1313
}
1414

1515
fun Emotion.toBackgroundColor(): Color {
1616
return when (this) {
1717
Emotion.WARM -> Color(0xFFFFF5D3)
1818
Emotion.JOY -> Color(0xFFFFEBE3)
19-
Emotion.TENSION -> Color(0xFFF3E8FF)
20-
Emotion.SADNESS -> Color(0xFFE1ECFF)
19+
Emotion.SAD -> Color(0xFFF3E8FF)
20+
Emotion.INSIGHT -> Color(0xFFE1ECFF)
2121
}
2222
}

core/common/src/main/kotlin/com/ninecraft/booket/core/common/extensions/String.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ fun String.decodeHtmlEntities(): String {
1717
.replace(" ", " ")
1818
}
1919

20+
fun String.formatPublishYear(): String {
21+
val year = this.substringBefore("-")
22+
return "${year}"
23+
}
24+
2025
fun String.toFormattedDate(): String {
2126
return try {
2227
val inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSS")

core/common/src/main/kotlin/com/ninecraft/booket/core/common/util/EmotionAnalyzer.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,20 @@ data class EmotionAnalysisResult(
88
)
99

1010
enum class EmotionDisplayType {
11+
NONE, // 모든 감정의 count가 0
1112
SINGLE, // 1개 감정이 1위
1213
DUAL, // 2개 감정이 공동 1위
1314
BALANCED, // 3개 이상 감정이 공동 1위
1415
}
1516

1617
fun analyzeEmotions(emotions: List<EmotionModel>): EmotionAnalysisResult {
17-
if (emotions.isEmpty()) {
18-
return EmotionAnalysisResult(emptyList(), EmotionDisplayType.BALANCED)
18+
val maxCount = emotions.maxOf { it.count }
19+
20+
// 모든 감정의 count가 0인 경우
21+
if (maxCount == 0) {
22+
return EmotionAnalysisResult(emptyList(), EmotionDisplayType.NONE)
1923
}
2024

21-
val maxCount = emotions.maxOf { it.count }
2225
val topEmotions = emotions.filter { it.count == maxCount }
2326

2427
val displayType = when (topEmotions.size) {

core/data/api/src/main/kotlin/com/ninecraft/booket/core/data/api/repository/BookRepository.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package com.ninecraft.booket.core.data.api.repository
33
import com.ninecraft.booket.core.model.BookDetailModel
44
import com.ninecraft.booket.core.model.BookSearchModel
55
import com.ninecraft.booket.core.model.BookUpsertModel
6-
import kotlinx.coroutines.flow.Flow
6+
import com.ninecraft.booket.core.model.HomeModel
77
import com.ninecraft.booket.core.model.LibraryModel
8+
import com.ninecraft.booket.core.model.SeedModel
9+
import kotlinx.coroutines.flow.Flow
810

911
interface BookRepository {
1012
val bookRecentSearches: Flow<List<String>>
@@ -17,10 +19,10 @@ interface BookRepository {
1719

1820
suspend fun removeBookRecentSearch(query: String)
1921

20-
suspend fun getBookDetail(itemId: String): Result<BookDetailModel>
22+
suspend fun getBookDetail(isbn13: String): Result<BookDetailModel>
2123

2224
suspend fun upsertBook(
23-
bookIsbn: String,
25+
isbn13: String,
2426
bookStatus: String,
2527
): Result<BookUpsertModel>
2628

@@ -37,4 +39,8 @@ interface BookRepository {
3739
): Result<LibraryModel>
3840

3941
suspend fun removeLibraryRecentSearch(query: String)
42+
43+
suspend fun getHome(): Result<HomeModel>
44+
45+
suspend fun getSeedsStats(userBookId: String): Result<SeedModel>
4046
}

core/data/api/src/main/kotlin/com/ninecraft/booket/core/data/api/repository/HomeRepository.kt

Lines changed: 0 additions & 7 deletions
This file was deleted.

core/data/api/src/main/kotlin/com/ninecraft/booket/core/data/api/repository/RecordRepository.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package com.ninecraft.booket.core.data.api.repository
22

3-
import com.ninecraft.booket.core.model.RecordDetailModel
43
import com.ninecraft.booket.core.model.RecordRegisterModel
4+
import com.ninecraft.booket.core.model.ReadingRecordsModel
5+
import com.ninecraft.booket.core.model.RecordDetailModel
56

67
interface RecordRepository {
78
suspend fun postRecord(
@@ -12,6 +13,13 @@ interface RecordRepository {
1213
review: String,
1314
): Result<RecordRegisterModel>
1415

16+
suspend fun getReadingRecords(
17+
userBookId: String,
18+
sort: String,
19+
page: Int,
20+
size: Int,
21+
): Result<ReadingRecordsModel>
22+
1523
suspend fun getRecordDetail(
1624
readingRecordId: String,
1725
): Result<RecordDetailModel>

core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/di/RepositoryModule.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ package com.ninecraft.booket.core.data.impl.di
22

33
import com.ninecraft.booket.core.data.api.repository.AuthRepository
44
import com.ninecraft.booket.core.data.api.repository.BookRepository
5-
import com.ninecraft.booket.core.data.api.repository.HomeRepository
65
import com.ninecraft.booket.core.data.api.repository.RecordRepository
76
import com.ninecraft.booket.core.data.api.repository.UserRepository
87
import com.ninecraft.booket.core.data.impl.repository.DefaultAuthRepository
98
import com.ninecraft.booket.core.data.impl.repository.DefaultBookRepository
10-
import com.ninecraft.booket.core.data.impl.repository.DefaultHomeRepository
119
import com.ninecraft.booket.core.data.impl.repository.DefaultRecordRepository
1210
import com.ninecraft.booket.core.data.impl.repository.DefaultUserRepository
1311
import dagger.Binds
@@ -35,8 +33,4 @@ internal abstract class RepositoryModule {
3533
@Binds
3634
@Singleton
3735
abstract fun bindRecordRepository(defaultRecordRepository: DefaultRecordRepository): RecordRepository
38-
39-
@Binds
40-
@Singleton
41-
abstract fun bindHomeRepository(defaultHomeRepository: DefaultHomeRepository): HomeRepository
4236
}

core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/mapper/ResponseToModel.kt

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,36 @@ import com.ninecraft.booket.core.model.BookDetailModel
66
import com.ninecraft.booket.core.model.BookSearchModel
77
import com.ninecraft.booket.core.model.BookSummaryModel
88
import com.ninecraft.booket.core.model.BookUpsertModel
9+
import com.ninecraft.booket.core.model.Emotion
10+
import com.ninecraft.booket.core.model.EmotionModel
911
import com.ninecraft.booket.core.model.HomeModel
1012
import com.ninecraft.booket.core.model.LibraryBookSummaryModel
1113
import com.ninecraft.booket.core.model.LibraryBooksModel
1214
import com.ninecraft.booket.core.model.LibraryModel
1315
import com.ninecraft.booket.core.model.PageInfoModel
16+
import com.ninecraft.booket.core.model.ReadingRecordModel
17+
import com.ninecraft.booket.core.model.ReadingRecordsModel
1418
import com.ninecraft.booket.core.model.RecentBookModel
1519
import com.ninecraft.booket.core.model.RecordDetailModel
1620
import com.ninecraft.booket.core.model.RecordRegisterModel
21+
import com.ninecraft.booket.core.model.SeedModel
1722
import com.ninecraft.booket.core.model.UserProfileModel
1823
import com.ninecraft.booket.core.network.response.BookDetailResponse
1924
import com.ninecraft.booket.core.network.response.BookSearchResponse
2025
import com.ninecraft.booket.core.network.response.BookSummary
2126
import com.ninecraft.booket.core.network.response.BookUpsertResponse
27+
import com.ninecraft.booket.core.network.response.Category
2228
import com.ninecraft.booket.core.network.response.HomeResponse
2329
import com.ninecraft.booket.core.network.response.LibraryBookSummary
2430
import com.ninecraft.booket.core.network.response.LibraryBooks
2531
import com.ninecraft.booket.core.network.response.LibraryResponse
2632
import com.ninecraft.booket.core.network.response.PageInfo
33+
import com.ninecraft.booket.core.network.response.ReadingRecord
34+
import com.ninecraft.booket.core.network.response.ReadingRecordsResponse
2735
import com.ninecraft.booket.core.network.response.RecentBook
2836
import com.ninecraft.booket.core.network.response.RecordDetailResponse
2937
import com.ninecraft.booket.core.network.response.RecordRegisterResponse
38+
import com.ninecraft.booket.core.network.response.SeedResponse
3039
import com.ninecraft.booket.core.network.response.UserProfileResponse
3140

3241
internal fun UserProfileResponse.toModel(): UserProfileModel {
@@ -74,33 +83,29 @@ internal fun BookDetailResponse.toModel(): BookDetailModel {
7483
author = author,
7584
pubDate = pubDate,
7685
description = description,
77-
isbn = isbn,
7886
isbn13 = isbn13,
79-
itemId = itemId,
80-
priceSales = priceSales,
81-
priceStandard = priceStandard,
8287
mallType = mallType,
83-
stockStatus = stockStatus,
84-
mileage = mileage,
85-
cover = cover,
86-
categoryId = categoryId,
88+
coverImageUrl = coverImageUrl,
8789
categoryName = categoryName,
8890
publisher = publisher,
91+
totalPage = totalPage,
92+
userBookStatus = userBookStatus,
8993
)
9094
}
9195

9296
internal fun BookUpsertResponse.toModel(): BookUpsertModel {
9397
return BookUpsertModel(
9498
userBookId = userBookId,
9599
userId = userId,
96-
bookIsbn = bookIsbn,
100+
isbn13 = isbn13,
97101
bookTitle = bookTitle,
98102
bookAuthor = bookAuthor,
99103
status = status,
100104
coverImageUrl = coverImageUrl,
101105
publisher = publisher,
102106
createdAt = createdAt,
103107
updatedAt = updatedAt,
108+
recordCount = recordCount,
104109
)
105110
}
106111

@@ -125,15 +130,15 @@ internal fun LibraryBookSummary.toModel(): LibraryBookSummaryModel {
125130
return LibraryBookSummaryModel(
126131
userBookId = userBookId,
127132
userId = userId,
128-
bookIsbn = bookIsbn,
133+
isbn13 = isbn13,
129134
bookTitle = bookTitle,
130135
bookAuthor = bookAuthor,
131136
status = status,
132-
recordCount = recordCount,
133137
coverImageUrl = coverImageUrl,
134138
publisher = publisher,
135139
createdAt = createdAt,
136140
updatedAt = updatedAt,
141+
recordCount = recordCount,
137142
)
138143
}
139144

@@ -159,6 +164,29 @@ internal fun RecordRegisterResponse.toModel(): RecordRegisterModel {
159164
)
160165
}
161166

167+
internal fun ReadingRecordsResponse.toModel(): ReadingRecordsModel {
168+
return ReadingRecordsModel(
169+
content = content.map { it.toModel() },
170+
page = page.toModel(),
171+
)
172+
}
173+
174+
internal fun ReadingRecord.toModel(): ReadingRecordModel {
175+
return ReadingRecordModel(
176+
id = id,
177+
userBookId = userBookId,
178+
pageNumber = pageNumber,
179+
quote = quote,
180+
review = review,
181+
emotionTags = emotionTags,
182+
createdAt = createdAt,
183+
updatedAt = updatedAt,
184+
bookTitle = bookTitle,
185+
bookPublisher = bookPublisher,
186+
bookCoverImageUrl = bookCoverImageUrl,
187+
)
188+
}
189+
162190
internal fun RecordDetailResponse.toModel(): RecordDetailModel {
163191
return RecordDetailModel(
164192
id = id,
@@ -185,6 +213,7 @@ internal fun HomeResponse.toModel(): HomeModel {
185213
internal fun RecentBook.toModel(): RecentBookModel {
186214
return RecentBookModel(
187215
userBookId = userBookId,
216+
isbn13 = isbn13,
188217
title = title,
189218
author = author,
190219
publisher = publisher,
@@ -193,3 +222,17 @@ internal fun RecentBook.toModel(): RecentBookModel {
193222
recordCount = recordCount,
194223
)
195224
}
225+
226+
internal fun SeedResponse.toModel(): SeedModel {
227+
return SeedModel(
228+
categories = categories.mapNotNull { it.toEmotionModel() },
229+
)
230+
}
231+
232+
internal fun Category.toEmotionModel(): EmotionModel? {
233+
val emotion = Emotion.fromDisplayName(name) ?: return null
234+
return EmotionModel(
235+
name = emotion,
236+
count = count,
237+
)
238+
}

core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/repository/DefaultBookRepository.kt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ internal class DefaultBookRepository @Inject constructor(
3434
bookRecentSearchDataSource.removeRecentSearch(query)
3535
}
3636

37-
override suspend fun getBookDetail(itemId: String) = runSuspendCatching {
38-
service.getBookDetail(itemId).toModel()
37+
override suspend fun getBookDetail(isbn13: String) = runSuspendCatching {
38+
service.getBookDetail(isbn13).toModel()
3939
}
4040

41-
override suspend fun upsertBook(bookIsbn: String, bookStatus: String) = runSuspendCatching {
42-
service.upsertBook(BookUpsertRequest(bookIsbn, bookStatus)).toModel()
41+
override suspend fun upsertBook(isbn13: String, bookStatus: String) = runSuspendCatching {
42+
service.upsertBook(BookUpsertRequest(isbn13, bookStatus)).toModel()
4343
}
4444

4545
override suspend fun filterLibraryBooks(status: String?, page: Int, size: Int) = runSuspendCatching {
@@ -56,4 +56,12 @@ internal class DefaultBookRepository @Inject constructor(
5656
override suspend fun removeLibraryRecentSearch(query: String) {
5757
libraryRecentSearchDataSource.removeRecentSearch(query)
5858
}
59+
60+
override suspend fun getHome() = runSuspendCatching {
61+
service.getHome().toModel()
62+
}
63+
64+
override suspend fun getSeedsStats(userBookId: String) = runSuspendCatching {
65+
service.getSeedsStats(userBookId).toModel()
66+
}
5967
}

0 commit comments

Comments
 (0)