Skip to content

Commit 6b1bfd5

Browse files
authored
Merge pull request #96 from YAPP-Github/feat/#94-terms-api
[feat] #94 이용약관 API 연동
2 parents 67433d9 + 5d96715 commit 6b1bfd5

28 files changed

Lines changed: 354 additions & 1616 deletions

File tree

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.neki.android.core.dataapi.repository
2+
3+
import com.neki.android.core.model.Term
4+
5+
interface TermRepository {
6+
suspend fun getTerms(): Result<List<Term>>
7+
suspend fun agreeTerms(termIds: List<Long>): Result<Unit>
8+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.neki.android.core.data.remote.api
2+
3+
import com.neki.android.core.data.remote.model.request.TermAgreementsRequest
4+
import com.neki.android.core.data.remote.model.response.BasicNullableResponse
5+
import com.neki.android.core.data.remote.model.response.BasicResponse
6+
import com.neki.android.core.data.remote.model.response.TermsResponse
7+
import io.ktor.client.HttpClient
8+
import io.ktor.client.call.body
9+
import io.ktor.client.request.get
10+
import io.ktor.client.request.post
11+
import io.ktor.client.request.setBody
12+
import javax.inject.Inject
13+
14+
class TermService @Inject constructor(
15+
private val client: HttpClient,
16+
) {
17+
suspend fun getTerms(): BasicResponse<TermsResponse> {
18+
return client.get("/api/terms").body()
19+
}
20+
21+
suspend fun agreeTerms(request: TermAgreementsRequest): BasicNullableResponse<Unit> {
22+
return client.post("/api/terms/agreements") {
23+
setBody(request)
24+
}.body()
25+
}
26+
}

core/data/src/main/java/com/neki/android/core/data/remote/di/NetworkModule.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ internal object NetworkModule {
5151
val sendWithoutAuthUrls = listOf(
5252
"/api/auth/kakao/login",
5353
"/api/auth/refresh",
54+
"/api/terms",
5455
)
5556

5657
private val json = Json {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.neki.android.core.data.remote.model.request
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class TermAgreementsRequest(
8+
@SerialName("agreements") val agreements: List<Agreement>,
9+
) {
10+
@Serializable
11+
data class Agreement(
12+
@SerialName("termId") val termId: Long,
13+
@SerialName("agreed") val agreed: Boolean,
14+
)
15+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.neki.android.core.data.remote.model.response
2+
3+
import com.neki.android.core.model.Term
4+
import kotlinx.serialization.SerialName
5+
import kotlinx.serialization.Serializable
6+
7+
@Serializable
8+
data class TermsResponse(
9+
@SerialName("terms") val terms: List<TermResponse> = emptyList(),
10+
) {
11+
@Serializable
12+
data class TermResponse(
13+
@SerialName("id") val id: Long = 0L,
14+
@SerialName("termType") val termType: String = "",
15+
@SerialName("title") val title: String = "",
16+
@SerialName("url") val url: String = "",
17+
@SerialName("isRequired") val isRequired: Boolean = false,
18+
) {
19+
internal fun toModel(): Term = Term(
20+
id = id,
21+
title = title,
22+
url = url,
23+
isRequired = isRequired,
24+
)
25+
}
26+
27+
fun toModels(): List<Term> = terms.map { it.toModel() }
28+
}

core/data/src/main/java/com/neki/android/core/data/remote/model/response/UserInfoResponse.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,18 @@ import kotlinx.serialization.Serializable
66

77
@Serializable
88
data class UserInfoResponse(
9-
@SerialName("userId") val userId: Long,
10-
@SerialName("name") val name: String,
11-
@SerialName("email") val email: String,
12-
@SerialName("profileImageUrl") val profileImageUrl: String,
13-
@SerialName("providerType") val providerType: String,
9+
@SerialName("userId") val userId: Long = 0L,
10+
@SerialName("name") val name: String = "",
11+
@SerialName("email") val email: String = "",
12+
@SerialName("profileImageUrl") val profileImageUrl: String = "",
13+
@SerialName("providerType") val providerType: String = "",
14+
@SerialName("agreeTerms") val agreeTerms: Boolean = false,
1415
) {
1516
fun toModel() = UserInfo(
1617
id = userId,
1718
nickname = name,
1819
profileImageUrl = profileImageUrl,
1920
loginType = providerType,
21+
isRequiredTermsAgreed = agreeTerms,
2022
)
2123
}

core/data/src/main/java/com/neki/android/core/data/repository/di/RepositoryModule.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.neki.android.core.data.repository.impl.FolderRepositoryImpl
77
import com.neki.android.core.data.repository.impl.MapRepositoryImpl
88
import com.neki.android.core.data.repository.impl.PhotoRepositoryImpl
99
import com.neki.android.core.data.repository.impl.PoseRepositoryImpl
10+
import com.neki.android.core.data.repository.impl.TermRepositoryImpl
1011
import com.neki.android.core.data.repository.impl.TokenRepositoryImpl
1112
import com.neki.android.core.data.repository.impl.UserRepositoryImpl
1213
import com.neki.android.core.dataapi.auth.AuthEventManager
@@ -16,6 +17,7 @@ import com.neki.android.core.dataapi.repository.MediaUploadRepository
1617
import com.neki.android.core.dataapi.repository.MapRepository
1718
import com.neki.android.core.dataapi.repository.PhotoRepository
1819
import com.neki.android.core.dataapi.repository.PoseRepository
20+
import com.neki.android.core.dataapi.repository.TermRepository
1921
import com.neki.android.core.dataapi.repository.TokenRepository
2022
import com.neki.android.core.dataapi.repository.UserRepository
2123
import dagger.Binds
@@ -81,4 +83,10 @@ internal interface RepositoryModule {
8183
fun bindPoseRepositoryImpl(
8284
poseRepositoryImpl: PoseRepositoryImpl,
8385
): PoseRepository
86+
87+
@Binds
88+
@Singleton
89+
fun bindTermRepositoryImpl(
90+
termRepositoryImpl: TermRepositoryImpl,
91+
): TermRepository
8492
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.neki.android.core.data.repository.impl
2+
3+
import com.neki.android.core.data.remote.api.TermService
4+
import com.neki.android.core.data.remote.model.request.TermAgreementsRequest
5+
import com.neki.android.core.data.util.runSuspendCatching
6+
import com.neki.android.core.dataapi.repository.TermRepository
7+
import com.neki.android.core.model.Term
8+
import javax.inject.Inject
9+
10+
class TermRepositoryImpl @Inject constructor(
11+
private val termService: TermService,
12+
) : TermRepository {
13+
override suspend fun getTerms(): Result<List<Term>> = runSuspendCatching {
14+
termService.getTerms().data.toModels()
15+
}
16+
17+
override suspend fun agreeTerms(termIds: List<Long>): Result<Unit> = runSuspendCatching {
18+
val request = TermAgreementsRequest(
19+
agreements = termIds.map { termId ->
20+
TermAgreementsRequest.Agreement(termId = termId, agreed = true)
21+
},
22+
)
23+
termService.agreeTerms(request).data
24+
}
25+
}

0 commit comments

Comments
 (0)