Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
cf6f160
[chore] #94 TermRepository 인터페이스 작성
Ojongseok Feb 9, 2026
a727935
[chore] #94 이용약관 관련 enum 상수 제거
Ojongseok Feb 9, 2026
300cee9
[chore] #94 이용약관 조회 API 토큰 인증 예외 추가
Ojongseok Feb 9, 2026
faba8ec
[chore] #94 이용약관 관련 model 정의
Ojongseok Feb 9, 2026
02530c6
[chore] #94 로그인 화면과 이용약관 화면 ViewModel 분리
Ojongseok Feb 9, 2026
4827cfa
[chore] #94 약관 관련 UI primitive 파라미터 타입 Term 타입으로 변경
Ojongseok Feb 9, 2026
f45187c
[feat] #94 이용약관 API 연동 및 UI 구성
Ojongseok Feb 9, 2026
c52b6ad
[chore] #94 TermViewModel 분리에 따른 Contract 참조 변경
Ojongseok Feb 9, 2026
fb319f3
[chore] #94 kakaoIdToken @AssistedInject 패턴으로 전달하도록 변경
Ojongseok Feb 9, 2026
db982d9
[chore] #94 이용약관 동의 API 인터페이스 작성
Ojongseok Feb 9, 2026
f7263ad
[chore] #94 이용약관 동의 Request model 작성
Ojongseok Feb 9, 2026
1e482a6
[chore] #94 서비스 가입 및 이용약관 동의 로직 구성
Ojongseok Feb 9, 2026
00b3a57
[feat] #94 서비스 가입 시점 변경
Ojongseok Feb 9, 2026
a7383bf
[chore] #94 UserInfo data class @Immutable 키워드 추가
Ojongseok Feb 10, 2026
905c26a
[chore] #94 사용자 정보 조회 약관동의 여부 필드 추가
Ojongseok Feb 10, 2026
49fea33
[feat] #94 유저 약관 동의 상태에 따른 화면전환 로직 분리
Ojongseok Feb 10, 2026
a57fb5b
[chore] #94 온보딩 노출 여부 플래그 변경 시점 수정
Ojongseok Feb 10, 2026
5566bb4
[chore] #94 온보딩 디자인 리소스 교체
Ojongseok Feb 10, 2026
3a935a7
[chore] #94 변수명 변경
Ojongseok Feb 10, 2026
8c5aff3
[chore] #94 TermRepositoryImpl 반환 타입 .data 추가
Ojongseok Feb 10, 2026
5d96715
[fix] #96 필수 약관 동의 필드 변수명 변경
Ojongseok Feb 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.neki.android.core.dataapi.repository

import com.neki.android.core.model.Term

interface TermRepository {
suspend fun getTerms(): Result<List<Term>>
suspend fun agreeTerms(termIds: List<Long>): Result<Unit>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.neki.android.core.data.remote.api

import com.neki.android.core.data.remote.model.request.TermAgreementsRequest
import com.neki.android.core.data.remote.model.response.BasicNullableResponse
import com.neki.android.core.data.remote.model.response.BasicResponse
import com.neki.android.core.data.remote.model.response.TermsResponse
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.request.get
import io.ktor.client.request.post
import io.ktor.client.request.setBody
import javax.inject.Inject

class TermService @Inject constructor(
private val client: HttpClient,
) {
suspend fun getTerms(): BasicResponse<TermsResponse> {
return client.get("/api/terms").body()
}

suspend fun agreeTerms(request: TermAgreementsRequest): BasicNullableResponse<Unit> {
return client.post("/api/terms/agreements") {
setBody(request)
}.body()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ internal object NetworkModule {
val sendWithoutAuthUrls = listOf(
"/api/auth/kakao/login",
"/api/auth/refresh",
"/api/terms",
)

private val json = Json {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.neki.android.core.data.remote.model.request

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class TermAgreementsRequest(
@SerialName("agreements") val agreements: List<Agreement>,
) {
@Serializable
data class Agreement(
@SerialName("termId") val termId: Long,
Comment thread
Ojongseok marked this conversation as resolved.
@SerialName("agreed") val agreed: Boolean,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.neki.android.core.data.remote.model.response

import com.neki.android.core.model.Term
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class TermsResponse(
@SerialName("terms") val terms: List<TermResponse> = emptyList(),
) {
@Serializable
data class TermResponse(
@SerialName("id") val id: Long = 0L,
@SerialName("termType") val termType: String = "",
@SerialName("title") val title: String = "",
@SerialName("url") val url: String = "",
@SerialName("isRequired") val isRequired: Boolean = false,
) {
internal fun toModel(): Term = Term(
id = id,
title = title,
url = url,
isRequired = isRequired,
)
}

fun toModels(): List<Term> = terms.map { it.toModel() }
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@ import kotlinx.serialization.Serializable

@Serializable
data class UserInfoResponse(
@SerialName("userId") val userId: Long,
@SerialName("name") val name: String,
@SerialName("email") val email: String,
@SerialName("profileImageUrl") val profileImageUrl: String,
@SerialName("providerType") val providerType: String,
@SerialName("userId") val userId: Long = 0L,
@SerialName("name") val name: String = "",
@SerialName("email") val email: String = "",
@SerialName("profileImageUrl") val profileImageUrl: String = "",
@SerialName("providerType") val providerType: String = "",
@SerialName("agreeTerms") val agreeTerms: Boolean = false,
) {
fun toModel() = UserInfo(
id = userId,
nickname = name,
profileImageUrl = profileImageUrl,
loginType = providerType,
isRequiredTermsAgreed = agreeTerms,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.neki.android.core.data.repository.impl.FolderRepositoryImpl
import com.neki.android.core.data.repository.impl.MapRepositoryImpl
import com.neki.android.core.data.repository.impl.PhotoRepositoryImpl
import com.neki.android.core.data.repository.impl.PoseRepositoryImpl
import com.neki.android.core.data.repository.impl.TermRepositoryImpl
import com.neki.android.core.data.repository.impl.TokenRepositoryImpl
import com.neki.android.core.data.repository.impl.UserRepositoryImpl
import com.neki.android.core.dataapi.auth.AuthEventManager
Expand All @@ -16,6 +17,7 @@ import com.neki.android.core.dataapi.repository.MediaUploadRepository
import com.neki.android.core.dataapi.repository.MapRepository
import com.neki.android.core.dataapi.repository.PhotoRepository
import com.neki.android.core.dataapi.repository.PoseRepository
import com.neki.android.core.dataapi.repository.TermRepository
import com.neki.android.core.dataapi.repository.TokenRepository
import com.neki.android.core.dataapi.repository.UserRepository
import dagger.Binds
Expand Down Expand Up @@ -81,4 +83,10 @@ internal interface RepositoryModule {
fun bindPoseRepositoryImpl(
poseRepositoryImpl: PoseRepositoryImpl,
): PoseRepository

@Binds
@Singleton
fun bindTermRepositoryImpl(
termRepositoryImpl: TermRepositoryImpl,
): TermRepository
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.neki.android.core.data.repository.impl

import com.neki.android.core.data.remote.api.TermService
import com.neki.android.core.data.remote.model.request.TermAgreementsRequest
import com.neki.android.core.data.util.runSuspendCatching
import com.neki.android.core.dataapi.repository.TermRepository
import com.neki.android.core.model.Term
import javax.inject.Inject

class TermRepositoryImpl @Inject constructor(
private val termService: TermService,
) : TermRepository {
override suspend fun getTerms(): Result<List<Term>> = runSuspendCatching {
termService.getTerms().data.toModels()
}

override suspend fun agreeTerms(termIds: List<Long>): Result<Unit> = runSuspendCatching {
val request = TermAgreementsRequest(
agreements = termIds.map { termId ->
TermAgreementsRequest.Agreement(termId = termId, agreed = true)
},
)
termService.agreeTerms(request).data
Comment thread
Ojongseok marked this conversation as resolved.
}
Comment thread
Ojongseok marked this conversation as resolved.
}
Loading