Skip to content

Commit 5bbac4b

Browse files
authored
Merge pull request #82 from YAPP-Github/BOOK-168-feature/#70
feat: 독서 기록 등록 API 연동 및 완료 화면 UI 구현
2 parents 8470a00 + f700241 commit 5bbac4b

31 files changed

Lines changed: 775 additions & 23 deletions

File tree

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.ninecraft.booket.core.data.api.repository
2+
3+
import com.ninecraft.booket.core.model.RecordRegisterModel
4+
5+
interface RecordRepository {
6+
suspend fun postRecord(
7+
userBookId: String,
8+
pageNumber: Int,
9+
quote: String,
10+
emotionTags: List<String>,
11+
review: String,
12+
): Result<RecordRegisterModel>
13+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ 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.RecordRepository
56
import com.ninecraft.booket.core.data.api.repository.UserRepository
67
import com.ninecraft.booket.core.data.impl.repository.DefaultAuthRepository
78
import com.ninecraft.booket.core.data.impl.repository.DefaultBookRepository
9+
import com.ninecraft.booket.core.data.impl.repository.DefaultRecordRepository
810
import com.ninecraft.booket.core.data.impl.repository.DefaultUserRepository
911
import dagger.Binds
1012
import dagger.Module
@@ -27,4 +29,8 @@ internal abstract class RepositoryModule {
2729
@Binds
2830
@Singleton
2931
abstract fun bindBookRepository(defaultBookRepository: DefaultBookRepository): BookRepository
32+
33+
@Binds
34+
@Singleton
35+
abstract fun bindRecordRepository(defaultRecordRepository: DefaultRecordRepository): RecordRepository
3036
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.ninecraft.booket.core.model.LibraryBookSummaryModel
99
import com.ninecraft.booket.core.model.LibraryBooksModel
1010
import com.ninecraft.booket.core.model.LibraryModel
1111
import com.ninecraft.booket.core.model.PageInfoModel
12+
import com.ninecraft.booket.core.model.RecordRegisterModel
1213
import com.ninecraft.booket.core.model.UserProfileModel
1314
import com.ninecraft.booket.core.network.response.BookDetailResponse
1415
import com.ninecraft.booket.core.network.response.BookSearchResponse
@@ -18,6 +19,7 @@ import com.ninecraft.booket.core.network.response.LibraryBookSummary
1819
import com.ninecraft.booket.core.network.response.LibraryBooks
1920
import com.ninecraft.booket.core.network.response.LibraryResponse
2021
import com.ninecraft.booket.core.network.response.PageInfo
22+
import com.ninecraft.booket.core.network.response.RecordRegisterResponse
2123
import com.ninecraft.booket.core.network.response.UserProfileResponse
2224

2325
internal fun UserProfileResponse.toModel(): UserProfileModel {
@@ -135,3 +137,16 @@ internal fun PageInfo.toModel(): PageInfoModel {
135137
totalPages = totalPages,
136138
)
137139
}
140+
141+
internal fun RecordRegisterResponse.toModel(): RecordRegisterModel {
142+
return RecordRegisterModel(
143+
id = id,
144+
userBookId = userBookId,
145+
pageNumber = pageNumber,
146+
quote = quote,
147+
emotionTags = emotionTags,
148+
review = review,
149+
createdAt = createdAt,
150+
updatedAt = updatedAt,
151+
)
152+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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.RecordRepository
5+
import com.ninecraft.booket.core.data.impl.mapper.toModel
6+
import com.ninecraft.booket.core.network.request.RecordRegisterRequest
7+
import com.ninecraft.booket.core.network.service.ReedService
8+
import javax.inject.Inject
9+
10+
class DefaultRecordRepository @Inject constructor(
11+
private val service: ReedService,
12+
) : RecordRepository {
13+
override suspend fun postRecord(
14+
userBookId: String,
15+
pageNumber: Int,
16+
quote: String,
17+
emotionTags: List<String>,
18+
review: String,
19+
) = runSuspendCatching {
20+
service.postRecord(userBookId, RecordRegisterRequest(pageNumber, quote, emotionTags, review)).toModel()
21+
}
22+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.ninecraft.booket.core.designsystem
2+
3+
import androidx.compose.ui.graphics.Color
4+
import com.ninecraft.booket.core.designsystem.theme.JoyBgColor
5+
import com.ninecraft.booket.core.designsystem.theme.JoyTextColor
6+
import com.ninecraft.booket.core.designsystem.theme.SadnessBgColor
7+
import com.ninecraft.booket.core.designsystem.theme.SadnessTextColor
8+
import com.ninecraft.booket.core.designsystem.theme.TensionBgColor
9+
import com.ninecraft.booket.core.designsystem.theme.TensionTextColor
10+
import com.ninecraft.booket.core.designsystem.theme.WarmthBgColor
11+
import com.ninecraft.booket.core.designsystem.theme.WarmthTextColor
12+
13+
enum class EmotionTag(val label: String, val bgColor: Color, val textColor: Color, val graphic: Int) {
14+
WARMTH("따뜻함", WarmthBgColor, WarmthTextColor, 0),
15+
JOY("즐거움", JoyBgColor, JoyTextColor, 0),
16+
TENSION("긴장감", TensionBgColor, TensionTextColor, 0),
17+
SADNESS("슬픔", SadnessBgColor, SadnessTextColor, 0),
18+
}

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/theme/Color.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,16 @@ val Blue900 = Color(0xFF1F47CD)
6565

6666
val Kakao = Color(0xFFFBD300)
6767

68+
// Emotion Color
69+
val WarmthTextColor = Color(0xFFE3931B)
70+
val WarmthBgColor = Color(0xFFFFF5D3)
71+
val JoyTextColor = Color(0xFFEE6B33)
72+
val JoyBgColor = Color(0xFFFFEBE3)
73+
val TensionTextColor = Color(0xFF9A55E4)
74+
val TensionBgColor = Color(0xFFF3E8FF)
75+
val SadnessTextColor = Color(0xFF2872E9)
76+
val SadnessBgColor = Color(0xFFE1ECFF)
77+
6878
@Immutable
6979
data class ReedColorScheme(
7080
// Base
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.ninecraft.booket.core.model
2+
3+
data class RecordRegisterModel(
4+
val id: String = "",
5+
val userBookId: String = "",
6+
val pageNumber: Int = 0,
7+
val quote: String = "",
8+
val emotionTags: List<String> = emptyList(),
9+
val review: String = "",
10+
val createdAt: String = "",
11+
val updatedAt: String = "",
12+
)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.ninecraft.booket.core.network.request
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class RecordRegisterRequest(
8+
@SerialName("pageNumber")
9+
val pageNumber: Int,
10+
@SerialName("quote")
11+
val quote: String,
12+
@SerialName("emotionTags")
13+
val emotionTags: List<String>,
14+
@SerialName("review")
15+
val review: String,
16+
)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.ninecraft.booket.core.network.response
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class RecordRegisterResponse(
8+
@SerialName("id")
9+
val id: String,
10+
@SerialName("userBookId")
11+
val userBookId: String,
12+
@SerialName("pageNumber")
13+
val pageNumber: Int,
14+
@SerialName("quote")
15+
val quote: String,
16+
@SerialName("emotionTags")
17+
val emotionTags: List<String>,
18+
@SerialName("review")
19+
val review: String,
20+
@SerialName("createdAt")
21+
val createdAt: String,
22+
@SerialName("updatedAt")
23+
val updatedAt: String,
24+
)

core/network/src/main/kotlin/com/ninecraft/booket/core/network/service/ReedService.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,23 @@ package com.ninecraft.booket.core.network.service
22

33
import com.ninecraft.booket.core.network.request.BookUpsertRequest
44
import com.ninecraft.booket.core.network.request.LoginRequest
5+
import com.ninecraft.booket.core.network.request.RecordRegisterRequest
56
import com.ninecraft.booket.core.network.request.RefreshTokenRequest
67
import com.ninecraft.booket.core.network.request.TermsAgreementRequest
78
import com.ninecraft.booket.core.network.response.BookDetailResponse
89
import com.ninecraft.booket.core.network.response.BookSearchResponse
910
import com.ninecraft.booket.core.network.response.BookUpsertResponse
1011
import com.ninecraft.booket.core.network.response.LibraryResponse
1112
import com.ninecraft.booket.core.network.response.LoginResponse
13+
import com.ninecraft.booket.core.network.response.RecordRegisterResponse
1214
import com.ninecraft.booket.core.network.response.RefreshTokenResponse
1315
import com.ninecraft.booket.core.network.response.TermsAgreementResponse
1416
import com.ninecraft.booket.core.network.response.UserProfileResponse
1517
import retrofit2.http.Body
1618
import retrofit2.http.GET
1719
import retrofit2.http.POST
1820
import retrofit2.http.PUT
21+
import retrofit2.http.Path
1922
import retrofit2.http.Query
2023

2124
interface ReedService {
@@ -66,4 +69,11 @@ interface ReedService {
6669
@Query("size") size: Int,
6770
@Query("sort") sort: String = "CREATED_DATE_DESC",
6871
): LibraryResponse
72+
73+
// Reading-records endpoints (auth required)
74+
@POST("api/v1/reading-records/{userBookId}")
75+
suspend fun postRecord(
76+
@Path("userBookId") userBookId: String,
77+
@Body recordRegisterRequest: RecordRegisterRequest,
78+
): RecordRegisterResponse
6979
}

0 commit comments

Comments
 (0)