Skip to content

Commit f6be374

Browse files
authored
Merge pull request #72 from ikseong00/feat/mypage-api
[FEAT] 마이페이지 화면 api 연결
2 parents cf3d580 + 3acd79b commit f6be374

35 files changed

Lines changed: 1326 additions & 431 deletions

app/src/main/java/com/kuit/ourmenu/OurMenuApp.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.kuit.ourmenu
22

33
import android.app.Application
4+
import android.util.Log
45
import coil3.ImageLoader
56
import coil3.PlatformContext
67
import coil3.SingletonImageLoader
78
import coil3.memory.MemoryCache
89
import coil3.util.DebugLogger
910
import com.kakao.sdk.common.KakaoSdk
11+
import com.kakao.sdk.common.util.Utility
1012
import com.kakao.vectormap.KakaoMapSdk
1113
import dagger.hilt.android.HiltAndroidApp
1214

@@ -16,11 +18,10 @@ class OurMenuApp : Application(), SingletonImageLoader.Factory {
1618
super.onCreate()
1719
KakaoSdk.init(this, BuildConfig.KAKAO_APP_KEY)
1820
KakaoMapSdk.init(this, BuildConfig.KAKAO_APP_KEY)
19-
/*
20-
* 이 부분을 주석 해제해서 keyHash 값 읽으시면 됩니다.
21-
* val keyHash = Utility.getKeyHash(this)
22-
* Log.d("KeyHash", keyHash)
23-
* */
21+
// 이 부분을 주석 해제해서 keyHash 값 읽으시면 됩니다
22+
val keyHash = Utility.getKeyHash(this)
23+
Log.d("KeyHash", keyHash)
24+
2425

2526
}
2627

app/src/main/java/com/kuit/ourmenu/data/model/auth/request/SignupRequest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ data class SignupRequest(
88
@SerialName("email")
99
val email: String?,
1010
@SerialName("mealTime")
11-
val mealTime: List<Int>,
11+
val mealTime: List<String>,
1212
@SerialName("password")
1313
val password: String?,
1414
@SerialName("signInType")

app/src/main/java/com/kuit/ourmenu/data/model/base/ApiResponseHandler.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.kuit.ourmenu.data.model.base
22

3+
import android.R.id.message
4+
35
fun <T> BaseResponse<T>.handleBaseResponse(): Result<T?> =
46
if (isSuccess) {
57
Result.success(response)
@@ -13,10 +15,8 @@ fun <T> BaseResponse<T>.handleBaseResponse(): Result<T?> =
1315
)
1416
}
1517

16-
class OurMenuApiFailureException(
18+
data class OurMenuApiFailureException(
1719
val status: Int? = null,
18-
private val code: String? = null,
20+
val code: String? = null,
1921
override val message: String? = null
20-
) : Exception(
21-
"OurMenu API failure: status = $status, code = $code, message = $message"
22-
)
22+
) : Throwable()
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.kuit.ourmenu.data.model.user.request
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class ChangeMealTimeRequest(
8+
@SerialName("mealTime")
9+
val mealTime: List<String>
10+
)
Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,29 @@
11
package com.kuit.ourmenu.data.model.user.response
22

3+
34
import kotlinx.serialization.SerialName
45
import kotlinx.serialization.Serializable
56

67
@Serializable
78
data class UserInfoResponse(
9+
@SerialName("announcementUrl")
10+
val announcementUrl: String,
11+
@SerialName("appReviewUrl")
12+
val appReviewUrl: String,
13+
@SerialName("customerServiceUrl")
14+
val customerServiceUrl: String,
815
@SerialName("email")
916
val email: String,
10-
@SerialName("mealTime")
11-
val mealTime: List<Int>,
17+
@SerialName("mealTimeList")
18+
val mealTimeList: List<MealTime>,
1219
@SerialName("signInType")
1320
val signInType: String
14-
)
21+
) {
22+
@Serializable
23+
data class MealTime(
24+
@SerialName("isAfter")
25+
val isAfter: Boolean,
26+
@SerialName("mealTime")
27+
val mealTime: String
28+
)
29+
}

app/src/main/java/com/kuit/ourmenu/data/repository/AuthRepository.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.kuit.ourmenu.data.repository
22

3-
import android.util.Log
43
import com.kuit.ourmenu.data.model.auth.SignInType
54
import com.kuit.ourmenu.data.model.auth.request.ConfirmCodeRequest
65
import com.kuit.ourmenu.data.model.auth.request.EmailRequest
@@ -15,11 +14,11 @@ import javax.inject.Singleton
1514
@Singleton
1615
class AuthRepository @Inject constructor(
1716
private val authService: AuthService,
18-
private val tokenManager: TokenManager
17+
private val tokenManager: TokenManager,
1918
) {
2019
suspend fun signup(
2120
email: String?,
22-
mealTime: List<Int>,
21+
mealTime: List<String>,
2322
password: String?,
2423
signInType: SignInType
2524
) = runCatching {

app/src/main/java/com/kuit/ourmenu/ui/oauth/KakaoModule.kt renamed to app/src/main/java/com/kuit/ourmenu/data/repository/KakaoRepository.kt

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.kuit.ourmenu.ui.oauth
1+
package com.kuit.ourmenu.data.repository
22

33
import android.content.Context
44
import android.util.Log
@@ -8,10 +8,12 @@ import com.kakao.sdk.common.model.ClientError
88
import com.kakao.sdk.common.model.ClientErrorCause
99
import com.kakao.sdk.user.UserApiClient
1010
import kotlinx.coroutines.suspendCancellableCoroutine
11+
import javax.inject.Inject
12+
import javax.inject.Singleton
1113
import kotlin.coroutines.resume
1214

13-
object KakaoModule {
14-
15+
@Singleton
16+
class KakaoRepository @Inject constructor() {
1517
fun getKakaoLogin(
1618
context: Context,
1719
successLogin: () -> Unit,
@@ -25,7 +27,9 @@ object KakaoModule {
2527
}
2628

2729
if (UserApiClient.instance.isKakaoTalkLoginAvailable(context)) {
30+
Log.d("KakaoModule", "카카오톡으로 로그인 가능")
2831
UserApiClient.instance.loginWithKakaoTalk(context) { token, error ->
32+
Log.d("KakaoModule", "카카오톡으로 로그인 시도")
2933
if (error != null) {
3034
Log.e("KakaoModule", "카카오톡으로 로그인 실패", error)
3135
if (error is ClientError && error.reason == ClientErrorCause.Cancelled) {
@@ -36,9 +40,23 @@ object KakaoModule {
3640
} else if (token != null) {
3741
Log.i("KakaoModule", "카카오톡으로 로그인 성공 ${token.accessToken}")
3842
}
43+
UserApiClient.instance.me { user, error ->
44+
if (error != null) {
45+
Log.e("KakaoModule", "사용자 정보 요청 실패", error)
46+
}
47+
else if (user != null) {
48+
Log.i("KakaoModule", "사용자 정보 요청 성공" +
49+
"\n회원번호: ${user.id}" +
50+
"\n이메일: ${user.kakaoAccount?.email}" +
51+
"\n닉네임: ${user.kakaoAccount?.profile?.nickname}" +
52+
"\n프로필사진: ${user.kakaoAccount?.profile?.thumbnailImageUrl}")
53+
}
54+
}
55+
3956
successLogin()
4057
}
4158
} else {
59+
Log.d("KakaoModule", "카카오톡으로 로그인 불가능, 카카오계정으로 로그인 시도")
4260
UserApiClient.instance.loginWithKakaoAccount(context, callback = callback)
4361
successLogin()
4462
}
@@ -66,13 +84,35 @@ object KakaoModule {
6684
}
6785
}
6886

69-
fun logout() {
87+
fun logout(
88+
successLogout: () -> Unit,
89+
errorLogout: (Throwable) -> Unit,
90+
) {
7091
if (AuthApiClient.instance.hasToken()) {
7192
UserApiClient.instance.logout { error ->
7293
if (error != null) {
7394
Log.e("KakaoTag", "로그아웃 실패. SDK에서 토큰 삭제됨", error)
95+
errorLogout(error)
7496
} else {
7597
Log.i("KakaoTag", "로그아웃 성공. SDK에서 토큰 삭제됨")
98+
successLogout()
99+
}
100+
}
101+
}
102+
}
103+
104+
fun unlink(
105+
successUnlink: () -> Unit,
106+
errorUnlink: (Throwable) -> Unit,
107+
) {
108+
if (AuthApiClient.instance.hasToken()) {
109+
UserApiClient.instance.unlink { error ->
110+
if (error != null) {
111+
Log.e("KakaoTag", "회원 탈퇴 실패. SDK에서 토큰 삭제됨", error)
112+
errorUnlink(error)
113+
} else {
114+
Log.i("KakaoTag", "회원 탈퇴 성공. SDK에서 토큰 삭제됨")
115+
successUnlink()
76116
}
77117
}
78118
}

app/src/main/java/com/kuit/ourmenu/data/repository/UserRepository.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package com.kuit.ourmenu.data.repository
22

33
import com.kuit.ourmenu.data.model.base.handleBaseResponse
4+
import com.kuit.ourmenu.data.model.user.request.ChangeMealTimeRequest
45
import com.kuit.ourmenu.data.model.user.request.ChangePasswordRequest
56
import com.kuit.ourmenu.data.service.UserService
67
import javax.inject.Inject
78
import javax.inject.Singleton
89

910
@Singleton
1011
class UserRepository @Inject constructor(
11-
private val userService: UserService
12+
private val userService: UserService,
13+
private val kakaoRepository: KakaoRepository
1214
) {
1315

1416
suspend fun sendTemporaryPassword(
@@ -27,13 +29,18 @@ class UserRepository @Inject constructor(
2729
}
2830

2931
suspend fun updateMealTimes(
30-
mealTimes: List<Int>
32+
newMealTimes: List<String>
3133
) = runCatching {
32-
userService.updateMealTimes(mealTimes).handleBaseResponse().getOrThrow()
34+
userService.updateMealTimes(
35+
ChangeMealTimeRequest(newMealTimes)
36+
).handleBaseResponse().getOrThrow()
3337
}
3438

3539
suspend fun getUserInfo() = runCatching {
3640
userService.getUserInfo().handleBaseResponse().getOrThrow()
3741
}
3842

43+
suspend fun deleteUser() = runCatching {
44+
userService.deleteUser().handleBaseResponse().getOrThrow()
45+
}
3946
}

app/src/main/java/com/kuit/ourmenu/data/service/UserService.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ package com.kuit.ourmenu.data.service
22

33
import com.kuit.ourmenu.data.model.auth.response.TemporaryPasswordResponse
44
import com.kuit.ourmenu.data.model.base.BaseResponse
5+
import com.kuit.ourmenu.data.model.user.request.ChangeMealTimeRequest
56
import com.kuit.ourmenu.data.model.user.request.ChangePasswordRequest
67
import com.kuit.ourmenu.data.model.user.response.UserInfoResponse
78
import retrofit2.http.Body
9+
import retrofit2.http.DELETE
810
import retrofit2.http.GET
911
import retrofit2.http.PATCH
1012
import retrofit2.http.POST
@@ -21,11 +23,14 @@ interface UserService {
2123
@Body request: ChangePasswordRequest
2224
): BaseResponse<Unit>
2325

24-
@PATCH("api/users/meal-times")
26+
@PATCH("api/users/meal-time")
2527
suspend fun updateMealTimes(
26-
@Body mealTimes: List<Int>
28+
@Body mealTimes: ChangeMealTimeRequest
2729
): BaseResponse<Unit>
2830

2931
@GET("api/users")
3032
suspend fun getUserInfo(): BaseResponse<UserInfoResponse>
33+
34+
@DELETE("api/users")
35+
suspend fun deleteUser(): BaseResponse<Unit>
3136
}

app/src/main/java/com/kuit/ourmenu/ui/signup/component/MealTime.kt renamed to app/src/main/java/com/kuit/ourmenu/ui/common/MealTime.kt

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.kuit.ourmenu.ui.signup.component
1+
package com.kuit.ourmenu.ui.common
22

33
import androidx.compose.foundation.background
44
import androidx.compose.foundation.border
@@ -15,22 +15,21 @@ import androidx.compose.runtime.Composable
1515
import androidx.compose.ui.Alignment
1616
import androidx.compose.ui.Modifier
1717
import androidx.compose.ui.unit.dp
18-
import com.kuit.ourmenu.ui.signup.uistate.MealTime
18+
import com.kuit.ourmenu.ui.common.model.MealTime
1919
import com.kuit.ourmenu.ui.theme.Neutral100
2020
import com.kuit.ourmenu.ui.theme.Neutral300
2121
import com.kuit.ourmenu.ui.theme.Neutral500
2222
import com.kuit.ourmenu.ui.theme.Primary100
2323
import com.kuit.ourmenu.ui.theme.Primary500Main
2424
import com.kuit.ourmenu.ui.theme.ourMenuTypography
25+
import com.kuit.ourmenu.utils.ExtensionUtil.toMealTime
2526
import com.kuit.ourmenu.utils.ViewUtil.noRippleClickable
2627

2728
@Composable
2829
fun MealTimeGrid(
2930
modifier: Modifier = Modifier,
3031
mealTimes: List<MealTime>,
31-
selectedTimes: List<String>,
32-
addTime: (Int, String) -> Unit,
33-
removeTime: (Int, String) -> Unit
32+
updateSelectedTime: (Int) -> Unit,
3433
) {
3534
val state = rememberLazyGridState()
3635

@@ -48,12 +47,7 @@ fun MealTimeGrid(
4847
.height(42.dp),
4948
mealTime = mealTimes[index].mealTime,
5049
selected = mealTimes[index].selected,
51-
updateSelected = { mealTime, selected ->
52-
if (selected) {
53-
if (selectedTimes.size < 4) addTime(index, mealTime)
54-
} else
55-
removeTime(index, mealTime)
56-
}
50+
updateSelected = { updateSelectedTime(index) }
5751
)
5852
}
5953
}
@@ -62,9 +56,9 @@ fun MealTimeGrid(
6256
@Composable
6357
fun MealTimeItem(
6458
modifier: Modifier = Modifier,
65-
mealTime: String = "10:00",
59+
mealTime: Int = 0,
6660
selected: Boolean = false,
67-
updateSelected: (String, Boolean) -> Unit = { _, _ -> },
61+
updateSelected: () -> Unit = { },
6862
) {
6963

7064
val containerColor = if (selected) Primary100 else Neutral100
@@ -79,12 +73,10 @@ fun MealTimeItem(
7973
shape = RoundedCornerShape(size = 8.dp)
8074
)
8175
.background(color = containerColor, shape = RoundedCornerShape(size = 8.dp))
82-
.noRippleClickable {
83-
updateSelected(mealTime, !selected)
84-
}
76+
.noRippleClickable { updateSelected() }
8577
) {
8678
Text(
87-
text = mealTime,
79+
text = mealTime.toMealTime(),
8880
style = ourMenuTypography().pretendard_500_16,
8981
color = textColor,
9082
modifier = Modifier.align(Alignment.Center)

0 commit comments

Comments
 (0)