Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
c65bb5e
✨ :: SignUpModel μΆ”κ°€
oheunchan07 Aug 21, 2025
0600e85
✨ :: SignUpDto μΆ”κ°€
oheunchan07 Aug 21, 2025
c87c306
✨ :: SignUpMapper μΆ”κ°€
oheunchan07 Aug 21, 2025
33819a8
✨ :: SignUpDataSource μΆ”κ°€
oheunchan07 Aug 21, 2025
a8ac035
✨ :: SignUpRepository μΆ”κ°€
oheunchan07 Aug 21, 2025
25a99ef
✨ :: SignUpUseCase μΆ”κ°€
oheunchan07 Aug 21, 2025
959ec04
✨ :: SignUpApi μΆ”κ°€
oheunchan07 Aug 21, 2025
1dec20c
✨ :: SignUpUiState μΆ”κ°€
oheunchan07 Aug 21, 2025
e3d88fb
✨ :: SignUpUiViewModel μΆ”κ°€
oheunchan07 Aug 21, 2025
7f3858e
♻️ :: nameSpace μˆ˜μ •
oheunchan07 Aug 21, 2025
fc52a3a
✨ :: VerificationEmailDto μΆ”κ°€
oheunchan07 Aug 25, 2025
073c8be
✨ :: VerificationEmailModel μΆ”κ°€
oheunchan07 Aug 25, 2025
f849478
✨ :: VerificationEmailMapper μΆ”κ°€
oheunchan07 Aug 25, 2025
c47f68c
✨ :: VerificationEmailApi μΆ”κ°€
oheunchan07 Aug 25, 2025
a8daa08
✨ :: VerificationEmailDataSource μΆ”κ°€
oheunchan07 Aug 25, 2025
f4db655
✨ :: VerificationEmailRepository μΆ”κ°€
oheunchan07 Aug 25, 2025
92a07bb
✨ :: VerificationEmailUseCase μΆ”κ°€
oheunchan07 Aug 25, 2025
cf05834
✨ :: VerificationEmailViewModel μΆ”κ°€
oheunchan07 Aug 25, 2025
5b25b2a
✨ :: VerificationEmailUiState μΆ”κ°€
oheunchan07 Aug 25, 2025
5df7043
♻️ :: λ³€μˆ˜λͺ… μˆ˜μ • postVerificationEmail -> verificationEmail
oheunchan07 Aug 25, 2025
a729c55
♻️ :: λ³€μˆ˜λͺ… μˆ˜μ • postVerificationEmail -> verificationEmail
oheunchan07 Aug 25, 2025
c72b855
✨ :: VerificationCodeDto μΆ”κ°€
oheunchan07 Aug 25, 2025
aca4575
✨ :: VerificationCodeModel μΆ”κ°€
oheunchan07 Aug 25, 2025
f5d52ba
✨ :: VerificationCodeApi μΆ”κ°€
oheunchan07 Aug 25, 2025
80d61ea
✨ :: VerificationCodeDataSource μΆ”κ°€
oheunchan07 Aug 25, 2025
ec821c5
✨ :: VerificationCodeRepository μΆ”κ°€
oheunchan07 Aug 25, 2025
5bc07fc
✨ :: VerificationCodeMapper μΆ”κ°€
oheunchan07 Aug 25, 2025
6dd51a1
✨ :: VerificationCodeUseCase μΆ”κ°€
oheunchan07 Aug 25, 2025
6256646
✨ :: VerificationCodeUiState μΆ”κ°€
oheunchan07 Aug 25, 2025
440285d
✨ :: VerificationCodeViewModel μΆ”κ°€
oheunchan07 Aug 25, 2025
bfc20ea
♻️ :: settings.gradle.kts μˆ˜μ •
oheunchan07 Aug 25, 2025
3951503
✨ :: SchoolInfoDto μΆ”κ°€
oheunchan07 Aug 26, 2025
67ddbfd
✨ :: SchoolInfoModel μΆ”κ°€
oheunchan07 Aug 26, 2025
c7a354a
✨ :: SchoolInfoMapper μΆ”κ°€
oheunchan07 Aug 26, 2025
322c8c6
✨ :: SchoolApi μΆ”κ°€
oheunchan07 Aug 26, 2025
5cdd9d2
✨ :: School NetworkModule μΆ”κ°€
oheunchan07 Aug 26, 2025
8094e6c
✨ :: SchoolDataSource μΆ”κ°€
oheunchan07 Aug 26, 2025
92f81b3
✨ :: SchoolRepository μΆ”κ°€
oheunchan07 Aug 26, 2025
94ca754
✨ :: SchoolUseCase μΆ”κ°€
oheunchan07 Aug 26, 2025
601e1e0
✨ :: SchoolUiState μΆ”κ°€
oheunchan07 Aug 26, 2025
0dcb11b
✨ :: SchoolViewModel μΆ”κ°€
oheunchan07 Aug 26, 2025
c51cef9
✨ :: Neis Api μΆ”κ°€
oheunchan07 Aug 26, 2025
092f584
♻️ :: api μ£Όμ†Œ μˆ˜μ •
oheunchan07 Aug 28, 2025
4afcdc4
✨ :: build.gradle.kts μΆ”κ°€
oheunchan07 Aug 28, 2025
aa18faf
✨ :: navigation μ—°κ²°
oheunchan07 Aug 28, 2025
e2f835d
✨ :: 라이브러리 μΆ”κ°€
oheunchan07 Aug 28, 2025
9460377
✨ :: VerificationCodeUiState μΆ”κ°€
oheunchan07 Aug 28, 2025
f48cfeb
✨ :: SearchSchoolUiState μΆ”κ°€
oheunchan07 Aug 28, 2025
3565f14
✨ :: SignUpcreen ViewModel 적용
oheunchan07 Aug 28, 2025
bdafe7e
Merge remote-tracking branch 'origin/develop' into feature/208-sign-u…
oheunchan07 Aug 28, 2025
d39c25e
♻️ :: μ€„λ°”κΏˆ 적용
oheunchan07 Sep 1, 2025
3ff8449
♻️ :: λΆˆν•„μš”ν•œ 코루틴 둜직 μ‚­μ œ
oheunchan07 Sep 1, 2025
92519dc
♻️ :: UiState μˆ˜μ •
oheunchan07 Sep 1, 2025
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
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ dependencies {
implementation(project(":feature:chart"))
implementation(project(":feature:account"))
implementation(project(":feature:signin"))
implementation(project(":feature:signup"))
implementation(project(":feature:trade"))
implementation(project(":feature:investmentSearch"))
implementation(project(":feature:monthlyEarnings"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ import com.jusicool.account.navigation.accountRoute
import com.jusicool.account.navigation.navigateToAccountRoute
import com.jusicool.chart.navigation.chartRoute
import com.jusicool.chart.navigation.navigateToChartRoute
import com.jusicool.signin.navigation.navigateToSignInRoute
import com.jusicool.signin.navigation.signInRoute
import com.jusicool.signup.navigation.navigateToSignUpRoute
import com.jusicool.signup.navigation.signUpRoute
import com.jusicool.trade.navigation.buyReserveRoute
import com.jusicool.trade.navigation.buyRoute
import com.jusicool.trade.navigation.navigateToBuyReserveRoute
Expand Down Expand Up @@ -42,10 +45,14 @@ fun JusicoolNavHost(
startDestination = startDestination
) {
signInRoute(
navigateToSignUp = { /*TODO()*/ },
navigateToSignUp = navController::navigateToSignUpRoute,
navigateToAccount = navController::navigateToAccountRoute
)

signUpRoute(
navigateToSignIn = navController::navigateToSignInRoute
)

accountRoute(
navigateToOrderHistory = navController::navigateToOrderHistoryRoute,
navigateToMonthlyEarningsRoute = navController::navigateToMonthlyEarningsRoute,
Expand Down
7 changes: 7 additions & 0 deletions data/di/src/main/java/com/jusicool/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import com.jusicool.repository.MarketRepository
import com.jusicool.repository.MarketRepositoryImpl
import com.jusicool.repository.OrderRepository
import com.jusicool.repository.OrderRepositoryImpl
import com.jusicool.repository.SchoolRepository
import com.jusicool.repository.SchoolRepositoryImpl
import com.jusicool.repository.WsKoreaInvestmentRepository
import com.jusicool.repository.WsKoreaInvestmentRepositoryImpl
import dagger.Binds
Expand Down Expand Up @@ -72,4 +74,9 @@ abstract class RepositoryModule {
abstract fun bindCommunityRepository(
communityRepositoryImpl: CommunityRepositoryImpl
): CommunityRepository

@Binds
abstract fun bindSchoolRepository(
schoolRepositoryImpl: SchoolRepositoryImpl
): SchoolRepository
}
11 changes: 11 additions & 0 deletions data/model/src/main/java/com/jusicool/model/auth/SignUpRequest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.jusicool.model.auth

import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
data class SignUpRequest(
val username: String,
val email: String,
val password: String,
val school: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.jusicool.model.auth

import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
data class VerificationCodeRequest(
val email: String,
val code: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.jusicool.model.auth

import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
data class VerificationEmailRequest(
val email: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.jusicool.model.mapper.auth

import com.jusicool.entity.auth.SignUpModel
import com.jusicool.model.auth.SignUpRequest

fun SignUpModel.toDto(): SignUpRequest =
SignUpRequest(
username = this.username,
email = this.email,
password = this.password,
school = this.school
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.jusicool.model.mapper.auth

import com.jusicool.entity.auth.VerificationCodeModel
import com.jusicool.model.auth.VerificationCodeRequest

fun VerificationCodeModel.toDto(): VerificationCodeRequest =
VerificationCodeRequest(
email = this.email,
code = this.code
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.jusicool.model.mapper.auth

import com.jusicool.entity.auth.VerificationEmailModel
import com.jusicool.model.auth.VerificationEmailRequest

fun VerificationEmailModel.toDto(): VerificationEmailRequest =
VerificationEmailRequest(
email = this.email
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.jusicool.model.mapper.school

import com.jusicool.entity.school.SchoolInfoModel
import com.jusicool.model.school.SchoolInfoResponse
import com.jusicool.model.school.SchoolRow

fun SchoolInfoResponse.toModel(): List<SchoolInfoModel> {
val rows = sections
.orEmpty()
.flatMap { it.row.orEmpty() }

val dedup = LinkedHashMap<String, SchoolInfoModel>()

rows.forEach { r ->
val name = r.name?.trim().orEmpty()
if (name.isEmpty()) return@forEach

val address = listOfNotNull(
r.roadAddr?.trim()?.takeIf { it.isNotEmpty() },
r.roadDetail?.trim()?.takeIf { it.isNotEmpty() }
).joinToString(" ")

val model = SchoolInfoModel(
officeCode = r.officeCode.orEmpty(),
schoolCode = r.schoolCode.orEmpty(),
name = name,
address = address
)

val key = if (model.schoolCode.isNotEmpty()) {
"code:${model.schoolCode}"
} else {
"fallback:${model.name}|${model.address}"
}

dedup.putIfAbsent(key, model)
}

return dedup.values.toList()
}

fun SchoolRow.toModel(): SchoolInfoModel = SchoolInfoModel(
officeCode = officeCode.orEmpty(),
schoolCode = schoolCode.orEmpty(),
name = name.orEmpty(),
address = listOfNotNull(
roadAddr?.trim()?.takeIf { it.isNotEmpty() },
roadDetail?.trim()?.takeIf { it.isNotEmpty() }
).joinToString(" ")
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.jusicool.model.school

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
data class SchoolInfoResponse(
@Json(name = "schoolInfo") val sections: List<RowSection>? = null
)

@JsonClass(generateAdapter = true)
data class RowSection(
val row: List<SchoolRow>? = null
)

@JsonClass(generateAdapter = true)
data class SchoolRow(
@Json(name = "ATPT_OFCDC_SC_CODE") val officeCode: String? = null,
@Json(name = "SD_SCHUL_CODE") val schoolCode: String? = null,
@Json(name = "SCHUL_NM") val name: String? = null,
@Json(name = "ORG_RDNMA") val roadAddr: String? = null,
@Json(name = "ORG_RDNDA") val roadDetail: String? = null
)
5 changes: 5 additions & 0 deletions data/network/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ android {
name = "KOREAINVESTMENT_BASE_URL",
value = "\"${getApiKey("KOREAINVESTMENT_BASE_URL")}\""
)
buildConfigField(
type = "String",
name = "NEIS_API_KEY",
value = "\"${getApiKey("NEIS_API_KEY")}\""
)
}

namespace = "com.jusicool.network"
Expand Down
18 changes: 18 additions & 0 deletions data/network/src/main/java/com/jusicool/network/api/AuthApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,28 @@ package com.jusicool.network.api
import retrofit2.http.Body
import retrofit2.http.POST
import com.jusicool.model.auth.SignInRequest
import com.jusicool.model.auth.SignUpRequest
import com.jusicool.model.auth.VerificationCodeRequest
import com.jusicool.model.auth.VerificationEmailRequest

interface AuthApi {
@POST("/user/signin")
suspend fun signIn(
@Body body: SignInRequest
)

@POST("/user/signup")
suspend fun signUp(
@Body body: SignUpRequest
)

@POST("/user/email/send")
suspend fun verificationEmailRequest(
@Body body: VerificationEmailRequest
)

@POST("/user/email/verify")
suspend fun verificationCodeRequest(
@Body body: VerificationCodeRequest
)
}
17 changes: 17 additions & 0 deletions data/network/src/main/java/com/jusicool/network/api/SchoolApi.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.jusicool.network.api


import com.jusicool.model.school.SchoolInfoResponse
import retrofit2.http.GET
import retrofit2.http.Query

interface SchoolApi {
@GET("schoolInfo")
suspend fun searchSchools(
@Query("KEY") key: String,
@Query("Type") type: String = "json",
@Query("pIndex") pIndex: Int = 1,
@Query("pSize") pSize: Int = 30,
@Query("SCHUL_NM") keyword: String
): SchoolInfoResponse
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
package com.jusicool.network.datasource.auth

import com.jusicool.model.auth.SignInRequest
import com.jusicool.model.auth.SignUpRequest
import com.jusicool.model.auth.VerificationCodeRequest
import com.jusicool.model.auth.VerificationEmailRequest
import kotlinx.coroutines.flow.Flow

interface AuthDataSource {
fun authSignIn(body: SignInRequest): Flow<Unit>

fun authSignUp(body: SignUpRequest): Flow<Unit>

fun verificationEmail(body: VerificationEmailRequest): Flow<Unit>

fun verificationCode(body: VerificationCodeRequest): Flow<Unit>
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.jusicool.network.datasource.auth

import com.jusicool.model.auth.SignInRequest
import com.jusicool.model.auth.SignUpRequest
import com.jusicool.model.auth.VerificationCodeRequest
import com.jusicool.model.auth.VerificationEmailRequest
import com.jusicool.network.api.AuthApi
import com.jusicool.utils.performApiRequest
import kotlinx.coroutines.flow.Flow
Expand All @@ -11,4 +14,13 @@ class AuthDataSourceImpl @Inject constructor(
) : AuthDataSource {
override fun authSignIn(body: SignInRequest): Flow<Unit> =
performApiRequest { service.signIn(body = body) }

override fun authSignUp(body: SignUpRequest): Flow<Unit> =
performApiRequest { service.signUp(body = body) }

override fun verificationEmail(body: VerificationEmailRequest): Flow<Unit> =
performApiRequest { service.verificationEmailRequest(body = body) }

override fun verificationCode(body: VerificationCodeRequest): Flow<Unit> =
performApiRequest { service.verificationCodeRequest(body = body) }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.jusicool.network.datasource.school

import com.jusicool.model.school.SchoolInfoResponse
import kotlinx.coroutines.flow.Flow

interface SchoolDataSource {
fun searchSchools(keyword: String, page: Int = 1, size: Int = 30): Flow<SchoolInfoResponse>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.jusicool.network.datasource.school

import com.jusicool.model.mapper.school.toModel
import com.jusicool.model.school.SchoolInfoResponse
import com.jusicool.network.BuildConfig
import com.jusicool.network.api.SchoolApi
import com.jusicool.utils.performApiRequest
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject

class SchoolDatasourceImpl @Inject constructor(
private val schoolApi: SchoolApi
) : SchoolDataSource {
override fun searchSchools(keyword: String, page: Int, size: Int): Flow<SchoolInfoResponse> =
performApiRequest { schoolApi.searchSchools(key = BuildConfig.NEIS_API_KEY, pIndex = page, pSize = size, keyword = keyword) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@ import com.jusicool.network.api.HoldingApi
import com.jusicool.network.api.KoreaInvestmentApi
import com.jusicool.network.api.MarketApi
import com.jusicool.network.api.OrderApi
import com.jusicool.network.api.SchoolApi
import com.jusicool.network.util.BaseApiRetrofit
import com.jusicool.network.util.BasicCookieJar
import com.jusicool.network.util.KoreaInvestmentAuthManager
import com.jusicool.network.util.KoreaInvestmentInterceptor
import com.jusicool.network.util.KoreaInvestmentRetrofit
import com.jusicool.network.util.NeisRetrofit
import com.jusicool.network.util.UpbitRetrofit
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
Expand Down Expand Up @@ -145,6 +147,19 @@ object NetworkModule {
.addConverterFactory(moshiConverterFactory)
.build()

@Provides
@Singleton
@NeisRetrofit
fun provideNeisRetrofit(
okHttpClient: OkHttpClient,
moshiConverterFactory: MoshiConverterFactory
): Retrofit =
Retrofit.Builder()
.baseUrl("https://open.neis.go.kr/hub/")
.client(okHttpClient)
.addConverterFactory(moshiConverterFactory)
.build()

@Provides
fun provideAuthApi(@BaseApiRetrofit retrofit: Retrofit): AuthApi =
retrofit.create(AuthApi::class.java)
Expand Down Expand Up @@ -176,4 +191,8 @@ object NetworkModule {
@Provides
fun provideCommunityApi(@BaseApiRetrofit retrofit: Retrofit): CommunityApi =
retrofit.create(CommunityApi::class.java)

@Provides
fun provideSchoolApi(@NeisRetrofit retrofit: Retrofit): SchoolApi =
retrofit.create(SchoolApi::class.java)
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import com.jusicool.network.datasource.market.MarketDataSource
import com.jusicool.network.datasource.market.MarketDataSourceImpl
import com.jusicool.network.datasource.order.OrderDataSource
import com.jusicool.network.datasource.order.OrderDataSourceImpl
import com.jusicool.network.datasource.school.SchoolDataSource
import com.jusicool.network.datasource.school.SchoolDatasourceImpl
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
Expand Down Expand Up @@ -77,4 +79,9 @@ abstract class RemoteDataSourceModule {
abstract fun bindMarketDataSource(
marketDataSourceImpl: MarketDataSourceImpl
): MarketDataSource

@Binds
abstract fun bindSchoolDataSource(
schoolDatasourceImpl: SchoolDatasourceImpl
): SchoolDataSource
}
Loading