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

Feat/#19 week_compose7 필수과제 구현 #20

Open
wants to merge 6 commits into
base: develop-compose
Choose a base branch
from
Open
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
19 changes: 11 additions & 8 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -55,18 +55,18 @@ android {
}

dependencies {
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.7.0'
implementation 'androidx.activity:activity-compose:1.8.2'
implementation platform('androidx.compose:compose-bom:2024.03.00')
implementation 'androidx.core:core-ktx:1.13.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.1'
implementation 'androidx.activity:activity-compose:1.9.0'
implementation platform('androidx.compose:compose-bom:2024.05.00')
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.ui:ui-graphics'
implementation 'androidx.compose.ui:ui-tooling-preview'
implementation 'androidx.compose.material3:material3'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation platform('androidx.compose:compose-bom:2024.03.00')
androidTestImplementation platform('androidx.compose:compose-bom:2024.05.00')
androidTestImplementation 'androidx.compose.ui:ui-test-junit4'
debugImplementation 'androidx.compose.ui:ui-tooling'
debugImplementation 'androidx.compose.ui:ui-test-manifest'
Expand All @@ -76,16 +76,19 @@ dependencies {

//Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1'
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3'
implementation 'com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0'

// define a BOM and its version
implementation(platform("com.squareup.okhttp3:okhttp-bom:4.10.0"))
implementation(platform("com.squareup.okhttp3:okhttp-bom:4.11.0"))

// define any required OkHttp artifacts without version
implementation("com.squareup.okhttp3:okhttp")
implementation("com.squareup.okhttp3:logging-interceptor")

// Coil
implementation("io.coil-kt:coil-compose:2.4.0")
implementation("io.coil-kt:coil-compose:2.6.0")


implementation ("androidx.lifecycle:lifecycle-runtime-compose:2.8.1")
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package com.sopt.now.compose

import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4

import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith

import org.junit.Assert.*

/**
* Instrumented test, which will execute on an Android device.
*
Expand Down
17 changes: 0 additions & 17 deletions app/src/main/java/com/sopt/now/compose/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,32 +1,15 @@
package com.sopt.now.compose

import android.content.Context
import android.os.Build
import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.sopt.now.compose.models.User
import com.sopt.now.compose.ui.SoptApp
import com.sopt.now.compose.ui.composables.TitleAndContentTextComposable
import com.sopt.now.compose.ui.theme.NOWSOPTAndroidTheme

class MainActivity : ComponentActivity() {
Expand Down
2 changes: 0 additions & 2 deletions app/src/main/java/com/sopt/now/compose/SoptApplication.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.sopt.now.compose

import android.app.Application
import android.content.Context
import android.widget.Toast
import com.sopt.now.compose.container.AppContainer
import com.sopt.now.compose.container.SoptAppContainer

Expand Down
13 changes: 13 additions & 0 deletions app/src/main/java/com/sopt/now/compose/container/AppContainer.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.sopt.now.compose.container

import com.sopt.now.compose.container.impl.AuthRepositoryImpl
import com.sopt.now.compose.container.impl.FollowerRepositoryImpl
import com.sopt.now.compose.container.impl.MemberRepositoryImpl
import com.sopt.now.compose.container.impl.UserRepositoryImpl

interface AppContainer{
val userRepository: UserRepositoryImpl
val followRepository: FollowerRepositoryImpl
val memberRepository: MemberRepositoryImpl
val authRepository: AuthRepositoryImpl
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,40 +3,35 @@ package com.sopt.now.compose.container
import android.content.Context
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
import com.sopt.now.compose.BuildConfig
import com.sopt.now.compose.container.PreferenceUserRepository.Companion.USER_ID_KEY
import com.sopt.now.compose.network.FollowService
import com.sopt.now.compose.container.impl.AuthRepositoryImpl
import com.sopt.now.compose.container.impl.FollowerRepositoryImpl
import com.sopt.now.compose.container.impl.MemberRepositoryImpl
import com.sopt.now.compose.container.impl.UserRepositoryImpl
import com.sopt.now.compose.network.AuthService
import com.sopt.now.compose.network.FollowService
import kotlinx.serialization.json.Json
import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.create


interface AppContainer{
val userRepository: PreferenceUserRepository
val followRepository: NetworkFollowerRepository
val memberRepository: NetworkMemberRepository
val authRepository: NetworkAuthRepository
}

class SoptAppContainer(context: Context): AppContainer {

override val userRepository: PreferenceUserRepository by lazy {
PreferenceUserRepository(context.getSharedPreferences(PREFERENCE_ID, Context.MODE_PRIVATE))
override val userRepository: UserRepositoryImpl by lazy {
UserRepositoryImpl(context.getSharedPreferences(PREFERENCE_ID, Context.MODE_PRIVATE))
}

override val followRepository: NetworkFollowerRepository by lazy {
NetworkFollowerRepository(followService = retrofitFollower.create(FollowService::class.java))
override val followRepository: FollowerRepositoryImpl by lazy {
FollowerRepositoryImpl(followService = retrofitFollower.create(FollowService::class.java))
}

override val memberRepository: NetworkMemberRepository by lazy {
NetworkMemberRepository(authService = retrofitUser.create(AuthService::class.java))
override val memberRepository: MemberRepositoryImpl by lazy {
MemberRepositoryImpl(authService = retrofitUser.create(AuthService::class.java))
}

override val authRepository: NetworkAuthRepository by lazy {
NetworkAuthRepository(authService = retrofitLogin.create(AuthService::class.java))
override val authRepository: AuthRepositoryImpl by lazy {
AuthRepositoryImpl(authService = retrofitLogin.create(AuthService::class.java))
}

val retrofitLogin: Retrofit by lazy {
Expand All @@ -61,10 +56,7 @@ class SoptAppContainer(context: Context): AppContainer {
}

private val okHttpClientWithInterceptor: OkHttpClient.Builder by lazy {
val memberId = context
.getSharedPreferences(PREFERENCE_ID, Context.MODE_PRIVATE)
.getString(USER_ID_KEY, "")
.orEmpty()
val memberId = userRepository.getUserId()

OkHttpClient.Builder().apply {
addInterceptor(Interceptor { chain ->
Expand All @@ -80,7 +72,5 @@ class SoptAppContainer(context: Context): AppContainer {
companion object{
const val BASE_URL = BuildConfig.AUTH_BASE_URL
const val PREFERENCE_ID = "SOPT"

private const val TAG = "SoptAppContainer"
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,14 @@
package com.sopt.now.compose.container
package com.sopt.now.compose.container.impl

import com.sopt.now.compose.container.repository.AuthRepository
import com.sopt.now.compose.network.AuthService
import com.sopt.now.compose.network.dto.RequestLoginDto
import com.sopt.now.compose.network.dto.RequestSignUpDto
import com.sopt.now.compose.network.dto.ResponseLoginDto
import com.sopt.now.compose.network.dto.ResponseSignUpDto
import com.sopt.now.compose.ui.screens.login.LoginViewModel
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonObject
import retrofit2.Response

interface AuthRepository {
suspend fun postLogin(request: RequestLoginDto): Result<Response<ResponseLoginDto>>
suspend fun postSignUp(request: RequestSignUpDto): Result<Response<ResponseSignUpDto>>
}

class NetworkAuthRepository(
class AuthRepositoryImpl(
private val authService: AuthService
) : AuthRepository {
override suspend fun postLogin(request: RequestLoginDto): Result<Response<ResponseLoginDto>> =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
package com.sopt.now.compose.container
package com.sopt.now.compose.container.impl

import com.sopt.now.compose.models.Follower
import com.sopt.now.compose.container.repository.FollowerRepository
import com.sopt.now.compose.network.FollowService
import com.sopt.now.compose.network.dto.ResponseFollowListDto
import retrofit2.Response

interface FollowerRepository{
suspend fun getFollowers(page: Int = 2): Result<Response<ResponseFollowListDto>>
}

class NetworkFollowerRepository(
class FollowerRepositoryImpl(
private val followService: FollowService
): FollowerRepository {
override suspend fun getFollowers(page: Int): Result<Response<ResponseFollowListDto>> = runCatching {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,13 @@
package com.sopt.now.compose.container
package com.sopt.now.compose.container.impl

import com.sopt.now.compose.container.repository.MemberRepository
import com.sopt.now.compose.models.User
import com.sopt.now.compose.network.AuthService
import com.sopt.now.compose.network.dto.RequestChangePasswordDto
import com.sopt.now.compose.network.dto.ResponseChangePasswordDto
import retrofit2.Response

private const val TAG = "AuthRepository"

interface MemberRepository {
suspend fun getUserInfo(): Result<User>
suspend fun patchUserPassword(
request: RequestChangePasswordDto
): Response<ResponseChangePasswordDto>
}

class NetworkMemberRepository(
class MemberRepositoryImpl(
private val authService: AuthService
) : MemberRepository {
override suspend fun getUserInfo(): Result<User> = runCatching {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,13 @@
package com.sopt.now.compose.container
package com.sopt.now.compose.container.impl

import android.content.SharedPreferences
import android.util.Log
import com.sopt.now.compose.container.repository.UserRepository
import com.sopt.now.compose.models.User
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

interface UserRepository {
suspend fun getUserProfile(): User?
suspend fun setUserProfile(user: User)

suspend fun getUserId(): String
suspend fun setUserId(userId: String)
}

class PreferenceUserRepository(
val sharedPreferences: SharedPreferences
class UserRepositoryImpl(
private val sharedPreferences: SharedPreferences
) : UserRepository {
override suspend fun getUserProfile(): User {
override fun getUserProfile(): User {
sharedPreferences.run {
val id = getString(ID_KEY, "") ?: ""
val pw = getString(PW_KEY, "") ?: ""
Expand All @@ -27,7 +17,7 @@ class PreferenceUserRepository(
}
}

override suspend fun setUserProfile(user: User) {
override fun setUserProfile(user: User) {
val edit = sharedPreferences.edit()
edit.run {
putString(ID_KEY, user.id)
Expand All @@ -38,12 +28,11 @@ class PreferenceUserRepository(
}
}

override suspend fun getUserId(): String {
override fun getUserId(): String {
return sharedPreferences.getString(USER_ID_KEY, "").orEmpty()
}

override suspend fun setUserId(userId: String) {
Log.d(TAG, "userId: $userId")
override fun setUserId(userId: String) {
val edit = sharedPreferences.edit()
edit.putString(USER_ID_KEY, userId).apply()

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.sopt.now.compose.container.repository

import com.sopt.now.compose.network.dto.RequestLoginDto
import com.sopt.now.compose.network.dto.RequestSignUpDto
import com.sopt.now.compose.network.dto.ResponseLoginDto
import com.sopt.now.compose.network.dto.ResponseSignUpDto
import retrofit2.Response

interface AuthRepository {
suspend fun postLogin(request: RequestLoginDto): Result<Response<ResponseLoginDto>>
suspend fun postSignUp(request: RequestSignUpDto): Result<Response<ResponseSignUpDto>>
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.sopt.now.compose.container.repository

import com.sopt.now.compose.network.dto.ResponseFollowListDto
import retrofit2.Response

interface FollowerRepository{
suspend fun getFollowers(page: Int = 2): Result<Response<ResponseFollowListDto>>
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.sopt.now.compose.container.repository

import com.sopt.now.compose.models.User
import com.sopt.now.compose.network.dto.RequestChangePasswordDto
import com.sopt.now.compose.network.dto.ResponseChangePasswordDto
import retrofit2.Response

interface MemberRepository {
suspend fun getUserInfo(): Result<User>
suspend fun patchUserPassword(
request: RequestChangePasswordDto
): Response<ResponseChangePasswordDto>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.sopt.now.compose.container.repository

import com.sopt.now.compose.models.User

interface UserRepository {
fun getUserProfile(): User?
fun setUserProfile(user: User)
fun getUserId(): String
fun setUserId(userId: String)
}

Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import com.sopt.now.compose.network.dto.ResponseChangePasswordDto
import com.sopt.now.compose.network.dto.ResponseLoginDto
import com.sopt.now.compose.network.dto.ResponseMemberInfoDto
import com.sopt.now.compose.network.dto.ResponseSignUpDto
import retrofit2.Call
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.GET
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.sopt.now.compose.network

import com.sopt.now.compose.network.dto.ResponseFollowListDto
import retrofit2.Call
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Query
Expand Down
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 이 부분 발견 못했을 법도 한데 어떻게 발견하셨나요 역시 세심하시네요

Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ data class ResponseFollowListDto(
@SerialName("page")
val page:Int,
@SerialName("per_page")
val per_page:Int,
val perPage:Int,
@SerialName("total")
val total:Int,
@SerialName("total_pages")
val total_pages:Int,
val totalPages:Int,
@SerialName("data")
val data:List<Follower>,
@SerialName("support")
Expand Down
Loading