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] 마이페이지 / 유저 정보 조회 서버 연결 및 기능 구현 #245

Merged
merged 11 commits into from
Feb 21, 2024
4 changes: 4 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,10 @@
android:name=".presentation.main.notification.NotificationActivity"
android:exported="false"
android:screenOrientation="portrait" />
<activity
android:name=".presentation.main.mypage.myfeed.MyFeedActivity"
android:exported="false"
android:screenOrientation="portrait" />
<activity
android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
android:exported="true">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,61 +1,43 @@
package org.go.sopt.winey.data.model.remote.response

import org.go.sopt.winey.domain.entity.User
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import org.go.sopt.winey.domain.entity.UserV2

@Serializable
data class ResponseGetUserDto(
@SerialName("userResponseGoalDto")
val userResponseGoalDto: UserResponseGoalDto?,
@SerialName("userResponseUserDto")
val userResponseUserDto: UserResponseUserDto?
@SerialName("userData")
val userData: UserData
) {
@Serializable
data class UserResponseGoalDto(
@SerialName("duringGoalAmount")
val duringGoalAmount: Long,
@SerialName("duringGoalCount")
val duringGoalCount: Long,
@SerialName("isAttained")
val isAttained: Boolean,
@SerialName("isOver")
val isOver: Boolean,
@SerialName("targetDay")
val targetDay: Int,
@SerialName("targetMoney")
val targetMoney: Int,
@SerialName("dday")
val dday: Int
)

@Serializable
data class UserResponseUserDto(
@SerialName("nickname")
val nickname: String,
data class UserData(
@SerialName("userId")
val userId: Int,
@SerialName("nickname")
val nickname: String,
@SerialName("userLevel")
val userLevel: String,
@SerialName("fcmIsAllowed")
val fcmIsAllowed: Boolean
val fcmIsAllowed: Boolean,
@SerialName("accumulatedAmount")
val accumulatedAmount: Int,
@SerialName("amountSavedHundredDays")
val amountSavedHundredDays: Int,
@SerialName("amountSavedTwoWeeks")
val amountSavedTwoWeeks: Int,
@SerialName("amountSpentTwoWeeks")
val amountSpentTwoWeeks: Int
)

fun toUser(): User {
val data = this
val userResponseUserDto = data.userResponseUserDto

return User(
nickname = userResponseUserDto?.nickname.orEmpty(),
userLevel = userResponseUserDto?.userLevel.orEmpty(),
fcmIsAllowed = userResponseUserDto?.fcmIsAllowed ?: false,
duringGoalAmount = data.userResponseGoalDto?.duringGoalAmount ?: 0,
duringGoalCount = data.userResponseGoalDto?.duringGoalCount ?: 0,
targetMoney = data.userResponseGoalDto?.targetMoney ?: 0,
targetDay = data.userResponseGoalDto?.targetDay ?: 0,
dday = data.userResponseGoalDto?.dday ?: 0,
isOver = data.userResponseGoalDto?.isOver ?: true,
isAttained = data.userResponseGoalDto?.isAttained ?: false
fun toUser(): UserV2 {
return UserV2(
nickname = userData.nickname,
userLevel = userData.userLevel,
fcmIsAllowed = userData.fcmIsAllowed,
accumulatedAmount = userData.accumulatedAmount,
amountSavedHundredDays = userData.amountSavedHundredDays,
amountSavedTwoWeeks = userData.amountSavedTwoWeeks,
amountSpentTwoWeeks = userData.amountSpentTwoWeeks
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ import org.go.sopt.winey.data.model.remote.response.ResponseLogoutDto
import org.go.sopt.winey.data.model.remote.response.ResponseReIssueTokenDto
import org.go.sopt.winey.data.source.AuthDataSource
import org.go.sopt.winey.domain.entity.Goal
import org.go.sopt.winey.domain.entity.User
import org.go.sopt.winey.domain.entity.UserV2
import org.go.sopt.winey.domain.repository.AuthRepository
import javax.inject.Inject

class AuthRepositoryImpl @Inject constructor(
private val authDataSource: AuthDataSource
) : AuthRepository {
override suspend fun getUser(): Result<User?> =
override suspend fun getUser(): Result<UserV2?> =
runCatching {
authDataSource.getUser().data?.toUser()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import com.google.gson.Gson
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.map
import org.go.sopt.winey.domain.entity.User
import org.go.sopt.winey.domain.entity.UserV2
import org.go.sopt.winey.domain.repository.DataStoreRepository
import java.io.IOException
import javax.inject.Inject
Expand Down Expand Up @@ -91,14 +91,14 @@ class DataStoreRepositoryImpl @Inject constructor(
}
}

override suspend fun saveUserInfo(userInfo: User?) {
override suspend fun saveUserInfo(userInfo: UserV2?) {
dataStore.edit {
val json = Gson().toJson(userInfo)
it[USER_INFO] = json
}
}

override suspend fun getUserInfo(): Flow<User> {
override suspend fun getUserInfo(): Flow<UserV2> {
return dataStore.data
.catch { exception ->
if (exception is IOException) {
Expand All @@ -111,9 +111,17 @@ class DataStoreRepositoryImpl @Inject constructor(
.map {
val json = it[USER_INFO]
try {
Gson().fromJson(json, User::class.java)
Gson().fromJson(json, UserV2::class.java)
} catch (e: Exception) {
User()
UserV2(
nickname = "",
userLevel = "",
accumulatedAmount = 0,
amountSavedHundredDays = 0,
amountSavedTwoWeeks = 0,
amountSpentTwoWeeks = 0,
fcmIsAllowed = true
)
}
}
}
Expand Down
14 changes: 0 additions & 14 deletions app/src/main/java/org/go/sopt/winey/domain/entity/User.kt

This file was deleted.

11 changes: 11 additions & 0 deletions app/src/main/java/org/go/sopt/winey/domain/entity/UserV2.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.go.sopt.winey.domain.entity

data class UserV2(
val nickname: String,
val userLevel: String,
val fcmIsAllowed: Boolean,
val accumulatedAmount: Int,
val amountSavedHundredDays: Int,
val amountSavedTwoWeeks: Int,
val amountSpentTwoWeeks: Int
)
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import org.go.sopt.winey.data.model.remote.response.ResponseLoginDto
import org.go.sopt.winey.data.model.remote.response.ResponseLogoutDto
import org.go.sopt.winey.data.model.remote.response.ResponseReIssueTokenDto
import org.go.sopt.winey.domain.entity.Goal
import org.go.sopt.winey.domain.entity.User
import org.go.sopt.winey.domain.entity.UserV2

interface AuthRepository {
suspend fun getUser(): Result<User?>
suspend fun getUser(): Result<UserV2?>

suspend fun postCreateGoal(requestCreateGoalDto: RequestCreateGoalDto): Result<Goal?>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package org.go.sopt.winey.domain.repository

import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.flow.Flow
import org.go.sopt.winey.domain.entity.User
import org.go.sopt.winey.domain.entity.UserV2

interface DataStoreRepository {
suspend fun saveSocialToken(socialAccessToken: String, socialRefreshToken: String)
Expand All @@ -25,9 +25,9 @@ interface DataStoreRepository {

suspend fun getUserId(): Flow<Int?>

suspend fun saveUserInfo(userInfo: User?)
suspend fun saveUserInfo(userInfo: UserV2?)

suspend fun getUserInfo(): Flow<User?>
suspend fun getUserInfo(): Flow<UserV2?>

suspend fun clearDataStore()
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import org.go.sopt.winey.data.model.remote.response.ResponseLogoutDto
import org.go.sopt.winey.domain.entity.User
import org.go.sopt.winey.domain.entity.UserV2
import org.go.sopt.winey.domain.repository.AuthRepository
import org.go.sopt.winey.domain.repository.DataStoreRepository
import org.go.sopt.winey.domain.repository.NotificationRepository
Expand All @@ -26,8 +26,8 @@ class MainViewModel @Inject constructor(
private val dataStoreRepository: DataStoreRepository,
private val notificationRepository: NotificationRepository
) : ViewModel() {
private val _getUserState = MutableStateFlow<UiState<User?>>(UiState.Loading)
val getUserState: StateFlow<UiState<User?>> = _getUserState.asStateFlow()
private val _getUserState = MutableStateFlow<UiState<UserV2?>>(UiState.Loading)
val getUserState: StateFlow<UiState<UserV2?>> = _getUserState.asStateFlow()

private val _logoutState = MutableStateFlow<UiState<ResponseLogoutDto?>>(UiState.Empty)
val logoutState: StateFlow<UiState<ResponseLogoutDto?>> = _logoutState.asStateFlow()
Expand Down Expand Up @@ -58,7 +58,7 @@ class MainViewModel @Inject constructor(
}
}

fun postLogout() {
private fun postLogout() {
viewModelScope.launch {
_logoutState.value = UiState.Loading

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,11 @@ import androidx.recyclerview.widget.SimpleItemAnimator
import com.google.android.material.bottomnavigation.BottomNavigationView
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import org.go.sopt.winey.R
import org.go.sopt.winey.databinding.FragmentWineyFeedBinding
import org.go.sopt.winey.domain.entity.User
import org.go.sopt.winey.domain.entity.WineyFeed
import org.go.sopt.winey.domain.repository.DataStoreRepository
import org.go.sopt.winey.presentation.main.MainViewModel
Expand All @@ -45,10 +43,10 @@ import org.go.sopt.winey.util.fragment.stringOf
import org.go.sopt.winey.util.fragment.viewLifeCycle
import org.go.sopt.winey.util.fragment.viewLifeCycleScope
import org.go.sopt.winey.util.fragment.wineySnackbar
import org.go.sopt.winey.util.view.snackbar.SnackbarType
import org.go.sopt.winey.util.view.UiState
import org.go.sopt.winey.util.view.WineyPopupMenu
import org.go.sopt.winey.util.view.setOnSingleClickListener
import org.go.sopt.winey.util.view.snackbar.SnackbarType
import org.json.JSONException
import org.json.JSONObject
import timber.log.Timber
Expand Down Expand Up @@ -429,40 +427,6 @@ class WineyFeedFragment :
}
}

/** 1차 릴리즈 당시, 절약 피드 업로드 (더 이상 사용 X) */
private fun initGetUserStateObserver() {
viewLifeCycleScope.launch {
mainViewModel.getUserState.collect { state ->
when (state) {
is UiState.Success -> {
val data = dataStoreRepository.getUserInfo().firstOrNull() ?: return@collect
checkGoalSetting(data)
}

is UiState.Failure -> {
snackBar(binding.root) { state.msg }
}

else -> Timber.tag("failure").e(MSG_WINEYFEED_ERROR)
}
}
}
}

private fun checkGoalSetting(data: User) {
// 목표를 설정한 적 없거나, 기간 내 목표 달성에 실패한 경우
if (data.isOver) {
showDefaultGoalSettingDialog()
}
// 기간 내 목표 달성에 성공한 경우
else if (data.isAttained) {
showCongratulationDialog()
} else {
// 새 목표를 설정한 경우
//navigateToUpload()
}
}

Copy link
Member

Choose a reason for hiding this comment

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

다 없어지니까 몬가 슬프네요 ..🥲

Copy link
Contributor Author

Choose a reason for hiding this comment

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

우리의 목표 바텀시트 . . 😭

private fun showDefaultGoalSettingDialog() {
amplitudeUtils.logEvent("view_goalsetting_popup")

Expand Down
Loading
Loading