Skip to content

Commit 4f609c4

Browse files
authored
Merge pull request #246 from YAPP-Github/BOOK-482-feature/#244
feat: 독서 기록,수정,공유 관련 UI 변경사항 반영 및 API 버저닝 적용
2 parents 2a7068c + 0cd02b7 commit 4f609c4

67 files changed

Lines changed: 1925 additions & 1668 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.ninecraft.booket.core.data.api.repository
2+
3+
import com.ninecraft.booket.core.model.EmotionGroupsModel
4+
5+
interface EmotionRepository {
6+
suspend fun getEmotions(): Result<EmotionGroupsModel>
7+
}

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

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

3-
import com.ninecraft.booket.core.model.ReadingRecordModel
4-
import com.ninecraft.booket.core.model.RecordRegisterModel
3+
import com.ninecraft.booket.core.model.ReadingRecordModelV2
54
import com.ninecraft.booket.core.model.ReadingRecordsModel
6-
import com.ninecraft.booket.core.model.RecordDetailModel
75

86
interface RecordRepository {
97
suspend fun postRecord(
108
userBookId: String,
11-
pageNumber: Int,
9+
pageNumber: Int?,
1210
quote: String,
13-
emotionTags: List<String>,
1411
review: String,
15-
): Result<RecordRegisterModel>
12+
primaryEmotion: String,
13+
detailEmotionTagIds: List<String>,
14+
): Result<ReadingRecordModelV2>
1615

1716
suspend fun getReadingRecords(
1817
userBookId: String,
1918
sort: String,
2019
page: Int,
2120
size: Int,
22-
): Result<ReadingRecordsModel>
21+
): Result<ReadingRecordsModel> // TODO: V2로 변경 필요
2322

2423
suspend fun getRecordDetail(
2524
readingRecordId: String,
26-
): Result<RecordDetailModel>
25+
): Result<ReadingRecordModelV2>
2726

2827
suspend fun editRecord(
2928
readingRecordId: String,
30-
pageNumber: Int,
29+
pageNumber: Int?,
3130
quote: String,
32-
emotionTags: List<String>,
3331
review: String,
34-
): Result<ReadingRecordModel>
32+
primaryEmotion: String,
33+
detailEmotionTagIds: List<String>,
34+
): Result<ReadingRecordModelV2>
3535

3636
suspend fun deleteRecord(
3737
readingRecordId: String,

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ 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.EmotionRepository
56
import com.ninecraft.booket.core.data.api.repository.RecordRepository
67
import com.ninecraft.booket.core.data.api.repository.RemoteConfigRepository
78
import com.ninecraft.booket.core.data.api.repository.UserRepository
89
import com.ninecraft.booket.core.data.impl.repository.DefaultAuthRepository
910
import com.ninecraft.booket.core.data.impl.repository.DefaultBookRepository
11+
import com.ninecraft.booket.core.data.impl.repository.DefaultEmotionRepository
1012
import com.ninecraft.booket.core.data.impl.repository.DefaultRecordRepository
1113
import com.ninecraft.booket.core.data.impl.repository.DefaultRemoteConfigRepository
1214
import com.ninecraft.booket.core.data.impl.repository.DefaultUserRepository
@@ -23,6 +25,9 @@ interface DataGraph {
2325
@Binds
2426
val DefaultBookRepository.bind: BookRepository
2527

28+
@Binds
29+
val DefaultEmotionRepository.bind: EmotionRepository
30+
2631
@Binds
2732
val DefaultRecordRepository.bind: RecordRepository
2833

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

Lines changed: 55 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
11
package com.ninecraft.booket.core.data.impl.mapper
22

33
import com.ninecraft.booket.core.common.extensions.decodeHtmlEntities
4-
import com.ninecraft.booket.core.common.extensions.toFormattedDate
54
import com.ninecraft.booket.core.model.BookDetailModel
65
import com.ninecraft.booket.core.model.BookSearchModel
76
import com.ninecraft.booket.core.model.BookSummaryModel
87
import com.ninecraft.booket.core.model.BookUpsertModel
8+
import com.ninecraft.booket.core.model.DetailEmotionModel
99
import com.ninecraft.booket.core.model.Emotion
10+
import com.ninecraft.booket.core.model.EmotionCode
11+
import com.ninecraft.booket.core.model.EmotionGroupModel
12+
import com.ninecraft.booket.core.model.EmotionGroupsModel
1013
import com.ninecraft.booket.core.model.EmotionModel
1114
import com.ninecraft.booket.core.model.HomeModel
1215
import com.ninecraft.booket.core.model.LibraryBookSummaryModel
1316
import com.ninecraft.booket.core.model.LibraryBooksModel
1417
import com.ninecraft.booket.core.model.LibraryModel
1518
import com.ninecraft.booket.core.model.PageInfoModel
19+
import com.ninecraft.booket.core.model.PrimaryEmotionModel
1620
import com.ninecraft.booket.core.model.ReadingRecordModel
21+
import com.ninecraft.booket.core.model.ReadingRecordModelV2
1722
import com.ninecraft.booket.core.model.ReadingRecordsModel
1823
import com.ninecraft.booket.core.model.RecentBookModel
19-
import com.ninecraft.booket.core.model.RecordDetailModel
2024
import com.ninecraft.booket.core.model.RecordRegisterModel
2125
import com.ninecraft.booket.core.model.SeedModel
2226
import com.ninecraft.booket.core.model.TermsAgreementModel
@@ -26,17 +30,21 @@ import com.ninecraft.booket.core.network.response.BookSearchResponse
2630
import com.ninecraft.booket.core.network.response.BookSummary
2731
import com.ninecraft.booket.core.network.response.BookUpsertResponse
2832
import com.ninecraft.booket.core.network.response.Category
33+
import com.ninecraft.booket.core.network.response.DetailEmotion
34+
import com.ninecraft.booket.core.network.response.EmotionGroup
35+
import com.ninecraft.booket.core.network.response.EmotionGroupsResponse
2936
import com.ninecraft.booket.core.network.response.GuestBookSearchResponse
3037
import com.ninecraft.booket.core.network.response.GuestBookSummary
3138
import com.ninecraft.booket.core.network.response.HomeResponse
3239
import com.ninecraft.booket.core.network.response.LibraryBookSummary
3340
import com.ninecraft.booket.core.network.response.LibraryBooks
3441
import com.ninecraft.booket.core.network.response.LibraryResponse
3542
import com.ninecraft.booket.core.network.response.PageInfo
43+
import com.ninecraft.booket.core.network.response.PrimaryEmotion
3644
import com.ninecraft.booket.core.network.response.ReadingRecord
45+
import com.ninecraft.booket.core.network.response.ReadingRecordV2
3746
import com.ninecraft.booket.core.network.response.ReadingRecordsResponse
3847
import com.ninecraft.booket.core.network.response.RecentBook
39-
import com.ninecraft.booket.core.network.response.RecordDetailResponse
4048
import com.ninecraft.booket.core.network.response.RecordRegisterResponse
4149
import com.ninecraft.booket.core.network.response.SeedResponse
4250
import com.ninecraft.booket.core.network.response.TermsAgreementResponse
@@ -187,6 +195,28 @@ internal fun PageInfo.toModel(): PageInfoModel {
187195
)
188196
}
189197

198+
internal fun EmotionGroupsResponse.toModel(): EmotionGroupsModel {
199+
return EmotionGroupsModel(
200+
emotions = emotions.map { it.toModel() },
201+
)
202+
}
203+
204+
internal fun EmotionGroup.toModel(): EmotionGroupModel {
205+
val code = EmotionCode.fromCode(code) ?: EmotionCode.OTHER
206+
return EmotionGroupModel(
207+
code = code,
208+
displayName = displayName,
209+
detailEmotions = detailEmotions.map { it.toModel() },
210+
)
211+
}
212+
213+
internal fun DetailEmotion.toModel(): DetailEmotionModel {
214+
return DetailEmotionModel(
215+
id = id,
216+
name = name,
217+
)
218+
}
219+
190220
internal fun RecordRegisterResponse.toModel(): RecordRegisterModel {
191221
return RecordRegisterModel(
192222
id = id,
@@ -220,27 +250,36 @@ internal fun ReadingRecord.toModel(): ReadingRecordModel {
220250
emotionTags = emotionTags,
221251
createdAt = createdAt,
222252
updatedAt = updatedAt,
223-
bookTitle = bookTitle,
224-
bookPublisher = bookPublisher,
225-
bookCoverImageUrl = bookCoverImageUrl,
226-
author = author,
253+
bookTitle = bookTitle ?: "",
254+
bookPublisher = bookPublisher ?: "",
255+
bookCoverImageUrl = bookCoverImageUrl ?: "",
256+
author = author ?: "",
227257
)
228258
}
229259

230-
internal fun RecordDetailResponse.toModel(): RecordDetailModel {
231-
return RecordDetailModel(
260+
internal fun ReadingRecordV2.toModel(): ReadingRecordModelV2 {
261+
return ReadingRecordModelV2(
232262
id = id,
233263
userBookId = userBookId,
234264
pageNumber = pageNumber,
235265
quote = quote,
236266
review = review ?: "",
237-
emotionTags = emotionTags,
238-
createdAt = createdAt.toFormattedDate(),
239-
updatedAt = updatedAt.toFormattedDate(),
240-
bookTitle = bookTitle,
241-
bookPublisher = bookPublisher,
242-
bookCoverImageUrl = bookCoverImageUrl,
243-
author = author,
267+
primaryEmotion = primaryEmotion.toModel(),
268+
detailEmotions = detailEmotions.map { it.toModel() },
269+
createdAt = createdAt,
270+
updatedAt = updatedAt,
271+
bookTitle = bookTitle ?: "",
272+
bookPublisher = bookPublisher ?: "",
273+
bookCoverImageUrl = bookCoverImageUrl ?: "",
274+
author = author ?: "",
275+
)
276+
}
277+
278+
internal fun PrimaryEmotion.toModel(): PrimaryEmotionModel {
279+
val code = EmotionCode.fromCode(code) ?: EmotionCode.OTHER
280+
return PrimaryEmotionModel(
281+
code = code,
282+
displayName = displayName,
244283
)
245284
}
246285

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.ninecraft.booket.core.data.impl.repository
2+
3+
import com.ninecraft.booket.core.common.utils.runSuspendCatching
4+
import com.ninecraft.booket.core.data.api.repository.EmotionRepository
5+
import com.ninecraft.booket.core.data.impl.mapper.toModel
6+
import com.ninecraft.booket.core.di.DataScope
7+
import com.ninecraft.booket.core.model.EmotionGroupsModel
8+
import com.ninecraft.booket.core.network.service.ReedService
9+
import dev.zacsweers.metro.Inject
10+
import dev.zacsweers.metro.SingleIn
11+
12+
@SingleIn(DataScope::class)
13+
@Inject
14+
class DefaultEmotionRepository(
15+
private val service: ReedService,
16+
) : EmotionRepository {
17+
override suspend fun getEmotions(): Result<EmotionGroupsModel> = runSuspendCatching {
18+
service.getEmotions().toModel()
19+
}
20+
}

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ package com.ninecraft.booket.core.data.impl.repository
33
import com.ninecraft.booket.core.common.utils.runSuspendCatching
44
import com.ninecraft.booket.core.data.api.repository.RecordRepository
55
import com.ninecraft.booket.core.data.impl.mapper.toModel
6-
import com.ninecraft.booket.core.model.ReadingRecordModel
6+
import com.ninecraft.booket.core.di.DataScope
77
import com.ninecraft.booket.core.network.request.RecordRegisterRequest
88
import com.ninecraft.booket.core.network.service.ReedService
99
import dev.zacsweers.metro.Inject
10-
import com.ninecraft.booket.core.di.DataScope
1110
import dev.zacsweers.metro.SingleIn
1211

1312
@SingleIn(DataScope::class)
@@ -17,12 +16,13 @@ class DefaultRecordRepository(
1716
) : RecordRepository {
1817
override suspend fun postRecord(
1918
userBookId: String,
20-
pageNumber: Int,
19+
pageNumber: Int?,
2120
quote: String,
22-
emotionTags: List<String>,
2321
review: String,
22+
primaryEmotion: String,
23+
detailEmotionTagIds: List<String>,
2424
) = runSuspendCatching {
25-
service.postRecord(userBookId, RecordRegisterRequest(pageNumber, quote, emotionTags, review)).toModel()
25+
service.postRecord(userBookId, RecordRegisterRequest(pageNumber, quote, review, primaryEmotion, detailEmotionTagIds)).toModel()
2626
}
2727

2828
override suspend fun getReadingRecords(
@@ -40,12 +40,13 @@ class DefaultRecordRepository(
4040

4141
override suspend fun editRecord(
4242
readingRecordId: String,
43-
pageNumber: Int,
43+
pageNumber: Int?,
4444
quote: String,
45-
emotionTags: List<String>,
4645
review: String,
47-
): Result<ReadingRecordModel> = runSuspendCatching {
48-
service.editRecord(readingRecordId, RecordRegisterRequest(pageNumber, quote, emotionTags, review)).toModel()
46+
primaryEmotion: String,
47+
detailEmotionTagIds: List<String>,
48+
) = runSuspendCatching {
49+
service.editRecord(readingRecordId, RecordRegisterRequest(pageNumber, quote, review, primaryEmotion, detailEmotionTagIds)).toModel()
4950
}
5051

5152
override suspend fun deleteRecord(readingRecordId: String): Result<Unit> = runSuspendCatching {

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/Emotion.kt

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.ninecraft.booket.core.designsystem.theme.WarmthBgColor
1717
import com.ninecraft.booket.core.designsystem.theme.WarmthTextColor
1818
import com.ninecraft.booket.core.designsystem.theme.Yellow300
1919
import com.ninecraft.booket.core.model.Emotion
20+
import com.ninecraft.booket.core.model.EmotionCode
2021

2122
val Emotion.bgColor: Color
2223
get() = when (this) {
@@ -36,15 +37,6 @@ val Emotion.textColor: Color
3637
Emotion.ETC -> EtcTextColor
3738
}
3839

39-
val Emotion.graphicRes: Int
40-
get() = when (this) {
41-
Emotion.WARM -> R.drawable.img_emotion_warmth
42-
Emotion.JOY -> R.drawable.img_emotion_joy
43-
Emotion.SAD -> R.drawable.img_emotion_sadness
44-
Emotion.INSIGHT -> R.drawable.img_emotion_insight
45-
Emotion.ETC -> R.drawable.img_emotion_warmth
46-
}
47-
4840
val Emotion.ratioBarColor: Color
4941
get() = when (this) {
5042
Emotion.WARM -> Yellow300
@@ -54,20 +46,29 @@ val Emotion.ratioBarColor: Color
5446
Emotion.ETC -> Neutral300
5547
}
5648

57-
val Emotion.graphicResV2: Int?
49+
val EmotionCode.graphicRes: Int
50+
get() = when (this) {
51+
EmotionCode.WARMTH -> R.drawable.img_warmth
52+
EmotionCode.JOY -> R.drawable.img_joy
53+
EmotionCode.SADNESS -> R.drawable.img_sadness
54+
EmotionCode.INSIGHT -> R.drawable.img_insight
55+
EmotionCode.OTHER -> R.drawable.img_other
56+
}
57+
58+
val EmotionCode.categoryGraphicRes: Int?
5859
get() = when (this) {
59-
Emotion.WARM -> R.drawable.img_category_warm
60-
Emotion.JOY -> R.drawable.img_category_joy
61-
Emotion.SAD -> R.drawable.img_category_sad
62-
Emotion.INSIGHT -> R.drawable.img_category_insight
63-
Emotion.ETC -> null
60+
EmotionCode.WARMTH -> R.drawable.img_category_warmth
61+
EmotionCode.JOY -> R.drawable.img_category_joy
62+
EmotionCode.SADNESS -> R.drawable.img_category_sadness
63+
EmotionCode.INSIGHT -> R.drawable.img_category_insight
64+
EmotionCode.OTHER -> null
6465
}
6566

66-
val Emotion.descriptionRes: Int
67+
val EmotionCode.descriptionRes: Int
6768
get() = when (this) {
68-
Emotion.WARM -> R.string.emotion_warm_description
69-
Emotion.JOY -> R.string.emotion_joy_description
70-
Emotion.SAD -> R.string.emotion_sad_description
71-
Emotion.INSIGHT -> R.string.emotion_insight_description
72-
Emotion.ETC -> R.string.emotion_etc_description
69+
EmotionCode.WARMTH -> R.string.emotion_warm_description
70+
EmotionCode.JOY -> R.string.emotion_joy_description
71+
EmotionCode.SADNESS -> R.string.emotion_sad_description
72+
EmotionCode.INSIGHT -> R.string.emotion_insight_description
73+
EmotionCode.OTHER -> R.string.emotion_other_description
7374
}

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/RecordStep.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.ninecraft.booket.core.designsystem
33
enum class RecordStep {
44
QUOTE,
55
EMOTION,
6-
IMPRESSION,
76
;
87

98
val value: Int get() = ordinal

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/RecordProgressBar.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ fun RecordProgressBar(
2323
modifier = modifier.fillMaxWidth(),
2424
horizontalArrangement = Arrangement.spacedBy(ReedTheme.spacing.spacing1),
2525
) {
26-
repeat(3) { index ->
26+
repeat(2) { index ->
2727
val bgColor = if (index <= currentStep.ordinal) ReedTheme.colors.bgPrimary else ReedTheme.colors.bgDisabled
2828

2929
Box(

core/designsystem/src/main/res/drawable/img_category_sad.webp renamed to core/designsystem/src/main/res/drawable/img_category_sadness.webp

File renamed without changes.

0 commit comments

Comments
 (0)