From c9c0b34a82b80e798df72d37ce6db8f288f09bb5 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Thu, 22 Jan 2026 11:19:29 +0900 Subject: [PATCH 01/16] =?UTF-8?q?=E2=9C=A8=20=EC=B4=88=EB=8C=80=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=AA=A8?= =?UTF-8?q?=EB=8D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/twix/domain/model/InviteCode.kt | 18 ++++++++ .../com/twix/domain/model/InviteCodeTest.kt | 43 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 domain/src/main/java/com/twix/domain/model/InviteCode.kt create mode 100644 domain/src/test/java/com/twix/domain/model/InviteCodeTest.kt diff --git a/domain/src/main/java/com/twix/domain/model/InviteCode.kt b/domain/src/main/java/com/twix/domain/model/InviteCode.kt new file mode 100644 index 00000000..0060a090 --- /dev/null +++ b/domain/src/main/java/com/twix/domain/model/InviteCode.kt @@ -0,0 +1,18 @@ +package com.twix.domain.model + +@JvmInline +value class InviteCode( + val value: String, +) { + init { + require(value.length == INVITE_CODE_LENGTH) { INVALID_INVITE_CODE_EXCEPTION } + require(INVITE_CODE_REGEX.matches(value)) { INVALID_INVITE_CODE_EXCEPTION } + } + + companion object { + private val INVITE_CODE_REGEX = Regex("^[A-Z0-9]+$") + private const val INVITE_CODE_LENGTH = 8 + private const val INVALID_INVITE_CODE_EXCEPTION = + "InviteCode must be 8 characters of uppercase letters and digits" + } +} diff --git a/domain/src/test/java/com/twix/domain/model/InviteCodeTest.kt b/domain/src/test/java/com/twix/domain/model/InviteCodeTest.kt new file mode 100644 index 00000000..ff5435e6 --- /dev/null +++ b/domain/src/test/java/com/twix/domain/model/InviteCodeTest.kt @@ -0,0 +1,43 @@ +package com.twix.domain.model + +import org.assertj.core.api.Assertions.assertThat +import org.assertj.core.api.Assertions.assertThatThrownBy +import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.ValueSource + +class InviteCodeTest { + @Test + fun `유효한 초대 코드는 정상적으로 생성된다`() { + val inviteCode = InviteCode("AB12CD34") + + assertThat(inviteCode.value).isEqualTo("AB12CD34") + } + + @ParameterizedTest + @ValueSource( + strings = [ + "ab12CD34", + "AB12CD3!", + " ", + ], + ) + fun `규칙에 맞지 않는 초대 코드는 예외가 발생한다`(invalidCode: String) { + assertThatThrownBy { InviteCode(invalidCode) } + .isInstanceOf(IllegalArgumentException::class.java) + .hasMessage("InviteCode must be 8 characters of uppercase letters and digits") + } + + @ParameterizedTest + @ValueSource( + strings = [ + "ABC123", + "AB12CD345", + ], + ) + fun `8자리가 아닌 초대 코드는 예외가 발생한다`(invalidLengthCode: String) { + assertThatThrownBy { InviteCode(invalidLengthCode) } + .isInstanceOf(IllegalArgumentException::class.java) + .hasMessage("InviteCode must be 8 characters of uppercase letters and digits") + } +} From cb5b1a772f3910a77f4695bbf48ec7e76e2cf8a6 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Thu, 22 Jan 2026 11:20:04 +0900 Subject: [PATCH 02/16] =?UTF-8?q?=E2=9C=A8=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20=EC=83=81=ED=83=9C=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=AA=A8?= =?UTF-8?q?=EB=8D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/twix/domain/model/OnboardingStatus.kt | 22 ++++++++++ .../twix/domain/model/OnboardingStatusTest.kt | 41 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 domain/src/main/java/com/twix/domain/model/OnboardingStatus.kt create mode 100644 domain/src/test/java/com/twix/domain/model/OnboardingStatusTest.kt diff --git a/domain/src/main/java/com/twix/domain/model/OnboardingStatus.kt b/domain/src/main/java/com/twix/domain/model/OnboardingStatus.kt new file mode 100644 index 00000000..72489333 --- /dev/null +++ b/domain/src/main/java/com/twix/domain/model/OnboardingStatus.kt @@ -0,0 +1,22 @@ +package com.twix.domain.model + +enum class OnboardingStatus { + COUPLE_CONNECTION, + PROFILE_SETUP, + ANNIVERSARY_SETUP, + COMPLETED, + ; + + companion object { + fun from(status: String): OnboardingStatus = + when (status) { + "COUPLE_CONNECTION" -> COUPLE_CONNECTION + "PROFILE_SETUP" -> PROFILE_SETUP + "ANNIVERSARY_SETUP" -> ANNIVERSARY_SETUP + "COMPLETED" -> COMPLETED + else -> throw IllegalArgumentException(UNKNOWN_STATUS.format(status)) + } + + private const val UNKNOWN_STATUS = "UNKNOWN_STATUS: %s" + } +} diff --git a/domain/src/test/java/com/twix/domain/model/OnboardingStatusTest.kt b/domain/src/test/java/com/twix/domain/model/OnboardingStatusTest.kt new file mode 100644 index 00000000..968a759f --- /dev/null +++ b/domain/src/test/java/com/twix/domain/model/OnboardingStatusTest.kt @@ -0,0 +1,41 @@ +package com.twix.domain.model + +import org.assertj.core.api.Assertions.assertThatThrownBy +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.CsvSource +import kotlin.test.assertEquals + +class OnboardingStatusTest { + @ParameterizedTest + @CsvSource( + "COUPLE_CONNECTION,COUPLE_CONNECTION", + "PROFILE_SETUP,PROFILE_SETUP", + "ANNIVERSARY_SETUP,ANNIVERSARY_SETUP", + "COMPLETED,COMPLETED" + ) + @DisplayName("올바른 OnboardingStatus enum을 반환한다") + fun `유효한 상태 문자열이 주어지면 올바른 OnboardingStatus enum을 반환한다`( + input: String, + expected: OnboardingStatus + ) { + // when + val result = OnboardingStatus.from(input) + + // then + assertEquals(result, expected) + } + + @Test + fun `유효하지 않은 상태 문자열이 주어지면 IllegalArgumentException을 던진다`() { + // given + val invalidStatus = "UNKNOWN" + + // when + assertThatThrownBy { OnboardingStatus.from(invalidStatus) } + // then + .isInstanceOf(IllegalArgumentException::class.java) + .hasMessage("UNKNOWN_STATUS: $invalidStatus") + } +} From e350946bca6b6eb46e2d7b83e979914a5a9b0d88 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Thu, 22 Jan 2026 11:22:21 +0900 Subject: [PATCH 03/16] =?UTF-8?q?=E2=9E=95=20Ktorfit=20KSP=20dependency=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/network/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/core/network/build.gradle.kts b/core/network/build.gradle.kts index 45bdf02d..6d2e7083 100644 --- a/core/network/build.gradle.kts +++ b/core/network/build.gradle.kts @@ -42,4 +42,5 @@ android { dependencies { implementation(libs.bundles.ktor) implementation(libs.ktorfit.lib) + ksp(libs.ktorfit.ksp) } From 676a4df988e830ad4f484fa47386db9043ac5184 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Thu, 22 Jan 2026 11:23:31 +0900 Subject: [PATCH 04/16] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Ktorfit=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85=20=EB=AA=A8=EB=93=88=20=ED=83=80=EC=9E=85=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/twix/network/di/HttpClientModule.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/network/src/main/java/com/twix/network/di/HttpClientModule.kt b/core/network/src/main/java/com/twix/network/di/HttpClientModule.kt index 565d2c86..dfa3b254 100644 --- a/core/network/src/main/java/com/twix/network/di/HttpClientModule.kt +++ b/core/network/src/main/java/com/twix/network/di/HttpClientModule.kt @@ -16,7 +16,7 @@ internal val httpClientModule = ) } - single { + single { Ktorfit .Builder() .baseUrl(BuildConfig.BASE_URL) From 25e6b1a6814be7ba8129e28439567ad0d629a32d Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Thu, 22 Jan 2026 11:24:34 +0900 Subject: [PATCH 05/16] =?UTF-8?q?=E2=9A=A1=EF=B8=8FKtor=20=EB=A1=9C?= =?UTF-8?q?=EA=B9=85=20=EC=8B=9C=EC=8A=A4=ED=85=9C=20Android=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=BC=93=EA=B3=BC=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network/src/main/java/com/twix/network/HttpClientProvider.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/core/network/src/main/java/com/twix/network/HttpClientProvider.kt b/core/network/src/main/java/com/twix/network/HttpClientProvider.kt index 4f598072..9129b4ad 100644 --- a/core/network/src/main/java/com/twix/network/HttpClientProvider.kt +++ b/core/network/src/main/java/com/twix/network/HttpClientProvider.kt @@ -46,6 +46,7 @@ internal object HttpClientProvider { } else { LogLevel.NONE } + logger = Logger.ANDROID sanitizeHeader { header -> header == SANITIZE_HEADER } } From 7ef9ef0aa0aa142e4fd9a42d46a3a72927fe9fc2 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Thu, 22 Jan 2026 11:26:12 +0900 Subject: [PATCH 06/16] =?UTF-8?q?=E2=9C=A8=20=EC=B4=88=EB=8C=80=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20API=20=EC=9D=91=EB=8B=B5=20=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/response/onboarding/InviteCodeResponse.kt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 core/network/src/main/java/com/twix/network/model/response/onboarding/InviteCodeResponse.kt diff --git a/core/network/src/main/java/com/twix/network/model/response/onboarding/InviteCodeResponse.kt b/core/network/src/main/java/com/twix/network/model/response/onboarding/InviteCodeResponse.kt new file mode 100644 index 00000000..56fb14e3 --- /dev/null +++ b/core/network/src/main/java/com/twix/network/model/response/onboarding/InviteCodeResponse.kt @@ -0,0 +1,8 @@ +package com.twix.network.model.response.onboarding + +import kotlinx.serialization.Serializable + +@Serializable +data class InviteCodeResponse( + val inviteCode: String, +) From bb85f91db5ff5146ccb5cc118f5987dcb07c6101 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Thu, 22 Jan 2026 11:26:23 +0900 Subject: [PATCH 07/16] =?UTF-8?q?=E2=9C=A8=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20=EC=83=81=ED=83=9C=20API=20=EC=9D=91=EB=8B=B5=20=EB=AA=A8?= =?UTF-8?q?=EB=8D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/response/onboarding/OnBoardingStatusResponse.kt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 core/network/src/main/java/com/twix/network/model/response/onboarding/OnBoardingStatusResponse.kt diff --git a/core/network/src/main/java/com/twix/network/model/response/onboarding/OnBoardingStatusResponse.kt b/core/network/src/main/java/com/twix/network/model/response/onboarding/OnBoardingStatusResponse.kt new file mode 100644 index 00000000..4037b796 --- /dev/null +++ b/core/network/src/main/java/com/twix/network/model/response/onboarding/OnBoardingStatusResponse.kt @@ -0,0 +1,8 @@ +package com.twix.network.model.response.onboarding + +import kotlinx.serialization.Serializable + +@Serializable +data class OnBoardingStatusResponse( + val status: String, +) From 5cc9c95951aa272c4c71c466661b2d84d98917ee Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Thu, 22 Jan 2026 11:28:34 +0900 Subject: [PATCH 08/16] =?UTF-8?q?=E2=9C=A8=20OnboardingService=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/twix/network/di/ApiServiceModule.kt | 6 ++++ .../java/com/twix/network/di/NetworkModule.kt | 1 + .../twix/network/service/OnboardingService.kt | 30 +++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 core/network/src/main/java/com/twix/network/service/OnboardingService.kt diff --git a/core/network/src/main/java/com/twix/network/di/ApiServiceModule.kt b/core/network/src/main/java/com/twix/network/di/ApiServiceModule.kt index bfe215b8..7116c8c0 100644 --- a/core/network/src/main/java/com/twix/network/di/ApiServiceModule.kt +++ b/core/network/src/main/java/com/twix/network/di/ApiServiceModule.kt @@ -1,7 +1,13 @@ package com.twix.network.di +import com.twix.network.service.OnboardingService +import com.twix.network.service.createOnboardingService +import de.jensklingenberg.ktorfit.Ktorfit import org.koin.dsl.module internal val apiServiceModule = module { + single { + get().createOnboardingService() + } } diff --git a/core/network/src/main/java/com/twix/network/di/NetworkModule.kt b/core/network/src/main/java/com/twix/network/di/NetworkModule.kt index 60c94728..8ebfe092 100644 --- a/core/network/src/main/java/com/twix/network/di/NetworkModule.kt +++ b/core/network/src/main/java/com/twix/network/di/NetworkModule.kt @@ -3,4 +3,5 @@ package com.twix.network.di val networkModule = listOf( httpClientModule, + apiServiceModule, ) diff --git a/core/network/src/main/java/com/twix/network/service/OnboardingService.kt b/core/network/src/main/java/com/twix/network/service/OnboardingService.kt new file mode 100644 index 00000000..8a61263a --- /dev/null +++ b/core/network/src/main/java/com/twix/network/service/OnboardingService.kt @@ -0,0 +1,30 @@ +package com.twix.network.service + +import com.twix.network.model.response.onboarding.InviteCodeResponse +import com.twix.network.model.response.onboarding.OnBoardingStatusResponse +import de.jensklingenberg.ktorfit.http.Body +import de.jensklingenberg.ktorfit.http.GET +import de.jensklingenberg.ktorfit.http.POST + +interface OnboardingService { + @POST("onboarding/anniversary") + suspend fun anniversarySetup( + @Body request: String, + ) + + @POST("onboarding/couple-connection") + suspend fun coupleConnection( + @Body request: String, + ) + + @POST("onboarding/profile") + suspend fun profileSetup( + @Body request: String, + ) + + @GET("onboarding/invite-code") + suspend fun fetchInviteCode(): InviteCodeResponse + + @GET("onboarding/status") + suspend fun fetchOnBoardingStatus(): OnBoardingStatusResponse +} From 69a9a30b8835dc021c7b07a9c70053b0fe3aa2ab Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Thu, 22 Jan 2026 11:29:22 +0900 Subject: [PATCH 09/16] =?UTF-8?q?=E2=9C=A8=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20Repository=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/twix/di/InitKoin.kt | 2 ++ .../main/java/com/twix/data/di/DataModule.kt | 6 ++++ .../java/com/twix/data/di/RepositoryModule.kt | 12 +++++++ .../repository/DefaultOnboardingRepository.kt | 32 +++++++++++++++++++ .../domain/repository/OnBoardingRepository.kt | 16 ++++++++++ 5 files changed, 68 insertions(+) create mode 100644 data/src/main/java/com/twix/data/di/DataModule.kt create mode 100644 data/src/main/java/com/twix/data/di/RepositoryModule.kt create mode 100644 data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt create mode 100644 domain/src/main/java/com/twix/domain/repository/OnBoardingRepository.kt diff --git a/app/src/main/java/com/yapp/twix/di/InitKoin.kt b/app/src/main/java/com/yapp/twix/di/InitKoin.kt index 140d6f51..4b4dd87f 100644 --- a/app/src/main/java/com/yapp/twix/di/InitKoin.kt +++ b/app/src/main/java/com/yapp/twix/di/InitKoin.kt @@ -1,6 +1,7 @@ package com.yapp.twix.di import android.content.Context +import com.twix.data.di.dataModule import com.twix.network.di.networkModule import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin @@ -18,6 +19,7 @@ fun initKoin( addAll(extraModules) addAll(featureModules) addAll(networkModule) + addAll(dataModule) }, ) } diff --git a/data/src/main/java/com/twix/data/di/DataModule.kt b/data/src/main/java/com/twix/data/di/DataModule.kt new file mode 100644 index 00000000..b4bb1999 --- /dev/null +++ b/data/src/main/java/com/twix/data/di/DataModule.kt @@ -0,0 +1,6 @@ +package com.twix.data.di + +val dataModule = + listOf( + repositoryModule, + ) diff --git a/data/src/main/java/com/twix/data/di/RepositoryModule.kt b/data/src/main/java/com/twix/data/di/RepositoryModule.kt new file mode 100644 index 00000000..bc50e95d --- /dev/null +++ b/data/src/main/java/com/twix/data/di/RepositoryModule.kt @@ -0,0 +1,12 @@ +package com.twix.data.di + +import com.twix.data.repository.DefaultOnboardingRepository +import com.twix.domain.repository.OnBoardingRepository +import org.koin.dsl.module + +internal val repositoryModule = + module { + single { + DefaultOnboardingRepository(get()) + } + } diff --git a/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt b/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt new file mode 100644 index 00000000..ba9efe6e --- /dev/null +++ b/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt @@ -0,0 +1,32 @@ +package com.twix.data.repository + +import com.twix.domain.model.InviteCode +import com.twix.domain.model.OnboardingStatus +import com.twix.domain.repository.OnBoardingRepository +import com.twix.network.service.OnboardingService + +class DefaultOnboardingRepository( + private val service: OnboardingService, +) : OnBoardingRepository { + override suspend fun fetchInviteCode(): InviteCode { + val response = service.fetchInviteCode() + return InviteCode(response.inviteCode) + } + + override suspend fun fetchOnboardingStatus(): OnboardingStatus { + val response = service.fetchOnBoardingStatus() + return OnboardingStatus.from(response.status) + } + + override suspend fun anniversarySetup(request: String) { + service.anniversarySetup(request) + } + + override suspend fun coupleConnection(request: String) { + service.coupleConnection(request) + } + + override suspend fun profileSetup(request: String) { + service.profileSetup(request) + } +} diff --git a/domain/src/main/java/com/twix/domain/repository/OnBoardingRepository.kt b/domain/src/main/java/com/twix/domain/repository/OnBoardingRepository.kt new file mode 100644 index 00000000..76173f04 --- /dev/null +++ b/domain/src/main/java/com/twix/domain/repository/OnBoardingRepository.kt @@ -0,0 +1,16 @@ +package com.twix.domain.repository + +import com.twix.domain.model.InviteCode +import com.twix.domain.model.OnboardingStatus + +interface OnBoardingRepository { + suspend fun anniversarySetup(request: String) + + suspend fun coupleConnection(request: String) + + suspend fun profileSetup(request: String) + + suspend fun fetchInviteCode(): InviteCode + + suspend fun fetchOnboardingStatus(): OnboardingStatus +} From cec976eabaa0e4176326d478544ae00e2a0038f7 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Thu, 22 Jan 2026 11:29:53 +0900 Subject: [PATCH 10/16] =?UTF-8?q?=E2=9C=A8:=20Ktor=20client=20import=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/twix/network/HttpClientProvider.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/core/network/src/main/java/com/twix/network/HttpClientProvider.kt b/core/network/src/main/java/com/twix/network/HttpClientProvider.kt index 9129b4ad..c468b311 100644 --- a/core/network/src/main/java/com/twix/network/HttpClientProvider.kt +++ b/core/network/src/main/java/com/twix/network/HttpClientProvider.kt @@ -5,7 +5,9 @@ import io.ktor.client.HttpClientConfig import io.ktor.client.plugins.HttpTimeout import io.ktor.client.plugins.contentnegotiation.ContentNegotiation import io.ktor.client.plugins.defaultRequest +import io.ktor.client.plugins.logging.ANDROID import io.ktor.client.plugins.logging.LogLevel +import io.ktor.client.plugins.logging.Logger import io.ktor.client.plugins.logging.Logging import io.ktor.http.ContentType import io.ktor.http.contentType @@ -24,6 +26,18 @@ internal object HttpClientProvider { configureLogging(isDebug) configureTimeout() configureDefaultRequest(baseUrl) + + // TODO : 토큰 관련 기능 구현 후 적용 +// install(Auth) { +// bearer { +// loadTokens { +// BearerTokens( +// accessToken = "", +// refreshToken = "", +// ) +// } +// } +// } } private fun HttpClientConfig<*>.configureContentNegotiation(isDebug: Boolean) { From cb098728bbc328db4267d92e7dcaa81a8cdceb7d Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Thu, 22 Jan 2026 11:30:15 +0900 Subject: [PATCH 11/16] =?UTF-8?q?=F0=9F=94=A5=20.gitkeep=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/design-system/src/main/java/com/twix/designsystem/.gitkeep | 1 - data/src/main/java/com/twix/data/.gitkeep | 1 - domain/src/main/java/com/twix/domain/.gitkeep | 1 - 3 files changed, 3 deletions(-) delete mode 100644 core/design-system/src/main/java/com/twix/designsystem/.gitkeep delete mode 100644 data/src/main/java/com/twix/data/.gitkeep delete mode 100644 domain/src/main/java/com/twix/domain/.gitkeep diff --git a/core/design-system/src/main/java/com/twix/designsystem/.gitkeep b/core/design-system/src/main/java/com/twix/designsystem/.gitkeep deleted file mode 100644 index 379ad9b7..00000000 --- a/core/design-system/src/main/java/com/twix/designsystem/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -# This file ensures the directory is tracked by git diff --git a/data/src/main/java/com/twix/data/.gitkeep b/data/src/main/java/com/twix/data/.gitkeep deleted file mode 100644 index 379ad9b7..00000000 --- a/data/src/main/java/com/twix/data/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -# This file ensures the directory is tracked by git diff --git a/domain/src/main/java/com/twix/domain/.gitkeep b/domain/src/main/java/com/twix/domain/.gitkeep deleted file mode 100644 index 379ad9b7..00000000 --- a/domain/src/main/java/com/twix/domain/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -# This file ensures the directory is tracked by git From 1c3873e392c4935e535f842316431068710f524a Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Thu, 22 Jan 2026 11:31:57 +0900 Subject: [PATCH 12/16] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20KtlintFormat=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/com/twix/domain/model/OnboardingStatusTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/domain/src/test/java/com/twix/domain/model/OnboardingStatusTest.kt b/domain/src/test/java/com/twix/domain/model/OnboardingStatusTest.kt index 968a759f..3e7a6b0d 100644 --- a/domain/src/test/java/com/twix/domain/model/OnboardingStatusTest.kt +++ b/domain/src/test/java/com/twix/domain/model/OnboardingStatusTest.kt @@ -13,12 +13,12 @@ class OnboardingStatusTest { "COUPLE_CONNECTION,COUPLE_CONNECTION", "PROFILE_SETUP,PROFILE_SETUP", "ANNIVERSARY_SETUP,ANNIVERSARY_SETUP", - "COMPLETED,COMPLETED" + "COMPLETED,COMPLETED", ) @DisplayName("올바른 OnboardingStatus enum을 반환한다") fun `유효한 상태 문자열이 주어지면 올바른 OnboardingStatus enum을 반환한다`( input: String, - expected: OnboardingStatus + expected: OnboardingStatus, ) { // when val result = OnboardingStatus.from(input) From e97f63b3e1b043074aaeb5b51c83816c8d5af87d Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Mon, 26 Jan 2026 17:35:01 +0900 Subject: [PATCH 13/16] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor:=20Request?= =?UTF-8?q?=20DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../twix/network/model/request/CoupleConnectionReqeust.kt | 8 ++++++++ .../java/com/twix/network/model/request/ProfileRequest.kt | 8 ++++++++ .../java/com/twix/network/service/OnboardingService.kt | 6 ++++-- .../twix/data/repository/DefaultOnboardingRepository.kt | 6 ++++-- 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 core/network/src/main/java/com/twix/network/model/request/CoupleConnectionReqeust.kt create mode 100644 core/network/src/main/java/com/twix/network/model/request/ProfileRequest.kt diff --git a/core/network/src/main/java/com/twix/network/model/request/CoupleConnectionReqeust.kt b/core/network/src/main/java/com/twix/network/model/request/CoupleConnectionReqeust.kt new file mode 100644 index 00000000..830ad861 --- /dev/null +++ b/core/network/src/main/java/com/twix/network/model/request/CoupleConnectionReqeust.kt @@ -0,0 +1,8 @@ +package com.twix.network.model.request + +import kotlinx.serialization.Serializable + +@Serializable +data class CoupleConnectionReqeust( + val inviteCode: String, +) diff --git a/core/network/src/main/java/com/twix/network/model/request/ProfileRequest.kt b/core/network/src/main/java/com/twix/network/model/request/ProfileRequest.kt new file mode 100644 index 00000000..86501941 --- /dev/null +++ b/core/network/src/main/java/com/twix/network/model/request/ProfileRequest.kt @@ -0,0 +1,8 @@ +package com.twix.network.model.request + +import kotlinx.serialization.Serializable + +@Serializable +data class ProfileRequest( + val nickname: String, +) diff --git a/core/network/src/main/java/com/twix/network/service/OnboardingService.kt b/core/network/src/main/java/com/twix/network/service/OnboardingService.kt index 8a61263a..dd5e8487 100644 --- a/core/network/src/main/java/com/twix/network/service/OnboardingService.kt +++ b/core/network/src/main/java/com/twix/network/service/OnboardingService.kt @@ -1,5 +1,7 @@ package com.twix.network.service +import com.twix.network.model.request.CoupleConnectionReqeust +import com.twix.network.model.request.ProfileRequest import com.twix.network.model.response.onboarding.InviteCodeResponse import com.twix.network.model.response.onboarding.OnBoardingStatusResponse import de.jensklingenberg.ktorfit.http.Body @@ -14,12 +16,12 @@ interface OnboardingService { @POST("onboarding/couple-connection") suspend fun coupleConnection( - @Body request: String, + @Body request: CoupleConnectionReqeust, ) @POST("onboarding/profile") suspend fun profileSetup( - @Body request: String, + @Body request: ProfileRequest, ) @GET("onboarding/invite-code") diff --git a/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt b/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt index ba9efe6e..6d1764f5 100644 --- a/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt +++ b/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt @@ -3,6 +3,8 @@ package com.twix.data.repository import com.twix.domain.model.InviteCode import com.twix.domain.model.OnboardingStatus import com.twix.domain.repository.OnBoardingRepository +import com.twix.network.model.request.CoupleConnectionReqeust +import com.twix.network.model.request.ProfileRequest import com.twix.network.service.OnboardingService class DefaultOnboardingRepository( @@ -23,10 +25,10 @@ class DefaultOnboardingRepository( } override suspend fun coupleConnection(request: String) { - service.coupleConnection(request) + service.coupleConnection(CoupleConnectionReqeust(request)) } override suspend fun profileSetup(request: String) { - service.profileSetup(request) + service.profileSetup(ProfileRequest(request)) } } From 00dd4228d3926088c9af95cd6328cf5850a0422d Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Mon, 26 Jan 2026 17:37:17 +0900 Subject: [PATCH 14/16] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor:=20Onboardi?= =?UTF-8?q?ngStatus=20=EB=A7=A4=ED=95=91=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/twix/domain/model/OnboardingStatus.kt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/domain/src/main/java/com/twix/domain/model/OnboardingStatus.kt b/domain/src/main/java/com/twix/domain/model/OnboardingStatus.kt index 72489333..ab5272c8 100644 --- a/domain/src/main/java/com/twix/domain/model/OnboardingStatus.kt +++ b/domain/src/main/java/com/twix/domain/model/OnboardingStatus.kt @@ -9,12 +9,10 @@ enum class OnboardingStatus { companion object { fun from(status: String): OnboardingStatus = - when (status) { - "COUPLE_CONNECTION" -> COUPLE_CONNECTION - "PROFILE_SETUP" -> PROFILE_SETUP - "ANNIVERSARY_SETUP" -> ANNIVERSARY_SETUP - "COMPLETED" -> COMPLETED - else -> throw IllegalArgumentException(UNKNOWN_STATUS.format(status)) + runCatching { + valueOf(status.trim().uppercase()) + }.getOrElse { + throw IllegalArgumentException(UNKNOWN_STATUS.format(status)) } private const val UNKNOWN_STATUS = "UNKNOWN_STATUS: %s" From b7d00ce5c7f2505a61ea3fca84d15f815b4d57c3 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Mon, 26 Jan 2026 18:32:46 +0900 Subject: [PATCH 15/16] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor:=20CoupleCo?= =?UTF-8?q?nnectionReqeust=20=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...{CoupleConnectionReqeust.kt => CoupleConnectionRequest.kt} | 2 +- .../main/java/com/twix/network/service/OnboardingService.kt | 4 ++-- .../com/twix/data/repository/DefaultOnboardingRepository.kt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename core/network/src/main/java/com/twix/network/model/request/{CoupleConnectionReqeust.kt => CoupleConnectionRequest.kt} (77%) diff --git a/core/network/src/main/java/com/twix/network/model/request/CoupleConnectionReqeust.kt b/core/network/src/main/java/com/twix/network/model/request/CoupleConnectionRequest.kt similarity index 77% rename from core/network/src/main/java/com/twix/network/model/request/CoupleConnectionReqeust.kt rename to core/network/src/main/java/com/twix/network/model/request/CoupleConnectionRequest.kt index 830ad861..4c5461fe 100644 --- a/core/network/src/main/java/com/twix/network/model/request/CoupleConnectionReqeust.kt +++ b/core/network/src/main/java/com/twix/network/model/request/CoupleConnectionRequest.kt @@ -3,6 +3,6 @@ package com.twix.network.model.request import kotlinx.serialization.Serializable @Serializable -data class CoupleConnectionReqeust( +data class CoupleConnectionRequest( val inviteCode: String, ) diff --git a/core/network/src/main/java/com/twix/network/service/OnboardingService.kt b/core/network/src/main/java/com/twix/network/service/OnboardingService.kt index dd5e8487..f4953302 100644 --- a/core/network/src/main/java/com/twix/network/service/OnboardingService.kt +++ b/core/network/src/main/java/com/twix/network/service/OnboardingService.kt @@ -1,6 +1,6 @@ package com.twix.network.service -import com.twix.network.model.request.CoupleConnectionReqeust +import com.twix.network.model.request.CoupleConnectionRequest import com.twix.network.model.request.ProfileRequest import com.twix.network.model.response.onboarding.InviteCodeResponse import com.twix.network.model.response.onboarding.OnBoardingStatusResponse @@ -16,7 +16,7 @@ interface OnboardingService { @POST("onboarding/couple-connection") suspend fun coupleConnection( - @Body request: CoupleConnectionReqeust, + @Body request: CoupleConnectionRequest, ) @POST("onboarding/profile") diff --git a/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt b/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt index 6d1764f5..65d203c6 100644 --- a/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt +++ b/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt @@ -3,7 +3,7 @@ package com.twix.data.repository import com.twix.domain.model.InviteCode import com.twix.domain.model.OnboardingStatus import com.twix.domain.repository.OnBoardingRepository -import com.twix.network.model.request.CoupleConnectionReqeust +import com.twix.network.model.request.CoupleConnectionRequest import com.twix.network.model.request.ProfileRequest import com.twix.network.service.OnboardingService @@ -25,7 +25,7 @@ class DefaultOnboardingRepository( } override suspend fun coupleConnection(request: String) { - service.coupleConnection(CoupleConnectionReqeust(request)) + service.coupleConnection(CoupleConnectionRequest(request)) } override suspend fun profileSetup(request: String) { From 3216d74e37b23340596514a6e191412648282818 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Mon, 26 Jan 2026 21:26:40 +0900 Subject: [PATCH 16/16] =?UTF-8?q?=E2=9C=A8=20Feat:=20AnniversaryRequest=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/twix/network/model/request/AnniversaryRequest.kt | 8 ++++++++ .../java/com/twix/network/service/OnboardingService.kt | 3 ++- .../twix/data/repository/DefaultOnboardingRepository.kt | 3 ++- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 core/network/src/main/java/com/twix/network/model/request/AnniversaryRequest.kt diff --git a/core/network/src/main/java/com/twix/network/model/request/AnniversaryRequest.kt b/core/network/src/main/java/com/twix/network/model/request/AnniversaryRequest.kt new file mode 100644 index 00000000..4506fe76 --- /dev/null +++ b/core/network/src/main/java/com/twix/network/model/request/AnniversaryRequest.kt @@ -0,0 +1,8 @@ +package com.twix.network.model.request + +import kotlinx.serialization.Serializable + +@Serializable +data class AnniversaryRequest( + val anniversaryDate: String, +) diff --git a/core/network/src/main/java/com/twix/network/service/OnboardingService.kt b/core/network/src/main/java/com/twix/network/service/OnboardingService.kt index f4953302..6cd55e5d 100644 --- a/core/network/src/main/java/com/twix/network/service/OnboardingService.kt +++ b/core/network/src/main/java/com/twix/network/service/OnboardingService.kt @@ -1,5 +1,6 @@ package com.twix.network.service +import com.twix.network.model.request.AnniversaryRequest import com.twix.network.model.request.CoupleConnectionRequest import com.twix.network.model.request.ProfileRequest import com.twix.network.model.response.onboarding.InviteCodeResponse @@ -11,7 +12,7 @@ import de.jensklingenberg.ktorfit.http.POST interface OnboardingService { @POST("onboarding/anniversary") suspend fun anniversarySetup( - @Body request: String, + @Body request: AnniversaryRequest, ) @POST("onboarding/couple-connection") diff --git a/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt b/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt index 65d203c6..a9f998f6 100644 --- a/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt +++ b/data/src/main/java/com/twix/data/repository/DefaultOnboardingRepository.kt @@ -3,6 +3,7 @@ package com.twix.data.repository import com.twix.domain.model.InviteCode import com.twix.domain.model.OnboardingStatus import com.twix.domain.repository.OnBoardingRepository +import com.twix.network.model.request.AnniversaryRequest import com.twix.network.model.request.CoupleConnectionRequest import com.twix.network.model.request.ProfileRequest import com.twix.network.service.OnboardingService @@ -21,7 +22,7 @@ class DefaultOnboardingRepository( } override suspend fun anniversarySetup(request: String) { - service.anniversarySetup(request) + service.anniversarySetup(AnniversaryRequest(request)) } override suspend fun coupleConnection(request: String) {