Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[로그인] #9 - 로그인 기능 구현 #10

Merged
merged 4 commits into from
Dec 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 7 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,19 @@ android {
}

dependencies {
implementation(projects.core.designsystem)
implementation(projects.feature.mypage)
implementation(projects.feature.home)
implementation(projects.feature.viewmore)
implementation(projects.feature.map)
implementation(projects.feature.signin)
implementation(projects.feature.splash)

implementation(projects.core.repo.signin.impl)

implementation(projects.core.http)

implementation(projects.core.designsystem)

implementation(libs.androidx.appcompat)
implementation(libs.kotlinx.immutable)
}
1 change: 0 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">


<uses-permission android:name="android.permission.INTERNET" />

<application
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import androidx.navigation.navOptions
import org.cazait.cazaitandroid.feature.home.navigateHome
import org.cazait.cazaitandroid.feature.map.navigateMap
import org.cazait.cazaitandroid.feature.mypage.navigateMyPage
import org.cazait.cazaitandroid.feature.signin.navigateSignIn
import org.cazait.cazaitandroid.feature.splash.SplashNav
import org.cazait.cazaitandroid.feature.viewmore.navigateViewMore

internal class MainNavigator(
Expand All @@ -20,7 +22,7 @@ internal class MainNavigator(
@Composable get() = navController
.currentBackStackEntryAsState().value?.destination

val startDestination = org.cazait.cazaitandroid.feature.splash.SplashNav.route
val startDestination = SplashNav.route

val currentTab: MainTab?
@Composable get() = currentDestination
Expand All @@ -44,6 +46,10 @@ internal class MainNavigator(
}
}

fun navigateSignIn() {
navController.navigateSignIn()
}

@Composable
fun shouldShowBottomBar(): Boolean {
val currentRoute = currentDestination?.route ?: return false
Expand Down
29 changes: 16 additions & 13 deletions app/src/main/kotlin/org/cazait/cazaitandroid/ui/MainScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ import org.cazait.cazaitandroid.core.designsystem.theme.surfaceDim
import org.cazait.cazaitandroid.feature.home.homeNavGraph
import org.cazait.cazaitandroid.feature.map.mapNavGraph
import org.cazait.cazaitandroid.feature.mypage.myPageNavGraph
import org.cazait.cazaitandroid.feature.signin.signInNavGraph
import org.cazait.cazaitandroid.feature.splash.splashNavGraph
import org.cazait.cazaitandroid.feature.viewmore.viewMoreNavGraph
import org.cazait.cazaitandroid.rememberMainNavigator
Expand Down Expand Up @@ -82,27 +83,29 @@ internal fun MainScreen(
startDestination = navigator.startDestination,
) {
homeNavGraph(
padding = padding,
onCafeClick = {},
onShowErrorSnackbar = onShowErrorSnackbar,
// padding = padding,
// onCafeClick = {},
// onShowErrorSnackbar = onShowErrorSnackbar,
)
mapNavGraph(
padding = padding,
onCafeClick = {},
onShowErrorSnackbar = onShowErrorSnackbar,
// padding = padding,
// onCafeClick = {},
// onShowErrorSnackbar = onShowErrorSnackbar,
)
myPageNavGraph(
padding = padding,
onCafeClick = {},
onShowErrorSnackbar = onShowErrorSnackbar,
// padding = padding,
// onCafeClick = {},
// onShowErrorSnackbar = onShowErrorSnackbar,
)
viewMoreNavGraph(
padding = padding,
onShowErrorSnackbar = onShowErrorSnackbar,
// padding = padding,
// onShowErrorSnackbar = onShowErrorSnackbar,
)
splashNavGraph(
padding = padding,
onClickStart = { navigator.navigate(tab = MainTab.HOME) },
onClickStart = { navigator.navigateSignIn() },
)
signInNavGraph(
onShowErrorSnackbar = onShowErrorSnackbar,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import org.cazait.cazaitandroid.configureCoroutineAndroid

plugins {
id("cazait.kotlin.library")
}

configureCoroutineAndroid()
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,14 @@ private val DarkColorScheme = darkColorScheme(
onError = Red05,
errorContainer = Red04,
onErrorContainer = Red01,
surface = Graphite,
surface = DarkGray,
onSurface = White,
inverseSurface = Neon05,
inverseOnSurface = Black,
outline = DarkGray,
outlineVariant = Cosmos,
scrim = Black,
background = Graphite,
)

private val LightColorScheme = lightColorScheme(
Expand All @@ -65,7 +66,8 @@ private val LightColorScheme = lightColorScheme(
inverseOnSurface = White,
outline = LightGray,
outlineVariant = DarkGray,
scrim = Black,
scrim = White,
background = Beige,
)

val LocalDarkTheme = compositionLocalOf { true }
Expand Down
18 changes: 18 additions & 0 deletions core/http/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
plugins {
id("cazait.android.library")
id("cazait.android.hilt")
}

android {
namespace = "org.cazait.cazaitandroid.core.http"
}

dependencies {
implementation(libs.retrofit.core)
implementation(libs.retrofit.kotlin.serialization)
implementation(libs.okhttp.logging)
implementation(libs.kotlinx.serialization.json)
implementation(libs.kotlinx.datetime)

implementation(libs.inject)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.cazait.cazaitandroid.core.http

import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Converter
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
internal object OkHttpModule {

@Provides
@Singleton
fun provideOkHttpClient(): OkHttpClient = OkHttpClient.Builder()
.addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.build()

@Provides
@Singleton
fun provideConverterFactory(
json: Json,
): Converter.Factory {
return json.asConverterFactory("application/json".toMediaType())
}

@Provides
@Singleton
fun provideJson(): Json = Json {
ignoreUnknownKeys = true
}
}
9 changes: 9 additions & 0 deletions core/repo/signin/api/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
plugins {
id("cazait.coroutine.library")
id("kotlinx-serialization")
}

dependencies {
api(libs.kotlinx.datetime)
implementation(libs.kotlinx.serialization.json)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.cazait.cazaitandroid.core.repo.signin.api

import org.cazait.cazaitandroid.core.repo.signin.api.model.AccountName
import org.cazait.cazaitandroid.core.repo.signin.api.model.Password
import org.cazait.cazaitandroid.core.repo.signin.api.model.UserInformation

interface SignInRepository {
suspend fun postSignIn(accountName: AccountName, password: Password): UserInformation
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package org.cazait.cazaitandroid.core.repo.signin.api.model

@JvmInline
value class AccessToken(val token: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package org.cazait.cazaitandroid.core.repo.signin.api.model

@JvmInline
value class AccountName(val name: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package org.cazait.cazaitandroid.core.repo.signin.api.model

@JvmInline
value class Password(val word: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package org.cazait.cazaitandroid.core.repo.signin.api.model

@JvmInline
value class RefreshToken(val token: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.cazait.cazaitandroid.core.repo.signin.api.model

import java.util.UUID

@JvmInline
value class UserId(val uuid: UUID)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.cazait.cazaitandroid.core.repo.signin.api.model

data class UserInformation(
val userId: UserId,
val accountName: AccountName,
val accessToken: AccessToken,
val refreshToken: RefreshToken,
)
22 changes: 22 additions & 0 deletions core/repo/signin/impl/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
plugins {
id("cazait.android.library")
id("cazait.android.hilt")
id("kotlinx-serialization")
}

android {
namespace = "org.cazait.cazaitandroid.core.repo.signin"
}

dependencies {
implementation(projects.core.repo.signin.api)

implementation(libs.androidx.datastore)

implementation(libs.retrofit.core)
implementation(libs.retrofit.kotlin.serialization)
implementation(libs.kotlinx.datetime)

testImplementation(libs.junit4)
testImplementation(libs.kotlin.test)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.cazait.cazaitandroid.core.repo.signin

import org.cazait.cazaitandroid.core.repo.signin.api.SignInRepository
import org.cazait.cazaitandroid.core.repo.signin.api.model.AccountName
import org.cazait.cazaitandroid.core.repo.signin.api.model.Password
import org.cazait.cazaitandroid.core.repo.signin.api.model.UserInformation
import org.cazait.cazaitandroid.core.repo.signin.mapper.toData
import org.cazait.cazaitandroid.core.repo.signin.network.SignInApi
import org.cazait.cazaitandroid.core.repo.signin.network.model.SignInRequest
import javax.inject.Inject

internal class DefaultSignInRepository @Inject constructor(
private val signInApi: SignInApi,
) : SignInRepository {
override suspend fun postSignIn(
accountName: AccountName,
password: Password,
): UserInformation = signInApi.postSignIn(
SignInRequest(accountName.name, password.word),
).data.toData()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package org.cazait.cazaitandroid.core.repo.signin.di

import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import okhttp3.OkHttpClient
import org.cazait.cazaitandroid.core.repo.signin.DefaultSignInRepository
import org.cazait.cazaitandroid.core.repo.signin.api.SignInRepository
import org.cazait.cazaitandroid.core.repo.signin.network.SignInApi
import retrofit2.Converter
import retrofit2.Retrofit
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
internal object SignInRepoModule {
@Provides
@Singleton
fun provideSignInApi(
okHttpClient: OkHttpClient,
converterFactory: Converter.Factory,
): SignInApi {
return Retrofit.Builder()
.baseUrl("https://cazait.shop")
.addConverterFactory(converterFactory)
.client(okHttpClient).build()
.create(SignInApi::class.java)
}
}

@Module
@InstallIn(SingletonComponent::class)
internal abstract class SignInRepoBindModule {
@Binds
abstract fun bindSignInRepository(
dataSource: DefaultSignInRepository,
): SignInRepository
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.cazait.cazaitandroid.core.repo.signin.mapper

import org.cazait.cazaitandroid.core.repo.signin.api.model.AccessToken
import org.cazait.cazaitandroid.core.repo.signin.api.model.AccountName
import org.cazait.cazaitandroid.core.repo.signin.api.model.RefreshToken
import org.cazait.cazaitandroid.core.repo.signin.api.model.UserId
import org.cazait.cazaitandroid.core.repo.signin.api.model.UserInformation
import org.cazait.cazaitandroid.core.repo.signin.network.model.UserInformationResponse
import java.util.UUID

internal fun UserInformationResponse.toData(): UserInformation = UserInformation(
userId = UserId(UUID.fromString(id)),
accountName = AccountName(accountName),
accessToken = AccessToken(accessToken),
refreshToken = RefreshToken(refreshToken),
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.cazait.cazaitandroid.core.repo.signin.network

import org.cazait.cazaitandroid.core.repo.signin.network.model.SignInRequest
import org.cazait.cazaitandroid.core.repo.signin.network.model.SignInResponse
import retrofit2.http.Body
import retrofit2.http.POST
import retrofit2.http.Query

internal interface SignInApi {
@POST("/api/auths/log-in")
suspend fun postSignIn(
@Body
signInRequest: SignInRequest,
@Query("role")
role: String = "user",
): SignInResponse
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.cazait.cazaitandroid.core.repo.signin.network.model

import kotlinx.serialization.Serializable

@Serializable
data class SignInRequest(val accountName: String, val password: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.cazait.cazaitandroid.core.repo.signin.network.model

import kotlinx.serialization.Serializable

@Serializable
internal data class SignInResponse(
val code: Int,
val result: String,
val message: String,
val data: UserInformationResponse,
)
Loading
Loading