From c030dd32666ed64927e649837af91af2e23ab814 Mon Sep 17 00:00:00 2001
From: Lee YongIn <67788699+LeeYongIn0517@users.noreply.github.com>
Date: Sun, 13 Oct 2024 19:05:48 +0900
Subject: [PATCH 01/93] =?UTF-8?q?1.1.2=EB=B2=84=EC=A0=84=20develop=20->=20?=
=?UTF-8?q?release=20=EB=A8=B8=EC=A7=80=ED=95=A9=EB=8B=88=EB=8B=A4=20(#168?=
=?UTF-8?q?)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Chore: action/upload-artifact 버전 변경
* Delete: 필요없는 테스트 삭제
* Delete: 불필요 코드 제거
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Feat: 에러핸들링 메서드 추가
* Fix: 에러처리 구문 수정
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Chore: CI/CD 공통 작업 분리 및 CD 워크플로우 작성
* Feat: 버전 수정 1.1.1(22)
* Chore: 프로덕션으로 수정
* Hotfix/hpedia (#160)
* Rename: 네비게이션 이벤트 명 변경
* Feat: error state 추가
* Fix: UI state에서 throw를 처리하지 못하는 부분 수정
* Feat: type 설정 변경
* Feat: 변수 관리 조정 및 Error 상태 추가
* Chore: core-common 의존성 추가
* Delete: 토큰 재발급 임시 로직 삭제
* HotFix: Authenticator 토큰 재발급 및 에러메세지 전달 기능 수정
* Fix: Authenticator 적용
* Fix: api 호출부에 Authenticator 적용
* Delete: 안쓰는 api 삭제
* Refactor: FCM 초기화 및 초기 라우팅 코드 함수로 분리
* Delete: 임시 refreshToken 코드 관련 api 삭제
* Rename: 토큰 관련 클래스 의존성 주입 모듈 이름 수정
* Fix: 토큰 동적 할당 시점 변경
* Fix: 로그인 화면 이동 네비게이션 변경
* Chore: 버전 변경 (v1.1.1 -> v1.1.2)
* Chore: ci,cd 구문 변경 및 action.yml 파일 추가
* Fix: action.yml 추가 (#162)
* Chore: v1.1.1 - CD 작업 테스트
* Chore: 환경설정 구문 추가
* Fix: cdWorkflow 파일 수정
환경 설정 구문 삭제
* Fix: ciWorkFlow 파일 수정
환경설정 구문 삭제
* Update whatsnew-ko-KR.txt
* Fix: 파일 경로 오타 수정
* Fix: 파일 경로 오타 수정
* Fix: 깃헙 액션 워크플로우 일시 중지
* Chore: ci/cd 워크플로우 임시로 주석처리 및 사용중지
* Chore: CI 구문 롤백 및 오작동 CI/CD 임시폴더로 분리
* Fix: 파라미터 명시적으로 구분
* Fix: RouteScreen 파라미터 변수명 변경 반영
* Chore: 버전코드 수정 22->23
* Ignore
* Fix: 백업데이터 설정 해제
* Chore: 버전 업데이트
* Revert "Chore: 버전 업데이트"
This reverts commit 031fc2f141d3ffbc07b0954eda874c58d7e1c834.
* Revert "Fix: 백업데이터 설정 해제"
This reverts commit bb68a8d265be89d74bcc2feed66baca5355cd475.
---------
Co-authored-by: Seo Hojun <101941674+uselessnaming@users.noreply.github.com>
---
.idea/deploymentTargetSelector.xml | 8 +
.idea/other.xml | 11 +
app/build.gradle.kts | 4 +-
.../main/java/com/hmoa/app/AppViewModel.kt | 19 +-
.../main/java/com/hmoa/app/MainActivity.kt | 121 +++++------
.../core_datastore/Admin/AdminDataStore.kt | 12 --
.../Admin/AdminDataStoreImpl.kt | 30 ---
.../core_datastore/Brand/BrandDataStore.kt | 3 -
.../Brand/BrandDataStoreImpl.kt | 56 ++---
.../BrandHPedia/BrandHPediaDataStore.kt | 10 +-
.../BrandHPedia/BrandHPediaDataStoreImpl.kt | 12 --
.../Community/CommunityDataStoreImpl.kt | 100 +++++++--
.../CommunityCommentDataStoreImpl.kt | 92 ++++++---
.../hmoa/core_datastore/DatastoreModule.kt | 5 -
.../Fcm/FcmRemoteDataStoreImpl.kt | 53 +++--
.../Hshop/HshopRemoteDataStoreImpl.kt | 26 ++-
.../Login/LoginRemoteDataStoreImpl.kt | 29 +--
.../Magazine/MagazineDataStoreImpl.kt | 67 ++++--
.../core_datastore/Main/MainDataStoreImpl.kt | 52 +++--
.../Member/MemberDataStoreImpl.kt | 193 ++++++++++++------
.../core_datastore/Note/NoteDataStoreImpl.kt | 24 ++-
.../Perfume/PerfumeDataStoreImpl.kt | 95 ++++++---
.../PerfumeCommentDataStoreImpl.kt | 47 ++++-
.../Perfumer/PerfumerDataStoreImpl.kt | 17 +-
.../Report/ReportDataStoreImpl.kt | 17 +-
.../Search/SearchDataStoreImpl.kt | 52 +++--
.../Survey/SurveyRemoteDataStoreImpl.kt | 72 +++++--
.../core_datastore/Term/TermDataStoreImpl.kt | 15 +-
.../component/ErrorUiSetView.kt | 1 +
.../core_domain/repository/AdminRepository.kt | 12 --
.../repository/BrandHPediaRepository.kt | 7 -
.../core_domain/repository/BrandRepository.kt | 3 -
core-network/build.gradle.kts | 2 +-
.../authentication/AuthAuthenticator.kt | 62 ------
.../authentication/Authenticator.kt | 21 ++
.../authentication/AuthenticatorImpl.kt | 93 +++++++++
...catorModule.kt => AuthenticationModule.kt} | 6 +-
.../com/hmoa/core_network/di/ServiceModule.kt | 13 +-
.../hmoa/core_network/service/AdminService.kt | 26 ---
.../service/BrandHPediaService.kt | 11 -
.../hmoa/core_network/service/BrandService.kt | 15 --
.../core_repository/AdminRepositoryImpl.kt | 30 ---
.../BrandHPediaRepositoryImpl.kt | 12 --
.../core_repository/BrandRepositoryImpl.kt | 13 --
.../core_repository/LoginRepositoryImpl.kt | 3 -
.../hmoa/core_repository/RepositoryModule.kt | 6 +-
.../feature_community/Navigation/NavGraph.kt | 60 +++---
.../Screen/CommunityDescriptionPage.kt | 63 +++---
.../feature_community/Screen/CommunityHome.kt | 32 ++-
.../Screen/CommunityPreview.kt | 52 ++---
.../feature_hpedia/Screen/HPediaScreen.kt | 6 +-
51 files changed, 1022 insertions(+), 769 deletions(-)
delete mode 100644 core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStore.kt
delete mode 100644 core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStoreImpl.kt
delete mode 100644 core-domain/src/main/java/com/hmoa/core_domain/repository/AdminRepository.kt
delete mode 100644 core-network/src/main/java/com/hmoa/core_network/authentication/AuthAuthenticator.kt
create mode 100644 core-network/src/main/java/com/hmoa/core_network/authentication/Authenticator.kt
create mode 100644 core-network/src/main/java/com/hmoa/core_network/authentication/AuthenticatorImpl.kt
rename core-network/src/main/java/com/hmoa/core_network/di/{AuthenticatorModule.kt => AuthenticationModule.kt} (80%)
delete mode 100644 core-network/src/main/java/com/hmoa/core_network/service/AdminService.kt
delete mode 100644 core-repository/src/main/java/com/hmoa/core_repository/AdminRepositoryImpl.kt
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
index b268ef36c..70faf41cc 100644
--- a/.idea/deploymentTargetSelector.xml
+++ b/.idea/deploymentTargetSelector.xml
@@ -4,6 +4,14 @@
+
+
+
+
+
+
+
+
diff --git a/.idea/other.xml b/.idea/other.xml
index 94c96f631..a76f1180a 100644
--- a/.idea/other.xml
+++ b/.idea/other.xml
@@ -25,6 +25,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index c99a7facd..4dbf589dc 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -22,8 +22,8 @@ android {
applicationId = "com.hmoa.app"
minSdk = 26
targetSdk = 34
- versionCode = 22
- versionName = "1.1.1"
+ versionCode = 23
+ versionName = "1.1.2"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
manifestPlaceholders["REDIRECTION_PATH"] = localProperties["REDIRECTION_PATH"] as String
diff --git a/app/src/main/java/com/hmoa/app/AppViewModel.kt b/app/src/main/java/com/hmoa/app/AppViewModel.kt
index eabdbdbe9..daaaf2b65 100644
--- a/app/src/main/java/com/hmoa/app/AppViewModel.kt
+++ b/app/src/main/java/com/hmoa/app/AppViewModel.kt
@@ -6,8 +6,9 @@ import com.hmoa.core_domain.repository.FcmRepository
import com.hmoa.core_domain.repository.LoginRepository
import com.hmoa.core_model.request.FCMTokenSaveRequestDto
import dagger.hilt.android.lifecycle.HiltViewModel
-import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
@@ -16,9 +17,10 @@ class AppViewModel @Inject constructor(
private val loginRepository: LoginRepository,
private val fcmRepository: FcmRepository,
) : ViewModel() {
- suspend fun authToken(): Flow = loginRepository.getAuthToken()
- suspend fun rememberedToken(): Flow = loginRepository.getRememberedToken()
- suspend fun getFcmToken(): Flow = fcmRepository.getLocalFcmToken()
+ suspend fun authTokenFlow(): Flow = loginRepository.getAuthToken()
+ suspend fun rememberedTokenFlow(): Flow = loginRepository.getRememberedToken()
+
+ suspend fun fcmTokenFlow(): Flow = fcmRepository.getLocalFcmToken()
fun delFcmToken() {
viewModelScope.launch {
@@ -37,11 +39,8 @@ class AppViewModel @Inject constructor(
fun saveFcmToken(token: String) = viewModelScope.launch { fcmRepository.saveLocalFcmToken(token) }
fun checkAlarm(id: Int) = viewModelScope.launch { fcmRepository.checkAlarm(id) }
suspend fun getNotificationEnabled(): Flow = fcmRepository.getNotificationEnabled()
- suspend fun saveNotificationEnabled(isEnabled: Boolean) = fcmRepository.saveNotificationEnabled(isEnabled)
- fun refreshToken() {
- viewModelScope.launch(Dispatchers.IO) {
- loginRepository.refreshToken()
- }
- }
+ suspend fun saveNotificationEnabled(isEnabled: Boolean) =
+ viewModelScope.launch { fcmRepository.saveNotificationEnabled(isEnabled) }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/hmoa/app/MainActivity.kt b/app/src/main/java/com/hmoa/app/MainActivity.kt
index 54ee3768a..277e4b322 100644
--- a/app/src/main/java/com/hmoa/app/MainActivity.kt
+++ b/app/src/main/java/com/hmoa/app/MainActivity.kt
@@ -27,8 +27,9 @@ import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.WindowCompat
-import androidx.lifecycle.coroutineScope
+import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.example.feature_userinfo.UserInfoGraph
@@ -54,11 +55,8 @@ import com.hmoa.feature_magazine.Navigation.MagazineRoute
import com.hmoa.feature_magazine.Navigation.navigateToMagazineHome
import com.hmoa.feature_perfume.navigation.PerfumeRoute
import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.coroutines.*
import kotlinx.coroutines.flow.collectLatest
-import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.stateIn
-import kotlinx.coroutines.flow.zip
+import kotlinx.coroutines.launch
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@@ -90,54 +88,27 @@ class MainActivity : AppCompatActivity() {
private val needTopBarScreens = HomeRoute.Home.name
override fun onCreate(savedInstanceState: Bundle?) {
-
super.onCreate(savedInstanceState)
installSplashScreen()
WindowCompat.setDecorFitsSystemWindows(window, false)
requestNotificationPermission()
- initFirebaseSetting()
lifecycleScope.launch {
- val currentJob = coroutineContext.job
- val authTokenState = viewModel.authToken().stateIn(this)
- val rememberedTokenState = viewModel.rememberedToken().stateIn(this)
- val newFlow = authTokenState.zip(rememberedTokenState) { authtoken, rememberedToken ->
- Pair(authtoken, rememberedToken)
- }
- launch {
- newFlow.collectLatest { token ->
- Log.d("LOGIN TOKEN", "access : ${token.first} refresh : ${token.second}")
- if (token.first == null && token.second == null) {
- initialRoute = AuthenticationRoute.Login.name
- currentJob.cancel()
- } else {
- initialRoute = HomeRoute.Home.name
- currentJob.cancel()
+ repeatOnLifecycle(Lifecycle.State.CREATED) {
+ viewModel.fcmTokenFlow().collectLatest { fcmToken ->
+ viewModel.getNotificationEnabled().collectLatest { isEnabled ->
+ Log.d("POST PERMISSION", "is granted : ${isEnabled}")
+ Log.d("FCM TEST", "fcm token : ${fcmToken}")
+ initializeFirebaseSetting(
+ fcmToken = fcmToken,
+ onSaveFcmToken = { token -> viewModel.saveFcmToken(token) })
+ initializeRoute(
+ onRouteToLogin = { checkFcmToken(fcmToken, isEnabled) })
}
}
}
- launch {
- viewModel.getNotificationEnabled().collectLatest {
- Log.d("POST PERMISSION", "is granted : ${it}")
- }
- }
}
- //fcm token post
- lifecycleScope.launch {
- val authToken = viewModel.authToken()
- val rememberToken = viewModel.rememberedToken()
- val fcmToken = viewModel.getFcmToken()
- combine(authToken, rememberToken, fcmToken) { authToken, rememberToken, fcmToken -> }.collectLatest {
- val auth = authToken.stateIn(this).value
- val remember = rememberToken.stateIn(this).value
- val fcm = fcmToken.stateIn(this).value
- if (auth != null && remember != null && fcm != null) {
- withContext(Dispatchers.IO) { checkFcmToken(fcm) }
- lifecycle.coroutineScope.cancel()
- }
- }
- }
setContent {
val navHostController = rememberNavController()
@@ -152,6 +123,9 @@ class MainActivity : AppCompatActivity() {
}
isBottomBarVisible = route in needBottomBarScreens
isTopBarVisible = route in needTopBarScreens
+ } ?: run {
+ isBottomBarVisible = false
+ isTopBarVisible = false
}
val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
val deeplink = remember { handleDeeplink(intent) }
@@ -204,21 +178,52 @@ class MainActivity : AppCompatActivity() {
}
//firebase 초기 토큰 처리
- private fun initFirebaseSetting() {
+ private fun initializeFirebaseSetting(fcmToken: String?, onSaveFcmToken: (token: String) -> Unit) {
FirebaseMessaging.getInstance().token.addOnSuccessListener {
- CoroutineScope(Dispatchers.IO).launch {
- val fcmToken = viewModel.getFcmToken().stateIn(this).value
- Log.d("FCM TEST", "fcm token : ${fcmToken}")
- if (it != fcmToken) {
- Log.d("FCM TEST", "firebase messaging fcm token : ${it}")
- viewModel.saveFcmToken(it)
- }
+ if (it != fcmToken) {
+ Log.d("FCM TEST", "firebase messaging fcm token : ${it}")
+ onSaveFcmToken(it)
}
}.addOnFailureListener {
Log.e("FCM TEST", "${it.message} \n ${it.stackTrace}")
}
}
+ private suspend fun initializeRoute(
+ onRouteToLogin: suspend () -> Unit
+ ) {
+ viewModel.authTokenFlow().collectLatest { authToken ->
+ viewModel.rememberedTokenFlow().collectLatest { rememberToken ->
+ Log.d("LOGIN TOKEN", "auth : ${authToken} remember : ${rememberToken}")
+ if (authToken == null && rememberToken == null) {
+ initialRoute = AuthenticationRoute.Login.name
+ onRouteToLogin()
+ } else {
+ initialRoute = HomeRoute.Home.name
+ }
+ }
+ }
+ }
+
+ private suspend fun checkFcmToken(fcmToken: String?, isEnabled: Boolean) {
+ if (fcmToken != null) {
+ handleFcmToken(fcmToken, isEnabled)
+ }
+ Log.d("FCM TEST", "checkFcmToken의 fcmToken 값: ${fcmToken}")
+ }
+
+ private suspend fun handleFcmToken(
+ fcmToken: String, isEnabled: Boolean
+ ) {
+ if (isEnabled) {
+ Log.d("FCM TEST", "post fcm token")
+ viewModel.postFcmToken(fcmToken)
+ } else {
+ Log.d("FCM TEST", "delete fcm token")
+ viewModel.delFcmToken()
+ }
+ }
+
//deeplink 처리 함수
private fun handleDeeplink(intent: Intent?): Pair {
var deeplink: String? = intent?.getStringExtra("deeplink") ?: return Pair(null, null)
@@ -236,22 +241,6 @@ class MainActivity : AppCompatActivity() {
return Pair(deeplink, alarm_id)
}
- private suspend fun checkFcmToken(
- fcmToken: String
- ) {
- CoroutineScope(Dispatchers.IO).launch {
- val isEnabled = viewModel.getNotificationEnabled().stateIn(this)
- // isEnabled 가 true 면
- if (isEnabled.value) {
- Log.d("FCM TEST", "post fcm token")
- viewModel.postFcmToken(fcmToken)
- } else {
- Log.d("FCM TEST", "delete fcm token")
- viewModel.delFcmToken()
- }
- }
- }
-
private fun requestNotificationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
val deniedPermissions = permissions.filter { !com.hmoa.core_common.checkPermission(this, it) }
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStore.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStore.kt
deleted file mode 100644
index d3d249024..000000000
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStore.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.hmoa.core_datastore.Admin
-
-import com.hmoa.core_model.request.HomeMenuSaveRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.HomeMenuPerfumeResponseDto
-
-interface AdminDataStore {
- suspend fun deleteHomeMenu(homeMenuId : Int) : DataResponseDto
- suspend fun postHomeMenu(homeMenuId : Int, homeMenuSaveRequestDto : HomeMenuSaveRequestDto) : DataResponseDto
- suspend fun postHomePerfume(dto : HomeMenuPerfumeResponseDto) : DataResponseDto
- suspend fun postHomePerfumeAdd(homeId : Int, perfumeId : Int) : DataResponseDto
-}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStoreImpl.kt
deleted file mode 100644
index f7cef87d8..000000000
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStoreImpl.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.hmoa.core_datastore.Admin
-
-import com.hmoa.core_model.request.HomeMenuSaveRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.HomeMenuPerfumeResponseDto
-import com.hmoa.core_network.service.AdminService
-import javax.inject.Inject
-
-class AdminDataStoreImpl @Inject constructor(
- private val adminService: AdminService
-) : AdminDataStore {
- override suspend fun deleteHomeMenu(homeMenuId: Int): DataResponseDto {
- return adminService.deleteHomeMenu(homeMenuId)
- }
-
- override suspend fun postHomeMenu(
- homeMenuId: Int,
- homeMenuSaveRequestDto: HomeMenuSaveRequestDto
- ): DataResponseDto {
- return adminService.postHomeMenu(homeMenuId, homeMenuSaveRequestDto)
- }
-
- override suspend fun postHomePerfume(dto: HomeMenuPerfumeResponseDto): DataResponseDto {
- return adminService.postHomePerfume(dto)
- }
-
- override suspend fun postHomePerfumeAdd(homeId: Int, perfumeId: Int): DataResponseDto {
- return adminService.postHomePerfumeAdd(homeId, perfumeId)
- }
-}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStore.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStore.kt
index 1e6e6a4f9..02b695900 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStore.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStore.kt
@@ -4,14 +4,11 @@ import ResultResponse
import com.hmoa.core_model.response.BrandDefaultResponseDto
import com.hmoa.core_model.response.BrandPerfumeBriefPagingResponseDto
import com.hmoa.core_model.response.DataResponseDto
-import java.io.File
interface BrandDataStore {
suspend fun getBrand(brandId: Int): ResultResponse>
suspend fun putBrandLike(brandId: Int): DataResponseDto
suspend fun deleteBrandLike(brandId: Int): DataResponseDto
- suspend fun postBrandTestSave(image: File, brandId: Int): DataResponseDto //임시?
- suspend fun postBrand(image: File, brandName: String, englishName: String): DataResponseDto
suspend fun getPerfumesSortedChar(
brandId: Int,
pageNum: Int
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStoreImpl.kt
index b4493e75c..3337f447e 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStoreImpl.kt
@@ -1,28 +1,33 @@
package com.hmoa.core_datastore.Brand
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.BrandDefaultResponseDto
import com.hmoa.core_model.response.BrandPerfumeBriefPagingResponseDto
import com.hmoa.core_model.response.DataResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.BrandService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
-import kotlinx.serialization.json.Json
-import java.io.File
+import com.skydoves.sandwich.suspendOnSuccess
import javax.inject.Inject
class BrandDataStoreImpl @Inject constructor(
- private val brandService: BrandService
+ private val brandService: BrandService,
+ private val authenticator: Authenticator
) : BrandDataStore {
override suspend fun getBrand(brandId: Int): ResultResponse> {
val result = ResultResponse>()
brandService.getBrand(brandId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ brandService.getBrand(brandId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -35,18 +40,6 @@ class BrandDataStoreImpl @Inject constructor(
return brandService.deleteBrandLike(brandId)
}
- override suspend fun postBrandTestSave(image: File, brandId: Int): DataResponseDto {
- return brandService.postBrandTestSave(image = image, brandId = brandId)
- }
-
- override suspend fun postBrand(
- image: File,
- brandName: String,
- englishName: String
- ): DataResponseDto {
- return brandService.postBrand(image, brandName, englishName)
- }
-
override suspend fun getPerfumesSortedChar(
brandId: Int,
pageNum: Int
@@ -55,8 +48,13 @@ class BrandDataStoreImpl @Inject constructor(
brandService.getPerfumesSortedChar(brandId, pageNum).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ brandService.getPerfumesSortedChar(brandId, pageNum).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -69,8 +67,13 @@ class BrandDataStoreImpl @Inject constructor(
brandService.getPerfumesSortedLike(brandId, pageNum).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ brandService.getPerfumesSortedLike(brandId, pageNum).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -83,8 +86,13 @@ class BrandDataStoreImpl @Inject constructor(
brandService.getPerfumesSortedUpdate(brandId, pageNum).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ brandService.getPerfumesSortedUpdate(brandId, pageNum).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStore.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStore.kt
index 3f6cbacbe..f0a1f96cd 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStore.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStore.kt
@@ -3,10 +3,8 @@ package com.hmoa.core_datastore.BrandHPedia
import com.hmoa.core_model.response.DataResponseDto
interface BrandHPediaDataStore {
- suspend fun getBrandStoryAll(pageNum : Int) : DataResponseDto
- suspend fun getBrandStory(brandStoryId : Int) : DataResponseDto
- suspend fun deleteBrandStory(brandStoryId : Int) : DataResponseDto
- suspend fun updateBrandStory(brandStoryId : Int, content : String) : DataResponseDto
- suspend fun postBrandStory(brandStorySubtitle : String, brandStoryTitle : String, content : String) : DataResponseDto
- suspend fun postTestSave() : DataResponseDto //Test
+ suspend fun getBrandStoryAll(pageNum: Int): DataResponseDto
+ suspend fun getBrandStory(brandStoryId: Int): DataResponseDto
+ suspend fun deleteBrandStory(brandStoryId: Int): DataResponseDto
+ suspend fun updateBrandStory(brandStoryId: Int, content: String): DataResponseDto
}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStoreImpl.kt
index c210f47e8..fc99440c9 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStoreImpl.kt
@@ -25,16 +25,4 @@ class BrandHPediaDataStoreImpl @Inject constructor(
): DataResponseDto {
return brandHPediaService.updateBrandStory(brandStoryId, content)
}
-
- override suspend fun postBrandStory(
- brandStorySubtitle: String,
- brandStoryTitle: String,
- content: String
- ): DataResponseDto {
- return brandHPediaService.postBrandStory(brandStorySubtitle, brandStoryTitle, content)
- }
-
- override suspend fun postTestSave(): DataResponseDto {
- return brandHPediaService.postTestSave()
- }
}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Community/CommunityDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Community/CommunityDataStoreImpl.kt
index 024074980..5b3db0aef 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Community/CommunityDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Community/CommunityDataStoreImpl.kt
@@ -4,26 +4,33 @@ import ResultResponse
import com.hmoa.core_datastore.Mapper.transformMultipartBody
import com.hmoa.core_datastore.Mapper.transformRequestBody
import com.hmoa.core_datastore.Mapper.transformToMultipartBody
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.CommunityService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import java.io.File
import javax.inject.Inject
-class CommunityDataStoreImpl @Inject constructor(private val communityService: CommunityService) :
+class CommunityDataStoreImpl @Inject constructor(
+ private val communityService: CommunityService,
+ private val authenticator: Authenticator
+) :
CommunityDataStore {
override suspend fun getCommunity(communityId: Int): ResultResponse {
val result = ResultResponse()
communityService.getCommunity(communityId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.getCommunity(communityId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -45,8 +52,19 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.postCommunityUpdate(
+ images.transformToMultipartBody(),
+ deleteCommunityPhotoIds.transformRequestBody(),
+ title.transformRequestBody(),
+ content.transformRequestBody(),
+ communityId
+ ).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -56,8 +74,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.deleteCommunity(communityId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.deleteCommunity(communityId).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -67,8 +90,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.putCommunityLike(communityId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.putCommunityLike(communityId).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -78,8 +106,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.deleteCommunityLike(communityId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.deleteCommunityLike(communityId).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -96,8 +129,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.getCommunitiesHome().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.getCommunitiesHome().suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -117,8 +155,18 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.postCommunitySave(
+ images.transformToMultipartBody(),
+ category.transformMultipartBody("category"),
+ title.transformMultipartBody("title"),
+ content.transformMultipartBody("content")
+ ).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -128,8 +176,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.getMyCommunitiesByHeart(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.getMyCommunitiesByHeart(cursor).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -139,8 +192,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.getMyCommunities(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.getMyCommunities(cursor).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/CommunityComment/CommunityCommentDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/CommunityComment/CommunityCommentDataStoreImpl.kt
index 5239962dc..70531dc57 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/CommunityComment/CommunityCommentDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/CommunityComment/CommunityCommentDataStoreImpl.kt
@@ -1,22 +1,20 @@
package com.hmoa.core_datastore.CommunityComment
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.CommunityCommentDefaultRequestDto
-import com.hmoa.core_model.response.CommunityCommentAllResponseDto
-import com.hmoa.core_model.response.CommunityCommentDefaultResponseDto
-import com.hmoa.core_model.response.CommunityCommentWithLikedResponseDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.PagingData
+import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.CommunityCommentService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class CommunityCommentDataStoreImpl @Inject constructor(private val communityCommentService: CommunityCommentService) :
+class CommunityCommentDataStoreImpl @Inject constructor(
+ private val communityCommentService: CommunityCommentService,
+ private val authenticator: Authenticator
+) :
CommunityCommentDataStore {
override suspend fun getCommunityComment(
commentId: Int
@@ -25,8 +23,13 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.getCommunityComment(commentId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.getCommunityComment(commentId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -39,8 +42,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.putCommunityComment(commentId, dto).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.putCommunityComment(commentId, dto)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -50,8 +59,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.deleteCommunityComment(commentId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.deleteCommunityComment(commentId)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -63,8 +78,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.putCommunityCommentLiked(commentId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.putCommunityCommentLiked(commentId)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -74,8 +95,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.deleteCommunityCommentLiked(commentId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.deleteCommunityCommentLiked(commentId)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -95,8 +122,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.postCommunityComment(communityId, dto).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.postCommunityComment(communityId, dto)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -106,8 +139,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.getMyCommunityCommentsByHeart(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.getMyCommunityCommentsByHeart(cursor)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -117,8 +156,13 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.getMyCommunityComments(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.getMyCommunityComments(cursor).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/DatastoreModule.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/DatastoreModule.kt
index e0c3b56de..8d8c7ddff 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/DatastoreModule.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/DatastoreModule.kt
@@ -1,7 +1,5 @@
package com.hmoa.core_datastore
-import com.hmoa.core_datastore.Admin.AdminDataStore
-import com.hmoa.core_datastore.Admin.AdminDataStoreImpl
import com.hmoa.core_datastore.Brand.BrandDataStore
import com.hmoa.core_datastore.Brand.BrandDataStoreImpl
import com.hmoa.core_datastore.BrandHPedia.BrandHPediaDataStore
@@ -55,9 +53,6 @@ import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
interface DatastoreModule {
- @Singleton
- @Binds
- fun provideAdminDatastore(adminDataStoreImpl: AdminDataStoreImpl): AdminDataStore
@Singleton
@Binds
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Fcm/FcmRemoteDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Fcm/FcmRemoteDataStoreImpl.kt
index 5e88c68c9..cf50b7a16 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Fcm/FcmRemoteDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Fcm/FcmRemoteDataStoreImpl.kt
@@ -1,19 +1,19 @@
package com.hmoa.core_datastore.Fcm
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.FCMTokenSaveRequestDto
import com.hmoa.core_model.response.AlarmResponse
import com.hmoa.core_model.response.DataResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.FcmService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
class FcmRemoteDataStoreImpl @Inject constructor(
- private val fcmDataService: FcmService
+ private val fcmDataService: FcmService,
+ private val authenticator: Authenticator
) : FcmRemoteDataStore {
override suspend fun deleteFcmToken(): ResultResponse {
@@ -21,38 +21,61 @@ class FcmRemoteDataStoreImpl @Inject constructor(
fcmDataService.deleteFcmToken().suspendOnSuccess {
result.data = this.data.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ fcmDataService.deleteFcmToken().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun getFcmList(): ResultResponse>> {
var result = ResultResponse>>()
- fcmDataService.getAlarmList().suspendOnSuccess{
+ fcmDataService.getAlarmList().suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ fcmDataService.getAlarmList().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun checkAlarm(alarmId: Int): ResultResponse> {
var result = ResultResponse>()
- fcmDataService.checkAlarm(alarmId).suspendOnSuccess{
+ fcmDataService.checkAlarm(alarmId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ fcmDataService.checkAlarm(alarmId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun saveFcmToken(fcmTokenSaveRequest: FCMTokenSaveRequestDto): ResultResponse {
var result = ResultResponse()
fcmDataService.saveFcmToken(fcmTokenSaveRequest).suspendOnSuccess {
result.data = this.data.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ fcmDataService.saveFcmToken(fcmTokenSaveRequest).suspendOnSuccess { result.data = this.data.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Hshop/HshopRemoteDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Hshop/HshopRemoteDataStoreImpl.kt
index 9579fa3dc..3c269657f 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Hshop/HshopRemoteDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Hshop/HshopRemoteDataStoreImpl.kt
@@ -1,24 +1,31 @@
package com.hmoa.core_datastore.Hshop
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.ProductListRequestDto
import com.hmoa.core_model.response.ProductListResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.HshopService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class HshopRemoteDataStoreImpl @Inject constructor(private val hshopService: HshopService) : HshopRemoteDataStore {
+class HshopRemoteDataStoreImpl @Inject constructor(
+ private val hshopService: HshopService,
+ private val authenticator: Authenticator
+) : HshopRemoteDataStore {
override suspend fun getNotes(): ResultResponse {
var result = ResultResponse()
hshopService.getNotes().suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ hshopService.getNotes().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -28,8 +35,13 @@ class HshopRemoteDataStoreImpl @Inject constructor(private val hshopService: Hsh
hshopService.postNotesSelected(dto).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ hshopService.postNotesSelected(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStoreImpl.kt
index 53f340f53..cdd3e1b56 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStoreImpl.kt
@@ -2,26 +2,25 @@ package com.hmoa.core_datastore.Login
import ResultResponse
import com.hmoa.core_model.Provider
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.GoogleAccessTokenRequestDto
import com.hmoa.core_model.request.OauthLoginRequestDto
import com.hmoa.core_model.request.RememberedLoginRequestDto
import com.hmoa.core_model.response.GoogleAccessTokenResponseDto
import com.hmoa.core_model.response.MemberLoginResponseDto
import com.hmoa.core_model.response.TokenResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.authentication.GoogleServerAuthCodeService
-import com.hmoa.core_network.authentication.RefreshTokenManager
import com.hmoa.core_network.service.LoginService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
-import kotlinx.serialization.json.Json
+import com.skydoves.sandwich.suspendOnSuccess
import javax.inject.Inject
class LoginRemoteDataStoreImpl @Inject constructor(
private val loginService: LoginService,
private val googleServerAuthCodeService: GoogleServerAuthCodeService,
- private val refreshTokenManager: RefreshTokenManager
+ private val authenticator: Authenticator
) : LoginRemoteDataStore {
@@ -33,8 +32,13 @@ class LoginRemoteDataStoreImpl @Inject constructor(
loginService.postOAuth(accessToken, provider).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ loginService.postOAuth(accessToken, provider).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -44,8 +48,13 @@ class LoginRemoteDataStoreImpl @Inject constructor(
loginService.postRemembered(dto).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ loginService.postRemembered(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -53,8 +62,4 @@ class LoginRemoteDataStoreImpl @Inject constructor(
override suspend fun postGoogleServerAuthCode(dto: GoogleAccessTokenRequestDto): ResultResponse {
return googleServerAuthCodeService.postGoogleServerAuthCodeServiceImpl(dto)
}
-
- override suspend fun refreshToken() {
- refreshTokenManager.refreshTokenEvery50Minutes()
- }
}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Magazine/MagazineDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Magazine/MagazineDataStoreImpl.kt
index 61154c3ff..24b088c6e 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Magazine/MagazineDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Magazine/MagazineDataStoreImpl.kt
@@ -1,66 +1,97 @@
package com.hmoa.core_datastore.Magazine
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.MagazineResponseDto
import com.hmoa.core_model.response.MagazineSummaryResponseDto
import com.hmoa.core_model.response.MagazineTastingCommentResponseDto
import com.hmoa.core_model.response.PagingData
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.MagazineService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
class MagazineDataStoreImpl @Inject constructor(
- private val magazineService: MagazineService
+ private val magazineService: MagazineService,
+ private val authenticator: Authenticator
) : MagazineDataStore {
override suspend fun getMagazine(magazineId: Int): ResultResponse {
val result = ResultResponse()
- magazineService.getMagazine(magazineId).suspendOnSuccess{
+ magazineService.getMagazine(magazineId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.getMagazine(magazineId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun putMagazineHeart(magazineId: Int): ResultResponse {
val result = ResultResponse()
- magazineService.putMagazineHeart(magazineId).suspendOnSuccess{
+ magazineService.putMagazineHeart(magazineId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.putMagazineHeart(magazineId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
override suspend fun deleteMagazineHeart(magazineId: Int): ResultResponse {
val result = ResultResponse()
- magazineService.deleteMagazineHeart(magazineId).suspendOnSuccess{
+ magazineService.deleteMagazineHeart(magazineId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.deleteMagazineHeart(magazineId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
override suspend fun getMagazineList(cursor: Int): ResultResponse> {
val result = ResultResponse>()
- magazineService.getMagazineList(cursor).suspendOnSuccess{
+ magazineService.getMagazineList(cursor).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.getMagazineList(cursor).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
override suspend fun getMagazineTastingComment(): ResultResponse {
val result = ResultResponse()
- magazineService.getMagazineTastingComment().suspendOnSuccess{
+ magazineService.getMagazineTastingComment().suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.getMagazineTastingComment().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Main/MainDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Main/MainDataStoreImpl.kt
index 33ac9a8b5..a8bb6269d 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Main/MainDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Main/MainDataStoreImpl.kt
@@ -1,27 +1,33 @@
package com.hmoa.core_datastore.Main
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.HomeMenuAllResponseDto
import com.hmoa.core_model.response.HomeMenuDefaultResponseDto
import com.hmoa.core_model.response.HomeMenuFirstResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.MainService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
-import kotlinx.serialization.json.Json
+import com.skydoves.sandwich.suspendOnSuccess
import javax.inject.Inject
class MainDataStoreImpl @Inject constructor(
- private val mainService: MainService
+ private val mainService: MainService,
+ private val authenticator: Authenticator
) : MainDataStore {
override suspend fun getFirst(): ResultResponse {
val result = ResultResponse()
mainService.getFirst().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getFirst().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -31,8 +37,13 @@ class MainDataStoreImpl @Inject constructor(
mainService.getFirstMenu().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getFirstMenu().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -42,8 +53,13 @@ class MainDataStoreImpl @Inject constructor(
mainService.getSecond().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getSecond().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -53,8 +69,13 @@ class MainDataStoreImpl @Inject constructor(
mainService.getSecondMenu().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getSecondMenu().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -64,8 +85,13 @@ class MainDataStoreImpl @Inject constructor(
mainService.getThirdMenu().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getThirdMenu().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Member/MemberDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Member/MemberDataStoreImpl.kt
index a068151f4..3e253362a 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Member/MemberDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Member/MemberDataStoreImpl.kt
@@ -2,7 +2,6 @@ package com.hmoa.core_datastore.Member
import ResultResponse
import com.hmoa.core_datastore.Mapper.transformToMultipartBody
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.AgeRequestDto
import com.hmoa.core_model.request.JoinUpdateRequestDto
import com.hmoa.core_model.request.NickNameRequestDto
@@ -11,26 +10,33 @@ import com.hmoa.core_model.response.CommunityByCategoryResponseDto
import com.hmoa.core_model.response.CommunityCommentDefaultResponseDto
import com.hmoa.core_model.response.DataResponseDto
import com.hmoa.core_model.response.MemberResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.MemberService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import java.io.File
import javax.inject.Inject
class MemberDataStoreImpl @Inject constructor(
- private val memberService: MemberService
+ private val memberService: MemberService,
+ private val authenticator: Authenticator
) : MemberDataStore {
override suspend fun getMember(): ResultResponse {
val result = ResultResponse()
- memberService.getMember().suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getMember()
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getMember().suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
@@ -40,23 +46,35 @@ class MemberDataStoreImpl @Inject constructor(
override suspend fun getCommunities(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getCommunities(page).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getCommunities(page)
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getCommunities(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun getCommunityComments(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getCommunityComments(page).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getCommunityComments(page)
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getCommunityComments(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
@@ -66,82 +84,125 @@ class MemberDataStoreImpl @Inject constructor(
override suspend fun postExistsNickname(request: NickNameRequestDto): ResultResponse {
val result = ResultResponse()
- memberService.postExistsNickname(request).suspendOnSuccess {
- result.data = false
- }.suspendOnError {
- if (this.statusCode.code == 409) {
- result.data = true
- } else {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ memberService.postExistsNickname(request)
+ .suspendOnSuccess {
+ result.data = false
+ }.suspendOnError {
+ if (this.statusCode.code == 409) {
+ result.data = true
+ } else {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.postExistsNickname(request).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
}
- }
return result
}
override suspend fun updateJoin(request: JoinUpdateRequestDto): ResultResponse {
val result = ResultResponse()
- memberService.updateJoin(request).suspendMapSuccess {
- result.data = this
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.updateJoin(request)
+ .suspendMapSuccess {
+ result.data = this
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.updateJoin(request).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun updateNickname(request: NickNameRequestDto): ResultResponse> {
val result = ResultResponse>()
- memberService.updateNickname(request).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.updateNickname(request)
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.updateNickname(request).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun getCommunityFavoriteComments(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getCommunityFavoriteComments(page).suspendMapSuccess {
- result.data = this
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getCommunityFavoriteComments(page)
+ .suspendMapSuccess {
+ result.data = this
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getCommunityFavoriteComments(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun getPerfumeFavoriteComments(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getPerfumeFavoriteComments(page).suspendMapSuccess {
- result.data = this
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getPerfumeFavoriteComments(page)
+ .suspendMapSuccess {
+ result.data = this
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getPerfumeFavoriteComments(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun getPerfumeComments(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getPerfumeComments(page).suspendMapSuccess {
- result.data = this
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getPerfumeComments(page)
+ .suspendMapSuccess {
+ result.data = this
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getPerfumeComments(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun postProfilePhoto(image: File): ResultResponse> {
val result = ResultResponse>()
- memberService.postProfilePhoto(image.transformToMultipartBody()).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.postProfilePhoto(image.transformToMultipartBody())
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.postProfilePhoto(image.transformToMultipartBody())
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Note/NoteDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Note/NoteDataStoreImpl.kt
index a3bc2e7cb..f434b5f31 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Note/NoteDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Note/NoteDataStoreImpl.kt
@@ -1,18 +1,18 @@
package com.hmoa.core_datastore.Note
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.DataResponseDto
import com.hmoa.core_model.response.NoteDescResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.NoteService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
class NoteDataStoreImpl @Inject constructor(
- private val noteService: NoteService
+ private val noteService: NoteService,
+ private val authenticator: Authenticator
) : NoteDataStore {
override suspend fun getNoteAll(pageNum: Int): DataResponseDto {
return noteService.getNoteAll(pageNum)
@@ -20,12 +20,18 @@ class NoteDataStoreImpl @Inject constructor(
override suspend fun getNote(noteId: Int): ResultResponse> {
val result = ResultResponse>()
- noteService.getNote(noteId).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ noteService.getNote(noteId)
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ noteService.getNote(noteId).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Perfume/PerfumeDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Perfume/PerfumeDataStoreImpl.kt
index b5817d071..6b9475a9f 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Perfume/PerfumeDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Perfume/PerfumeDataStoreImpl.kt
@@ -1,45 +1,53 @@
package com.hmoa.core_datastore.Perfume
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.AgeRequestDto
import com.hmoa.core_model.request.PerfumeGenderRequestDto
import com.hmoa.core_model.request.PerfumeWeatherRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.PerfumeAgeResponseDto
-import com.hmoa.core_model.response.PerfumeDetailResponseDto
-import com.hmoa.core_model.response.PerfumeDetailSecondResponseDto
-import com.hmoa.core_model.response.PerfumeGenderResponseDto
-import com.hmoa.core_model.response.PerfumeLikeResponseDto
-import com.hmoa.core_model.response.PerfumeWeatherResponseDto
-import com.hmoa.core_model.response.RecentPerfumeResponseDto
+import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.PerfumeService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: PerfumeService) : PerfumeDataStore {
+class PerfumeDataStoreImpl @Inject constructor(
+ private val perfumeService: PerfumeService,
+ private val authenticator: Authenticator
+) : PerfumeDataStore {
override suspend fun getPerfumeTopDetail(perfumeId: String): ResultResponse {
var result = ResultResponse()
- perfumeService.getPerfumeTopDetail(perfumeId).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ perfumeService.getPerfumeTopDetail(perfumeId)
+ .suspendOnSuccess {
+ result.data = this.data
+ }
+ .suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.getPerfumeTopDetail(perfumeId).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
+
override suspend fun getPerfumeBottomDetail(perfumeId: String): ResultResponse {
var result = ResultResponse()
perfumeService.getPerfumeBottomDetail(perfumeId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.getPerfumeBottomDetail(perfumeId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -49,8 +57,13 @@ class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: Perfu
perfumeService.postPerfumeAge(dto, perfumeId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.postPerfumeAge(dto, perfumeId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -67,8 +80,13 @@ class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: Perfu
perfumeService.postPerfumeGender(dto, perfumeId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.postPerfumeGender(dto, perfumeId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -93,8 +111,13 @@ class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: Perfu
perfumeService.postPerfumeWeather(perfumeId, dto).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.postPerfumeWeather(perfumeId, dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -108,17 +131,29 @@ class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: Perfu
perfumeService.getLikePerfumes().suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.getLikePerfumes().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun getRecentPerfumes(): ResultResponse {
val result = ResultResponse()
- perfumeService.getRecentPerfumes().suspendOnSuccess{
+ perfumeService.getRecentPerfumes().suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.getRecentPerfumes().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/PerfumeComment/PerfumeCommentDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/PerfumeComment/PerfumeCommentDataStoreImpl.kt
index 3e6a02c2e..fbaeee8ad 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/PerfumeComment/PerfumeCommentDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/PerfumeComment/PerfumeCommentDataStoreImpl.kt
@@ -1,17 +1,19 @@
package com.hmoa.core_datastore.PerfumeComment
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.PerfumeCommentRequestDto
import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.PerfumeCommentService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeCommentService: PerfumeCommentService) :
+class PerfumeCommentDataStoreImpl @Inject constructor(
+ private val perfumeCommentService: PerfumeCommentService,
+ private val authenticator: Authenticator
+) :
PerfumeCommentDataStore {
override suspend fun getPerfumeComment(commentId: Int): PerfumeCommentResponseDto {
return perfumeCommentService.getPerfumeComment(commentId)
@@ -42,8 +44,13 @@ class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeComment
perfumeCommentService.putPerfumeCommentLike(commentId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeCommentService.putPerfumeCommentLike(commentId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -53,8 +60,14 @@ class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeComment
perfumeCommentService.deletePerfumeCommentLike(commentId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeCommentService.deletePerfumeCommentLike(commentId)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -73,8 +86,14 @@ class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeComment
perfumeCommentService.getPerfumeCommentsWithHeart(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeCommentService.getPerfumeCommentsWithHeart(cursor)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -86,8 +105,14 @@ class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeComment
perfumeCommentService.getMyPerfumeComments(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeCommentService.getMyPerfumeComments(cursor)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Perfumer/PerfumerDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Perfumer/PerfumerDataStoreImpl.kt
index 04973e286..1e48370cc 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Perfumer/PerfumerDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Perfumer/PerfumerDataStoreImpl.kt
@@ -1,17 +1,19 @@
package com.hmoa.core_datastore.Perfumer
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.DataResponseDto
import com.hmoa.core_model.response.PerfumerDescResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.PerfumerService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class PerfumerDataStoreImpl @Inject constructor(private val perfumerService: PerfumerService) :
+class PerfumerDataStoreImpl @Inject constructor(
+ private val perfumerService: PerfumerService,
+ private val authenticator: Authenticator
+) :
PerfumerDataStore {
override suspend fun getPerfumers(pageNum: String): DataResponseDto {
return perfumerService.getPerfumers(pageNum)
@@ -22,8 +24,13 @@ class PerfumerDataStoreImpl @Inject constructor(private val perfumerService: Per
perfumerService.getPerfumer(perfumerId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumerService.getPerfumer(perfumerId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStoreImpl.kt
index d8bcb8a0c..42232e170 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStoreImpl.kt
@@ -1,17 +1,19 @@
package com.hmoa.core_datastore.Report
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.TargetRequestDto
import com.hmoa.core_model.response.DataResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.ReportService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class ReportDataStoreImpl @Inject constructor(private val reportService: ReportService) : ReportDataStore {
+class ReportDataStoreImpl @Inject constructor(
+ private val reportService: ReportService,
+ private val authenticator: Authenticator
+) : ReportDataStore {
override suspend fun reportCommunity(dto: TargetRequestDto): DataResponseDto {
return reportService.postReportCommunity(dto)
}
@@ -25,8 +27,13 @@ class ReportDataStoreImpl @Inject constructor(private val reportService: ReportS
reportService.postReportPerfumeComment(dto).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ reportService.postReportPerfumeComment(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Search/SearchDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Search/SearchDataStoreImpl.kt
index 26d382b02..5c225665d 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Search/SearchDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Search/SearchDataStoreImpl.kt
@@ -1,25 +1,31 @@
package com.hmoa.core_datastore.Search
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.SearchService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
-import kotlinx.serialization.json.Json
+import com.skydoves.sandwich.suspendOnSuccess
import javax.inject.Inject
class SearchDataStoreImpl @Inject constructor(
- private val searchService: SearchService
+ private val searchService: SearchService,
+ private val authenticator: Authenticator
) : SearchDataStore {
override suspend fun getBrand(searchWord: String): ResultResponse> {
val result = ResultResponse>()
searchService.getBrand(searchWord).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getBrand(searchWord).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -29,8 +35,13 @@ class SearchDataStoreImpl @Inject constructor(
searchService.getBrandAll(consonant).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getBrandAll(consonant).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -50,8 +61,13 @@ class SearchDataStoreImpl @Inject constructor(
searchService.getCommunity(page, searchWord).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getCommunity(page, searchWord).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -73,8 +89,13 @@ class SearchDataStoreImpl @Inject constructor(
searchService.getPerfume(page, searchWord).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getPerfume(page, searchWord).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -87,8 +108,13 @@ class SearchDataStoreImpl @Inject constructor(
searchService.getPerfumeName(page, searchWord).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getPerfumeName(page, searchWord).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Survey/SurveyRemoteDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Survey/SurveyRemoteDataStoreImpl.kt
index 14e04b157..84d6e7fa7 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Survey/SurveyRemoteDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Survey/SurveyRemoteDataStoreImpl.kt
@@ -1,7 +1,6 @@
package com.hmoa.core_datastore.Survey
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.ContentRequestDto
import com.hmoa.core_model.request.SurveyRespondRequestDto
import com.hmoa.core_model.request.SurveySaveAnswerRequestDtos
@@ -9,20 +8,29 @@ import com.hmoa.core_model.request.SurveySaveRequestDto
import com.hmoa.core_model.response.DataResponseDto
import com.hmoa.core_model.response.RecommendNotesResponseDto
import com.hmoa.core_model.response.SurveyQuestionsResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.SurveyService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: SurveyService) : SurveyRemoteDataStore {
+class SurveyRemoteDataStoreImpl @Inject constructor(
+ private val surveyService: SurveyService,
+ private val authenticator: Authenticator
+) : SurveyRemoteDataStore {
override suspend fun getSurveyQuestions(): ResultResponse {
val result = ResultResponse()
surveyService.getSurveyQuestions().suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- result.errorMessage = Json.decodeFromString(this.message())
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.getSurveyQuestions().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -32,27 +40,45 @@ class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: S
surveyService.postSurveyResponds(dto).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- result.errorMessage = Json.decodeFromString(this.message())
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.postSurveyResponds(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
override suspend fun saveSurvey(dto: SurveySaveRequestDto): ResultResponse> {
val result = ResultResponse>()
- surveyService.saveSurvey(dto).suspendOnSuccess{
+ surveyService.saveSurvey(dto).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.saveSurvey(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
override suspend fun saveAnswerNote(dto: SurveySaveAnswerRequestDtos): ResultResponse> {
val result = ResultResponse>()
- surveyService.saveAnswerNote(dto).suspendOnSuccess{
+ surveyService.saveAnswerNote(dto).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.saveAnswerNote(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -62,10 +88,16 @@ class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: S
questionId: Int
): ResultResponse> {
val result = ResultResponse>()
- surveyService.saveAnswerByQuestionId(dto, questionId).suspendOnSuccess{
+ surveyService.saveAnswerByQuestionId(dto, questionId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.saveAnswerByQuestionId(dto, questionId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -75,10 +107,16 @@ class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: S
surveyId: Int
): ResultResponse> {
val result = ResultResponse>()
- surveyService.saveQuestionBySurveyId(dto, surveyId).suspendOnSuccess{
+ surveyService.saveQuestionBySurveyId(dto, surveyId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.saveQuestionBySurveyId(dto, surveyId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Term/TermDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Term/TermDataStoreImpl.kt
index 3491d0bd6..c9b0097b7 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Term/TermDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Term/TermDataStoreImpl.kt
@@ -1,19 +1,19 @@
package com.hmoa.core_datastore.Term
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.DataResponseDto
import com.hmoa.core_model.response.TermDefaultResponseDto
import com.hmoa.core_model.response.TermDescResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.TermService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
class TermDataStoreImpl @Inject constructor(
- private val termService: TermService
+ private val termService: TermService,
+ private val authenticator: Authenticator
) : TermDataStore {
override suspend fun getTerms(page: Int): DataResponseDto> {
@@ -25,8 +25,13 @@ class TermDataStoreImpl @Inject constructor(
termService.getTerm(termId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ termService.getTerm(termId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/ErrorUiSetView.kt b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/ErrorUiSetView.kt
index 7ce488ab5..5cb74dba9 100644
--- a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/ErrorUiSetView.kt
+++ b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/ErrorUiSetView.kt
@@ -92,6 +92,7 @@ fun ErrorUiSetView(onLoginClick: () -> Unit, errorUiState: ErrorUiState, onClose
?: "서비스 정상화를 위해 노력하고 있습니다 :)",
onDismiss = {
isOpen = false
+ onCloseClick()
},
modifier = Modifier.wrapContentHeight()
.width(screenWidth - 88.dp)
diff --git a/core-domain/src/main/java/com/hmoa/core_domain/repository/AdminRepository.kt b/core-domain/src/main/java/com/hmoa/core_domain/repository/AdminRepository.kt
deleted file mode 100644
index 31e0ff510..000000000
--- a/core-domain/src/main/java/com/hmoa/core_domain/repository/AdminRepository.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.hmoa.core_domain.repository
-
-import com.hmoa.core_model.request.HomeMenuSaveRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.HomeMenuPerfumeResponseDto
-
-interface AdminRepository {
- suspend fun deleteHomeMenu(homeMenuId: Int): DataResponseDto
- suspend fun postHomeMenu(homeMenuId: Int, homeMenuSaveRequestDto: HomeMenuSaveRequestDto): DataResponseDto
- suspend fun postHomePerfume(dto: HomeMenuPerfumeResponseDto): DataResponseDto
- suspend fun postHomePerfumeAdd(homeId: Int, perfumeId: Int): DataResponseDto
-}
\ No newline at end of file
diff --git a/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandHPediaRepository.kt b/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandHPediaRepository.kt
index 0ffebd54f..d0d81568a 100644
--- a/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandHPediaRepository.kt
+++ b/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandHPediaRepository.kt
@@ -7,11 +7,4 @@ interface BrandHPediaRepository {
suspend fun getBrandStory(brandStoryId: Int): DataResponseDto
suspend fun deleteBrandStory(brandStoryId: Int): DataResponseDto
suspend fun updateBrandStory(brandStoryId: Int, content: String): DataResponseDto
- suspend fun postBrandStory(
- brandStorySubtitle: String,
- brandStoryTitle: String,
- content: String
- ): DataResponseDto
-
- suspend fun postTestSave(): DataResponseDto //Test
}
\ No newline at end of file
diff --git a/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandRepository.kt b/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandRepository.kt
index 320fc13eb..7e942c7e2 100644
--- a/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandRepository.kt
+++ b/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandRepository.kt
@@ -4,14 +4,11 @@ import ResultResponse
import com.hmoa.core_model.response.BrandDefaultResponseDto
import com.hmoa.core_model.response.BrandPerfumeBriefPagingResponseDto
import com.hmoa.core_model.response.DataResponseDto
-import java.io.File
interface BrandRepository {
suspend fun getBrand(brandId: Int): ResultResponse>
suspend fun putBrandLike(brandId: Int): DataResponseDto
suspend fun deleteBrandLike(brandId: Int): DataResponseDto
- suspend fun postBrandTestSave(image: File, brandId: Int): DataResponseDto //임시?
- suspend fun postBrand(image: File, brandName: String, englishName: String): DataResponseDto
suspend fun getPerfumesSortedChar(
brandId: Int,
pageNum: Int
diff --git a/core-network/build.gradle.kts b/core-network/build.gradle.kts
index 6177967e7..9119df4cc 100644
--- a/core-network/build.gradle.kts
+++ b/core-network/build.gradle.kts
@@ -45,13 +45,13 @@ android {
}
dependencies {
- val ktor_version = "2.3.7"
val mockito_version = "4.8.0"
val hilt_version = "2.48.1"
val kotlinx_version = "1.5.0"
implementation(project(":core-model"))
implementation(project(":core-database"))
+ implementation(project(":core-common"))
implementation("com.github.skydoves:sandwich:1.3.5")
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
diff --git a/core-network/src/main/java/com/hmoa/core_network/authentication/AuthAuthenticator.kt b/core-network/src/main/java/com/hmoa/core_network/authentication/AuthAuthenticator.kt
deleted file mode 100644
index 2eda0d67a..000000000
--- a/core-network/src/main/java/com/hmoa/core_network/authentication/AuthAuthenticator.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.hmoa.core_network.authentication
-
-import android.util.Log
-import com.hmoa.core_database.TokenManager
-import com.hmoa.core_model.request.RememberedLoginRequestDto
-import com.skydoves.sandwich.suspendOnError
-import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.coroutines.flow.first
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
-import okhttp3.Request
-import okhttp3.Response
-import okhttp3.Route
-import javax.inject.Inject
-
-
-class AuthAuthenticator @Inject constructor(
- private val tokenManager: TokenManager,
- private val refreshTokenManager: RefreshTokenManager
-) : okhttp3.Authenticator {
- override fun authenticate(route: Route?, response: Response): Request? {
- val rememberedToken = runBlocking {
- tokenManager.getRememberedToken().first()
- }
-
- if (rememberedToken == null) {
- response.close()
- return null
- }
-
- var newRequest: Request? = null
- runBlocking {
- refreshTokenManager.refreshTokens(RememberedLoginRequestDto(rememberedToken))
- .suspendOnError {
- if (this.response.code() == 404) {
- Log.e("AuthAuthenticator", "토큰 리프레싱 실패")
- }
- }
- .suspendOnSuccess {
- val responseBody = this.response.body()
- if (responseBody != null) {
- val refreshedAuthToken = responseBody.authToken
- val refreshedRememberToken = responseBody.rememberedToken
- launch {
- tokenManager.deleteAuthToken()
- tokenManager.deleteRememberedToken()
- }.join()
- refreshTokenManager.saveRefreshTokens(refreshedAuthToken, refreshedRememberToken)
- newRequest = response.request.addRefreshAuthToken(refreshedAuthToken)
- Log.d("AuthAuthenticator", "토큰 리프레싱 성공")
- }
- }
- }
-
- response.close()
- return newRequest
- }
-
- fun Request.addRefreshAuthToken(token: String?): Request {
- return this.newBuilder().header("X-AUTH-TOKEN", "${token}").build()
- }
-}
diff --git a/core-network/src/main/java/com/hmoa/core_network/authentication/Authenticator.kt b/core-network/src/main/java/com/hmoa/core_network/authentication/Authenticator.kt
new file mode 100644
index 000000000..b0caaf274
--- /dev/null
+++ b/core-network/src/main/java/com/hmoa/core_network/authentication/Authenticator.kt
@@ -0,0 +1,21 @@
+package com.hmoa.core_network.authentication
+
+import com.hmoa.core_model.data.ErrorMessage
+
+interface Authenticator {
+ // API 에러를 처리하고, 토큰 갱신이 필요한 경우 처리하는 함수
+ suspend fun handleApiError(
+ rawMessage: String,
+ handleErrorMesssage: (i: ErrorMessage) -> Unit,
+ onCompleteTokenRefresh: suspend () -> Unit
+ )
+
+ // 토큰 갱신 처리 함수
+ suspend fun onRefreshToken(
+ onRefreshSuccess: suspend () -> Unit,
+ onRefreshFail: (errorMessage: ErrorMessage) -> Unit
+ )
+
+ // 모든 토큰을 업데이트하는 함수
+ suspend fun updateAllTokens(authToken: String, rememberToken: String)
+}
\ No newline at end of file
diff --git a/core-network/src/main/java/com/hmoa/core_network/authentication/AuthenticatorImpl.kt b/core-network/src/main/java/com/hmoa/core_network/authentication/AuthenticatorImpl.kt
new file mode 100644
index 000000000..b48dc7f1d
--- /dev/null
+++ b/core-network/src/main/java/com/hmoa/core_network/authentication/AuthenticatorImpl.kt
@@ -0,0 +1,93 @@
+package com.hmoa.core_network.authentication
+
+import android.util.Log
+import com.hmoa.core_common.ErrorMessageType
+import com.hmoa.core_database.TokenManager
+import com.hmoa.core_model.data.ErrorMessage
+import com.hmoa.core_model.request.RememberedLoginRequestDto
+import com.skydoves.sandwich.message
+import com.skydoves.sandwich.suspendOnError
+import com.skydoves.sandwich.suspendOnSuccess
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.runBlocking
+import kotlinx.serialization.json.Json
+import javax.inject.Inject
+
+
+class AuthenticatorImpl @Inject constructor(
+ private val tokenManager: TokenManager,
+ private val refreshTokenManager: RefreshTokenManager
+) : Authenticator {
+ override suspend fun handleApiError(
+ rawMessage: String,
+ handleErrorMesssage: (i: ErrorMessage) -> Unit,
+ onCompleteTokenRefresh: suspend () -> Unit
+ ) {
+ Json.decodeFromString(rawMessage).apply {
+ onTokenRefresh { refreshTokenErrorMessage ->
+ onRefreshToken(
+ onRefreshSuccess = {
+ onCompleteTokenRefresh()
+ },
+ onRefreshFail = { handleErrorMesssage(refreshTokenErrorMessage) }
+ )
+ }
+ onHandleError { message ->
+ handleErrorMesssage(message)
+ }
+ }
+ }
+
+ override suspend fun onRefreshToken(
+ onRefreshSuccess: suspend () -> Unit,
+ onRefreshFail: (errorMessage: ErrorMessage) -> Unit
+ ) {
+ val rememberedToken = runBlocking {
+ tokenManager.getRememberedToken().first()
+ }
+ if (rememberedToken != null) {
+ refreshTokenManager.refreshTokens(RememberedLoginRequestDto(rememberedToken))
+ .suspendOnError {
+ if (this.response.code() == 404) {
+ Log.e("Authenticator", "토큰 리프레싱 실패")
+ onRefreshFail(Json.decodeFromString(this.message()))
+ }
+ }
+ .suspendOnSuccess {
+ val responseBody = this.response.body()
+ if (responseBody != null) {
+ Log.d("Authenticator", "토큰 리프레싱 성공")
+ updateAllTokens(
+ authToken = responseBody.authToken,
+ rememberToken = responseBody.rememberedToken
+ )
+ onRefreshSuccess()
+ }
+ }
+ }
+ }
+
+ override suspend fun updateAllTokens(authToken: String, rememberToken: String) {
+ tokenManager.deleteAuthToken()
+ tokenManager.deleteRememberedToken()
+ refreshTokenManager.saveRefreshTokens(authToken, rememberToken)
+ }
+
+ suspend inline fun ErrorMessage.onTokenRefresh(
+ crossinline onResult: suspend ErrorMessage.(message: ErrorMessage) -> Unit,
+ ): ErrorMessage {
+ if (this.message == ErrorMessageType.EXPIRED_TOKEN.message) {
+ onResult(this)
+ }
+ return this
+ }
+
+ suspend inline fun ErrorMessage.onHandleError(
+ crossinline onResult: suspend ErrorMessage.(message: ErrorMessage) -> Unit,
+ ): ErrorMessage {
+ if (this.message != ErrorMessageType.EXPIRED_TOKEN.message) {
+ onResult(this)
+ }
+ return this
+ }
+}
\ No newline at end of file
diff --git a/core-network/src/main/java/com/hmoa/core_network/di/AuthenticatorModule.kt b/core-network/src/main/java/com/hmoa/core_network/di/AuthenticationModule.kt
similarity index 80%
rename from core-network/src/main/java/com/hmoa/core_network/di/AuthenticatorModule.kt
rename to core-network/src/main/java/com/hmoa/core_network/di/AuthenticationModule.kt
index 7e74def1f..d657cf47a 100644
--- a/core-network/src/main/java/com/hmoa/core_network/di/AuthenticatorModule.kt
+++ b/core-network/src/main/java/com/hmoa/core_network/di/AuthenticationModule.kt
@@ -5,16 +5,14 @@ import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
-import okhttp3.Authenticator
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
-interface AuthenticatorModule {
-
+interface AuthenticationModule {
@Binds
@Singleton
- fun bindAuthenticatorImpl(authAuthenticator: AuthAuthenticator): Authenticator
+ fun bindAuthenticator(authenticatorImpl: AuthenticatorImpl): Authenticator
@Binds
@Singleton
diff --git a/core-network/src/main/java/com/hmoa/core_network/di/ServiceModule.kt b/core-network/src/main/java/com/hmoa/core_network/di/ServiceModule.kt
index e9911eedb..5f2e59ea9 100644
--- a/core-network/src/main/java/com/hmoa/core_network/di/ServiceModule.kt
+++ b/core-network/src/main/java/com/hmoa/core_network/di/ServiceModule.kt
@@ -3,7 +3,6 @@ package com.hmoa.core_network.di
import com.google.gson.GsonBuilder
import com.hmoa.core_database.TokenManager
import com.hmoa.core_network.BuildConfig
-import com.hmoa.core_network.authentication.AuthAuthenticator
import com.hmoa.core_network.service.*
import com.skydoves.sandwich.adapters.ApiResponseCallAdapterFactory
import dagger.Module
@@ -32,21 +31,19 @@ object ServiceModule {
}
@Provides
- fun provideOkHttpClient(headerInterceptor: Interceptor, authenticator: AuthAuthenticator): OkHttpClient {
-
+ fun provideOkHttpClient(headerInterceptor: Interceptor): OkHttpClient {
val okHttpClientBuilder = OkHttpClient().newBuilder()
okHttpClientBuilder.connectTimeout(60, TimeUnit.SECONDS)
okHttpClientBuilder.readTimeout(60, TimeUnit.SECONDS)
- okHttpClientBuilder.authenticator(authenticator)
okHttpClientBuilder.addInterceptor(headerInterceptor)
return okHttpClientBuilder.build()
}
@Provides
fun provideHeaderInterceptor(tokenManager: TokenManager): Interceptor {
- val token = tokenManager.getAuthTokenForHeader()
return Interceptor { chain ->
with(chain) {
+ val token = tokenManager.getAuthTokenForHeader()
val newRequest = request().newBuilder()
.header("X-AUTH-TOKEN", "${token}")
.build()
@@ -79,12 +76,6 @@ object ServiceModule {
return retrofit.create(FcmService::class.java)
}
- @Singleton
- @Provides
- fun providerAdminService(retrofit: Retrofit): AdminService {
- return retrofit.create(AdminService::class.java)
- }
-
@Singleton
@Provides
fun providerBrandService(retrofit: Retrofit): BrandService {
diff --git a/core-network/src/main/java/com/hmoa/core_network/service/AdminService.kt b/core-network/src/main/java/com/hmoa/core_network/service/AdminService.kt
deleted file mode 100644
index ed0cd3a26..000000000
--- a/core-network/src/main/java/com/hmoa/core_network/service/AdminService.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.hmoa.core_network.service
-
-import com.hmoa.core_model.request.HomeMenuSaveRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.HomeMenuPerfumeResponseDto
-import retrofit2.http.*
-
-interface AdminService {
- @DELETE("/admin/{homeMenuId}/delete")
- suspend fun deleteHomeMenu(@Path(value = "homeMenuId") homeMenuId: Int): DataResponseDto
-
- @GET("/admin/{homeMenuId}/modify")
- suspend fun postHomeMenu(
- @Path(value = "homeMenuId") homeMenuId: Int,
- @Body homeMenuSaveRequestDto: HomeMenuSaveRequestDto
- ): DataResponseDto
-
- @GET("/admin/homePerfume")
- suspend fun postHomePerfume(@Body dto: HomeMenuPerfumeResponseDto): DataResponseDto
-
- @GET("/admin/homePerfume/add")
- suspend fun postHomePerfumeAdd(
- @Field("homeId") homeId: Int,
- @Field("perfumeId") perfumeId: Int
- ): DataResponseDto
-}
\ No newline at end of file
diff --git a/core-network/src/main/java/com/hmoa/core_network/service/BrandHPediaService.kt b/core-network/src/main/java/com/hmoa/core_network/service/BrandHPediaService.kt
index e9695c983..0c7d123c6 100644
--- a/core-network/src/main/java/com/hmoa/core_network/service/BrandHPediaService.kt
+++ b/core-network/src/main/java/com/hmoa/core_network/service/BrandHPediaService.kt
@@ -18,15 +18,4 @@ interface BrandHPediaService {
@Path(value = "brandStoryId") brandStoryId: Int,
@Field("content") content: String
): DataResponseDto
-
- @FormUrlEncoded
- @POST("/brandstory/new")
- suspend fun postBrandStory(
- @Field("brandStorySubtitle") brandStorySubtitle: String,
- @Field("brandStoryTitle") brandStoryTitle: String,
- @Field("content") content: String
- ): DataResponseDto
-
- @POST("/brandstory/testSave")
- suspend fun postTestSave(): DataResponseDto //Test
}
\ No newline at end of file
diff --git a/core-network/src/main/java/com/hmoa/core_network/service/BrandService.kt b/core-network/src/main/java/com/hmoa/core_network/service/BrandService.kt
index bccb0d303..b5dfccd91 100644
--- a/core-network/src/main/java/com/hmoa/core_network/service/BrandService.kt
+++ b/core-network/src/main/java/com/hmoa/core_network/service/BrandService.kt
@@ -5,7 +5,6 @@ import com.hmoa.core_model.response.BrandPerfumeBriefPagingResponseDto
import com.hmoa.core_model.response.DataResponseDto
import com.skydoves.sandwich.ApiResponse
import retrofit2.http.*
-import java.io.File
interface BrandService {
@GET("/brand/{brandId}")
@@ -17,20 +16,6 @@ interface BrandService {
@DELETE("/brand/{brandId}/like")
suspend fun deleteBrandLike(@Path(value = "brandId") brandId: Int): DataResponseDto
- @FormUrlEncoded
- @POST("/brand/{brandId}/testSave")
- suspend fun postBrandTestSave(
- @Path(value = "brandId") brandId: Int, @Field("image") image: File
- ): DataResponseDto //임시?
-
- @FormUrlEncoded
- @POST("/brand/new")
- suspend fun postBrand(
- @Field("image") image: File,
- @Field("brandName") brandName: String,
- @Field("englishName") englishName: String
- ): DataResponseDto
-
@GET("/brand/perfumes/{brandId}")
suspend fun getPerfumesSortedChar(
@Path(value = "brandId") brandId: Int,
diff --git a/core-repository/src/main/java/com/hmoa/core_repository/AdminRepositoryImpl.kt b/core-repository/src/main/java/com/hmoa/core_repository/AdminRepositoryImpl.kt
deleted file mode 100644
index 73e15d99d..000000000
--- a/core-repository/src/main/java/com/hmoa/core_repository/AdminRepositoryImpl.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.hmoa.core_repository
-
-import com.hmoa.core_datastore.Admin.AdminDataStore
-import com.hmoa.core_model.request.HomeMenuSaveRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.HomeMenuPerfumeResponseDto
-import javax.inject.Inject
-
-class AdminRepositoryImpl @Inject constructor(
- private val adminDataStore: AdminDataStore
-) : com.hmoa.core_domain.repository.AdminRepository {
- override suspend fun deleteHomeMenu(homeMenuId: Int): DataResponseDto {
- return adminDataStore.deleteHomeMenu(homeMenuId)
- }
-
- override suspend fun postHomeMenu(
- homeMenuId: Int,
- homeMenuSaveRequestDto: HomeMenuSaveRequestDto
- ): DataResponseDto {
- return adminDataStore.postHomeMenu(homeMenuId, homeMenuSaveRequestDto)
- }
-
- override suspend fun postHomePerfume(dto: HomeMenuPerfumeResponseDto): DataResponseDto {
- return adminDataStore.postHomePerfume(dto)
- }
-
- override suspend fun postHomePerfumeAdd(homeId: Int, perfumeId: Int): DataResponseDto {
- return adminDataStore.postHomePerfumeAdd(homeId, perfumeId)
- }
-}
\ No newline at end of file
diff --git a/core-repository/src/main/java/com/hmoa/core_repository/BrandHPediaRepositoryImpl.kt b/core-repository/src/main/java/com/hmoa/core_repository/BrandHPediaRepositoryImpl.kt
index f9cefbfb0..2b4a62fd4 100644
--- a/core-repository/src/main/java/com/hmoa/core_repository/BrandHPediaRepositoryImpl.kt
+++ b/core-repository/src/main/java/com/hmoa/core_repository/BrandHPediaRepositoryImpl.kt
@@ -23,16 +23,4 @@ class BrandHPediaRepositoryImpl @Inject constructor(
override suspend fun updateBrandStory(brandStoryId: Int, content: String): DataResponseDto {
return brandHPediaDataStore.updateBrandStory(brandStoryId, content)
}
-
- override suspend fun postBrandStory(
- brandStorySubtitle: String,
- brandStoryTitle: String,
- content: String
- ): DataResponseDto {
- return brandHPediaDataStore.postBrandStory(brandStorySubtitle, brandStoryTitle, content)
- }
-
- override suspend fun postTestSave(): DataResponseDto {
- return brandHPediaDataStore.postTestSave()
- }
}
\ No newline at end of file
diff --git a/core-repository/src/main/java/com/hmoa/core_repository/BrandRepositoryImpl.kt b/core-repository/src/main/java/com/hmoa/core_repository/BrandRepositoryImpl.kt
index 653bc1035..28c5835ff 100644
--- a/core-repository/src/main/java/com/hmoa/core_repository/BrandRepositoryImpl.kt
+++ b/core-repository/src/main/java/com/hmoa/core_repository/BrandRepositoryImpl.kt
@@ -5,7 +5,6 @@ import com.hmoa.core_datastore.Brand.BrandDataStore
import com.hmoa.core_model.response.BrandDefaultResponseDto
import com.hmoa.core_model.response.BrandPerfumeBriefPagingResponseDto
import com.hmoa.core_model.response.DataResponseDto
-import java.io.File
import javax.inject.Inject
class BrandRepositoryImpl @Inject constructor(
@@ -24,18 +23,6 @@ class BrandRepositoryImpl @Inject constructor(
return brandDataStore.deleteBrandLike(brandId)
}
- override suspend fun postBrandTestSave(image: File, brandId: Int): DataResponseDto {
- return brandDataStore.postBrandTestSave(image, brandId)
- }
-
- override suspend fun postBrand(
- image: File,
- brandName: String,
- englishName: String
- ): DataResponseDto {
- return brandDataStore.postBrand(image, brandName, englishName)
- }
-
override suspend fun getPerfumesSortedChar(
brandId: Int,
pageNum: Int
diff --git a/core-repository/src/main/java/com/hmoa/core_repository/LoginRepositoryImpl.kt b/core-repository/src/main/java/com/hmoa/core_repository/LoginRepositoryImpl.kt
index f5d7e878a..3a1abefef 100644
--- a/core-repository/src/main/java/com/hmoa/core_repository/LoginRepositoryImpl.kt
+++ b/core-repository/src/main/java/com/hmoa/core_repository/LoginRepositoryImpl.kt
@@ -87,7 +87,4 @@ class LoginRepositoryImpl @Inject constructor(
loginLocalDataStore.deleteGoogleAccessToken()
}
- override suspend fun refreshToken() {
- loginRemoteDataStore.refreshToken()
- }
}
\ No newline at end of file
diff --git a/core-repository/src/main/java/com/hmoa/core_repository/RepositoryModule.kt b/core-repository/src/main/java/com/hmoa/core_repository/RepositoryModule.kt
index fbb0cfc91..a93a5c76e 100644
--- a/core-repository/src/main/java/com/hmoa/core_repository/RepositoryModule.kt
+++ b/core-repository/src/main/java/com/hmoa/core_repository/RepositoryModule.kt
@@ -11,10 +11,6 @@ import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
interface RepositoryModule {
- @Binds
- @Singleton
- fun bindAdminRepositoryImpl(repositoryImpl: AdminRepositoryImpl): AdminRepository
-
@Binds
@Singleton
fun bindBrandRepositoryImpl(repositoryImpl: BrandRepositoryImpl): BrandRepository
@@ -89,5 +85,5 @@ interface RepositoryModule {
@Binds
@Singleton
- fun bindHshopRepositoryImpl(repositoryImpl: HshopRepositoryImpl):HshopRepository
+ fun bindHshopRepositoryImpl(repositoryImpl: HshopRepositoryImpl): HshopRepository
}
\ No newline at end of file
diff --git a/feature-community/src/main/java/com/hmoa/feature_community/Navigation/NavGraph.kt b/feature-community/src/main/java/com/hmoa/feature_community/Navigation/NavGraph.kt
index e838f7d68..11ef78832 100644
--- a/feature-community/src/main/java/com/hmoa/feature_community/Navigation/NavGraph.kt
+++ b/feature-community/src/main/java/com/hmoa/feature_community/Navigation/NavGraph.kt
@@ -1,19 +1,9 @@
package com.hmoa.feature_community.Navigation
-import androidx.navigation.NavController
-import androidx.navigation.NavGraphBuilder
-import androidx.navigation.NavType
+import androidx.navigation.*
import androidx.navigation.compose.composable
import androidx.navigation.compose.navigation
-import androidx.navigation.navArgument
-import androidx.navigation.navDeepLink
-import com.hmoa.feature_community.Screen.CommunityCommentEditRoute
-import com.hmoa.feature_community.Screen.CommunityDescriptionRoute
-import com.hmoa.feature_community.Screen.CommunityEditRoute
-import com.hmoa.feature_community.Screen.CommunityHomeRoute
-import com.hmoa.feature_community.Screen.CommunityPostRoute
-import com.hmoa.feature_community.Screen.CommunityPreviewRoute
-import com.hmoa.feature_community.Screen.CommunitySearchRoute
+import com.hmoa.feature_community.Screen.*
//게시글 기본 화면
fun NavController.navigateToCommunityRoute() = navigate(CommunityRoute.CommunityGraphRoute.name)
@@ -26,20 +16,20 @@ fun NavController.navigateToCommunityHome() = navigate(CommunityRoute.CommunityH
//게시글 등록 화면
fun NavController.navigateToCommunityPostRoute(type: String) =
- navigate("${CommunityRoute.CommunityPostRoute.name}/${type}"){
+ navigate("${CommunityRoute.CommunityPostRoute.name}/${type}") {
popUpTo("${CommunityRoute.CommunityPostRoute.name}/{type}") { inclusive = true }
}
//게시글 수정 화면
fun NavController.navigateToCommunityEditRoute(id: Int) =
- navigate("${CommunityRoute.CommunityEditRoute.name}/${id}"){
+ navigate("${CommunityRoute.CommunityEditRoute.name}/${id}") {
popUpTo("${CommunityRoute.CommunityEditRoute.name}/{id}") { inclusive = true }
}
//게시글 상세 화면
fun NavController.navigateToCommunityDescriptionRoute(id: Int) =
navigate("${CommunityRoute.CommunityDescriptionRoute.name}/${id}") {
- popUpTo("${CommunityRoute.CommunityDescriptionRoute.name}/{id}"){inclusive = true}
+ popUpTo("${CommunityRoute.CommunityDescriptionRoute.name}/{id}") { inclusive = true }
}
//게시글 검색 화면
@@ -58,9 +48,9 @@ fun NavGraphBuilder.nestedCommunityGraph(
navCommunitySearch: () -> Unit,
navCommunityCommentEdit: (Int) -> Unit,
onErrorHandleLoginAgain: () -> Unit,
- navLogin : () -> Unit,
- navHome : () -> Unit,
- navHPedia : () -> Unit,
+ navLogin: () -> Unit,
+ navHome: () -> Unit,
+ navHPedia: () -> Unit,
popStack: () -> Unit,
) {
navigation(
@@ -69,20 +59,20 @@ fun NavGraphBuilder.nestedCommunityGraph(
) {
composable(route = CommunityRoute.CommunityHomeRoute.name) {
CommunityHomeRoute(
- navCommunityDescription = navCommunityDescription,
- navCommunityGraph = navCommunityPage,
+ onNavCommunityDescription = navCommunityDescription,
+ onNavCommunityGraph = navCommunityPage,
onErrorHandleLoginAgain = onErrorHandleLoginAgain,
- navHome = navHome
+ onNavHome = navHome
)
}
composable(route = CommunityRoute.CommunityPreviewRoute.name) {
CommunityPreviewRoute(
- navBack = navBack,
- navSearch = navCommunitySearch,
- navCommunityDescription = navCommunityDescription,
- navPost = navCommunityPost,
- navLogin = onErrorHandleLoginAgain,
- navHPedia = navHPedia,
+ onNavBack = navBack,
+ onNavSearch = navCommunitySearch,
+ onNavCommunityDescription = navCommunityDescription,
+ onNavPost = navCommunityPost,
+ onNavLogin = onErrorHandleLoginAgain,
+ onNavHPedia = navHPedia,
)
}
composable(route = "${CommunityRoute.CommunityPostRoute.name}/{type}") {
@@ -104,19 +94,19 @@ fun NavGraphBuilder.nestedCommunityGraph(
}
composable(
route = "${CommunityRoute.CommunityDescriptionRoute.name}/{id}",
- arguments = listOf(navArgument("id"){type = NavType.IntType}),
- deepLinks = listOf(navDeepLink{uriPattern = "hmoa://community/{id}"})
+ arguments = listOf(navArgument("id") { type = NavType.IntType }),
+ deepLinks = listOf(navDeepLink { uriPattern = "hmoa://community/{id}" })
) {
val id = it.arguments?.getInt("id")
CommunityDescriptionRoute(
id = id,
- navCommunityEdit = navCommunityEdit,
- navCommentEdit = navCommunityCommentEdit,
- navLogin = navLogin,
- navBack = navBack,
- navHPedia = navHPedia,
- popStack = popStack
+ onNavCommunityEdit = navCommunityEdit,
+ onNavCommentEdit = navCommunityCommentEdit,
+ onNavLogin = navLogin,
+ onNavBack = navBack,
+ onNavHPedia = navHPedia,
+ onNavPopStack = popStack
)
}
composable(route = CommunityRoute.CommunitySearchRoute.name) {
diff --git a/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityDescriptionPage.kt b/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityDescriptionPage.kt
index ea67b9942..95a4b3e11 100644
--- a/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityDescriptionPage.kt
+++ b/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityDescriptionPage.kt
@@ -57,12 +57,12 @@ import kotlinx.coroutines.launch
@Composable
fun CommunityDescriptionRoute(
id: Int?,
- navCommunityEdit: (Int) -> Unit,
- navCommentEdit : (Int) -> Unit,
- navLogin : () -> Unit,
- navBack : () -> Unit,
- navHPedia : () -> Unit,
- popStack: () -> Unit,
+ onNavCommunityEdit: (Int) -> Unit,
+ onNavCommentEdit : (Int) -> Unit,
+ onNavLogin : () -> Unit,
+ onNavBack : () -> Unit,
+ onNavHPedia : () -> Unit,
+ onNavPopStack: () -> Unit,
viewModel : CommunityDescViewModel = hiltViewModel()
){
viewModel.setId(id)
@@ -81,7 +81,7 @@ fun CommunityDescriptionRoute(
onChangeLike = {viewModel.updateLike()},
uiState = uiState.value,
commentList = comments,
- navBack = navBack,
+ onNavBack = onNavBack,
onReportCommunity = {
viewModel.reportCommunity()
if(reportState.value){
@@ -104,7 +104,7 @@ fun CommunityDescriptionRoute(
},
onDeleteCommunity = {
viewModel.delCommunity()
- navBack()
+ onNavBack()
Toast.makeText(context, "게시글 삭제 완료", Toast.LENGTH_SHORT).show()
},
onDeleteComment = { commentId ->
@@ -112,13 +112,12 @@ fun CommunityDescriptionRoute(
comments.refresh()
Toast.makeText(context, "댓글 삭제", Toast.LENGTH_SHORT).show()
},
- navCommunityEdit = {navCommunityEdit(id!!)},
- navCommentEdit = navCommentEdit,
+ onNavCommunityEdit = {onNavCommunityEdit(id!!)},
+ onNavCommentEdit = onNavCommentEdit,
onErrorHandleLoginAgain = {
- if(viewModel.hasToken()){navHPedia()}
- else {navLogin()}
+ onNavLogin()
},
- popStack = popStack
+ onNavPopStack = onNavPopStack
)
}
@@ -135,11 +134,11 @@ fun CommunityDescriptionPage(
onChangeCommentLike : (Int, Boolean) -> Unit,
onDeleteCommunity : () -> Unit,
onDeleteComment : (Int) -> Unit,
- navBack : () -> Unit,
- navCommunityEdit : () -> Unit,
- navCommentEdit : (Int) -> Unit,
+ onNavBack : () -> Unit,
+ onNavCommunityEdit : () -> Unit,
+ onNavCommentEdit : (Int) -> Unit,
onErrorHandleLoginAgain : () -> Unit,
- popStack: () -> Unit,
+ onNavPopStack: () -> Unit,
){
when (uiState) {
CommunityDescUiState.Loading -> AppLoadingScreen()
@@ -156,17 +155,17 @@ fun CommunityDescriptionPage(
onChangeCommentLike = onChangeCommentLike,
onDeleteCommunity = onDeleteCommunity,
onDeleteComment = onDeleteComment,
- navBack = navBack,
- navCommunityEdit = navCommunityEdit,
- navCommentEdit = navCommentEdit,
- popStack = popStack
+ onNavBack = onNavBack,
+ onNavCommunityEdit = onNavCommunityEdit,
+ onNavCommentEdit = onNavCommentEdit,
+ onNavPopStack = onNavPopStack
)
}
CommunityDescUiState.Error -> {
ErrorUiSetView(
onLoginClick = onErrorHandleLoginAgain,
errorUiState = errState,
- onCloseClick = navBack,
+ onCloseClick = onNavBack,
)
}
}
@@ -186,10 +185,10 @@ private fun CommunityDescContent(
onChangeCommentLike : (Int, Boolean) -> Unit,
onDeleteCommunity : () -> Unit,
onDeleteComment : (Int) -> Unit,
- navBack : () -> Unit,
- navCommunityEdit : () -> Unit,
- navCommentEdit : (Int) -> Unit,
- popStack: () -> Unit
+ onNavBack : () -> Unit,
+ onNavCommunityEdit : () -> Unit,
+ onNavCommentEdit : (Int) -> Unit,
+ onNavPopStack: () -> Unit
){
var type by remember{mutableStateOf("post")}
val onChangeType : (String) -> Unit = { type = it }
@@ -201,7 +200,7 @@ private fun CommunityDescContent(
val dialogOpen = { scope.launch { modalSheetState.show() } }
val dialogClose = {
scope.launch { modalSheetState.hide() }
- popStack()
+ onNavPopStack()
}
ModalBottomSheetLayout(
@@ -211,13 +210,13 @@ private fun CommunityDescContent(
if (type == "post" && community.writed){
EditModal(
onDeleteClick = onDeleteCommunity,
- onEditClick = navCommunityEdit,
+ onEditClick = onNavCommunityEdit,
onCancelClick = {dialogClose()}
)
} else if (type == "comment" && comment != null && comment!!.writed){
EditModal(
onDeleteClick = { onDeleteComment(comment!!.commentId) },
- onEditClick = { navCommentEdit(comment!!.commentId) },
+ onEditClick = { onNavCommentEdit(comment!!.commentId) },
onCancelClick = { dialogClose() }
)
}
@@ -251,7 +250,7 @@ private fun CommunityDescContent(
onChangeType = onChangeType,
onPostComment = onPostComment,
setComment = { comment = it },
- navBack = navBack,
+ onNavBack = onNavBack,
)
}
}
@@ -268,7 +267,7 @@ private fun CommunityDescMainContent(
onPostComment: (String) -> Unit,
setComment: (CommunityCommentWithLikedResponseDto) -> Unit,
onDialogOpen : () -> Unit,
- navBack : () -> Unit,
+ onNavBack : () -> Unit,
){
val scrollState = rememberScrollState()
val configuration = LocalConfiguration.current
@@ -281,7 +280,7 @@ private fun CommunityDescMainContent(
TopBar(
title = "Community",
navIcon = painterResource(com.hmoa.core_designsystem.R.drawable.ic_back),
- onNavClick = navBack
+ onNavClick = onNavBack
)
Column(
diff --git a/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityHome.kt b/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityHome.kt
index c2dc133df..2010604f8 100644
--- a/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityHome.kt
+++ b/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityHome.kt
@@ -39,10 +39,10 @@ import com.hmoa.feature_community.ViewModel.CommunityHomeViewModel
@Composable
fun CommunityHomeRoute(
- navCommunityGraph: () -> Unit,
- navCommunityDescription: (Int) -> Unit,
+ onNavCommunityGraph: () -> Unit,
+ onNavCommunityDescription: (Int) -> Unit,
onErrorHandleLoginAgain: () -> Unit,
- navHome : () -> Unit,
+ onNavHome : () -> Unit,
viewModel: CommunityHomeViewModel = hiltViewModel(),
) {
@@ -53,14 +53,10 @@ fun CommunityHomeRoute(
CommunityHome(
errorUiState = errorUiState,
uiState = uiState,
- navCommunityGraph = navCommunityGraph,
- navCommunityDescription = navCommunityDescription,
+ onNavCommunityGraph = onNavCommunityGraph,
+ onNavCommunityDescription = onNavCommunityDescription,
onErrorHandleLoginAgain = {
- if (viewModel.hasToken()){
- navHome()
- } else {
- onErrorHandleLoginAgain()
- }
+ onErrorHandleLoginAgain()
},
)
}
@@ -69,21 +65,21 @@ fun CommunityHomeRoute(
fun CommunityHome(
errorUiState: ErrorUiState,
uiState: CommunityHomeUiState,
- navCommunityGraph: () -> Unit,
- navCommunityDescription: (Int) -> Unit,
+ onNavCommunityGraph: () -> Unit,
+ onNavCommunityDescription: (Int) -> Unit,
onErrorHandleLoginAgain: () -> Unit,
) {
Column(modifier = Modifier
.padding(horizontal = 16.dp)
.fillMaxSize()) {
- CommunityTitleBar(navCommunityByCategory = navCommunityGraph)
+ CommunityTitleBar(onNavCommunityByCategory = onNavCommunityGraph)
when (uiState) {
is CommunityHomeUiState.Loading -> AppLoadingScreen()
is CommunityHomeUiState.Community -> {
CommunityHomeContent(
communities = uiState.communities,
- navCommunityDescription = navCommunityDescription
+ onNavCommunityDescription = onNavCommunityDescription
)
}
is CommunityHomeUiState.Error -> {
@@ -99,7 +95,7 @@ fun CommunityHome(
@Composable
fun CommunityTitleBar(
- navCommunityByCategory: () -> Unit,
+ onNavCommunityByCategory: () -> Unit,
) {
Row(
modifier = Modifier
@@ -116,7 +112,7 @@ fun CommunityTitleBar(
)
Text(
- modifier = Modifier.clickable {navCommunityByCategory()},
+ modifier = Modifier.clickable {onNavCommunityByCategory()},
text = "전체보기",
fontSize = 12.sp,
fontFamily = FontFamily(Font(R.font.pretendard_regular)),
@@ -129,11 +125,11 @@ fun CommunityTitleBar(
@Composable
fun CommunityHomeContent(
communities: List,
- navCommunityDescription: (Int) -> Unit,
+ onNavCommunityDescription: (Int) -> Unit,
) {
PostList(
communities = communities,
- onNavCommunityDescription = navCommunityDescription
+ onNavCommunityDescription = onNavCommunityDescription
)
}
diff --git a/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityPreview.kt b/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityPreview.kt
index 01e3e6089..47da3c87a 100644
--- a/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityPreview.kt
+++ b/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityPreview.kt
@@ -43,12 +43,12 @@ import com.hmoa.feature_community.ViewModel.CommunityPreviewViewModel
@Composable
fun CommunityPreviewRoute(
- navBack: () -> Unit,
- navSearch: () -> Unit,
- navCommunityDescription: (Int) -> Unit,
- navPost: (String) -> Unit,
- navLogin: () -> Unit,
- navHPedia : () -> Unit,
+ onNavBack: () -> Unit,
+ onNavSearch: () -> Unit,
+ onNavCommunityDescription: (Int) -> Unit,
+ onNavPost: (String) -> Unit,
+ onNavLogin: () -> Unit,
+ onNavHPedia : () -> Unit,
viewModel: CommunityPreviewViewModel = hiltViewModel()
) {
//view model의 ui state에서 type, list 를 받아서 사용하는 방식
@@ -62,16 +62,15 @@ fun CommunityPreviewRoute(
communities = viewModel.communityPagingSource().collectAsLazyPagingItems(),
type = type,
onTypeChanged = {viewModel.updateCategory(it)},
- navBack = navBack,
- navSearch = navSearch,
- navCommunityDescription = navCommunityDescription,
- navPost = {
- if (viewModel.hasToken()){navPost(it)}
+ onNavBack = onNavBack,
+ onNavSearch = onNavSearch,
+ onNavCommunityDescription = onNavCommunityDescription,
+ onNavPost = {
+ if (viewModel.hasToken()){onNavPost(it)}
else {viewModel.updateLoginError()}
},
onErrorHandleLoginAgain = {
- if(viewModel.hasToken()){navHPedia()}
- else {navLogin()}
+ onNavLogin()
}
)
}
@@ -83,10 +82,10 @@ fun CommunityPage(
communities: LazyPagingItems,
type: Category,
onTypeChanged: (Category) -> Unit,
- navBack: () -> Unit,
- navSearch: () -> Unit,
- navCommunityDescription: (Int) -> Unit,
- navPost: (String) -> Unit,
+ onNavBack: () -> Unit,
+ onNavSearch: () -> Unit,
+ onNavCommunityDescription: (Int) -> Unit,
+ onNavPost: (String) -> Unit,
onErrorHandleLoginAgain : () -> Unit,
) {
when (uiState) {
@@ -102,9 +101,9 @@ fun CommunityPage(
TopBar(
title = "Community",
navIcon = painterResource(com.hmoa.core_designsystem.R.drawable.ic_back),
- onNavClick = navBack,
+ onNavClick = onNavBack,
menuIcon = painterResource(com.hmoa.core_designsystem.R.drawable.ic_search),
- onMenuClick = navSearch
+ onMenuClick = onNavSearch
)
ContentDivider()
CommunityMainTypes(
@@ -114,7 +113,7 @@ fun CommunityPage(
ContentDivider()
CommunityPagePostList(
communities = communities.itemSnapshotList,
- navCommunityDescription = navCommunityDescription
+ onNavCommunityDescription = onNavCommunityDescription
)
}
Column(
@@ -124,9 +123,9 @@ fun CommunityPage(
horizontalAlignment = Alignment.End
) {
FloatingActionBtn(
- onNavRecommend = { navPost(Category.추천.name) },
- onNavPresent = { navPost(Category.시향기.name) },
- onNavFree = { navPost(Category.자유.name) },
+ onNavRecommend = { onNavPost(Category.추천.name) },
+ onNavPresent = { onNavPost(Category.시향기.name) },
+ onNavFree = { onNavPost(Category.자유.name) },
isAvailable = !uiState.enableLoginErrorDialog,
)
}
@@ -192,7 +191,7 @@ fun CommunityMainTypes(
@Composable
fun CommunityPagePostList(
communities: ItemSnapshotList,
- navCommunityDescription: (Int) -> Unit
+ onNavCommunityDescription: (Int) -> Unit
) {
LazyColumn {
items(communities) { community ->
@@ -202,7 +201,10 @@ fun CommunityPagePostList(
.fillMaxWidth()
.wrapContentHeight()
.border(width = 1.dp, color = CustomColor.gray2),
- onPostClick = {navCommunityDescription(community.communityId)},
+ onPostClick = {
+ // 여기서 Description으로 이동
+ onNavCommunityDescription(community.communityId)
+ },
postType = community.category,
postTitle = community.title,
heartCount = community.heartCount,
diff --git a/feature-hpedia/src/main/java/com/hmoa/feature_hpedia/Screen/HPediaScreen.kt b/feature-hpedia/src/main/java/com/hmoa/feature_hpedia/Screen/HPediaScreen.kt
index 559c0ed2a..1d9254bc5 100644
--- a/feature-hpedia/src/main/java/com/hmoa/feature_hpedia/Screen/HPediaScreen.kt
+++ b/feature-hpedia/src/main/java/com/hmoa/feature_hpedia/Screen/HPediaScreen.kt
@@ -67,10 +67,10 @@ fun HPediaScreen(
}
Spacer(Modifier.height(27.dp))
CommunityHomeRoute(
- navCommunityGraph = navCommunityGraph,
- navCommunityDescription = navCommunityDesc,
+ onNavCommunityGraph = navCommunityGraph,
+ onNavCommunityDescription = navCommunityDesc,
onErrorHandleLoginAgain = onErrorHandleLoginAgain,
- navHome = navHome
+ onNavHome = navHome
)
}
}
From 9feb75f2dd5caf37eb61974af33e3b5c51c7720f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=8B=E1=85=AD=E1=86=BC=E1=84=8B?=
=?UTF-8?q?=E1=85=B5=E1=86=AB?=
Date: Sun, 13 Oct 2024 19:19:59 +0900
Subject: [PATCH 02/93] Delete
---
.../java/com/hmoa/core_datastore/Login/LoginRemoteDataStore.kt | 1 -
1 file changed, 1 deletion(-)
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStore.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStore.kt
index 4fa49307a..92a04ec56 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStore.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStore.kt
@@ -13,5 +13,4 @@ interface LoginRemoteDataStore {
suspend fun postOAuth(accessToken: OauthLoginRequestDto, provider: Provider): ResultResponse
suspend fun postRemembered(dto: RememberedLoginRequestDto): ResultResponse
suspend fun postGoogleServerAuthCode(dto: GoogleAccessTokenRequestDto): ResultResponse
- suspend fun refreshToken()
}
\ No newline at end of file
From a48f7546ae2b8c1fba57db5d1178035c088a9c43 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=8B=E1=85=AD=E1=86=BC=E1=84=8B?=
=?UTF-8?q?=E1=85=B5=E1=86=AB?=
Date: Sun, 13 Oct 2024 19:24:37 +0900
Subject: [PATCH 03/93] Delete
---
.../main/java/com/hmoa/core_domain/repository/LoginRepository.kt | 1 -
1 file changed, 1 deletion(-)
diff --git a/core-domain/src/main/java/com/hmoa/core_domain/repository/LoginRepository.kt b/core-domain/src/main/java/com/hmoa/core_domain/repository/LoginRepository.kt
index 803d1c585..01ddda9f6 100644
--- a/core-domain/src/main/java/com/hmoa/core_domain/repository/LoginRepository.kt
+++ b/core-domain/src/main/java/com/hmoa/core_domain/repository/LoginRepository.kt
@@ -26,5 +26,4 @@ interface LoginRepository {
suspend fun deleteRememberedToken()
suspend fun deleteKakaoAccessToken()
suspend fun deleteGoogleAccessToken()
- suspend fun refreshToken()
}
\ No newline at end of file
From 066804e68244db2bf41f9927d294dd2f031496c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=8B=E1=85=AD=E1=86=BC=E1=84=8B?=
=?UTF-8?q?=E1=85=B5=E1=86=AB?=
Date: Sun, 13 Oct 2024 19:25:51 +0900
Subject: [PATCH 04/93] Delete
---
app/src/main/java/com/hmoa/app/MainActivity.kt | 17 -----------------
1 file changed, 17 deletions(-)
diff --git a/app/src/main/java/com/hmoa/app/MainActivity.kt b/app/src/main/java/com/hmoa/app/MainActivity.kt
index 277e4b322..fcf2e99f8 100644
--- a/app/src/main/java/com/hmoa/app/MainActivity.kt
+++ b/app/src/main/java/com/hmoa/app/MainActivity.kt
@@ -6,8 +6,6 @@ import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
-import android.os.Handler
-import android.os.Looper
import android.util.Log
import androidx.activity.compose.setContent
import androidx.activity.viewModels
@@ -288,19 +286,4 @@ class MainActivity : AppCompatActivity() {
lifecycleScope.launch { viewModel.saveNotificationEnabled(true) }
}
}
-
- override fun onResume() {
- super.onResume()
- //30분 마다 토큰 재발급하는 임시대책
- val handler = Handler(Looper.getMainLooper())
- val runnable = object : java.lang.Runnable {
- override fun run() {
- // 작업 실행
- Log.d("HandlerTest", "another shot in 1 minute")
- viewModel.refreshToken()
- handler.postDelayed(this, 30 * 60 * 1000) // 30분 후에 다시 실행
- }
- }
- handler.post(runnable)
- }
}
\ No newline at end of file
From 7dc9e0e20cff68f5876acc3f191bd329e2819fbd Mon Sep 17 00:00:00 2001
From: Lee YongIn <67788699+LeeYongIn0517@users.noreply.github.com>
Date: Mon, 14 Oct 2024 14:30:29 +0900
Subject: [PATCH 05/93] =?UTF-8?q?Release=201.1.2=20=EB=B2=84=EC=A0=84=20?=
=?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20-=20=EC=BB=A4=EB=B0=8B=20?=
=?UTF-8?q?=EB=88=84=EB=9D=BD=EB=90=9C=20=EB=B6=80=EB=B6=84=20=EC=B6=94?=
=?UTF-8?q?=EA=B0=80=20=ED=91=B8=EC=8B=9C=20(#169)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Ignore
* Ignore
* Feat: feature-hbti 모듈 생성
* Feat:선택지 무효화 기능 추가 및 SurveyOptionList로 수정
* Rename: SurveyOptionItem -> SurveyOptionList
* Feat: ProgressBarPreview에 +/- 효과 추가
* Chore: gradle 의존성 추가
* Fix: intent 이름 변경
* Feat: 알림 선택 시 읽음 처리 이벤트 추가
* Feat: 포그라운드 알림 처리
* Fix: Navigation Deeplink 오류 수정
* Chore: mockito 라이브러리 추가
* Feat: HbtiScreen 추가
* Chore: compose material 및 preview 라이브러리 추가
* Feat: Hbti화면 완성
* Design: 향BTI 화면 디자인 구성 완료
* Feat: 향BTI 테스트 데이터계층 클래스 생성
* Rename: SurveyAnswerResponseDto -> SurveyOptionResponseDto
* Feat: fcm token 저장 함수 추가
* Fix: 파라미터 이름 오류 수정
* Fix: 토큰 저장 알고리즘 수정
* Feat: 향수 추천 화면 추가
* Design: 공백 수정
* Feat: 데이터 계층 hilt 주입코드 추가
* Feat: HbtiSurvey 화면 추가(미완성)
* Feat: 가격 선택 화면 추가
* Design: 아이템 간 간격 조절
* Rename: 컴포넌트 이름 변경
* Rename: 컴포넌트 이름 변경
* Feat: 향료 선택 화면 추가
* Refactor: 화면 구성 변경
* Fix: 파라미터 변경
* Resource: icon 추가
* Fix: 파라미터 수정
* Feat: 향료 선택 화면 추가
* Style: 공백 스타일 변경
* Fix: 푸쉬 오류 수정
* Style: 코드 스타일 변경
* Feat: 향수 추천 결과 화면 추가
* Rename: 컴포넌트 이름 변경
* Ignore
* Delete
* Chore: test 라이브러리 추가
* Feat: HbtiSurveyViewmodel 생성
* Test: HbtiSurveyViewModel 테스트 생성
* Test: 테스트 기대값 수정
* Feat: Dto 추가
* Feat: Api 추가
* Style: 코드 라인 변경
* Feat: 비즈니스 로직 추가
* Remove: 삭제
* Feat: 향료 데이터 클래스 추가
* Comment: 주석 추가
* Fix: 서버에 정보 전달 로직 임의 대체
* Rename: 함수 명 변경
* Feat: 비즈니스 로직 추가
* Feat: 비즈니스 로직 추가
* Feat: 비즈니스 로직 추가
* Feat: UI 상태 기준 분기
* Feat: Navigation 설정
* Design: On/Off 버튼 디자인
* Test: UI 테스트
* Chore: Firebase 의존성 추가
* Feat: onNewToken 함수 추가
* Feat: 알림 On/Off 알고리즘 추가
* Test: Hbti2 API 테스트 세팅
* Docs: resource 위치 이동
* Chore: 권한 추가
* Remove: 불필요 함수 제거
* Refactor: 파라미터 수정
* Refactor: 파라미터 수정
* Refactor: 파라미터 수정
* Feat: 갤러리 권한 추가
* Refactor: 파라미터 수정
* Style: 공백 제거
* Refactor: 함수 변경
* Fix: 알림 설정 저장 오류 수정
* Feat: 권한 관련 Common 파일 추가
* Fix: Intent Flag 오류 수정
* Fix: 권한 허가 로직 수정
* Fix: Pending Intent 플래그 수정
* Fix: Pending Intent 플래그 수정
* Fix: Conflict
* Refactor: 조건 수정
* Style: 공백 정리
* Feat: Error State 추가
* Feat: Error State 추가
* Rename: View Model 이름 변경
* Style: 공백 제거
* Feat: UiState와 ErrorState combine
* Fix: 조건 수정
* Feat: Error 상태 관리 추가
* Feat: navigation ci옵션 추가
* Fix: Navigation 변경
* Feat: navigation 스택 제거 함수 추가
* Feat: navigation 스택 조정
* Feat: error state 추가
* Feat: error state 추가
* Feat: error state와 ui state 연결
* Hotfix: Token 오류 수정
* Feat: ErrorUiState 추가 및 유저화면 적용
* Chore: 버전코드 변경 12->13
* Hotfix: 토큰 빈값 방출 수정
* Hotfix: ErrorUiSetView onCloseClick 콜백 동작 수정 및 Rename
* Design: 에러메세지 문구 수정
* Chore: 버전코드 수정 13->14
* Feat: 토큰리프레싱 후 기존 토큰 삭제 과정 추가
* Fix: 비동기 처리 완료 후 네비게이팅 하도록 수정
* Hotfix: memberNotFoundError 처리 누락 추가
* Chore: 버전코드 수정 (14->15)
* Hotfix: hpedia 커뮤니티 MemberNotFound 상태변수 추가
* Chore: 15->16 버전 코드 수정
* Chore: 버전 코드 수정 16->17
* Hotfix: ErrorState 타입캐스팅 디버깅 구문 삭제
* Chore: 버전코드 수정 (17->18)
* Remove: 기능없는 이용약관 삭제
구글 Broken Functionality policy 위반을 피하기 위한 조치입니다!
* Delete: 서비스 알림 배너 삭제
* Chore: 패키지명 변경 hmoa -> hyangmoa
* Chore: 패키지 명 변경 (hmoa -> hyangmoa)
* Chore: 버전코드 1로 초기화
* Revert "Chore: 패키지 명 변경 (hmoa -> hyangmoa)"
This reverts commit 811f817ebf54089de05ebabe42bdee964b52d3e1.
* Revert "Chore: 버전코드 1로 초기화"
This reverts commit 529e65abe5c96a90943b6ffd466ae5a4742570ef.
* Revert "Chore: 패키지명 변경 hmoa -> hyangmoa"
This reverts commit bfe2d86153421276a831ad4e69dd4ab50dfee72c.
* Chore: 테스트 라이브러리 추가
* Test: DataPreference 인풋 아웃풋 비교 테스트 추가
* Chore: 테스트 라이브러리 라이브러리 변경
* Test: DataStorePreference 인풋, 아웃풋 결과값 테스트
* Fix: 토큰이 null일 경우 빈 문자열 처리
* Feat: 이용약관 및 개인정보처리방침 url 수정
* Delete: 주석 삭제
* HotFix: 토큰 빈값 나오는 현상 수정
* HotFix: 토큰 초기화 및 유지 이슈 해결
* Chore: apk 파일 추출 명령어 추가
* Chore: 깃허브 시크릿 카피 스크립트 파일 추가
* Chore: APK 명령어는 master에서만 실행하도록 수정
* Delete: CI환경에 부적합 + 필요없음
* Delete: PR할 때만 CI되도록 수정
* Delete
* Delete
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Ignore
* Chore: 업데이트 버전명 수정 1.0.0 -> 1.1.0
* Fix: 버전정보 매개변수로 주입하기 추가
* Design: 로그인 버튼 마진 및 구글아이콘 수정
* Design: 향수 검색 화면 마진 수정
* Update README.md
* Update README.md
* Update README.md
* Design: 디자인 디테일 수정 (패딩 및 아이콘 크기)
* Design: 아이콘 크기 변경
* Chore: 버전 코드 증가(18->19)
* Design: 스위치 on포인트 색상 변경
* Chore: targetSdk 업그레이드 (33 -> 34)
* Chore: 버전코드 업데이트
* Chore: action/upload-artifact 버전 변경
* Chore: action/upload-artifact 버전 변경
* Delete: 필요없는 테스트 삭제
* Delete: 불필요 코드 제거
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Feat: 에러핸들링 메서드 추가
* Fix: 에러처리 구문 수정
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Chore: CI/CD 공통 작업 분리 및 CD 워크플로우 작성
* Feat: 버전 수정 1.1.1(22)
* Chore: 프로덕션으로 수정
* Hotfix/hpedia (#160)
* Rename: 네비게이션 이벤트 명 변경
* Feat: error state 추가
* Fix: UI state에서 throw를 처리하지 못하는 부분 수정
* Feat: type 설정 변경
* Feat: 변수 관리 조정 및 Error 상태 추가
* Chore: core-common 의존성 추가
* Delete: 토큰 재발급 임시 로직 삭제
* HotFix: Authenticator 토큰 재발급 및 에러메세지 전달 기능 수정
* Fix: Authenticator 적용
* Fix: api 호출부에 Authenticator 적용
* Delete: 안쓰는 api 삭제
* Refactor: FCM 초기화 및 초기 라우팅 코드 함수로 분리
* Delete: 임시 refreshToken 코드 관련 api 삭제
* Rename: 토큰 관련 클래스 의존성 주입 모듈 이름 수정
* Fix: 토큰 동적 할당 시점 변경
* Fix: 로그인 화면 이동 네비게이션 변경
* Chore: 버전 변경 (v1.1.1 -> v1.1.2)
* Chore: ci,cd 구문 변경 및 action.yml 파일 추가
* Fix: action.yml 추가 (#162)
* Chore: v1.1.1 - CD 작업 테스트
* Chore: 환경설정 구문 추가
* Fix: cdWorkflow 파일 수정
환경 설정 구문 삭제
* Fix: ciWorkFlow 파일 수정
환경설정 구문 삭제
* Update whatsnew-ko-KR.txt
* Fix: 파일 경로 오타 수정
* Fix: 파일 경로 오타 수정
* Fix: 깃헙 액션 워크플로우 일시 중지
* v1.1.1 release로 머지합니다 (#161)
* Chore: action/upload-artifact 버전 변경
* Delete: 필요없는 테스트 삭제
* Delete: 불필요 코드 제거
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Feat: 에러핸들링 메서드 추가
* Fix: 에러처리 구문 수정
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Chore: CI/CD 공통 작업 분리 및 CD 워크플로우 작성
* Feat: 버전 수정 1.1.1(22)
* Chore: 프로덕션으로 수정
* Hotfix/hpedia (#160)
* Rename: 네비게이션 이벤트 명 변경
* Feat: error state 추가
* Fix: UI state에서 throw를 처리하지 못하는 부분 수정
* Feat: type 설정 변경
* Feat: 변수 관리 조정 및 Error 상태 추가
* Fix: action.yml 추가 (#162)
* Chore: v1.1.1 - CD 작업 테스트
* Chore: 환경설정 구문 추가
* Fix: cdWorkflow 파일 수정
환경 설정 구문 삭제
* Fix: ciWorkFlow 파일 수정
환경설정 구문 삭제
* Update whatsnew-ko-KR.txt
* Fix: 파일 경로 오타 수정
* Fix: 파일 경로 오타 수정
* Fix: 깃헙 액션 워크플로우 일시 중지
---------
Co-authored-by: Seo Hojun <101941674+uselessnaming@users.noreply.github.com>
* Chore: ci/cd 워크플로우 임시로 주석처리 및 사용중지
* Chore: android.yml 워크플로우 일시중지 (#164)
* Chore: CI 구문 롤백 및 오작동 CI/CD 임시폴더로 분리
* Releasse/1.1.1 CI 구문 롤백 및 새로운 CI/CD 구문 분리 (#165)
* Chore: android.yml 워크플로우 일시중지
* Chore: 예전 CI 코드로 rollback 및 새로운 파일 분리
* Chore: actions upload-artifact 라이브러리 버전 업그레이드
* Rename: 이름 변경
* Fix: 파라미터 명시적으로 구분
* Fix: RouteScreen 파라미터 변수명 변경 반영
* Chore: 버전코드 수정 22->23
* Ignore
* Fix: 백업데이터 설정 해제
* Chore: 버전 업데이트
* Revert "Chore: 버전 업데이트"
This reverts commit 031fc2f141d3ffbc07b0954eda874c58d7e1c834.
* Revert "Fix: 백업데이터 설정 해제"
This reverts commit bb68a8d265be89d74bcc2feed66baca5355cd475.
* 1.1.2버전 develop -> release 머지합니다 (#168)
* Chore: action/upload-artifact 버전 변경
* Delete: 필요없는 테스트 삭제
* Delete: 불필요 코드 제거
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Feat: 에러핸들링 메서드 추가
* Fix: 에러처리 구문 수정
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Chore: CI/CD 공통 작업 분리 및 CD 워크플로우 작성
* Feat: 버전 수정 1.1.1(22)
* Chore: 프로덕션으로 수정
* Hotfix/hpedia (#160)
* Rename: 네비게이션 이벤트 명 변경
* Feat: error state 추가
* Fix: UI state에서 throw를 처리하지 못하는 부분 수정
* Feat: type 설정 변경
* Feat: 변수 관리 조정 및 Error 상태 추가
* Chore: core-common 의존성 추가
* Delete: 토큰 재발급 임시 로직 삭제
* HotFix: Authenticator 토큰 재발급 및 에러메세지 전달 기능 수정
* Fix: Authenticator 적용
* Fix: api 호출부에 Authenticator 적용
* Delete: 안쓰는 api 삭제
* Refactor: FCM 초기화 및 초기 라우팅 코드 함수로 분리
* Delete: 임시 refreshToken 코드 관련 api 삭제
* Rename: 토큰 관련 클래스 의존성 주입 모듈 이름 수정
* Fix: 토큰 동적 할당 시점 변경
* Fix: 로그인 화면 이동 네비게이션 변경
* Chore: 버전 변경 (v1.1.1 -> v1.1.2)
* Chore: ci,cd 구문 변경 및 action.yml 파일 추가
* Fix: action.yml 추가 (#162)
* Chore: v1.1.1 - CD 작업 테스트
* Chore: 환경설정 구문 추가
* Fix: cdWorkflow 파일 수정
환경 설정 구문 삭제
* Fix: ciWorkFlow 파일 수정
환경설정 구문 삭제
* Update whatsnew-ko-KR.txt
* Fix: 파일 경로 오타 수정
* Fix: 파일 경로 오타 수정
* Fix: 깃헙 액션 워크플로우 일시 중지
* Chore: ci/cd 워크플로우 임시로 주석처리 및 사용중지
* Chore: CI 구문 롤백 및 오작동 CI/CD 임시폴더로 분리
* Fix: 파라미터 명시적으로 구분
* Fix: RouteScreen 파라미터 변수명 변경 반영
* Chore: 버전코드 수정 22->23
* Ignore
* Fix: 백업데이터 설정 해제
* Chore: 버전 업데이트
* Revert "Chore: 버전 업데이트"
This reverts commit 031fc2f141d3ffbc07b0954eda874c58d7e1c834.
* Revert "Fix: 백업데이터 설정 해제"
This reverts commit bb68a8d265be89d74bcc2feed66baca5355cd475.
---------
Co-authored-by: Seo Hojun <101941674+uselessnaming@users.noreply.github.com>
* Delete
* Delete
* Delete
---------
Co-authored-by: uselessNaming
Co-authored-by: Seo Hojun <101941674+uselessnaming@users.noreply.github.com>
---
.idea/deploymentTargetSelector.xml | 8 +
.idea/other.xml | 11 +
app/build.gradle.kts | 4 +-
.../main/java/com/hmoa/app/AppViewModel.kt | 19 +-
.../main/java/com/hmoa/app/MainActivity.kt | 138 +++++--------
.../core_datastore/Admin/AdminDataStore.kt | 12 --
.../Admin/AdminDataStoreImpl.kt | 30 ---
.../core_datastore/Brand/BrandDataStore.kt | 3 -
.../Brand/BrandDataStoreImpl.kt | 56 ++---
.../BrandHPedia/BrandHPediaDataStore.kt | 10 +-
.../BrandHPedia/BrandHPediaDataStoreImpl.kt | 12 --
.../Community/CommunityDataStoreImpl.kt | 100 +++++++--
.../CommunityCommentDataStoreImpl.kt | 92 ++++++---
.../hmoa/core_datastore/DatastoreModule.kt | 5 -
.../Fcm/FcmRemoteDataStoreImpl.kt | 53 +++--
.../Hshop/HshopRemoteDataStoreImpl.kt | 26 ++-
.../Login/LoginRemoteDataStore.kt | 1 -
.../Login/LoginRemoteDataStoreImpl.kt | 29 +--
.../Magazine/MagazineDataStoreImpl.kt | 67 ++++--
.../core_datastore/Main/MainDataStoreImpl.kt | 52 +++--
.../Member/MemberDataStoreImpl.kt | 193 ++++++++++++------
.../core_datastore/Note/NoteDataStoreImpl.kt | 24 ++-
.../Perfume/PerfumeDataStoreImpl.kt | 95 ++++++---
.../PerfumeCommentDataStoreImpl.kt | 47 ++++-
.../Perfumer/PerfumerDataStoreImpl.kt | 17 +-
.../Report/ReportDataStoreImpl.kt | 17 +-
.../Search/SearchDataStoreImpl.kt | 52 +++--
.../Survey/SurveyRemoteDataStoreImpl.kt | 72 +++++--
.../core_datastore/Term/TermDataStoreImpl.kt | 15 +-
.../component/ErrorUiSetView.kt | 1 +
.../core_domain/repository/AdminRepository.kt | 12 --
.../repository/BrandHPediaRepository.kt | 7 -
.../core_domain/repository/BrandRepository.kt | 3 -
.../core_domain/repository/LoginRepository.kt | 1 -
core-network/build.gradle.kts | 2 +-
.../authentication/AuthAuthenticator.kt | 62 ------
.../authentication/Authenticator.kt | 21 ++
.../authentication/AuthenticatorImpl.kt | 93 +++++++++
...catorModule.kt => AuthenticationModule.kt} | 6 +-
.../com/hmoa/core_network/di/ServiceModule.kt | 13 +-
.../hmoa/core_network/service/AdminService.kt | 26 ---
.../service/BrandHPediaService.kt | 11 -
.../hmoa/core_network/service/BrandService.kt | 15 --
.../core_repository/AdminRepositoryImpl.kt | 30 ---
.../BrandHPediaRepositoryImpl.kt | 12 --
.../core_repository/BrandRepositoryImpl.kt | 13 --
.../core_repository/LoginRepositoryImpl.kt | 3 -
.../hmoa/core_repository/RepositoryModule.kt | 6 +-
.../feature_community/Navigation/NavGraph.kt | 60 +++---
.../Screen/CommunityDescriptionPage.kt | 63 +++---
.../feature_community/Screen/CommunityHome.kt | 32 ++-
.../Screen/CommunityPreview.kt | 52 ++---
.../feature_hpedia/Screen/HPediaScreen.kt | 6 +-
53 files changed, 1022 insertions(+), 788 deletions(-)
delete mode 100644 core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStore.kt
delete mode 100644 core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStoreImpl.kt
delete mode 100644 core-domain/src/main/java/com/hmoa/core_domain/repository/AdminRepository.kt
delete mode 100644 core-network/src/main/java/com/hmoa/core_network/authentication/AuthAuthenticator.kt
create mode 100644 core-network/src/main/java/com/hmoa/core_network/authentication/Authenticator.kt
create mode 100644 core-network/src/main/java/com/hmoa/core_network/authentication/AuthenticatorImpl.kt
rename core-network/src/main/java/com/hmoa/core_network/di/{AuthenticatorModule.kt => AuthenticationModule.kt} (80%)
delete mode 100644 core-network/src/main/java/com/hmoa/core_network/service/AdminService.kt
delete mode 100644 core-repository/src/main/java/com/hmoa/core_repository/AdminRepositoryImpl.kt
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
index b268ef36c..70faf41cc 100644
--- a/.idea/deploymentTargetSelector.xml
+++ b/.idea/deploymentTargetSelector.xml
@@ -4,6 +4,14 @@
+
+
+
+
+
+
+
+
diff --git a/.idea/other.xml b/.idea/other.xml
index 94c96f631..a76f1180a 100644
--- a/.idea/other.xml
+++ b/.idea/other.xml
@@ -25,6 +25,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index c99a7facd..4dbf589dc 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -22,8 +22,8 @@ android {
applicationId = "com.hmoa.app"
minSdk = 26
targetSdk = 34
- versionCode = 22
- versionName = "1.1.1"
+ versionCode = 23
+ versionName = "1.1.2"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
manifestPlaceholders["REDIRECTION_PATH"] = localProperties["REDIRECTION_PATH"] as String
diff --git a/app/src/main/java/com/hmoa/app/AppViewModel.kt b/app/src/main/java/com/hmoa/app/AppViewModel.kt
index eabdbdbe9..daaaf2b65 100644
--- a/app/src/main/java/com/hmoa/app/AppViewModel.kt
+++ b/app/src/main/java/com/hmoa/app/AppViewModel.kt
@@ -6,8 +6,9 @@ import com.hmoa.core_domain.repository.FcmRepository
import com.hmoa.core_domain.repository.LoginRepository
import com.hmoa.core_model.request.FCMTokenSaveRequestDto
import dagger.hilt.android.lifecycle.HiltViewModel
-import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
@@ -16,9 +17,10 @@ class AppViewModel @Inject constructor(
private val loginRepository: LoginRepository,
private val fcmRepository: FcmRepository,
) : ViewModel() {
- suspend fun authToken(): Flow = loginRepository.getAuthToken()
- suspend fun rememberedToken(): Flow = loginRepository.getRememberedToken()
- suspend fun getFcmToken(): Flow = fcmRepository.getLocalFcmToken()
+ suspend fun authTokenFlow(): Flow = loginRepository.getAuthToken()
+ suspend fun rememberedTokenFlow(): Flow = loginRepository.getRememberedToken()
+
+ suspend fun fcmTokenFlow(): Flow = fcmRepository.getLocalFcmToken()
fun delFcmToken() {
viewModelScope.launch {
@@ -37,11 +39,8 @@ class AppViewModel @Inject constructor(
fun saveFcmToken(token: String) = viewModelScope.launch { fcmRepository.saveLocalFcmToken(token) }
fun checkAlarm(id: Int) = viewModelScope.launch { fcmRepository.checkAlarm(id) }
suspend fun getNotificationEnabled(): Flow = fcmRepository.getNotificationEnabled()
- suspend fun saveNotificationEnabled(isEnabled: Boolean) = fcmRepository.saveNotificationEnabled(isEnabled)
- fun refreshToken() {
- viewModelScope.launch(Dispatchers.IO) {
- loginRepository.refreshToken()
- }
- }
+ suspend fun saveNotificationEnabled(isEnabled: Boolean) =
+ viewModelScope.launch { fcmRepository.saveNotificationEnabled(isEnabled) }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/hmoa/app/MainActivity.kt b/app/src/main/java/com/hmoa/app/MainActivity.kt
index 54ee3768a..fcf2e99f8 100644
--- a/app/src/main/java/com/hmoa/app/MainActivity.kt
+++ b/app/src/main/java/com/hmoa/app/MainActivity.kt
@@ -6,8 +6,6 @@ import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
-import android.os.Handler
-import android.os.Looper
import android.util.Log
import androidx.activity.compose.setContent
import androidx.activity.viewModels
@@ -27,8 +25,9 @@ import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.WindowCompat
-import androidx.lifecycle.coroutineScope
+import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.example.feature_userinfo.UserInfoGraph
@@ -54,11 +53,8 @@ import com.hmoa.feature_magazine.Navigation.MagazineRoute
import com.hmoa.feature_magazine.Navigation.navigateToMagazineHome
import com.hmoa.feature_perfume.navigation.PerfumeRoute
import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.coroutines.*
import kotlinx.coroutines.flow.collectLatest
-import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.stateIn
-import kotlinx.coroutines.flow.zip
+import kotlinx.coroutines.launch
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@@ -90,54 +86,27 @@ class MainActivity : AppCompatActivity() {
private val needTopBarScreens = HomeRoute.Home.name
override fun onCreate(savedInstanceState: Bundle?) {
-
super.onCreate(savedInstanceState)
installSplashScreen()
WindowCompat.setDecorFitsSystemWindows(window, false)
requestNotificationPermission()
- initFirebaseSetting()
lifecycleScope.launch {
- val currentJob = coroutineContext.job
- val authTokenState = viewModel.authToken().stateIn(this)
- val rememberedTokenState = viewModel.rememberedToken().stateIn(this)
- val newFlow = authTokenState.zip(rememberedTokenState) { authtoken, rememberedToken ->
- Pair(authtoken, rememberedToken)
- }
- launch {
- newFlow.collectLatest { token ->
- Log.d("LOGIN TOKEN", "access : ${token.first} refresh : ${token.second}")
- if (token.first == null && token.second == null) {
- initialRoute = AuthenticationRoute.Login.name
- currentJob.cancel()
- } else {
- initialRoute = HomeRoute.Home.name
- currentJob.cancel()
+ repeatOnLifecycle(Lifecycle.State.CREATED) {
+ viewModel.fcmTokenFlow().collectLatest { fcmToken ->
+ viewModel.getNotificationEnabled().collectLatest { isEnabled ->
+ Log.d("POST PERMISSION", "is granted : ${isEnabled}")
+ Log.d("FCM TEST", "fcm token : ${fcmToken}")
+ initializeFirebaseSetting(
+ fcmToken = fcmToken,
+ onSaveFcmToken = { token -> viewModel.saveFcmToken(token) })
+ initializeRoute(
+ onRouteToLogin = { checkFcmToken(fcmToken, isEnabled) })
}
}
}
- launch {
- viewModel.getNotificationEnabled().collectLatest {
- Log.d("POST PERMISSION", "is granted : ${it}")
- }
- }
}
- //fcm token post
- lifecycleScope.launch {
- val authToken = viewModel.authToken()
- val rememberToken = viewModel.rememberedToken()
- val fcmToken = viewModel.getFcmToken()
- combine(authToken, rememberToken, fcmToken) { authToken, rememberToken, fcmToken -> }.collectLatest {
- val auth = authToken.stateIn(this).value
- val remember = rememberToken.stateIn(this).value
- val fcm = fcmToken.stateIn(this).value
- if (auth != null && remember != null && fcm != null) {
- withContext(Dispatchers.IO) { checkFcmToken(fcm) }
- lifecycle.coroutineScope.cancel()
- }
- }
- }
setContent {
val navHostController = rememberNavController()
@@ -152,6 +121,9 @@ class MainActivity : AppCompatActivity() {
}
isBottomBarVisible = route in needBottomBarScreens
isTopBarVisible = route in needTopBarScreens
+ } ?: run {
+ isBottomBarVisible = false
+ isTopBarVisible = false
}
val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
val deeplink = remember { handleDeeplink(intent) }
@@ -204,21 +176,52 @@ class MainActivity : AppCompatActivity() {
}
//firebase 초기 토큰 처리
- private fun initFirebaseSetting() {
+ private fun initializeFirebaseSetting(fcmToken: String?, onSaveFcmToken: (token: String) -> Unit) {
FirebaseMessaging.getInstance().token.addOnSuccessListener {
- CoroutineScope(Dispatchers.IO).launch {
- val fcmToken = viewModel.getFcmToken().stateIn(this).value
- Log.d("FCM TEST", "fcm token : ${fcmToken}")
- if (it != fcmToken) {
- Log.d("FCM TEST", "firebase messaging fcm token : ${it}")
- viewModel.saveFcmToken(it)
- }
+ if (it != fcmToken) {
+ Log.d("FCM TEST", "firebase messaging fcm token : ${it}")
+ onSaveFcmToken(it)
}
}.addOnFailureListener {
Log.e("FCM TEST", "${it.message} \n ${it.stackTrace}")
}
}
+ private suspend fun initializeRoute(
+ onRouteToLogin: suspend () -> Unit
+ ) {
+ viewModel.authTokenFlow().collectLatest { authToken ->
+ viewModel.rememberedTokenFlow().collectLatest { rememberToken ->
+ Log.d("LOGIN TOKEN", "auth : ${authToken} remember : ${rememberToken}")
+ if (authToken == null && rememberToken == null) {
+ initialRoute = AuthenticationRoute.Login.name
+ onRouteToLogin()
+ } else {
+ initialRoute = HomeRoute.Home.name
+ }
+ }
+ }
+ }
+
+ private suspend fun checkFcmToken(fcmToken: String?, isEnabled: Boolean) {
+ if (fcmToken != null) {
+ handleFcmToken(fcmToken, isEnabled)
+ }
+ Log.d("FCM TEST", "checkFcmToken의 fcmToken 값: ${fcmToken}")
+ }
+
+ private suspend fun handleFcmToken(
+ fcmToken: String, isEnabled: Boolean
+ ) {
+ if (isEnabled) {
+ Log.d("FCM TEST", "post fcm token")
+ viewModel.postFcmToken(fcmToken)
+ } else {
+ Log.d("FCM TEST", "delete fcm token")
+ viewModel.delFcmToken()
+ }
+ }
+
//deeplink 처리 함수
private fun handleDeeplink(intent: Intent?): Pair {
var deeplink: String? = intent?.getStringExtra("deeplink") ?: return Pair(null, null)
@@ -236,22 +239,6 @@ class MainActivity : AppCompatActivity() {
return Pair(deeplink, alarm_id)
}
- private suspend fun checkFcmToken(
- fcmToken: String
- ) {
- CoroutineScope(Dispatchers.IO).launch {
- val isEnabled = viewModel.getNotificationEnabled().stateIn(this)
- // isEnabled 가 true 면
- if (isEnabled.value) {
- Log.d("FCM TEST", "post fcm token")
- viewModel.postFcmToken(fcmToken)
- } else {
- Log.d("FCM TEST", "delete fcm token")
- viewModel.delFcmToken()
- }
- }
- }
-
private fun requestNotificationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
val deniedPermissions = permissions.filter { !com.hmoa.core_common.checkPermission(this, it) }
@@ -299,19 +286,4 @@ class MainActivity : AppCompatActivity() {
lifecycleScope.launch { viewModel.saveNotificationEnabled(true) }
}
}
-
- override fun onResume() {
- super.onResume()
- //30분 마다 토큰 재발급하는 임시대책
- val handler = Handler(Looper.getMainLooper())
- val runnable = object : java.lang.Runnable {
- override fun run() {
- // 작업 실행
- Log.d("HandlerTest", "another shot in 1 minute")
- viewModel.refreshToken()
- handler.postDelayed(this, 30 * 60 * 1000) // 30분 후에 다시 실행
- }
- }
- handler.post(runnable)
- }
}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStore.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStore.kt
deleted file mode 100644
index d3d249024..000000000
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStore.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.hmoa.core_datastore.Admin
-
-import com.hmoa.core_model.request.HomeMenuSaveRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.HomeMenuPerfumeResponseDto
-
-interface AdminDataStore {
- suspend fun deleteHomeMenu(homeMenuId : Int) : DataResponseDto
- suspend fun postHomeMenu(homeMenuId : Int, homeMenuSaveRequestDto : HomeMenuSaveRequestDto) : DataResponseDto
- suspend fun postHomePerfume(dto : HomeMenuPerfumeResponseDto) : DataResponseDto
- suspend fun postHomePerfumeAdd(homeId : Int, perfumeId : Int) : DataResponseDto
-}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStoreImpl.kt
deleted file mode 100644
index f7cef87d8..000000000
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStoreImpl.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.hmoa.core_datastore.Admin
-
-import com.hmoa.core_model.request.HomeMenuSaveRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.HomeMenuPerfumeResponseDto
-import com.hmoa.core_network.service.AdminService
-import javax.inject.Inject
-
-class AdminDataStoreImpl @Inject constructor(
- private val adminService: AdminService
-) : AdminDataStore {
- override suspend fun deleteHomeMenu(homeMenuId: Int): DataResponseDto {
- return adminService.deleteHomeMenu(homeMenuId)
- }
-
- override suspend fun postHomeMenu(
- homeMenuId: Int,
- homeMenuSaveRequestDto: HomeMenuSaveRequestDto
- ): DataResponseDto {
- return adminService.postHomeMenu(homeMenuId, homeMenuSaveRequestDto)
- }
-
- override suspend fun postHomePerfume(dto: HomeMenuPerfumeResponseDto): DataResponseDto {
- return adminService.postHomePerfume(dto)
- }
-
- override suspend fun postHomePerfumeAdd(homeId: Int, perfumeId: Int): DataResponseDto {
- return adminService.postHomePerfumeAdd(homeId, perfumeId)
- }
-}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStore.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStore.kt
index 1e6e6a4f9..02b695900 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStore.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStore.kt
@@ -4,14 +4,11 @@ import ResultResponse
import com.hmoa.core_model.response.BrandDefaultResponseDto
import com.hmoa.core_model.response.BrandPerfumeBriefPagingResponseDto
import com.hmoa.core_model.response.DataResponseDto
-import java.io.File
interface BrandDataStore {
suspend fun getBrand(brandId: Int): ResultResponse>
suspend fun putBrandLike(brandId: Int): DataResponseDto
suspend fun deleteBrandLike(brandId: Int): DataResponseDto
- suspend fun postBrandTestSave(image: File, brandId: Int): DataResponseDto //임시?
- suspend fun postBrand(image: File, brandName: String, englishName: String): DataResponseDto
suspend fun getPerfumesSortedChar(
brandId: Int,
pageNum: Int
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStoreImpl.kt
index b4493e75c..3337f447e 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStoreImpl.kt
@@ -1,28 +1,33 @@
package com.hmoa.core_datastore.Brand
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.BrandDefaultResponseDto
import com.hmoa.core_model.response.BrandPerfumeBriefPagingResponseDto
import com.hmoa.core_model.response.DataResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.BrandService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
-import kotlinx.serialization.json.Json
-import java.io.File
+import com.skydoves.sandwich.suspendOnSuccess
import javax.inject.Inject
class BrandDataStoreImpl @Inject constructor(
- private val brandService: BrandService
+ private val brandService: BrandService,
+ private val authenticator: Authenticator
) : BrandDataStore {
override suspend fun getBrand(brandId: Int): ResultResponse> {
val result = ResultResponse>()
brandService.getBrand(brandId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ brandService.getBrand(brandId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -35,18 +40,6 @@ class BrandDataStoreImpl @Inject constructor(
return brandService.deleteBrandLike(brandId)
}
- override suspend fun postBrandTestSave(image: File, brandId: Int): DataResponseDto {
- return brandService.postBrandTestSave(image = image, brandId = brandId)
- }
-
- override suspend fun postBrand(
- image: File,
- brandName: String,
- englishName: String
- ): DataResponseDto {
- return brandService.postBrand(image, brandName, englishName)
- }
-
override suspend fun getPerfumesSortedChar(
brandId: Int,
pageNum: Int
@@ -55,8 +48,13 @@ class BrandDataStoreImpl @Inject constructor(
brandService.getPerfumesSortedChar(brandId, pageNum).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ brandService.getPerfumesSortedChar(brandId, pageNum).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -69,8 +67,13 @@ class BrandDataStoreImpl @Inject constructor(
brandService.getPerfumesSortedLike(brandId, pageNum).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ brandService.getPerfumesSortedLike(brandId, pageNum).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -83,8 +86,13 @@ class BrandDataStoreImpl @Inject constructor(
brandService.getPerfumesSortedUpdate(brandId, pageNum).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ brandService.getPerfumesSortedUpdate(brandId, pageNum).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStore.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStore.kt
index 3f6cbacbe..f0a1f96cd 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStore.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStore.kt
@@ -3,10 +3,8 @@ package com.hmoa.core_datastore.BrandHPedia
import com.hmoa.core_model.response.DataResponseDto
interface BrandHPediaDataStore {
- suspend fun getBrandStoryAll(pageNum : Int) : DataResponseDto
- suspend fun getBrandStory(brandStoryId : Int) : DataResponseDto
- suspend fun deleteBrandStory(brandStoryId : Int) : DataResponseDto
- suspend fun updateBrandStory(brandStoryId : Int, content : String) : DataResponseDto
- suspend fun postBrandStory(brandStorySubtitle : String, brandStoryTitle : String, content : String) : DataResponseDto
- suspend fun postTestSave() : DataResponseDto //Test
+ suspend fun getBrandStoryAll(pageNum: Int): DataResponseDto
+ suspend fun getBrandStory(brandStoryId: Int): DataResponseDto
+ suspend fun deleteBrandStory(brandStoryId: Int): DataResponseDto
+ suspend fun updateBrandStory(brandStoryId: Int, content: String): DataResponseDto
}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStoreImpl.kt
index c210f47e8..fc99440c9 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStoreImpl.kt
@@ -25,16 +25,4 @@ class BrandHPediaDataStoreImpl @Inject constructor(
): DataResponseDto {
return brandHPediaService.updateBrandStory(brandStoryId, content)
}
-
- override suspend fun postBrandStory(
- brandStorySubtitle: String,
- brandStoryTitle: String,
- content: String
- ): DataResponseDto {
- return brandHPediaService.postBrandStory(brandStorySubtitle, brandStoryTitle, content)
- }
-
- override suspend fun postTestSave(): DataResponseDto {
- return brandHPediaService.postTestSave()
- }
}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Community/CommunityDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Community/CommunityDataStoreImpl.kt
index 024074980..5b3db0aef 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Community/CommunityDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Community/CommunityDataStoreImpl.kt
@@ -4,26 +4,33 @@ import ResultResponse
import com.hmoa.core_datastore.Mapper.transformMultipartBody
import com.hmoa.core_datastore.Mapper.transformRequestBody
import com.hmoa.core_datastore.Mapper.transformToMultipartBody
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.CommunityService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import java.io.File
import javax.inject.Inject
-class CommunityDataStoreImpl @Inject constructor(private val communityService: CommunityService) :
+class CommunityDataStoreImpl @Inject constructor(
+ private val communityService: CommunityService,
+ private val authenticator: Authenticator
+) :
CommunityDataStore {
override suspend fun getCommunity(communityId: Int): ResultResponse {
val result = ResultResponse()
communityService.getCommunity(communityId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.getCommunity(communityId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -45,8 +52,19 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.postCommunityUpdate(
+ images.transformToMultipartBody(),
+ deleteCommunityPhotoIds.transformRequestBody(),
+ title.transformRequestBody(),
+ content.transformRequestBody(),
+ communityId
+ ).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -56,8 +74,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.deleteCommunity(communityId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.deleteCommunity(communityId).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -67,8 +90,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.putCommunityLike(communityId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.putCommunityLike(communityId).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -78,8 +106,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.deleteCommunityLike(communityId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.deleteCommunityLike(communityId).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -96,8 +129,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.getCommunitiesHome().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.getCommunitiesHome().suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -117,8 +155,18 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.postCommunitySave(
+ images.transformToMultipartBody(),
+ category.transformMultipartBody("category"),
+ title.transformMultipartBody("title"),
+ content.transformMultipartBody("content")
+ ).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -128,8 +176,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.getMyCommunitiesByHeart(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.getMyCommunitiesByHeart(cursor).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -139,8 +192,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.getMyCommunities(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.getMyCommunities(cursor).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/CommunityComment/CommunityCommentDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/CommunityComment/CommunityCommentDataStoreImpl.kt
index 5239962dc..70531dc57 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/CommunityComment/CommunityCommentDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/CommunityComment/CommunityCommentDataStoreImpl.kt
@@ -1,22 +1,20 @@
package com.hmoa.core_datastore.CommunityComment
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.CommunityCommentDefaultRequestDto
-import com.hmoa.core_model.response.CommunityCommentAllResponseDto
-import com.hmoa.core_model.response.CommunityCommentDefaultResponseDto
-import com.hmoa.core_model.response.CommunityCommentWithLikedResponseDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.PagingData
+import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.CommunityCommentService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class CommunityCommentDataStoreImpl @Inject constructor(private val communityCommentService: CommunityCommentService) :
+class CommunityCommentDataStoreImpl @Inject constructor(
+ private val communityCommentService: CommunityCommentService,
+ private val authenticator: Authenticator
+) :
CommunityCommentDataStore {
override suspend fun getCommunityComment(
commentId: Int
@@ -25,8 +23,13 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.getCommunityComment(commentId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.getCommunityComment(commentId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -39,8 +42,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.putCommunityComment(commentId, dto).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.putCommunityComment(commentId, dto)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -50,8 +59,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.deleteCommunityComment(commentId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.deleteCommunityComment(commentId)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -63,8 +78,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.putCommunityCommentLiked(commentId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.putCommunityCommentLiked(commentId)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -74,8 +95,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.deleteCommunityCommentLiked(commentId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.deleteCommunityCommentLiked(commentId)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -95,8 +122,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.postCommunityComment(communityId, dto).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.postCommunityComment(communityId, dto)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -106,8 +139,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.getMyCommunityCommentsByHeart(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.getMyCommunityCommentsByHeart(cursor)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -117,8 +156,13 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.getMyCommunityComments(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.getMyCommunityComments(cursor).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/DatastoreModule.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/DatastoreModule.kt
index e0c3b56de..8d8c7ddff 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/DatastoreModule.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/DatastoreModule.kt
@@ -1,7 +1,5 @@
package com.hmoa.core_datastore
-import com.hmoa.core_datastore.Admin.AdminDataStore
-import com.hmoa.core_datastore.Admin.AdminDataStoreImpl
import com.hmoa.core_datastore.Brand.BrandDataStore
import com.hmoa.core_datastore.Brand.BrandDataStoreImpl
import com.hmoa.core_datastore.BrandHPedia.BrandHPediaDataStore
@@ -55,9 +53,6 @@ import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
interface DatastoreModule {
- @Singleton
- @Binds
- fun provideAdminDatastore(adminDataStoreImpl: AdminDataStoreImpl): AdminDataStore
@Singleton
@Binds
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Fcm/FcmRemoteDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Fcm/FcmRemoteDataStoreImpl.kt
index 5e88c68c9..cf50b7a16 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Fcm/FcmRemoteDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Fcm/FcmRemoteDataStoreImpl.kt
@@ -1,19 +1,19 @@
package com.hmoa.core_datastore.Fcm
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.FCMTokenSaveRequestDto
import com.hmoa.core_model.response.AlarmResponse
import com.hmoa.core_model.response.DataResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.FcmService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
class FcmRemoteDataStoreImpl @Inject constructor(
- private val fcmDataService: FcmService
+ private val fcmDataService: FcmService,
+ private val authenticator: Authenticator
) : FcmRemoteDataStore {
override suspend fun deleteFcmToken(): ResultResponse {
@@ -21,38 +21,61 @@ class FcmRemoteDataStoreImpl @Inject constructor(
fcmDataService.deleteFcmToken().suspendOnSuccess {
result.data = this.data.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ fcmDataService.deleteFcmToken().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun getFcmList(): ResultResponse>> {
var result = ResultResponse>>()
- fcmDataService.getAlarmList().suspendOnSuccess{
+ fcmDataService.getAlarmList().suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ fcmDataService.getAlarmList().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun checkAlarm(alarmId: Int): ResultResponse> {
var result = ResultResponse>()
- fcmDataService.checkAlarm(alarmId).suspendOnSuccess{
+ fcmDataService.checkAlarm(alarmId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ fcmDataService.checkAlarm(alarmId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun saveFcmToken(fcmTokenSaveRequest: FCMTokenSaveRequestDto): ResultResponse {
var result = ResultResponse()
fcmDataService.saveFcmToken(fcmTokenSaveRequest).suspendOnSuccess {
result.data = this.data.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ fcmDataService.saveFcmToken(fcmTokenSaveRequest).suspendOnSuccess { result.data = this.data.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Hshop/HshopRemoteDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Hshop/HshopRemoteDataStoreImpl.kt
index 9579fa3dc..3c269657f 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Hshop/HshopRemoteDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Hshop/HshopRemoteDataStoreImpl.kt
@@ -1,24 +1,31 @@
package com.hmoa.core_datastore.Hshop
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.ProductListRequestDto
import com.hmoa.core_model.response.ProductListResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.HshopService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class HshopRemoteDataStoreImpl @Inject constructor(private val hshopService: HshopService) : HshopRemoteDataStore {
+class HshopRemoteDataStoreImpl @Inject constructor(
+ private val hshopService: HshopService,
+ private val authenticator: Authenticator
+) : HshopRemoteDataStore {
override suspend fun getNotes(): ResultResponse {
var result = ResultResponse()
hshopService.getNotes().suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ hshopService.getNotes().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -28,8 +35,13 @@ class HshopRemoteDataStoreImpl @Inject constructor(private val hshopService: Hsh
hshopService.postNotesSelected(dto).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ hshopService.postNotesSelected(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStore.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStore.kt
index 4fa49307a..92a04ec56 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStore.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStore.kt
@@ -13,5 +13,4 @@ interface LoginRemoteDataStore {
suspend fun postOAuth(accessToken: OauthLoginRequestDto, provider: Provider): ResultResponse
suspend fun postRemembered(dto: RememberedLoginRequestDto): ResultResponse
suspend fun postGoogleServerAuthCode(dto: GoogleAccessTokenRequestDto): ResultResponse
- suspend fun refreshToken()
}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStoreImpl.kt
index 53f340f53..cdd3e1b56 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStoreImpl.kt
@@ -2,26 +2,25 @@ package com.hmoa.core_datastore.Login
import ResultResponse
import com.hmoa.core_model.Provider
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.GoogleAccessTokenRequestDto
import com.hmoa.core_model.request.OauthLoginRequestDto
import com.hmoa.core_model.request.RememberedLoginRequestDto
import com.hmoa.core_model.response.GoogleAccessTokenResponseDto
import com.hmoa.core_model.response.MemberLoginResponseDto
import com.hmoa.core_model.response.TokenResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.authentication.GoogleServerAuthCodeService
-import com.hmoa.core_network.authentication.RefreshTokenManager
import com.hmoa.core_network.service.LoginService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
-import kotlinx.serialization.json.Json
+import com.skydoves.sandwich.suspendOnSuccess
import javax.inject.Inject
class LoginRemoteDataStoreImpl @Inject constructor(
private val loginService: LoginService,
private val googleServerAuthCodeService: GoogleServerAuthCodeService,
- private val refreshTokenManager: RefreshTokenManager
+ private val authenticator: Authenticator
) : LoginRemoteDataStore {
@@ -33,8 +32,13 @@ class LoginRemoteDataStoreImpl @Inject constructor(
loginService.postOAuth(accessToken, provider).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ loginService.postOAuth(accessToken, provider).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -44,8 +48,13 @@ class LoginRemoteDataStoreImpl @Inject constructor(
loginService.postRemembered(dto).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ loginService.postRemembered(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -53,8 +62,4 @@ class LoginRemoteDataStoreImpl @Inject constructor(
override suspend fun postGoogleServerAuthCode(dto: GoogleAccessTokenRequestDto): ResultResponse {
return googleServerAuthCodeService.postGoogleServerAuthCodeServiceImpl(dto)
}
-
- override suspend fun refreshToken() {
- refreshTokenManager.refreshTokenEvery50Minutes()
- }
}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Magazine/MagazineDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Magazine/MagazineDataStoreImpl.kt
index 61154c3ff..24b088c6e 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Magazine/MagazineDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Magazine/MagazineDataStoreImpl.kt
@@ -1,66 +1,97 @@
package com.hmoa.core_datastore.Magazine
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.MagazineResponseDto
import com.hmoa.core_model.response.MagazineSummaryResponseDto
import com.hmoa.core_model.response.MagazineTastingCommentResponseDto
import com.hmoa.core_model.response.PagingData
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.MagazineService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
class MagazineDataStoreImpl @Inject constructor(
- private val magazineService: MagazineService
+ private val magazineService: MagazineService,
+ private val authenticator: Authenticator
) : MagazineDataStore {
override suspend fun getMagazine(magazineId: Int): ResultResponse {
val result = ResultResponse()
- magazineService.getMagazine(magazineId).suspendOnSuccess{
+ magazineService.getMagazine(magazineId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.getMagazine(magazineId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun putMagazineHeart(magazineId: Int): ResultResponse {
val result = ResultResponse()
- magazineService.putMagazineHeart(magazineId).suspendOnSuccess{
+ magazineService.putMagazineHeart(magazineId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.putMagazineHeart(magazineId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
override suspend fun deleteMagazineHeart(magazineId: Int): ResultResponse {
val result = ResultResponse()
- magazineService.deleteMagazineHeart(magazineId).suspendOnSuccess{
+ magazineService.deleteMagazineHeart(magazineId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.deleteMagazineHeart(magazineId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
override suspend fun getMagazineList(cursor: Int): ResultResponse> {
val result = ResultResponse>()
- magazineService.getMagazineList(cursor).suspendOnSuccess{
+ magazineService.getMagazineList(cursor).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.getMagazineList(cursor).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
override suspend fun getMagazineTastingComment(): ResultResponse {
val result = ResultResponse()
- magazineService.getMagazineTastingComment().suspendOnSuccess{
+ magazineService.getMagazineTastingComment().suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.getMagazineTastingComment().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Main/MainDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Main/MainDataStoreImpl.kt
index 33ac9a8b5..a8bb6269d 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Main/MainDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Main/MainDataStoreImpl.kt
@@ -1,27 +1,33 @@
package com.hmoa.core_datastore.Main
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.HomeMenuAllResponseDto
import com.hmoa.core_model.response.HomeMenuDefaultResponseDto
import com.hmoa.core_model.response.HomeMenuFirstResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.MainService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
-import kotlinx.serialization.json.Json
+import com.skydoves.sandwich.suspendOnSuccess
import javax.inject.Inject
class MainDataStoreImpl @Inject constructor(
- private val mainService: MainService
+ private val mainService: MainService,
+ private val authenticator: Authenticator
) : MainDataStore {
override suspend fun getFirst(): ResultResponse {
val result = ResultResponse()
mainService.getFirst().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getFirst().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -31,8 +37,13 @@ class MainDataStoreImpl @Inject constructor(
mainService.getFirstMenu().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getFirstMenu().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -42,8 +53,13 @@ class MainDataStoreImpl @Inject constructor(
mainService.getSecond().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getSecond().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -53,8 +69,13 @@ class MainDataStoreImpl @Inject constructor(
mainService.getSecondMenu().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getSecondMenu().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -64,8 +85,13 @@ class MainDataStoreImpl @Inject constructor(
mainService.getThirdMenu().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getThirdMenu().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Member/MemberDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Member/MemberDataStoreImpl.kt
index a068151f4..3e253362a 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Member/MemberDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Member/MemberDataStoreImpl.kt
@@ -2,7 +2,6 @@ package com.hmoa.core_datastore.Member
import ResultResponse
import com.hmoa.core_datastore.Mapper.transformToMultipartBody
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.AgeRequestDto
import com.hmoa.core_model.request.JoinUpdateRequestDto
import com.hmoa.core_model.request.NickNameRequestDto
@@ -11,26 +10,33 @@ import com.hmoa.core_model.response.CommunityByCategoryResponseDto
import com.hmoa.core_model.response.CommunityCommentDefaultResponseDto
import com.hmoa.core_model.response.DataResponseDto
import com.hmoa.core_model.response.MemberResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.MemberService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import java.io.File
import javax.inject.Inject
class MemberDataStoreImpl @Inject constructor(
- private val memberService: MemberService
+ private val memberService: MemberService,
+ private val authenticator: Authenticator
) : MemberDataStore {
override suspend fun getMember(): ResultResponse {
val result = ResultResponse()
- memberService.getMember().suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getMember()
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getMember().suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
@@ -40,23 +46,35 @@ class MemberDataStoreImpl @Inject constructor(
override suspend fun getCommunities(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getCommunities(page).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getCommunities(page)
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getCommunities(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun getCommunityComments(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getCommunityComments(page).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getCommunityComments(page)
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getCommunityComments(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
@@ -66,82 +84,125 @@ class MemberDataStoreImpl @Inject constructor(
override suspend fun postExistsNickname(request: NickNameRequestDto): ResultResponse {
val result = ResultResponse()
- memberService.postExistsNickname(request).suspendOnSuccess {
- result.data = false
- }.suspendOnError {
- if (this.statusCode.code == 409) {
- result.data = true
- } else {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ memberService.postExistsNickname(request)
+ .suspendOnSuccess {
+ result.data = false
+ }.suspendOnError {
+ if (this.statusCode.code == 409) {
+ result.data = true
+ } else {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.postExistsNickname(request).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
}
- }
return result
}
override suspend fun updateJoin(request: JoinUpdateRequestDto): ResultResponse {
val result = ResultResponse()
- memberService.updateJoin(request).suspendMapSuccess {
- result.data = this
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.updateJoin(request)
+ .suspendMapSuccess {
+ result.data = this
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.updateJoin(request).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun updateNickname(request: NickNameRequestDto): ResultResponse> {
val result = ResultResponse>()
- memberService.updateNickname(request).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.updateNickname(request)
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.updateNickname(request).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun getCommunityFavoriteComments(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getCommunityFavoriteComments(page).suspendMapSuccess {
- result.data = this
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getCommunityFavoriteComments(page)
+ .suspendMapSuccess {
+ result.data = this
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getCommunityFavoriteComments(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun getPerfumeFavoriteComments(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getPerfumeFavoriteComments(page).suspendMapSuccess {
- result.data = this
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getPerfumeFavoriteComments(page)
+ .suspendMapSuccess {
+ result.data = this
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getPerfumeFavoriteComments(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun getPerfumeComments(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getPerfumeComments(page).suspendMapSuccess {
- result.data = this
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getPerfumeComments(page)
+ .suspendMapSuccess {
+ result.data = this
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getPerfumeComments(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun postProfilePhoto(image: File): ResultResponse> {
val result = ResultResponse>()
- memberService.postProfilePhoto(image.transformToMultipartBody()).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.postProfilePhoto(image.transformToMultipartBody())
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.postProfilePhoto(image.transformToMultipartBody())
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Note/NoteDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Note/NoteDataStoreImpl.kt
index a3bc2e7cb..f434b5f31 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Note/NoteDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Note/NoteDataStoreImpl.kt
@@ -1,18 +1,18 @@
package com.hmoa.core_datastore.Note
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.DataResponseDto
import com.hmoa.core_model.response.NoteDescResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.NoteService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
class NoteDataStoreImpl @Inject constructor(
- private val noteService: NoteService
+ private val noteService: NoteService,
+ private val authenticator: Authenticator
) : NoteDataStore {
override suspend fun getNoteAll(pageNum: Int): DataResponseDto {
return noteService.getNoteAll(pageNum)
@@ -20,12 +20,18 @@ class NoteDataStoreImpl @Inject constructor(
override suspend fun getNote(noteId: Int): ResultResponse> {
val result = ResultResponse>()
- noteService.getNote(noteId).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ noteService.getNote(noteId)
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ noteService.getNote(noteId).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Perfume/PerfumeDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Perfume/PerfumeDataStoreImpl.kt
index b5817d071..6b9475a9f 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Perfume/PerfumeDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Perfume/PerfumeDataStoreImpl.kt
@@ -1,45 +1,53 @@
package com.hmoa.core_datastore.Perfume
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.AgeRequestDto
import com.hmoa.core_model.request.PerfumeGenderRequestDto
import com.hmoa.core_model.request.PerfumeWeatherRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.PerfumeAgeResponseDto
-import com.hmoa.core_model.response.PerfumeDetailResponseDto
-import com.hmoa.core_model.response.PerfumeDetailSecondResponseDto
-import com.hmoa.core_model.response.PerfumeGenderResponseDto
-import com.hmoa.core_model.response.PerfumeLikeResponseDto
-import com.hmoa.core_model.response.PerfumeWeatherResponseDto
-import com.hmoa.core_model.response.RecentPerfumeResponseDto
+import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.PerfumeService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: PerfumeService) : PerfumeDataStore {
+class PerfumeDataStoreImpl @Inject constructor(
+ private val perfumeService: PerfumeService,
+ private val authenticator: Authenticator
+) : PerfumeDataStore {
override suspend fun getPerfumeTopDetail(perfumeId: String): ResultResponse {
var result = ResultResponse()
- perfumeService.getPerfumeTopDetail(perfumeId).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ perfumeService.getPerfumeTopDetail(perfumeId)
+ .suspendOnSuccess {
+ result.data = this.data
+ }
+ .suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.getPerfumeTopDetail(perfumeId).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
+
override suspend fun getPerfumeBottomDetail(perfumeId: String): ResultResponse {
var result = ResultResponse()
perfumeService.getPerfumeBottomDetail(perfumeId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.getPerfumeBottomDetail(perfumeId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -49,8 +57,13 @@ class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: Perfu
perfumeService.postPerfumeAge(dto, perfumeId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.postPerfumeAge(dto, perfumeId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -67,8 +80,13 @@ class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: Perfu
perfumeService.postPerfumeGender(dto, perfumeId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.postPerfumeGender(dto, perfumeId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -93,8 +111,13 @@ class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: Perfu
perfumeService.postPerfumeWeather(perfumeId, dto).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.postPerfumeWeather(perfumeId, dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -108,17 +131,29 @@ class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: Perfu
perfumeService.getLikePerfumes().suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.getLikePerfumes().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun getRecentPerfumes(): ResultResponse {
val result = ResultResponse()
- perfumeService.getRecentPerfumes().suspendOnSuccess{
+ perfumeService.getRecentPerfumes().suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.getRecentPerfumes().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/PerfumeComment/PerfumeCommentDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/PerfumeComment/PerfumeCommentDataStoreImpl.kt
index 3e6a02c2e..fbaeee8ad 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/PerfumeComment/PerfumeCommentDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/PerfumeComment/PerfumeCommentDataStoreImpl.kt
@@ -1,17 +1,19 @@
package com.hmoa.core_datastore.PerfumeComment
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.PerfumeCommentRequestDto
import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.PerfumeCommentService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeCommentService: PerfumeCommentService) :
+class PerfumeCommentDataStoreImpl @Inject constructor(
+ private val perfumeCommentService: PerfumeCommentService,
+ private val authenticator: Authenticator
+) :
PerfumeCommentDataStore {
override suspend fun getPerfumeComment(commentId: Int): PerfumeCommentResponseDto {
return perfumeCommentService.getPerfumeComment(commentId)
@@ -42,8 +44,13 @@ class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeComment
perfumeCommentService.putPerfumeCommentLike(commentId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeCommentService.putPerfumeCommentLike(commentId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -53,8 +60,14 @@ class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeComment
perfumeCommentService.deletePerfumeCommentLike(commentId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeCommentService.deletePerfumeCommentLike(commentId)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -73,8 +86,14 @@ class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeComment
perfumeCommentService.getPerfumeCommentsWithHeart(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeCommentService.getPerfumeCommentsWithHeart(cursor)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -86,8 +105,14 @@ class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeComment
perfumeCommentService.getMyPerfumeComments(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeCommentService.getMyPerfumeComments(cursor)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Perfumer/PerfumerDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Perfumer/PerfumerDataStoreImpl.kt
index 04973e286..1e48370cc 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Perfumer/PerfumerDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Perfumer/PerfumerDataStoreImpl.kt
@@ -1,17 +1,19 @@
package com.hmoa.core_datastore.Perfumer
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.DataResponseDto
import com.hmoa.core_model.response.PerfumerDescResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.PerfumerService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class PerfumerDataStoreImpl @Inject constructor(private val perfumerService: PerfumerService) :
+class PerfumerDataStoreImpl @Inject constructor(
+ private val perfumerService: PerfumerService,
+ private val authenticator: Authenticator
+) :
PerfumerDataStore {
override suspend fun getPerfumers(pageNum: String): DataResponseDto {
return perfumerService.getPerfumers(pageNum)
@@ -22,8 +24,13 @@ class PerfumerDataStoreImpl @Inject constructor(private val perfumerService: Per
perfumerService.getPerfumer(perfumerId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumerService.getPerfumer(perfumerId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStoreImpl.kt
index d8bcb8a0c..42232e170 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStoreImpl.kt
@@ -1,17 +1,19 @@
package com.hmoa.core_datastore.Report
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.TargetRequestDto
import com.hmoa.core_model.response.DataResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.ReportService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class ReportDataStoreImpl @Inject constructor(private val reportService: ReportService) : ReportDataStore {
+class ReportDataStoreImpl @Inject constructor(
+ private val reportService: ReportService,
+ private val authenticator: Authenticator
+) : ReportDataStore {
override suspend fun reportCommunity(dto: TargetRequestDto): DataResponseDto {
return reportService.postReportCommunity(dto)
}
@@ -25,8 +27,13 @@ class ReportDataStoreImpl @Inject constructor(private val reportService: ReportS
reportService.postReportPerfumeComment(dto).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ reportService.postReportPerfumeComment(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Search/SearchDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Search/SearchDataStoreImpl.kt
index 26d382b02..5c225665d 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Search/SearchDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Search/SearchDataStoreImpl.kt
@@ -1,25 +1,31 @@
package com.hmoa.core_datastore.Search
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.SearchService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
-import kotlinx.serialization.json.Json
+import com.skydoves.sandwich.suspendOnSuccess
import javax.inject.Inject
class SearchDataStoreImpl @Inject constructor(
- private val searchService: SearchService
+ private val searchService: SearchService,
+ private val authenticator: Authenticator
) : SearchDataStore {
override suspend fun getBrand(searchWord: String): ResultResponse> {
val result = ResultResponse>()
searchService.getBrand(searchWord).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getBrand(searchWord).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -29,8 +35,13 @@ class SearchDataStoreImpl @Inject constructor(
searchService.getBrandAll(consonant).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getBrandAll(consonant).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -50,8 +61,13 @@ class SearchDataStoreImpl @Inject constructor(
searchService.getCommunity(page, searchWord).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getCommunity(page, searchWord).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -73,8 +89,13 @@ class SearchDataStoreImpl @Inject constructor(
searchService.getPerfume(page, searchWord).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getPerfume(page, searchWord).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -87,8 +108,13 @@ class SearchDataStoreImpl @Inject constructor(
searchService.getPerfumeName(page, searchWord).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getPerfumeName(page, searchWord).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Survey/SurveyRemoteDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Survey/SurveyRemoteDataStoreImpl.kt
index 14e04b157..84d6e7fa7 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Survey/SurveyRemoteDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Survey/SurveyRemoteDataStoreImpl.kt
@@ -1,7 +1,6 @@
package com.hmoa.core_datastore.Survey
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.ContentRequestDto
import com.hmoa.core_model.request.SurveyRespondRequestDto
import com.hmoa.core_model.request.SurveySaveAnswerRequestDtos
@@ -9,20 +8,29 @@ import com.hmoa.core_model.request.SurveySaveRequestDto
import com.hmoa.core_model.response.DataResponseDto
import com.hmoa.core_model.response.RecommendNotesResponseDto
import com.hmoa.core_model.response.SurveyQuestionsResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.SurveyService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: SurveyService) : SurveyRemoteDataStore {
+class SurveyRemoteDataStoreImpl @Inject constructor(
+ private val surveyService: SurveyService,
+ private val authenticator: Authenticator
+) : SurveyRemoteDataStore {
override suspend fun getSurveyQuestions(): ResultResponse {
val result = ResultResponse()
surveyService.getSurveyQuestions().suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- result.errorMessage = Json.decodeFromString(this.message())
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.getSurveyQuestions().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -32,27 +40,45 @@ class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: S
surveyService.postSurveyResponds(dto).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- result.errorMessage = Json.decodeFromString(this.message())
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.postSurveyResponds(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
override suspend fun saveSurvey(dto: SurveySaveRequestDto): ResultResponse> {
val result = ResultResponse>()
- surveyService.saveSurvey(dto).suspendOnSuccess{
+ surveyService.saveSurvey(dto).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.saveSurvey(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
override suspend fun saveAnswerNote(dto: SurveySaveAnswerRequestDtos): ResultResponse> {
val result = ResultResponse>()
- surveyService.saveAnswerNote(dto).suspendOnSuccess{
+ surveyService.saveAnswerNote(dto).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.saveAnswerNote(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -62,10 +88,16 @@ class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: S
questionId: Int
): ResultResponse> {
val result = ResultResponse>()
- surveyService.saveAnswerByQuestionId(dto, questionId).suspendOnSuccess{
+ surveyService.saveAnswerByQuestionId(dto, questionId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.saveAnswerByQuestionId(dto, questionId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -75,10 +107,16 @@ class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: S
surveyId: Int
): ResultResponse> {
val result = ResultResponse>()
- surveyService.saveQuestionBySurveyId(dto, surveyId).suspendOnSuccess{
+ surveyService.saveQuestionBySurveyId(dto, surveyId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.saveQuestionBySurveyId(dto, surveyId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Term/TermDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Term/TermDataStoreImpl.kt
index 3491d0bd6..c9b0097b7 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Term/TermDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Term/TermDataStoreImpl.kt
@@ -1,19 +1,19 @@
package com.hmoa.core_datastore.Term
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.DataResponseDto
import com.hmoa.core_model.response.TermDefaultResponseDto
import com.hmoa.core_model.response.TermDescResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.TermService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
class TermDataStoreImpl @Inject constructor(
- private val termService: TermService
+ private val termService: TermService,
+ private val authenticator: Authenticator
) : TermDataStore {
override suspend fun getTerms(page: Int): DataResponseDto> {
@@ -25,8 +25,13 @@ class TermDataStoreImpl @Inject constructor(
termService.getTerm(termId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ termService.getTerm(termId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/ErrorUiSetView.kt b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/ErrorUiSetView.kt
index 7ce488ab5..5cb74dba9 100644
--- a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/ErrorUiSetView.kt
+++ b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/ErrorUiSetView.kt
@@ -92,6 +92,7 @@ fun ErrorUiSetView(onLoginClick: () -> Unit, errorUiState: ErrorUiState, onClose
?: "서비스 정상화를 위해 노력하고 있습니다 :)",
onDismiss = {
isOpen = false
+ onCloseClick()
},
modifier = Modifier.wrapContentHeight()
.width(screenWidth - 88.dp)
diff --git a/core-domain/src/main/java/com/hmoa/core_domain/repository/AdminRepository.kt b/core-domain/src/main/java/com/hmoa/core_domain/repository/AdminRepository.kt
deleted file mode 100644
index 31e0ff510..000000000
--- a/core-domain/src/main/java/com/hmoa/core_domain/repository/AdminRepository.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.hmoa.core_domain.repository
-
-import com.hmoa.core_model.request.HomeMenuSaveRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.HomeMenuPerfumeResponseDto
-
-interface AdminRepository {
- suspend fun deleteHomeMenu(homeMenuId: Int): DataResponseDto
- suspend fun postHomeMenu(homeMenuId: Int, homeMenuSaveRequestDto: HomeMenuSaveRequestDto): DataResponseDto
- suspend fun postHomePerfume(dto: HomeMenuPerfumeResponseDto): DataResponseDto
- suspend fun postHomePerfumeAdd(homeId: Int, perfumeId: Int): DataResponseDto
-}
\ No newline at end of file
diff --git a/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandHPediaRepository.kt b/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandHPediaRepository.kt
index 0ffebd54f..d0d81568a 100644
--- a/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandHPediaRepository.kt
+++ b/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandHPediaRepository.kt
@@ -7,11 +7,4 @@ interface BrandHPediaRepository {
suspend fun getBrandStory(brandStoryId: Int): DataResponseDto
suspend fun deleteBrandStory(brandStoryId: Int): DataResponseDto
suspend fun updateBrandStory(brandStoryId: Int, content: String): DataResponseDto
- suspend fun postBrandStory(
- brandStorySubtitle: String,
- brandStoryTitle: String,
- content: String
- ): DataResponseDto
-
- suspend fun postTestSave(): DataResponseDto //Test
}
\ No newline at end of file
diff --git a/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandRepository.kt b/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandRepository.kt
index 320fc13eb..7e942c7e2 100644
--- a/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandRepository.kt
+++ b/core-domain/src/main/java/com/hmoa/core_domain/repository/BrandRepository.kt
@@ -4,14 +4,11 @@ import ResultResponse
import com.hmoa.core_model.response.BrandDefaultResponseDto
import com.hmoa.core_model.response.BrandPerfumeBriefPagingResponseDto
import com.hmoa.core_model.response.DataResponseDto
-import java.io.File
interface BrandRepository {
suspend fun getBrand(brandId: Int): ResultResponse>
suspend fun putBrandLike(brandId: Int): DataResponseDto
suspend fun deleteBrandLike(brandId: Int): DataResponseDto
- suspend fun postBrandTestSave(image: File, brandId: Int): DataResponseDto //임시?
- suspend fun postBrand(image: File, brandName: String, englishName: String): DataResponseDto
suspend fun getPerfumesSortedChar(
brandId: Int,
pageNum: Int
diff --git a/core-domain/src/main/java/com/hmoa/core_domain/repository/LoginRepository.kt b/core-domain/src/main/java/com/hmoa/core_domain/repository/LoginRepository.kt
index 803d1c585..01ddda9f6 100644
--- a/core-domain/src/main/java/com/hmoa/core_domain/repository/LoginRepository.kt
+++ b/core-domain/src/main/java/com/hmoa/core_domain/repository/LoginRepository.kt
@@ -26,5 +26,4 @@ interface LoginRepository {
suspend fun deleteRememberedToken()
suspend fun deleteKakaoAccessToken()
suspend fun deleteGoogleAccessToken()
- suspend fun refreshToken()
}
\ No newline at end of file
diff --git a/core-network/build.gradle.kts b/core-network/build.gradle.kts
index 6177967e7..9119df4cc 100644
--- a/core-network/build.gradle.kts
+++ b/core-network/build.gradle.kts
@@ -45,13 +45,13 @@ android {
}
dependencies {
- val ktor_version = "2.3.7"
val mockito_version = "4.8.0"
val hilt_version = "2.48.1"
val kotlinx_version = "1.5.0"
implementation(project(":core-model"))
implementation(project(":core-database"))
+ implementation(project(":core-common"))
implementation("com.github.skydoves:sandwich:1.3.5")
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
diff --git a/core-network/src/main/java/com/hmoa/core_network/authentication/AuthAuthenticator.kt b/core-network/src/main/java/com/hmoa/core_network/authentication/AuthAuthenticator.kt
deleted file mode 100644
index 2eda0d67a..000000000
--- a/core-network/src/main/java/com/hmoa/core_network/authentication/AuthAuthenticator.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.hmoa.core_network.authentication
-
-import android.util.Log
-import com.hmoa.core_database.TokenManager
-import com.hmoa.core_model.request.RememberedLoginRequestDto
-import com.skydoves.sandwich.suspendOnError
-import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.coroutines.flow.first
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
-import okhttp3.Request
-import okhttp3.Response
-import okhttp3.Route
-import javax.inject.Inject
-
-
-class AuthAuthenticator @Inject constructor(
- private val tokenManager: TokenManager,
- private val refreshTokenManager: RefreshTokenManager
-) : okhttp3.Authenticator {
- override fun authenticate(route: Route?, response: Response): Request? {
- val rememberedToken = runBlocking {
- tokenManager.getRememberedToken().first()
- }
-
- if (rememberedToken == null) {
- response.close()
- return null
- }
-
- var newRequest: Request? = null
- runBlocking {
- refreshTokenManager.refreshTokens(RememberedLoginRequestDto(rememberedToken))
- .suspendOnError {
- if (this.response.code() == 404) {
- Log.e("AuthAuthenticator", "토큰 리프레싱 실패")
- }
- }
- .suspendOnSuccess {
- val responseBody = this.response.body()
- if (responseBody != null) {
- val refreshedAuthToken = responseBody.authToken
- val refreshedRememberToken = responseBody.rememberedToken
- launch {
- tokenManager.deleteAuthToken()
- tokenManager.deleteRememberedToken()
- }.join()
- refreshTokenManager.saveRefreshTokens(refreshedAuthToken, refreshedRememberToken)
- newRequest = response.request.addRefreshAuthToken(refreshedAuthToken)
- Log.d("AuthAuthenticator", "토큰 리프레싱 성공")
- }
- }
- }
-
- response.close()
- return newRequest
- }
-
- fun Request.addRefreshAuthToken(token: String?): Request {
- return this.newBuilder().header("X-AUTH-TOKEN", "${token}").build()
- }
-}
diff --git a/core-network/src/main/java/com/hmoa/core_network/authentication/Authenticator.kt b/core-network/src/main/java/com/hmoa/core_network/authentication/Authenticator.kt
new file mode 100644
index 000000000..b0caaf274
--- /dev/null
+++ b/core-network/src/main/java/com/hmoa/core_network/authentication/Authenticator.kt
@@ -0,0 +1,21 @@
+package com.hmoa.core_network.authentication
+
+import com.hmoa.core_model.data.ErrorMessage
+
+interface Authenticator {
+ // API 에러를 처리하고, 토큰 갱신이 필요한 경우 처리하는 함수
+ suspend fun handleApiError(
+ rawMessage: String,
+ handleErrorMesssage: (i: ErrorMessage) -> Unit,
+ onCompleteTokenRefresh: suspend () -> Unit
+ )
+
+ // 토큰 갱신 처리 함수
+ suspend fun onRefreshToken(
+ onRefreshSuccess: suspend () -> Unit,
+ onRefreshFail: (errorMessage: ErrorMessage) -> Unit
+ )
+
+ // 모든 토큰을 업데이트하는 함수
+ suspend fun updateAllTokens(authToken: String, rememberToken: String)
+}
\ No newline at end of file
diff --git a/core-network/src/main/java/com/hmoa/core_network/authentication/AuthenticatorImpl.kt b/core-network/src/main/java/com/hmoa/core_network/authentication/AuthenticatorImpl.kt
new file mode 100644
index 000000000..b48dc7f1d
--- /dev/null
+++ b/core-network/src/main/java/com/hmoa/core_network/authentication/AuthenticatorImpl.kt
@@ -0,0 +1,93 @@
+package com.hmoa.core_network.authentication
+
+import android.util.Log
+import com.hmoa.core_common.ErrorMessageType
+import com.hmoa.core_database.TokenManager
+import com.hmoa.core_model.data.ErrorMessage
+import com.hmoa.core_model.request.RememberedLoginRequestDto
+import com.skydoves.sandwich.message
+import com.skydoves.sandwich.suspendOnError
+import com.skydoves.sandwich.suspendOnSuccess
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.runBlocking
+import kotlinx.serialization.json.Json
+import javax.inject.Inject
+
+
+class AuthenticatorImpl @Inject constructor(
+ private val tokenManager: TokenManager,
+ private val refreshTokenManager: RefreshTokenManager
+) : Authenticator {
+ override suspend fun handleApiError(
+ rawMessage: String,
+ handleErrorMesssage: (i: ErrorMessage) -> Unit,
+ onCompleteTokenRefresh: suspend () -> Unit
+ ) {
+ Json.decodeFromString(rawMessage).apply {
+ onTokenRefresh { refreshTokenErrorMessage ->
+ onRefreshToken(
+ onRefreshSuccess = {
+ onCompleteTokenRefresh()
+ },
+ onRefreshFail = { handleErrorMesssage(refreshTokenErrorMessage) }
+ )
+ }
+ onHandleError { message ->
+ handleErrorMesssage(message)
+ }
+ }
+ }
+
+ override suspend fun onRefreshToken(
+ onRefreshSuccess: suspend () -> Unit,
+ onRefreshFail: (errorMessage: ErrorMessage) -> Unit
+ ) {
+ val rememberedToken = runBlocking {
+ tokenManager.getRememberedToken().first()
+ }
+ if (rememberedToken != null) {
+ refreshTokenManager.refreshTokens(RememberedLoginRequestDto(rememberedToken))
+ .suspendOnError {
+ if (this.response.code() == 404) {
+ Log.e("Authenticator", "토큰 리프레싱 실패")
+ onRefreshFail(Json.decodeFromString(this.message()))
+ }
+ }
+ .suspendOnSuccess {
+ val responseBody = this.response.body()
+ if (responseBody != null) {
+ Log.d("Authenticator", "토큰 리프레싱 성공")
+ updateAllTokens(
+ authToken = responseBody.authToken,
+ rememberToken = responseBody.rememberedToken
+ )
+ onRefreshSuccess()
+ }
+ }
+ }
+ }
+
+ override suspend fun updateAllTokens(authToken: String, rememberToken: String) {
+ tokenManager.deleteAuthToken()
+ tokenManager.deleteRememberedToken()
+ refreshTokenManager.saveRefreshTokens(authToken, rememberToken)
+ }
+
+ suspend inline fun ErrorMessage.onTokenRefresh(
+ crossinline onResult: suspend ErrorMessage.(message: ErrorMessage) -> Unit,
+ ): ErrorMessage {
+ if (this.message == ErrorMessageType.EXPIRED_TOKEN.message) {
+ onResult(this)
+ }
+ return this
+ }
+
+ suspend inline fun ErrorMessage.onHandleError(
+ crossinline onResult: suspend ErrorMessage.(message: ErrorMessage) -> Unit,
+ ): ErrorMessage {
+ if (this.message != ErrorMessageType.EXPIRED_TOKEN.message) {
+ onResult(this)
+ }
+ return this
+ }
+}
\ No newline at end of file
diff --git a/core-network/src/main/java/com/hmoa/core_network/di/AuthenticatorModule.kt b/core-network/src/main/java/com/hmoa/core_network/di/AuthenticationModule.kt
similarity index 80%
rename from core-network/src/main/java/com/hmoa/core_network/di/AuthenticatorModule.kt
rename to core-network/src/main/java/com/hmoa/core_network/di/AuthenticationModule.kt
index 7e74def1f..d657cf47a 100644
--- a/core-network/src/main/java/com/hmoa/core_network/di/AuthenticatorModule.kt
+++ b/core-network/src/main/java/com/hmoa/core_network/di/AuthenticationModule.kt
@@ -5,16 +5,14 @@ import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
-import okhttp3.Authenticator
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
-interface AuthenticatorModule {
-
+interface AuthenticationModule {
@Binds
@Singleton
- fun bindAuthenticatorImpl(authAuthenticator: AuthAuthenticator): Authenticator
+ fun bindAuthenticator(authenticatorImpl: AuthenticatorImpl): Authenticator
@Binds
@Singleton
diff --git a/core-network/src/main/java/com/hmoa/core_network/di/ServiceModule.kt b/core-network/src/main/java/com/hmoa/core_network/di/ServiceModule.kt
index e9911eedb..5f2e59ea9 100644
--- a/core-network/src/main/java/com/hmoa/core_network/di/ServiceModule.kt
+++ b/core-network/src/main/java/com/hmoa/core_network/di/ServiceModule.kt
@@ -3,7 +3,6 @@ package com.hmoa.core_network.di
import com.google.gson.GsonBuilder
import com.hmoa.core_database.TokenManager
import com.hmoa.core_network.BuildConfig
-import com.hmoa.core_network.authentication.AuthAuthenticator
import com.hmoa.core_network.service.*
import com.skydoves.sandwich.adapters.ApiResponseCallAdapterFactory
import dagger.Module
@@ -32,21 +31,19 @@ object ServiceModule {
}
@Provides
- fun provideOkHttpClient(headerInterceptor: Interceptor, authenticator: AuthAuthenticator): OkHttpClient {
-
+ fun provideOkHttpClient(headerInterceptor: Interceptor): OkHttpClient {
val okHttpClientBuilder = OkHttpClient().newBuilder()
okHttpClientBuilder.connectTimeout(60, TimeUnit.SECONDS)
okHttpClientBuilder.readTimeout(60, TimeUnit.SECONDS)
- okHttpClientBuilder.authenticator(authenticator)
okHttpClientBuilder.addInterceptor(headerInterceptor)
return okHttpClientBuilder.build()
}
@Provides
fun provideHeaderInterceptor(tokenManager: TokenManager): Interceptor {
- val token = tokenManager.getAuthTokenForHeader()
return Interceptor { chain ->
with(chain) {
+ val token = tokenManager.getAuthTokenForHeader()
val newRequest = request().newBuilder()
.header("X-AUTH-TOKEN", "${token}")
.build()
@@ -79,12 +76,6 @@ object ServiceModule {
return retrofit.create(FcmService::class.java)
}
- @Singleton
- @Provides
- fun providerAdminService(retrofit: Retrofit): AdminService {
- return retrofit.create(AdminService::class.java)
- }
-
@Singleton
@Provides
fun providerBrandService(retrofit: Retrofit): BrandService {
diff --git a/core-network/src/main/java/com/hmoa/core_network/service/AdminService.kt b/core-network/src/main/java/com/hmoa/core_network/service/AdminService.kt
deleted file mode 100644
index ed0cd3a26..000000000
--- a/core-network/src/main/java/com/hmoa/core_network/service/AdminService.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.hmoa.core_network.service
-
-import com.hmoa.core_model.request.HomeMenuSaveRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.HomeMenuPerfumeResponseDto
-import retrofit2.http.*
-
-interface AdminService {
- @DELETE("/admin/{homeMenuId}/delete")
- suspend fun deleteHomeMenu(@Path(value = "homeMenuId") homeMenuId: Int): DataResponseDto
-
- @GET("/admin/{homeMenuId}/modify")
- suspend fun postHomeMenu(
- @Path(value = "homeMenuId") homeMenuId: Int,
- @Body homeMenuSaveRequestDto: HomeMenuSaveRequestDto
- ): DataResponseDto
-
- @GET("/admin/homePerfume")
- suspend fun postHomePerfume(@Body dto: HomeMenuPerfumeResponseDto): DataResponseDto
-
- @GET("/admin/homePerfume/add")
- suspend fun postHomePerfumeAdd(
- @Field("homeId") homeId: Int,
- @Field("perfumeId") perfumeId: Int
- ): DataResponseDto
-}
\ No newline at end of file
diff --git a/core-network/src/main/java/com/hmoa/core_network/service/BrandHPediaService.kt b/core-network/src/main/java/com/hmoa/core_network/service/BrandHPediaService.kt
index e9695c983..0c7d123c6 100644
--- a/core-network/src/main/java/com/hmoa/core_network/service/BrandHPediaService.kt
+++ b/core-network/src/main/java/com/hmoa/core_network/service/BrandHPediaService.kt
@@ -18,15 +18,4 @@ interface BrandHPediaService {
@Path(value = "brandStoryId") brandStoryId: Int,
@Field("content") content: String
): DataResponseDto
-
- @FormUrlEncoded
- @POST("/brandstory/new")
- suspend fun postBrandStory(
- @Field("brandStorySubtitle") brandStorySubtitle: String,
- @Field("brandStoryTitle") brandStoryTitle: String,
- @Field("content") content: String
- ): DataResponseDto
-
- @POST("/brandstory/testSave")
- suspend fun postTestSave(): DataResponseDto //Test
}
\ No newline at end of file
diff --git a/core-network/src/main/java/com/hmoa/core_network/service/BrandService.kt b/core-network/src/main/java/com/hmoa/core_network/service/BrandService.kt
index bccb0d303..b5dfccd91 100644
--- a/core-network/src/main/java/com/hmoa/core_network/service/BrandService.kt
+++ b/core-network/src/main/java/com/hmoa/core_network/service/BrandService.kt
@@ -5,7 +5,6 @@ import com.hmoa.core_model.response.BrandPerfumeBriefPagingResponseDto
import com.hmoa.core_model.response.DataResponseDto
import com.skydoves.sandwich.ApiResponse
import retrofit2.http.*
-import java.io.File
interface BrandService {
@GET("/brand/{brandId}")
@@ -17,20 +16,6 @@ interface BrandService {
@DELETE("/brand/{brandId}/like")
suspend fun deleteBrandLike(@Path(value = "brandId") brandId: Int): DataResponseDto
- @FormUrlEncoded
- @POST("/brand/{brandId}/testSave")
- suspend fun postBrandTestSave(
- @Path(value = "brandId") brandId: Int, @Field("image") image: File
- ): DataResponseDto //임시?
-
- @FormUrlEncoded
- @POST("/brand/new")
- suspend fun postBrand(
- @Field("image") image: File,
- @Field("brandName") brandName: String,
- @Field("englishName") englishName: String
- ): DataResponseDto
-
@GET("/brand/perfumes/{brandId}")
suspend fun getPerfumesSortedChar(
@Path(value = "brandId") brandId: Int,
diff --git a/core-repository/src/main/java/com/hmoa/core_repository/AdminRepositoryImpl.kt b/core-repository/src/main/java/com/hmoa/core_repository/AdminRepositoryImpl.kt
deleted file mode 100644
index 73e15d99d..000000000
--- a/core-repository/src/main/java/com/hmoa/core_repository/AdminRepositoryImpl.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.hmoa.core_repository
-
-import com.hmoa.core_datastore.Admin.AdminDataStore
-import com.hmoa.core_model.request.HomeMenuSaveRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.HomeMenuPerfumeResponseDto
-import javax.inject.Inject
-
-class AdminRepositoryImpl @Inject constructor(
- private val adminDataStore: AdminDataStore
-) : com.hmoa.core_domain.repository.AdminRepository {
- override suspend fun deleteHomeMenu(homeMenuId: Int): DataResponseDto {
- return adminDataStore.deleteHomeMenu(homeMenuId)
- }
-
- override suspend fun postHomeMenu(
- homeMenuId: Int,
- homeMenuSaveRequestDto: HomeMenuSaveRequestDto
- ): DataResponseDto {
- return adminDataStore.postHomeMenu(homeMenuId, homeMenuSaveRequestDto)
- }
-
- override suspend fun postHomePerfume(dto: HomeMenuPerfumeResponseDto): DataResponseDto {
- return adminDataStore.postHomePerfume(dto)
- }
-
- override suspend fun postHomePerfumeAdd(homeId: Int, perfumeId: Int): DataResponseDto {
- return adminDataStore.postHomePerfumeAdd(homeId, perfumeId)
- }
-}
\ No newline at end of file
diff --git a/core-repository/src/main/java/com/hmoa/core_repository/BrandHPediaRepositoryImpl.kt b/core-repository/src/main/java/com/hmoa/core_repository/BrandHPediaRepositoryImpl.kt
index f9cefbfb0..2b4a62fd4 100644
--- a/core-repository/src/main/java/com/hmoa/core_repository/BrandHPediaRepositoryImpl.kt
+++ b/core-repository/src/main/java/com/hmoa/core_repository/BrandHPediaRepositoryImpl.kt
@@ -23,16 +23,4 @@ class BrandHPediaRepositoryImpl @Inject constructor(
override suspend fun updateBrandStory(brandStoryId: Int, content: String): DataResponseDto {
return brandHPediaDataStore.updateBrandStory(brandStoryId, content)
}
-
- override suspend fun postBrandStory(
- brandStorySubtitle: String,
- brandStoryTitle: String,
- content: String
- ): DataResponseDto {
- return brandHPediaDataStore.postBrandStory(brandStorySubtitle, brandStoryTitle, content)
- }
-
- override suspend fun postTestSave(): DataResponseDto {
- return brandHPediaDataStore.postTestSave()
- }
}
\ No newline at end of file
diff --git a/core-repository/src/main/java/com/hmoa/core_repository/BrandRepositoryImpl.kt b/core-repository/src/main/java/com/hmoa/core_repository/BrandRepositoryImpl.kt
index 653bc1035..28c5835ff 100644
--- a/core-repository/src/main/java/com/hmoa/core_repository/BrandRepositoryImpl.kt
+++ b/core-repository/src/main/java/com/hmoa/core_repository/BrandRepositoryImpl.kt
@@ -5,7 +5,6 @@ import com.hmoa.core_datastore.Brand.BrandDataStore
import com.hmoa.core_model.response.BrandDefaultResponseDto
import com.hmoa.core_model.response.BrandPerfumeBriefPagingResponseDto
import com.hmoa.core_model.response.DataResponseDto
-import java.io.File
import javax.inject.Inject
class BrandRepositoryImpl @Inject constructor(
@@ -24,18 +23,6 @@ class BrandRepositoryImpl @Inject constructor(
return brandDataStore.deleteBrandLike(brandId)
}
- override suspend fun postBrandTestSave(image: File, brandId: Int): DataResponseDto {
- return brandDataStore.postBrandTestSave(image, brandId)
- }
-
- override suspend fun postBrand(
- image: File,
- brandName: String,
- englishName: String
- ): DataResponseDto {
- return brandDataStore.postBrand(image, brandName, englishName)
- }
-
override suspend fun getPerfumesSortedChar(
brandId: Int,
pageNum: Int
diff --git a/core-repository/src/main/java/com/hmoa/core_repository/LoginRepositoryImpl.kt b/core-repository/src/main/java/com/hmoa/core_repository/LoginRepositoryImpl.kt
index f5d7e878a..3a1abefef 100644
--- a/core-repository/src/main/java/com/hmoa/core_repository/LoginRepositoryImpl.kt
+++ b/core-repository/src/main/java/com/hmoa/core_repository/LoginRepositoryImpl.kt
@@ -87,7 +87,4 @@ class LoginRepositoryImpl @Inject constructor(
loginLocalDataStore.deleteGoogleAccessToken()
}
- override suspend fun refreshToken() {
- loginRemoteDataStore.refreshToken()
- }
}
\ No newline at end of file
diff --git a/core-repository/src/main/java/com/hmoa/core_repository/RepositoryModule.kt b/core-repository/src/main/java/com/hmoa/core_repository/RepositoryModule.kt
index fbb0cfc91..a93a5c76e 100644
--- a/core-repository/src/main/java/com/hmoa/core_repository/RepositoryModule.kt
+++ b/core-repository/src/main/java/com/hmoa/core_repository/RepositoryModule.kt
@@ -11,10 +11,6 @@ import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
interface RepositoryModule {
- @Binds
- @Singleton
- fun bindAdminRepositoryImpl(repositoryImpl: AdminRepositoryImpl): AdminRepository
-
@Binds
@Singleton
fun bindBrandRepositoryImpl(repositoryImpl: BrandRepositoryImpl): BrandRepository
@@ -89,5 +85,5 @@ interface RepositoryModule {
@Binds
@Singleton
- fun bindHshopRepositoryImpl(repositoryImpl: HshopRepositoryImpl):HshopRepository
+ fun bindHshopRepositoryImpl(repositoryImpl: HshopRepositoryImpl): HshopRepository
}
\ No newline at end of file
diff --git a/feature-community/src/main/java/com/hmoa/feature_community/Navigation/NavGraph.kt b/feature-community/src/main/java/com/hmoa/feature_community/Navigation/NavGraph.kt
index e838f7d68..11ef78832 100644
--- a/feature-community/src/main/java/com/hmoa/feature_community/Navigation/NavGraph.kt
+++ b/feature-community/src/main/java/com/hmoa/feature_community/Navigation/NavGraph.kt
@@ -1,19 +1,9 @@
package com.hmoa.feature_community.Navigation
-import androidx.navigation.NavController
-import androidx.navigation.NavGraphBuilder
-import androidx.navigation.NavType
+import androidx.navigation.*
import androidx.navigation.compose.composable
import androidx.navigation.compose.navigation
-import androidx.navigation.navArgument
-import androidx.navigation.navDeepLink
-import com.hmoa.feature_community.Screen.CommunityCommentEditRoute
-import com.hmoa.feature_community.Screen.CommunityDescriptionRoute
-import com.hmoa.feature_community.Screen.CommunityEditRoute
-import com.hmoa.feature_community.Screen.CommunityHomeRoute
-import com.hmoa.feature_community.Screen.CommunityPostRoute
-import com.hmoa.feature_community.Screen.CommunityPreviewRoute
-import com.hmoa.feature_community.Screen.CommunitySearchRoute
+import com.hmoa.feature_community.Screen.*
//게시글 기본 화면
fun NavController.navigateToCommunityRoute() = navigate(CommunityRoute.CommunityGraphRoute.name)
@@ -26,20 +16,20 @@ fun NavController.navigateToCommunityHome() = navigate(CommunityRoute.CommunityH
//게시글 등록 화면
fun NavController.navigateToCommunityPostRoute(type: String) =
- navigate("${CommunityRoute.CommunityPostRoute.name}/${type}"){
+ navigate("${CommunityRoute.CommunityPostRoute.name}/${type}") {
popUpTo("${CommunityRoute.CommunityPostRoute.name}/{type}") { inclusive = true }
}
//게시글 수정 화면
fun NavController.navigateToCommunityEditRoute(id: Int) =
- navigate("${CommunityRoute.CommunityEditRoute.name}/${id}"){
+ navigate("${CommunityRoute.CommunityEditRoute.name}/${id}") {
popUpTo("${CommunityRoute.CommunityEditRoute.name}/{id}") { inclusive = true }
}
//게시글 상세 화면
fun NavController.navigateToCommunityDescriptionRoute(id: Int) =
navigate("${CommunityRoute.CommunityDescriptionRoute.name}/${id}") {
- popUpTo("${CommunityRoute.CommunityDescriptionRoute.name}/{id}"){inclusive = true}
+ popUpTo("${CommunityRoute.CommunityDescriptionRoute.name}/{id}") { inclusive = true }
}
//게시글 검색 화면
@@ -58,9 +48,9 @@ fun NavGraphBuilder.nestedCommunityGraph(
navCommunitySearch: () -> Unit,
navCommunityCommentEdit: (Int) -> Unit,
onErrorHandleLoginAgain: () -> Unit,
- navLogin : () -> Unit,
- navHome : () -> Unit,
- navHPedia : () -> Unit,
+ navLogin: () -> Unit,
+ navHome: () -> Unit,
+ navHPedia: () -> Unit,
popStack: () -> Unit,
) {
navigation(
@@ -69,20 +59,20 @@ fun NavGraphBuilder.nestedCommunityGraph(
) {
composable(route = CommunityRoute.CommunityHomeRoute.name) {
CommunityHomeRoute(
- navCommunityDescription = navCommunityDescription,
- navCommunityGraph = navCommunityPage,
+ onNavCommunityDescription = navCommunityDescription,
+ onNavCommunityGraph = navCommunityPage,
onErrorHandleLoginAgain = onErrorHandleLoginAgain,
- navHome = navHome
+ onNavHome = navHome
)
}
composable(route = CommunityRoute.CommunityPreviewRoute.name) {
CommunityPreviewRoute(
- navBack = navBack,
- navSearch = navCommunitySearch,
- navCommunityDescription = navCommunityDescription,
- navPost = navCommunityPost,
- navLogin = onErrorHandleLoginAgain,
- navHPedia = navHPedia,
+ onNavBack = navBack,
+ onNavSearch = navCommunitySearch,
+ onNavCommunityDescription = navCommunityDescription,
+ onNavPost = navCommunityPost,
+ onNavLogin = onErrorHandleLoginAgain,
+ onNavHPedia = navHPedia,
)
}
composable(route = "${CommunityRoute.CommunityPostRoute.name}/{type}") {
@@ -104,19 +94,19 @@ fun NavGraphBuilder.nestedCommunityGraph(
}
composable(
route = "${CommunityRoute.CommunityDescriptionRoute.name}/{id}",
- arguments = listOf(navArgument("id"){type = NavType.IntType}),
- deepLinks = listOf(navDeepLink{uriPattern = "hmoa://community/{id}"})
+ arguments = listOf(navArgument("id") { type = NavType.IntType }),
+ deepLinks = listOf(navDeepLink { uriPattern = "hmoa://community/{id}" })
) {
val id = it.arguments?.getInt("id")
CommunityDescriptionRoute(
id = id,
- navCommunityEdit = navCommunityEdit,
- navCommentEdit = navCommunityCommentEdit,
- navLogin = navLogin,
- navBack = navBack,
- navHPedia = navHPedia,
- popStack = popStack
+ onNavCommunityEdit = navCommunityEdit,
+ onNavCommentEdit = navCommunityCommentEdit,
+ onNavLogin = navLogin,
+ onNavBack = navBack,
+ onNavHPedia = navHPedia,
+ onNavPopStack = popStack
)
}
composable(route = CommunityRoute.CommunitySearchRoute.name) {
diff --git a/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityDescriptionPage.kt b/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityDescriptionPage.kt
index ea67b9942..95a4b3e11 100644
--- a/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityDescriptionPage.kt
+++ b/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityDescriptionPage.kt
@@ -57,12 +57,12 @@ import kotlinx.coroutines.launch
@Composable
fun CommunityDescriptionRoute(
id: Int?,
- navCommunityEdit: (Int) -> Unit,
- navCommentEdit : (Int) -> Unit,
- navLogin : () -> Unit,
- navBack : () -> Unit,
- navHPedia : () -> Unit,
- popStack: () -> Unit,
+ onNavCommunityEdit: (Int) -> Unit,
+ onNavCommentEdit : (Int) -> Unit,
+ onNavLogin : () -> Unit,
+ onNavBack : () -> Unit,
+ onNavHPedia : () -> Unit,
+ onNavPopStack: () -> Unit,
viewModel : CommunityDescViewModel = hiltViewModel()
){
viewModel.setId(id)
@@ -81,7 +81,7 @@ fun CommunityDescriptionRoute(
onChangeLike = {viewModel.updateLike()},
uiState = uiState.value,
commentList = comments,
- navBack = navBack,
+ onNavBack = onNavBack,
onReportCommunity = {
viewModel.reportCommunity()
if(reportState.value){
@@ -104,7 +104,7 @@ fun CommunityDescriptionRoute(
},
onDeleteCommunity = {
viewModel.delCommunity()
- navBack()
+ onNavBack()
Toast.makeText(context, "게시글 삭제 완료", Toast.LENGTH_SHORT).show()
},
onDeleteComment = { commentId ->
@@ -112,13 +112,12 @@ fun CommunityDescriptionRoute(
comments.refresh()
Toast.makeText(context, "댓글 삭제", Toast.LENGTH_SHORT).show()
},
- navCommunityEdit = {navCommunityEdit(id!!)},
- navCommentEdit = navCommentEdit,
+ onNavCommunityEdit = {onNavCommunityEdit(id!!)},
+ onNavCommentEdit = onNavCommentEdit,
onErrorHandleLoginAgain = {
- if(viewModel.hasToken()){navHPedia()}
- else {navLogin()}
+ onNavLogin()
},
- popStack = popStack
+ onNavPopStack = onNavPopStack
)
}
@@ -135,11 +134,11 @@ fun CommunityDescriptionPage(
onChangeCommentLike : (Int, Boolean) -> Unit,
onDeleteCommunity : () -> Unit,
onDeleteComment : (Int) -> Unit,
- navBack : () -> Unit,
- navCommunityEdit : () -> Unit,
- navCommentEdit : (Int) -> Unit,
+ onNavBack : () -> Unit,
+ onNavCommunityEdit : () -> Unit,
+ onNavCommentEdit : (Int) -> Unit,
onErrorHandleLoginAgain : () -> Unit,
- popStack: () -> Unit,
+ onNavPopStack: () -> Unit,
){
when (uiState) {
CommunityDescUiState.Loading -> AppLoadingScreen()
@@ -156,17 +155,17 @@ fun CommunityDescriptionPage(
onChangeCommentLike = onChangeCommentLike,
onDeleteCommunity = onDeleteCommunity,
onDeleteComment = onDeleteComment,
- navBack = navBack,
- navCommunityEdit = navCommunityEdit,
- navCommentEdit = navCommentEdit,
- popStack = popStack
+ onNavBack = onNavBack,
+ onNavCommunityEdit = onNavCommunityEdit,
+ onNavCommentEdit = onNavCommentEdit,
+ onNavPopStack = onNavPopStack
)
}
CommunityDescUiState.Error -> {
ErrorUiSetView(
onLoginClick = onErrorHandleLoginAgain,
errorUiState = errState,
- onCloseClick = navBack,
+ onCloseClick = onNavBack,
)
}
}
@@ -186,10 +185,10 @@ private fun CommunityDescContent(
onChangeCommentLike : (Int, Boolean) -> Unit,
onDeleteCommunity : () -> Unit,
onDeleteComment : (Int) -> Unit,
- navBack : () -> Unit,
- navCommunityEdit : () -> Unit,
- navCommentEdit : (Int) -> Unit,
- popStack: () -> Unit
+ onNavBack : () -> Unit,
+ onNavCommunityEdit : () -> Unit,
+ onNavCommentEdit : (Int) -> Unit,
+ onNavPopStack: () -> Unit
){
var type by remember{mutableStateOf("post")}
val onChangeType : (String) -> Unit = { type = it }
@@ -201,7 +200,7 @@ private fun CommunityDescContent(
val dialogOpen = { scope.launch { modalSheetState.show() } }
val dialogClose = {
scope.launch { modalSheetState.hide() }
- popStack()
+ onNavPopStack()
}
ModalBottomSheetLayout(
@@ -211,13 +210,13 @@ private fun CommunityDescContent(
if (type == "post" && community.writed){
EditModal(
onDeleteClick = onDeleteCommunity,
- onEditClick = navCommunityEdit,
+ onEditClick = onNavCommunityEdit,
onCancelClick = {dialogClose()}
)
} else if (type == "comment" && comment != null && comment!!.writed){
EditModal(
onDeleteClick = { onDeleteComment(comment!!.commentId) },
- onEditClick = { navCommentEdit(comment!!.commentId) },
+ onEditClick = { onNavCommentEdit(comment!!.commentId) },
onCancelClick = { dialogClose() }
)
}
@@ -251,7 +250,7 @@ private fun CommunityDescContent(
onChangeType = onChangeType,
onPostComment = onPostComment,
setComment = { comment = it },
- navBack = navBack,
+ onNavBack = onNavBack,
)
}
}
@@ -268,7 +267,7 @@ private fun CommunityDescMainContent(
onPostComment: (String) -> Unit,
setComment: (CommunityCommentWithLikedResponseDto) -> Unit,
onDialogOpen : () -> Unit,
- navBack : () -> Unit,
+ onNavBack : () -> Unit,
){
val scrollState = rememberScrollState()
val configuration = LocalConfiguration.current
@@ -281,7 +280,7 @@ private fun CommunityDescMainContent(
TopBar(
title = "Community",
navIcon = painterResource(com.hmoa.core_designsystem.R.drawable.ic_back),
- onNavClick = navBack
+ onNavClick = onNavBack
)
Column(
diff --git a/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityHome.kt b/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityHome.kt
index c2dc133df..2010604f8 100644
--- a/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityHome.kt
+++ b/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityHome.kt
@@ -39,10 +39,10 @@ import com.hmoa.feature_community.ViewModel.CommunityHomeViewModel
@Composable
fun CommunityHomeRoute(
- navCommunityGraph: () -> Unit,
- navCommunityDescription: (Int) -> Unit,
+ onNavCommunityGraph: () -> Unit,
+ onNavCommunityDescription: (Int) -> Unit,
onErrorHandleLoginAgain: () -> Unit,
- navHome : () -> Unit,
+ onNavHome : () -> Unit,
viewModel: CommunityHomeViewModel = hiltViewModel(),
) {
@@ -53,14 +53,10 @@ fun CommunityHomeRoute(
CommunityHome(
errorUiState = errorUiState,
uiState = uiState,
- navCommunityGraph = navCommunityGraph,
- navCommunityDescription = navCommunityDescription,
+ onNavCommunityGraph = onNavCommunityGraph,
+ onNavCommunityDescription = onNavCommunityDescription,
onErrorHandleLoginAgain = {
- if (viewModel.hasToken()){
- navHome()
- } else {
- onErrorHandleLoginAgain()
- }
+ onErrorHandleLoginAgain()
},
)
}
@@ -69,21 +65,21 @@ fun CommunityHomeRoute(
fun CommunityHome(
errorUiState: ErrorUiState,
uiState: CommunityHomeUiState,
- navCommunityGraph: () -> Unit,
- navCommunityDescription: (Int) -> Unit,
+ onNavCommunityGraph: () -> Unit,
+ onNavCommunityDescription: (Int) -> Unit,
onErrorHandleLoginAgain: () -> Unit,
) {
Column(modifier = Modifier
.padding(horizontal = 16.dp)
.fillMaxSize()) {
- CommunityTitleBar(navCommunityByCategory = navCommunityGraph)
+ CommunityTitleBar(onNavCommunityByCategory = onNavCommunityGraph)
when (uiState) {
is CommunityHomeUiState.Loading -> AppLoadingScreen()
is CommunityHomeUiState.Community -> {
CommunityHomeContent(
communities = uiState.communities,
- navCommunityDescription = navCommunityDescription
+ onNavCommunityDescription = onNavCommunityDescription
)
}
is CommunityHomeUiState.Error -> {
@@ -99,7 +95,7 @@ fun CommunityHome(
@Composable
fun CommunityTitleBar(
- navCommunityByCategory: () -> Unit,
+ onNavCommunityByCategory: () -> Unit,
) {
Row(
modifier = Modifier
@@ -116,7 +112,7 @@ fun CommunityTitleBar(
)
Text(
- modifier = Modifier.clickable {navCommunityByCategory()},
+ modifier = Modifier.clickable {onNavCommunityByCategory()},
text = "전체보기",
fontSize = 12.sp,
fontFamily = FontFamily(Font(R.font.pretendard_regular)),
@@ -129,11 +125,11 @@ fun CommunityTitleBar(
@Composable
fun CommunityHomeContent(
communities: List,
- navCommunityDescription: (Int) -> Unit,
+ onNavCommunityDescription: (Int) -> Unit,
) {
PostList(
communities = communities,
- onNavCommunityDescription = navCommunityDescription
+ onNavCommunityDescription = onNavCommunityDescription
)
}
diff --git a/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityPreview.kt b/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityPreview.kt
index 01e3e6089..47da3c87a 100644
--- a/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityPreview.kt
+++ b/feature-community/src/main/java/com/hmoa/feature_community/Screen/CommunityPreview.kt
@@ -43,12 +43,12 @@ import com.hmoa.feature_community.ViewModel.CommunityPreviewViewModel
@Composable
fun CommunityPreviewRoute(
- navBack: () -> Unit,
- navSearch: () -> Unit,
- navCommunityDescription: (Int) -> Unit,
- navPost: (String) -> Unit,
- navLogin: () -> Unit,
- navHPedia : () -> Unit,
+ onNavBack: () -> Unit,
+ onNavSearch: () -> Unit,
+ onNavCommunityDescription: (Int) -> Unit,
+ onNavPost: (String) -> Unit,
+ onNavLogin: () -> Unit,
+ onNavHPedia : () -> Unit,
viewModel: CommunityPreviewViewModel = hiltViewModel()
) {
//view model의 ui state에서 type, list 를 받아서 사용하는 방식
@@ -62,16 +62,15 @@ fun CommunityPreviewRoute(
communities = viewModel.communityPagingSource().collectAsLazyPagingItems(),
type = type,
onTypeChanged = {viewModel.updateCategory(it)},
- navBack = navBack,
- navSearch = navSearch,
- navCommunityDescription = navCommunityDescription,
- navPost = {
- if (viewModel.hasToken()){navPost(it)}
+ onNavBack = onNavBack,
+ onNavSearch = onNavSearch,
+ onNavCommunityDescription = onNavCommunityDescription,
+ onNavPost = {
+ if (viewModel.hasToken()){onNavPost(it)}
else {viewModel.updateLoginError()}
},
onErrorHandleLoginAgain = {
- if(viewModel.hasToken()){navHPedia()}
- else {navLogin()}
+ onNavLogin()
}
)
}
@@ -83,10 +82,10 @@ fun CommunityPage(
communities: LazyPagingItems,
type: Category,
onTypeChanged: (Category) -> Unit,
- navBack: () -> Unit,
- navSearch: () -> Unit,
- navCommunityDescription: (Int) -> Unit,
- navPost: (String) -> Unit,
+ onNavBack: () -> Unit,
+ onNavSearch: () -> Unit,
+ onNavCommunityDescription: (Int) -> Unit,
+ onNavPost: (String) -> Unit,
onErrorHandleLoginAgain : () -> Unit,
) {
when (uiState) {
@@ -102,9 +101,9 @@ fun CommunityPage(
TopBar(
title = "Community",
navIcon = painterResource(com.hmoa.core_designsystem.R.drawable.ic_back),
- onNavClick = navBack,
+ onNavClick = onNavBack,
menuIcon = painterResource(com.hmoa.core_designsystem.R.drawable.ic_search),
- onMenuClick = navSearch
+ onMenuClick = onNavSearch
)
ContentDivider()
CommunityMainTypes(
@@ -114,7 +113,7 @@ fun CommunityPage(
ContentDivider()
CommunityPagePostList(
communities = communities.itemSnapshotList,
- navCommunityDescription = navCommunityDescription
+ onNavCommunityDescription = onNavCommunityDescription
)
}
Column(
@@ -124,9 +123,9 @@ fun CommunityPage(
horizontalAlignment = Alignment.End
) {
FloatingActionBtn(
- onNavRecommend = { navPost(Category.추천.name) },
- onNavPresent = { navPost(Category.시향기.name) },
- onNavFree = { navPost(Category.자유.name) },
+ onNavRecommend = { onNavPost(Category.추천.name) },
+ onNavPresent = { onNavPost(Category.시향기.name) },
+ onNavFree = { onNavPost(Category.자유.name) },
isAvailable = !uiState.enableLoginErrorDialog,
)
}
@@ -192,7 +191,7 @@ fun CommunityMainTypes(
@Composable
fun CommunityPagePostList(
communities: ItemSnapshotList,
- navCommunityDescription: (Int) -> Unit
+ onNavCommunityDescription: (Int) -> Unit
) {
LazyColumn {
items(communities) { community ->
@@ -202,7 +201,10 @@ fun CommunityPagePostList(
.fillMaxWidth()
.wrapContentHeight()
.border(width = 1.dp, color = CustomColor.gray2),
- onPostClick = {navCommunityDescription(community.communityId)},
+ onPostClick = {
+ // 여기서 Description으로 이동
+ onNavCommunityDescription(community.communityId)
+ },
postType = community.category,
postTitle = community.title,
heartCount = community.heartCount,
diff --git a/feature-hpedia/src/main/java/com/hmoa/feature_hpedia/Screen/HPediaScreen.kt b/feature-hpedia/src/main/java/com/hmoa/feature_hpedia/Screen/HPediaScreen.kt
index 559c0ed2a..1d9254bc5 100644
--- a/feature-hpedia/src/main/java/com/hmoa/feature_hpedia/Screen/HPediaScreen.kt
+++ b/feature-hpedia/src/main/java/com/hmoa/feature_hpedia/Screen/HPediaScreen.kt
@@ -67,10 +67,10 @@ fun HPediaScreen(
}
Spacer(Modifier.height(27.dp))
CommunityHomeRoute(
- navCommunityGraph = navCommunityGraph,
- navCommunityDescription = navCommunityDesc,
+ onNavCommunityGraph = navCommunityGraph,
+ onNavCommunityDescription = navCommunityDesc,
onErrorHandleLoginAgain = onErrorHandleLoginAgain,
- navHome = navHome
+ onNavHome = navHome
)
}
}
From eecba5c9bd75dec256bc3f4ae6c5279f49922a94 Mon Sep 17 00:00:00 2001
From: Lee YongIn <67788699+LeeYongIn0517@users.noreply.github.com>
Date: Tue, 15 Oct 2024 18:16:57 +0900
Subject: [PATCH 06/93] =?UTF-8?q?HotFix:=20=EC=B9=B4=EC=B9=B4=EC=98=A4=20s?=
=?UTF-8?q?dk=20=EB=B2=84=EC=A0=84=20=EC=97=85=EA=B7=B8=EB=A0=88=EC=9D=B4?=
=?UTF-8?q?=EB=93=9C=20=20(#170)=20(#171)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* HotFix: 카카오 sdk 버전 업그레이드
* Feat: gradlew clean 작업 추가
* Delete
* Delete: refreshToken 추상메서드 삭제
* Delete: 토큰 리프레싱 임시방안 코드 삭제
---
.github/workflows/android.yml | 3 +++
app/build.gradle.kts | 13 +++++++------
feature-authentication/build.gradle.kts | 13 +++++++------
3 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index f26700233..aafb75163 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -46,6 +46,9 @@ jobs:
- name: Grant execute permission for gradlew
run: chmod +x gradlew
+ - name: Clear Gradle Cache
+ run: ./gradlew clean
+
- name: Build for debug with Gradle
run: ./gradlew assembleDebug
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 4dbf589dc..34b4ae23f 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -92,6 +92,7 @@ dependencies {
val hilt_version = "2.48.1"
val hilt_viewmodel_version = "1.0.0-alpha03"
val hilt_nav_compose_version = "1.0.0"
+ val kakao_version = "2.20.5"
implementation(project(":feature-home"))
implementation(project(":feature-authentication"))
@@ -109,12 +110,12 @@ dependencies {
implementation(project(":core-repository"))
implementation(project(":core-common"))
- implementation("com.kakao.sdk:v2-all:2.19.0")// 전체 모듈 설치, 2.11.0 버전부터 지원
- implementation("com.kakao.sdk:v2-user:2.19.0") // 카카오 로그인 API 모듈
- implementation("com.kakao.sdk:v2-talk:2.19.0") // 카카오톡 채널, 카카오톡 소셜, 카카오톡 메시지 API 모듈
- implementation("com.kakao.sdk:v2-share:2.19.0") // 카카오톡 공유 API 모듈
- implementation("com.kakao.sdk:v2-friend:2.19.0") // 피커 API 모듈
- implementation("com.kakao.sdk:v2-cert:2.19.0") // 카카오 인증서비스 API 모듈
+ implementation("com.kakao.sdk:v2-all:${kakao_version}")// 전체 모듈 설치, 2.11.0 버전부터 지원
+ implementation("com.kakao.sdk:v2-user:${kakao_version}") // 카카오 로그인 API 모듈
+ implementation("com.kakao.sdk:v2-talk:${kakao_version}") // 카카오톡 채널, 카카오톡 소셜, 카카오톡 메시지 API 모듈
+ implementation("com.kakao.sdk:v2-share:${kakao_version}") // 카카오톡 공유 API 모듈
+ implementation("com.kakao.sdk:v2-friend:${kakao_version}") // 피커 API 모듈
+ implementation("com.kakao.sdk:v2-cert:${kakao_version}") // 카카오 인증서비스 API 모듈
implementation("com.google.dagger:hilt-android:$hilt_version")
implementation("com.google.dagger:hilt-compiler:$hilt_version")
kapt("com.google.dagger:hilt-android-compiler:$hilt_version")
diff --git a/feature-authentication/build.gradle.kts b/feature-authentication/build.gradle.kts
index 98e9ef4ec..cd4cd008b 100644
--- a/feature-authentication/build.gradle.kts
+++ b/feature-authentication/build.gradle.kts
@@ -71,6 +71,7 @@ android {
dependencies {
implementation("com.google.firebase:firebase-messaging-ktx:23.4.1")
val hilt_version = "2.48.1"
+ val kakao_version = "2.20.5"
val hilt_viewmodel_version = "1.0.0-alpha03"
val hilt_nav_compose_version = "1.0.0"
@@ -79,12 +80,12 @@ dependencies {
implementation(project(":core-common"))
implementation(project(":core-model"))
- implementation("com.kakao.sdk:v2-all:2.19.0")// 전체 모듈 설치, 2.11.0 버전부터 지원
- implementation("com.kakao.sdk:v2-user:2.19.0") // 카카오 로그인 API 모듈
- implementation("com.kakao.sdk:v2-talk:2.19.0") // 카카오톡 채널, 카카오톡 소셜, 카카오톡 메시지 API 모듈
- implementation("com.kakao.sdk:v2-share:2.19.0") // 카카오톡 공유 API 모듈
- implementation("com.kakao.sdk:v2-friend:2.19.0") // 피커 API 모듈
- implementation("com.kakao.sdk:v2-cert:2.19.0") // 카카오 인증서비스 API 모듈
+ implementation("com.kakao.sdk:v2-all:${kakao_version}")// 전체 모듈 설치, 2.11.0 버전부터 지원
+ implementation("com.kakao.sdk:v2-user:${kakao_version}") // 카카오 로그인 API 모듈
+ implementation("com.kakao.sdk:v2-talk:${kakao_version}") // 카카오톡 채널, 카카오톡 소셜, 카카오톡 메시지 API 모듈
+ implementation("com.kakao.sdk:v2-share:${kakao_version}") // 카카오톡 공유 API 모듈
+ implementation("com.kakao.sdk:v2-friend:${kakao_version}") // 피커 API 모듈
+ implementation("com.kakao.sdk:v2-cert:${kakao_version}") // 카카오 인증서비스 API 모듈
implementation("com.google.dagger:hilt-android:$hilt_version")
implementation("com.google.dagger:hilt-compiler:$hilt_version")
kapt("com.google.dagger:hilt-android-compiler:$hilt_version")
From 3fc657177ea7fcf0d8e0f4682bb259e3471c698d Mon Sep 17 00:00:00 2001
From: Lee YongIn <67788699+LeeYongIn0517@users.noreply.github.com>
Date: Tue, 15 Oct 2024 21:49:39 +0900
Subject: [PATCH 07/93] =?UTF-8?q?v1.1.3=20=EC=97=85=EB=8D=B0=EC=9D=B4?=
=?UTF-8?q?=ED=8A=B8=20=EC=88=98=EC=A0=95=20(#175)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* HotFix: 카카오 sdk 버전 업그레이드 (#170)
* HotFix: 카카오 sdk 버전 업그레이드
* Feat: gradlew clean 작업 추가
* Delete
* Delete: refreshToken 추상메서드 삭제
* Delete: 토큰 리프레싱 임시방안 코드 삭제
* HotFix: 카카오 sdk 버전 업그레이드 (#174)
From 689234e6e6f587bcfbab8c65d25c2fcd79656418 Mon Sep 17 00:00:00 2001
From: Lee YongIn <67788699+LeeYongIn0517@users.noreply.github.com>
Date: Tue, 15 Oct 2024 22:48:48 +0900
Subject: [PATCH 08/93] =?UTF-8?q?v1.1.3=20=EC=97=85=EB=8D=B0=EC=9D=B4?=
=?UTF-8?q?=ED=8A=B8=20(#172)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Ignore
* Feat: feature-hbti 모듈 생성
* Feat:선택지 무효화 기능 추가 및 SurveyOptionList로 수정
* Rename: SurveyOptionItem -> SurveyOptionList
* Feat: ProgressBarPreview에 +/- 효과 추가
* Chore: gradle 의존성 추가
* Fix: intent 이름 변경
* Feat: 알림 선택 시 읽음 처리 이벤트 추가
* Feat: 포그라운드 알림 처리
* Fix: Navigation Deeplink 오류 수정
* Chore: mockito 라이브러리 추가
* Feat: HbtiScreen 추가
* Chore: compose material 및 preview 라이브러리 추가
* Feat: Hbti화면 완성
* Design: 향BTI 화면 디자인 구성 완료
* Feat: 향BTI 테스트 데이터계층 클래스 생성
* Rename: SurveyAnswerResponseDto -> SurveyOptionResponseDto
* Feat: fcm token 저장 함수 추가
* Fix: 파라미터 이름 오류 수정
* Fix: 토큰 저장 알고리즘 수정
* Feat: 향수 추천 화면 추가
* Design: 공백 수정
* Feat: 데이터 계층 hilt 주입코드 추가
* Feat: HbtiSurvey 화면 추가(미완성)
* Feat: 가격 선택 화면 추가
* Design: 아이템 간 간격 조절
* Rename: 컴포넌트 이름 변경
* Rename: 컴포넌트 이름 변경
* Feat: 향료 선택 화면 추가
* Refactor: 화면 구성 변경
* Fix: 파라미터 변경
* Resource: icon 추가
* Fix: 파라미터 수정
* Feat: 향료 선택 화면 추가
* Style: 공백 스타일 변경
* Fix: 푸쉬 오류 수정
* Style: 코드 스타일 변경
* Feat: 향수 추천 결과 화면 추가
* Rename: 컴포넌트 이름 변경
* Ignore
* Delete
* Chore: test 라이브러리 추가
* Feat: HbtiSurveyViewmodel 생성
* Test: HbtiSurveyViewModel 테스트 생성
* Test: 테스트 기대값 수정
* Feat: Dto 추가
* Feat: Api 추가
* Style: 코드 라인 변경
* Feat: 비즈니스 로직 추가
* Remove: 삭제
* Feat: 향료 데이터 클래스 추가
* Comment: 주석 추가
* Fix: 서버에 정보 전달 로직 임의 대체
* Rename: 함수 명 변경
* Feat: 비즈니스 로직 추가
* Feat: 비즈니스 로직 추가
* Feat: 비즈니스 로직 추가
* Feat: UI 상태 기준 분기
* Feat: Navigation 설정
* Design: On/Off 버튼 디자인
* Test: UI 테스트
* Chore: Firebase 의존성 추가
* Feat: onNewToken 함수 추가
* Feat: 알림 On/Off 알고리즘 추가
* Test: Hbti2 API 테스트 세팅
* Docs: resource 위치 이동
* Chore: 권한 추가
* Remove: 불필요 함수 제거
* Refactor: 파라미터 수정
* Refactor: 파라미터 수정
* Refactor: 파라미터 수정
* Feat: 갤러리 권한 추가
* Refactor: 파라미터 수정
* Style: 공백 제거
* Refactor: 함수 변경
* Fix: 알림 설정 저장 오류 수정
* Feat: 권한 관련 Common 파일 추가
* Fix: Intent Flag 오류 수정
* Fix: 권한 허가 로직 수정
* Fix: Pending Intent 플래그 수정
* Fix: Pending Intent 플래그 수정
* Fix: Conflict
* Refactor: 조건 수정
* Style: 공백 정리
* Feat: Error State 추가
* Feat: Error State 추가
* Rename: View Model 이름 변경
* Style: 공백 제거
* Feat: UiState와 ErrorState combine
* Fix: 조건 수정
* Feat: Error 상태 관리 추가
* Feat: navigation ci옵션 추가
* Fix: Navigation 변경
* Feat: navigation 스택 제거 함수 추가
* Feat: navigation 스택 조정
* Feat: error state 추가
* Feat: error state 추가
* Feat: error state와 ui state 연결
* Hotfix: Token 오류 수정
* Feat: ErrorUiState 추가 및 유저화면 적용
* Chore: 버전코드 변경 12->13
* Hotfix: 토큰 빈값 방출 수정
* Hotfix: ErrorUiSetView onCloseClick 콜백 동작 수정 및 Rename
* Design: 에러메세지 문구 수정
* Chore: 버전코드 수정 13->14
* Feat: 토큰리프레싱 후 기존 토큰 삭제 과정 추가
* Fix: 비동기 처리 완료 후 네비게이팅 하도록 수정
* Hotfix: memberNotFoundError 처리 누락 추가
* Chore: 버전코드 수정 (14->15)
* Hotfix: hpedia 커뮤니티 MemberNotFound 상태변수 추가
* Chore: 15->16 버전 코드 수정
* Chore: 버전 코드 수정 16->17
* Hotfix: ErrorState 타입캐스팅 디버깅 구문 삭제
* Chore: 버전코드 수정 (17->18)
* Remove: 기능없는 이용약관 삭제
구글 Broken Functionality policy 위반을 피하기 위한 조치입니다!
* Delete: 서비스 알림 배너 삭제
* Chore: 패키지명 변경 hmoa -> hyangmoa
* Chore: 패키지 명 변경 (hmoa -> hyangmoa)
* Chore: 버전코드 1로 초기화
* Revert "Chore: 패키지 명 변경 (hmoa -> hyangmoa)"
This reverts commit 811f817ebf54089de05ebabe42bdee964b52d3e1.
* Revert "Chore: 버전코드 1로 초기화"
This reverts commit 529e65abe5c96a90943b6ffd466ae5a4742570ef.
* Revert "Chore: 패키지명 변경 hmoa -> hyangmoa"
This reverts commit bfe2d86153421276a831ad4e69dd4ab50dfee72c.
* Chore: 테스트 라이브러리 추가
* Test: DataPreference 인풋 아웃풋 비교 테스트 추가
* Chore: 테스트 라이브러리 라이브러리 변경
* Test: DataStorePreference 인풋, 아웃풋 결과값 테스트
* Fix: 토큰이 null일 경우 빈 문자열 처리
* Feat: 이용약관 및 개인정보처리방침 url 수정
* Delete: 주석 삭제
* HotFix: 토큰 빈값 나오는 현상 수정
* HotFix: 토큰 초기화 및 유지 이슈 해결
* Chore: apk 파일 추출 명령어 추가
* Chore: 깃허브 시크릿 카피 스크립트 파일 추가
* Chore: APK 명령어는 master에서만 실행하도록 수정
* Delete: CI환경에 부적합 + 필요없음
* Delete: PR할 때만 CI되도록 수정
* Delete
* Delete
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Ignore
* Chore: 업데이트 버전명 수정 1.0.0 -> 1.1.0
* Fix: 버전정보 매개변수로 주입하기 추가
* Design: 로그인 버튼 마진 및 구글아이콘 수정
* Design: 향수 검색 화면 마진 수정
* Update README.md
* Update README.md
* Update README.md
* Design: 디자인 디테일 수정 (패딩 및 아이콘 크기)
* Design: 아이콘 크기 변경
* Chore: 버전 코드 증가(18->19)
* Design: 스위치 on포인트 색상 변경
* Chore: targetSdk 업그레이드 (33 -> 34)
* Chore: 버전코드 업데이트
* Chore: action/upload-artifact 버전 변경
* Chore: action/upload-artifact 버전 변경
* Delete: 필요없는 테스트 삭제
* Delete: 불필요 코드 제거
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Feat: 에러핸들링 메서드 추가
* Fix: 에러처리 구문 수정
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Chore: CI/CD 공통 작업 분리 및 CD 워크플로우 작성
* Feat: 버전 수정 1.1.1(22)
* Chore: 프로덕션으로 수정
* Hotfix/hpedia (#160)
* Rename: 네비게이션 이벤트 명 변경
* Feat: error state 추가
* Fix: UI state에서 throw를 처리하지 못하는 부분 수정
* Feat: type 설정 변경
* Feat: 변수 관리 조정 및 Error 상태 추가
* Chore: core-common 의존성 추가
* Delete: 토큰 재발급 임시 로직 삭제
* HotFix: Authenticator 토큰 재발급 및 에러메세지 전달 기능 수정
* Fix: Authenticator 적용
* Fix: api 호출부에 Authenticator 적용
* Delete: 안쓰는 api 삭제
* Refactor: FCM 초기화 및 초기 라우팅 코드 함수로 분리
* Delete: 임시 refreshToken 코드 관련 api 삭제
* Rename: 토큰 관련 클래스 의존성 주입 모듈 이름 수정
* Fix: 토큰 동적 할당 시점 변경
* Fix: 로그인 화면 이동 네비게이션 변경
* Chore: 버전 변경 (v1.1.1 -> v1.1.2)
* Chore: ci,cd 구문 변경 및 action.yml 파일 추가
* Fix: action.yml 추가 (#162)
* Chore: v1.1.1 - CD 작업 테스트
* Chore: 환경설정 구문 추가
* Fix: cdWorkflow 파일 수정
환경 설정 구문 삭제
* Fix: ciWorkFlow 파일 수정
환경설정 구문 삭제
* Update whatsnew-ko-KR.txt
* Fix: 파일 경로 오타 수정
* Fix: 파일 경로 오타 수정
* Fix: 깃헙 액션 워크플로우 일시 중지
* v1.1.1 release로 머지합니다 (#161)
* Chore: action/upload-artifact 버전 변경
* Delete: 필요없는 테스트 삭제
* Delete: 불필요 코드 제거
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Feat: 에러핸들링 메서드 추가
* Fix: 에러처리 구문 수정
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Chore: CI/CD 공통 작업 분리 및 CD 워크플로우 작성
* Feat: 버전 수정 1.1.1(22)
* Chore: 프로덕션으로 수정
* Hotfix/hpedia (#160)
* Rename: 네비게이션 이벤트 명 변경
* Feat: error state 추가
* Fix: UI state에서 throw를 처리하지 못하는 부분 수정
* Feat: type 설정 변경
* Feat: 변수 관리 조정 및 Error 상태 추가
* Fix: action.yml 추가 (#162)
* Chore: v1.1.1 - CD 작업 테스트
* Chore: 환경설정 구문 추가
* Fix: cdWorkflow 파일 수정
환경 설정 구문 삭제
* Fix: ciWorkFlow 파일 수정
환경설정 구문 삭제
* Update whatsnew-ko-KR.txt
* Fix: 파일 경로 오타 수정
* Fix: 파일 경로 오타 수정
* Fix: 깃헙 액션 워크플로우 일시 중지
---------
Co-authored-by: Seo Hojun <101941674+uselessnaming@users.noreply.github.com>
* Chore: ci/cd 워크플로우 임시로 주석처리 및 사용중지
* Chore: android.yml 워크플로우 일시중지 (#164)
* Chore: CI 구문 롤백 및 오작동 CI/CD 임시폴더로 분리
* Releasse/1.1.1 CI 구문 롤백 및 새로운 CI/CD 구문 분리 (#165)
* Chore: android.yml 워크플로우 일시중지
* Chore: 예전 CI 코드로 rollback 및 새로운 파일 분리
* Chore: actions upload-artifact 라이브러리 버전 업그레이드
* Rename: 이름 변경
* Fix: 파라미터 명시적으로 구분
* Fix: RouteScreen 파라미터 변수명 변경 반영
* Chore: 버전코드 수정 22->23
* Ignore
* Fix: 백업데이터 설정 해제
* Chore: 버전 업데이트
* Revert "Chore: 버전 업데이트"
This reverts commit 031fc2f141d3ffbc07b0954eda874c58d7e1c834.
* Revert "Fix: 백업데이터 설정 해제"
This reverts commit bb68a8d265be89d74bcc2feed66baca5355cd475.
* 1.1.2버전 develop -> release 머지합니다 (#168)
* Chore: action/upload-artifact 버전 변경
* Delete: 필요없는 테스트 삭제
* Delete: 불필요 코드 제거
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Feat: 에러핸들링 메서드 추가
* Fix: 에러처리 구문 수정
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Chore: CI/CD 공통 작업 분리 및 CD 워크플로우 작성
* Feat: 버전 수정 1.1.1(22)
* Chore: 프로덕션으로 수정
* Hotfix/hpedia (#160)
* Rename: 네비게이션 이벤트 명 변경
* Feat: error state 추가
* Fix: UI state에서 throw를 처리하지 못하는 부분 수정
* Feat: type 설정 변경
* Feat: 변수 관리 조정 및 Error 상태 추가
* Chore: core-common 의존성 추가
* Delete: 토큰 재발급 임시 로직 삭제
* HotFix: Authenticator 토큰 재발급 및 에러메세지 전달 기능 수정
* Fix: Authenticator 적용
* Fix: api 호출부에 Authenticator 적용
* Delete: 안쓰는 api 삭제
* Refactor: FCM 초기화 및 초기 라우팅 코드 함수로 분리
* Delete: 임시 refreshToken 코드 관련 api 삭제
* Rename: 토큰 관련 클래스 의존성 주입 모듈 이름 수정
* Fix: 토큰 동적 할당 시점 변경
* Fix: 로그인 화면 이동 네비게이션 변경
* Chore: 버전 변경 (v1.1.1 -> v1.1.2)
* Chore: ci,cd 구문 변경 및 action.yml 파일 추가
* Fix: action.yml 추가 (#162)
* Chore: v1.1.1 - CD 작업 테스트
* Chore: 환경설정 구문 추가
* Fix: cdWorkflow 파일 수정
환경 설정 구문 삭제
* Fix: ciWorkFlow 파일 수정
환경설정 구문 삭제
* Update whatsnew-ko-KR.txt
* Fix: 파일 경로 오타 수정
* Fix: 파일 경로 오타 수정
* Fix: 깃헙 액션 워크플로우 일시 중지
* Chore: ci/cd 워크플로우 임시로 주석처리 및 사용중지
* Chore: CI 구문 롤백 및 오작동 CI/CD 임시폴더로 분리
* Fix: 파라미터 명시적으로 구분
* Fix: RouteScreen 파라미터 변수명 변경 반영
* Chore: 버전코드 수정 22->23
* Ignore
* Fix: 백업데이터 설정 해제
* Chore: 버전 업데이트
* Revert "Chore: 버전 업데이트"
This reverts commit 031fc2f141d3ffbc07b0954eda874c58d7e1c834.
* Revert "Fix: 백업데이터 설정 해제"
This reverts commit bb68a8d265be89d74bcc2feed66baca5355cd475.
---------
Co-authored-by: Seo Hojun <101941674+uselessnaming@users.noreply.github.com>
* Delete
* Delete
* Delete
* HotFix: 카카오 sdk 버전 업그레이드 (#170) (#171)
* HotFix: 카카오 sdk 버전 업그레이드
* Feat: gradlew clean 작업 추가
* Delete
* Delete: refreshToken 추상메서드 삭제
* Delete: 토큰 리프레싱 임시방안 코드 삭제
* v1.1.3 업데이트 수정 (#175)
* HotFix: 카카오 sdk 버전 업그레이드 (#170)
* HotFix: 카카오 sdk 버전 업그레이드
* Feat: gradlew clean 작업 추가
* Delete
* Delete: refreshToken 추상메서드 삭제
* Delete: 토큰 리프레싱 임시방안 코드 삭제
* HotFix: 카카오 sdk 버전 업그레이드 (#174)
---------
Co-authored-by: Seo Hojun <101941674+uselessnaming@users.noreply.github.com>
Co-authored-by: uselessNaming
---
.github/workflows/android.yml | 3 +++
app/build.gradle.kts | 13 +++++++------
feature-authentication/build.gradle.kts | 13 +++++++------
3 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index f26700233..aafb75163 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -46,6 +46,9 @@ jobs:
- name: Grant execute permission for gradlew
run: chmod +x gradlew
+ - name: Clear Gradle Cache
+ run: ./gradlew clean
+
- name: Build for debug with Gradle
run: ./gradlew assembleDebug
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 4dbf589dc..34b4ae23f 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -92,6 +92,7 @@ dependencies {
val hilt_version = "2.48.1"
val hilt_viewmodel_version = "1.0.0-alpha03"
val hilt_nav_compose_version = "1.0.0"
+ val kakao_version = "2.20.5"
implementation(project(":feature-home"))
implementation(project(":feature-authentication"))
@@ -109,12 +110,12 @@ dependencies {
implementation(project(":core-repository"))
implementation(project(":core-common"))
- implementation("com.kakao.sdk:v2-all:2.19.0")// 전체 모듈 설치, 2.11.0 버전부터 지원
- implementation("com.kakao.sdk:v2-user:2.19.0") // 카카오 로그인 API 모듈
- implementation("com.kakao.sdk:v2-talk:2.19.0") // 카카오톡 채널, 카카오톡 소셜, 카카오톡 메시지 API 모듈
- implementation("com.kakao.sdk:v2-share:2.19.0") // 카카오톡 공유 API 모듈
- implementation("com.kakao.sdk:v2-friend:2.19.0") // 피커 API 모듈
- implementation("com.kakao.sdk:v2-cert:2.19.0") // 카카오 인증서비스 API 모듈
+ implementation("com.kakao.sdk:v2-all:${kakao_version}")// 전체 모듈 설치, 2.11.0 버전부터 지원
+ implementation("com.kakao.sdk:v2-user:${kakao_version}") // 카카오 로그인 API 모듈
+ implementation("com.kakao.sdk:v2-talk:${kakao_version}") // 카카오톡 채널, 카카오톡 소셜, 카카오톡 메시지 API 모듈
+ implementation("com.kakao.sdk:v2-share:${kakao_version}") // 카카오톡 공유 API 모듈
+ implementation("com.kakao.sdk:v2-friend:${kakao_version}") // 피커 API 모듈
+ implementation("com.kakao.sdk:v2-cert:${kakao_version}") // 카카오 인증서비스 API 모듈
implementation("com.google.dagger:hilt-android:$hilt_version")
implementation("com.google.dagger:hilt-compiler:$hilt_version")
kapt("com.google.dagger:hilt-android-compiler:$hilt_version")
diff --git a/feature-authentication/build.gradle.kts b/feature-authentication/build.gradle.kts
index 98e9ef4ec..cd4cd008b 100644
--- a/feature-authentication/build.gradle.kts
+++ b/feature-authentication/build.gradle.kts
@@ -71,6 +71,7 @@ android {
dependencies {
implementation("com.google.firebase:firebase-messaging-ktx:23.4.1")
val hilt_version = "2.48.1"
+ val kakao_version = "2.20.5"
val hilt_viewmodel_version = "1.0.0-alpha03"
val hilt_nav_compose_version = "1.0.0"
@@ -79,12 +80,12 @@ dependencies {
implementation(project(":core-common"))
implementation(project(":core-model"))
- implementation("com.kakao.sdk:v2-all:2.19.0")// 전체 모듈 설치, 2.11.0 버전부터 지원
- implementation("com.kakao.sdk:v2-user:2.19.0") // 카카오 로그인 API 모듈
- implementation("com.kakao.sdk:v2-talk:2.19.0") // 카카오톡 채널, 카카오톡 소셜, 카카오톡 메시지 API 모듈
- implementation("com.kakao.sdk:v2-share:2.19.0") // 카카오톡 공유 API 모듈
- implementation("com.kakao.sdk:v2-friend:2.19.0") // 피커 API 모듈
- implementation("com.kakao.sdk:v2-cert:2.19.0") // 카카오 인증서비스 API 모듈
+ implementation("com.kakao.sdk:v2-all:${kakao_version}")// 전체 모듈 설치, 2.11.0 버전부터 지원
+ implementation("com.kakao.sdk:v2-user:${kakao_version}") // 카카오 로그인 API 모듈
+ implementation("com.kakao.sdk:v2-talk:${kakao_version}") // 카카오톡 채널, 카카오톡 소셜, 카카오톡 메시지 API 모듈
+ implementation("com.kakao.sdk:v2-share:${kakao_version}") // 카카오톡 공유 API 모듈
+ implementation("com.kakao.sdk:v2-friend:${kakao_version}") // 피커 API 모듈
+ implementation("com.kakao.sdk:v2-cert:${kakao_version}") // 카카오 인증서비스 API 모듈
implementation("com.google.dagger:hilt-android:$hilt_version")
implementation("com.google.dagger:hilt-compiler:$hilt_version")
kapt("com.google.dagger:hilt-android-compiler:$hilt_version")
From 96ace7a740edffbc18379ef847db39b2cada891d Mon Sep 17 00:00:00 2001
From: Seo Hojun <101941674+uselessnaming@users.noreply.github.com>
Date: Wed, 30 Oct 2024 20:57:14 +0900
Subject: [PATCH 09/93] =?UTF-8?q?=EB=8F=99=EA=B8=B0=ED=99=94=20(#178)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Design: 공백 수정
* Design: On/Off 버튼 디자인
* Test: UI 테스트
* Chore: Firebase 의존성 추가
* Feat: onNewToken 함수 추가
* Feat: 알림 On/Off 알고리즘 추가
* Test: Hbti2 API 테스트 세팅
* Docs: resource 위치 이동
* Chore: 권한 추가
* Remove: 불필요 함수 제거
* Refactor: 파라미터 수정
* Refactor: 파라미터 수정
* Refactor: 파라미터 수정
* Feat: 갤러리 권한 추가
* Refactor: 파라미터 수정
* Style: 공백 제거
* Refactor: 함수 변경
* Fix: 알림 설정 저장 오류 수정
* Feat: 권한 관련 Common 파일 추가
* Fix: Intent Flag 오류 수정
* Fix: 권한 허가 로직 수정
* Fix: Pending Intent 플래그 수정
* Fix: Pending Intent 플래그 수정
* Fix: Conflict
* Refactor: 조건 수정
* Style: 공백 정리
* Feat: Error State 추가
* Feat: Error State 추가
* Rename: View Model 이름 변경
* Style: 공백 제거
* Feat: UiState와 ErrorState combine
* Fix: 조건 수정
* Feat: Error 상태 관리 추가
* Feat: navigation ci옵션 추가
* Fix: Navigation 변경
* Feat: navigation 스택 제거 함수 추가
* Feat: navigation 스택 조정
* Feat: error state 추가
* Feat: error state 추가
* Feat: error state와 ui state 연결
* Hotfix: Token 오류 수정
* Feat: ErrorUiState 추가 및 유저화면 적용
* Chore: 버전코드 변경 12->13
* Hotfix: 토큰 빈값 방출 수정
* Hotfix: ErrorUiSetView onCloseClick 콜백 동작 수정 및 Rename
* Design: 에러메세지 문구 수정
* Chore: 버전코드 수정 13->14
* Feat: 토큰리프레싱 후 기존 토큰 삭제 과정 추가
* Fix: 비동기 처리 완료 후 네비게이팅 하도록 수정
* Hotfix: memberNotFoundError 처리 누락 추가
* Chore: 버전코드 수정 (14->15)
* Hotfix: hpedia 커뮤니티 MemberNotFound 상태변수 추가
* Chore: 15->16 버전 코드 수정
* Chore: 버전 코드 수정 16->17
* Hotfix: ErrorState 타입캐스팅 디버깅 구문 삭제
* Chore: 버전코드 수정 (17->18)
* Remove: 기능없는 이용약관 삭제
구글 Broken Functionality policy 위반을 피하기 위한 조치입니다!
* Delete: 서비스 알림 배너 삭제
* Chore: 패키지명 변경 hmoa -> hyangmoa
* Chore: 패키지 명 변경 (hmoa -> hyangmoa)
* Chore: 버전코드 1로 초기화
* Revert "Chore: 패키지 명 변경 (hmoa -> hyangmoa)"
This reverts commit 811f817ebf54089de05ebabe42bdee964b52d3e1.
* Revert "Chore: 버전코드 1로 초기화"
This reverts commit 529e65abe5c96a90943b6ffd466ae5a4742570ef.
* Revert "Chore: 패키지명 변경 hmoa -> hyangmoa"
This reverts commit bfe2d86153421276a831ad4e69dd4ab50dfee72c.
* Chore: 테스트 라이브러리 추가
* Test: DataPreference 인풋 아웃풋 비교 테스트 추가
* Chore: 테스트 라이브러리 라이브러리 변경
* Test: DataStorePreference 인풋, 아웃풋 결과값 테스트
* Fix: 토큰이 null일 경우 빈 문자열 처리
* Feat: 이용약관 및 개인정보처리방침 url 수정
* Delete: 주석 삭제
* HotFix: 토큰 빈값 나오는 현상 수정
* HotFix: 토큰 초기화 및 유지 이슈 해결
* Chore: apk 파일 추출 명령어 추가
* Chore: 깃허브 시크릿 카피 스크립트 파일 추가
* Chore: APK 명령어는 master에서만 실행하도록 수정
* Delete: CI환경에 부적합 + 필요없음
* Delete: PR할 때만 CI되도록 수정
* Delete
* Delete
* Release 1.0.0(18) 출시 (#147)
* Feature-Magazine Init
* Chore: Manifest 정리
* Chore: 기본 의존성 설정
* Chore: Test 관련 의존성 정리
* Chore: Compose 설정
* Feat: Response Dto 추가
* Feat: Magazine Screen 추가
* Feat: Magazine Service 추가
* Feat: Magazine Service DI 추가
* Resource: Floating Action Button Open Icon 추가
* Feat: Magazine DataStore 추가
* Fix: Response 타입 수정
* Feat: Data Store DI
* Feat: Repository DI
* Feat: Magazine Repository 추가
* Feat: 최신 향수 받아오는 API 추가
* Feat: 최신 향수 받아오는 DTO 추가
* Resource: 공유 아이콘 추가
* Feat: Magazine ViewModel 로직 추가
* Design: TopBar 투명도 파라미터 추가
* Rename: 파일 명 변경
* Design: 투명도 추가
* Design: Magazine Tag 추가
* Resource: 아이콘 resource 추가
* Fix: Response 타입 변경
* Chore: Magazine 의존성 추가
* Feat: Magazine Navigation 추가
* Fix: Bottom Navigation 내용 변경
* Feat: Magazine 상세 화면 추가
* Feat: Magazine Paging 추가
* Feat: Magazine Route 클래스 추가
* Feat: Magazine 상세 비즈니스 로직 추가
* Fix: Conflict 수정
* Fix: Paging 오류 수정
* Design: title 색상 파라미터 추가
* Design: title 색상 파라미터 추가
* Design: review content 위치 변경
* Design: Content 글자 수 제한
* Design: title 글자 수 제한
* Fix: 개행문자 수정
* Feat: Navigation 이벤트 추가
* Feat: Magazine 상세 화면 추가
* Feat: Magazine 상세 화면 비즈니스 로직 추가
* Feat: Navigation 이벤트 추가
* Fix: 데이터 순서에 따른 오류 수정
* Design: Tag UI 수정
* Design: Space 크기 조절
* Feat: 좋아요 update 이벤트 추가
* Fix: Navigation 이벤트 파라미터 추가
* Feat: Navigation 이벤트 파라미터 추가
* Design: Magazine UI 위치 수정
* Fix: Magazine Image 추가
* Resource: Magazine Icon 추가
* Design: 바텀 네비게이션 UI 수정
* Feat: Navigation SingleTop 옵션 추가
* Feat: 좋아요 한 향수 페이지 위치 변동
* FIX: 비로그인 에러다이얼로그 동작 오류 수정
* Fix: Navigation 누락 오류 수정
* Fix: err state 누락 오류 수정
* Fix: navigation 누락 수정
* Design: UI 간격 수정
* Gradle: Material 의존성 추가
* Design: 수정 모달 추가
* Refactor: Dialog 팝업 방식 변경
* FIX: 좋아요 리프레싱 시 리컴포지션 안되는 오류 수정
* Rename: 이름 혼동 방지
* Rename: 이름 혼동 방지
* Fix: Dialog Pop up 시 깜빡거림 수정
* Feat: 향수페이지 댓글 오류 수정
* Fix: 향수 페이지 댓글 상태관리 변화 오류 수정
* Delete: 사용하지 않는 상태관리 변수 삭제
* Update README.md
* Resource: Font 추가
* Create android.yml
develop 브랜치로 코드 푸시, PR 시 빌드되는 기능
* Feat: 자동 빌드 기능 테스트 구문
* Update android.yml
* Feat: 자바 버전 11 -> 17
* Fix: CI환경 빌드에 local.properties 파일 동적 생성 기능 추가
* Fix: 경로 오류 수정
* Feat: 모든 모듈의 local-properties파일 삭제 명령파일 생성
* Fix: app 모듈왜 local.properties를 사용하는 모듈도 파일 동적생성 적용
* Chore: 서브 모듈 추가
* Delete: mylibrary 모듈 삭제
* Chore: AndroidSecretSecure 서브 레포지토리 추가
* Revert "Delete: mylibrary 모듈 삭제"
This reverts commit cc0c0fd6d21b7f3d941ed11ab515ff2bf6b8e8ab.
* Revert "Chore: 서브 모듈 추가"
This reverts commit 95cc85845823843a72eb29a6b65a001b99947c6f.
* Fix: 소셜 토큰 api 호출 오류 수정
* Ignore
* Fix: lateinit 삭제 및 초기화 값 지정
* Fix: IndexOutOfBoundException방지 구문 추가
* Chore: google-service.json 파일 추가
* Rename
* Chore: NATIVE_APP_KEY 적용
* Chore: 버전 증가 6->7
* Feat: 토큰 유무 검사 로직 수정
* Feat: 토큰 가져오는 비동기 작업 -> 동기로 변경
* Fix: 토큰 갱신 작업 대기방식을 동기적으로 변경
* Fix: 스트림 닫힘 오류 원인 부분 해결
* Revert "Feat: 토큰 가져오는 비동기 작업 -> 동기로 변경"
This reverts commit f56f46f1000603260a6f143dd4304ffc1b4750bf.
* Fix: postFcmToken NullPointException 원인구문 삭제
* Fix: 인터셉터 토큰 추가동작 수정
비동기 -> 동기
* Chore: v1.0.0 버전코드 수정 (7->8)
* Fix: native app key, string value로 변경
* Fix: HttpLoggingInterceptor 제거
- IllgalStateException 해결을 위해 지워봄
* Refactor: HPediaDesc api호출 분리 및 CastException 해결
* Chore: 버전코드 수정(8->9)
* Chore: 버전코드 수정 (9->10)
* Fix: 변수 명 오류
* Chore: 버전코드 수정(10->11)
* Fix: 카카오 앱 키 참조 방식 변경
* Chore: 버전코드 수정(11->12)
* Hotfix: Token 오류 수정
* Feat: ErrorUiState 추가 및 유저화면 적용
* Chore: 버전코드 변경 12->13
* Hotfix: 토큰 빈값 방출 수정
* Hotfix: ErrorUiSetView onCloseClick 콜백 동작 수정 및 Rename
* Design: 에러메세지 문구 수정
* Chore: 버전코드 수정 13->14
* Feat: 토큰리프레싱 후 기존 토큰 삭제 과정 추가
* Fix: 비동기 처리 완료 후 네비게이팅 하도록 수정
* Hotfix: memberNotFoundError 처리 누락 추가
* Chore: 버전코드 수정 (14->15)
* Hotfix: hpedia 커뮤니티 MemberNotFound 상태변수 추가
* Chore: 15->16 버전 코드 수정
* Chore: 버전 코드 수정 16->17
* Hotfix: ErrorState 타입캐스팅 디버깅 구문 삭제
* Chore: 버전코드 수정 (17->18)
* Remove: 기능없는 이용약관 삭제
구글 Broken Functionality policy 위반을 피하기 위한 조치입니다!
* Delete: 서비스 알림 배너 삭제
* Chore: 패키지명 변경 hmoa -> hyangmoa
* Chore: 패키지 명 변경 (hmoa -> hyangmoa)
* Chore: 버전코드 1로 초기화
* Revert "Chore: 패키지 명 변경 (hmoa -> hyangmoa)"
This reverts commit 811f817ebf54089de05ebabe42bdee964b52d3e1.
* Revert "Chore: 버전코드 1로 초기화"
This reverts commit 529e65abe5c96a90943b6ffd466ae5a4742570ef.
* Revert "Chore: 패키지명 변경 hmoa -> hyangmoa"
This reverts commit bfe2d86153421276a831ad4e69dd4ab50dfee72c.
* Chore: 테스트 라이브러리 추가
* Test: DataPreference 인풋 아웃풋 비교 테스트 추가
* Chore: 테스트 라이브러리 라이브러리 변경
* Test: DataStorePreference 인풋, 아웃풋 결과값 테스트
* Fix: 토큰이 null일 경우 빈 문자열 처리
* Feat: 이용약관 및 개인정보처리방침 url 수정
* Delete: 주석 삭제
* HotFix: 토큰 빈값 나오는 현상 수정
* HotFix: 토큰 초기화 및 유지 이슈 해결
* Chore: apk 파일 추출 명령어 추가
* Chore: 깃허브 시크릿 카피 스크립트 파일 추가
* Chore: APK 명령어는 master에서만 실행하도록 수정
* Delete: CI환경에 부적합 + 필요없음
* Delete: PR할 때만 CI되도록 수정
---------
Co-authored-by: uselessNaming
Co-authored-by: Seo Hojun <101941674+uselessnaming@users.noreply.github.com>
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Ignore
* Chore: 업데이트 버전명 수정 1.0.0 -> 1.1.0
* Fix: 버전정보 매개변수로 주입하기 추가
* Design: 로그인 버튼 마진 및 구글아이콘 수정
* Design: 향수 검색 화면 마진 수정
* Update README.md
* Update README.md
* Update README.md
* Design: 디자인 디테일 수정 (패딩 및 아이콘 크기)
* Design: 아이콘 크기 변경
* Chore: 버전 코드 증가(18->19)
* Design: 스위치 on포인트 색상 변경
* Chore: targetSdk 업그레이드 (33 -> 34)
* Chore: 버전코드 업데이트
* Chore: action/upload-artifact 버전 변경
* Chore: action/upload-artifact 버전 변경
* Delete: 필요없는 테스트 삭제
* Delete: 불필요 코드 제거
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Feat: 에러핸들링 메서드 추가
* Fix: 에러처리 구문 수정
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Chore: CI/CD 공통 작업 분리 및 CD 워크플로우 작성
* Feat: 버전 수정 1.1.1(22)
* Chore: 프로덕션으로 수정
* Hotfix/hpedia (#160)
* Rename: 네비게이션 이벤트 명 변경
* Feat: error state 추가
* Fix: UI state에서 throw를 처리하지 못하는 부분 수정
* Feat: type 설정 변경
* Feat: 변수 관리 조정 및 Error 상태 추가
* Chore: core-common 의존성 추가
* Delete: 토큰 재발급 임시 로직 삭제
* HotFix: Authenticator 토큰 재발급 및 에러메세지 전달 기능 수정
* Fix: Authenticator 적용
* Fix: api 호출부에 Authenticator 적용
* Delete: 안쓰는 api 삭제
* Refactor: FCM 초기화 및 초기 라우팅 코드 함수로 분리
* Delete: 임시 refreshToken 코드 관련 api 삭제
* Rename: 토큰 관련 클래스 의존성 주입 모듈 이름 수정
* Fix: 토큰 동적 할당 시점 변경
* Fix: 로그인 화면 이동 네비게이션 변경
* Chore: 버전 변경 (v1.1.1 -> v1.1.2)
* Chore: ci,cd 구문 변경 및 action.yml 파일 추가
* Fix: action.yml 추가 (#162)
* Chore: v1.1.1 - CD 작업 테스트
* Chore: 환경설정 구문 추가
* Fix: cdWorkflow 파일 수정
환경 설정 구문 삭제
* Fix: ciWorkFlow 파일 수정
환경설정 구문 삭제
* Update whatsnew-ko-KR.txt
* Fix: 파일 경로 오타 수정
* Fix: 파일 경로 오타 수정
* Fix: 깃헙 액션 워크플로우 일시 중지
* v1.1.1 release로 머지합니다 (#161)
* Chore: action/upload-artifact 버전 변경
* Delete: 필요없는 테스트 삭제
* Delete: 불필요 코드 제거
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Feat: 에러핸들링 메서드 추가
* Fix: 에러처리 구문 수정
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Chore: CI/CD 공통 작업 분리 및 CD 워크플로우 작성
* Feat: 버전 수정 1.1.1(22)
* Chore: 프로덕션으로 수정
* Hotfix/hpedia (#160)
* Rename: 네비게이션 이벤트 명 변경
* Feat: error state 추가
* Fix: UI state에서 throw를 처리하지 못하는 부분 수정
* Feat: type 설정 변경
* Feat: 변수 관리 조정 및 Error 상태 추가
* Fix: action.yml 추가 (#162)
* Chore: v1.1.1 - CD 작업 테스트
* Chore: 환경설정 구문 추가
* Fix: cdWorkflow 파일 수정
환경 설정 구문 삭제
* Fix: ciWorkFlow 파일 수정
환경설정 구문 삭제
* Update whatsnew-ko-KR.txt
* Fix: 파일 경로 오타 수정
* Fix: 파일 경로 오타 수정
* Fix: 깃헙 액션 워크플로우 일시 중지
---------
Co-authored-by: Seo Hojun <101941674+uselessnaming@users.noreply.github.com>
* Chore: ci/cd 워크플로우 임시로 주석처리 및 사용중지
* Chore: android.yml 워크플로우 일시중지 (#164)
* Chore: CI 구문 롤백 및 오작동 CI/CD 임시폴더로 분리
* Releasse/1.1.1 CI 구문 롤백 및 새로운 CI/CD 구문 분리 (#165)
* Chore: android.yml 워크플로우 일시중지
* Chore: 예전 CI 코드로 rollback 및 새로운 파일 분리
* Chore: actions upload-artifact 라이브러리 버전 업그레이드
* Rename: 이름 변경
* v1.1.1 버전 master로 머지합니다 (#163)
* Feat: Fcm 관련 함수 추가
* Chore: FCM 모듈 의존성 추가
* Feat: 알림 수신 여부 저장 이벤트 추가
* Feat: 알림 수신 여부 저장 이벤트 추가
* Chore: fcm 모듈 환경 설정 추가
* Feat: App Navigation 이벤트 추가
* Chore: FCM 모듈 환경 설정
* Resource: 아이콘 추가
* Feat: 알림 수신 여부 이벤트 추가
* Feat: 알림 화면 추가
* Feat: 알림 화면 비즈니스 로직 추가
* Feat: FCM 모듈 추가
* Feat: 알림 Response 모델 추가
* Feat: 알림 화면 네비게이션 추가
* Design: 읽음 여부에 따른 배경색 조절
* Test: 테스트 코드 추가
* Feat: App Scheme 추가
* Feat: Deeplink Navigation 추가
* Ignore
* Delete: sample-app 모듈 삭제
* Delete: Hhmoa_android_secret 로컬 폴더 삭제
* Design: Button 컴포넌트 disabled color 이름 적용
* Feat: Hbti설문 아이템 컴포넌트 추가
* Feat: ProgressBar 컴포넌트 생성
* Feat: VerticalStepBar 컴포넌트 생성
* Design: 홈화면 상단 로고 아이콘 추가
* Design: 디자인시스템 모듈 내 컴포넌트에 pretendard 폰트 적용
* Feat: profile 속성 추가
* Feat: send top notification 파라미터 수정
* Feat: profile 속성 추가
* Chore: Activity single top 속성 설정
* Fix: Error Ui State 업데이트 안되는 오류 수정
* Feat: deeplink 처리 함수 추가
* Refactor: Community, HPedia 네비게이션 분리
* Refactor: Community, HPedia 네비게이션 분리
* Feat: deeplink 설정
* Fix: 경로 설정 오류 수정
* Fix: deeplink 위치 오류 수정
* Fix: Response Dto 형식 오류 수정
* Design: Profile 반영
* Feat: 선택 이벤트 추가
* Feat: Navigation 설정
* Feat: 읽음 처리 함수 추가
* Fix: read 변경 가능하도록 수정
* Test: import 수정
* ignore: git pull
* Design: 색상 변경
* Feat: NoteImageItem 생성
* Feat: 권한 설정 여부 정보를 확인
* Feat: 권한 설정 함수 추가
* Ignore
* Ignore
* Feat: feature-hbti 모듈 생성
* Feat:선택지 무효화 기능 추가 및 SurveyOptionList로 수정
* Rename: SurveyOptionItem -> SurveyOptionList
* Feat: ProgressBarPreview에 +/- 효과 추가
* Chore: gradle 의존성 추가
* Fix: intent 이름 변경
* Feat: 알림 선택 시 읽음 처리 이벤트 추가
* Feat: 포그라운드 알림 처리
* Fix: Navigation Deeplink 오류 수정
* Chore: mockito 라이브러리 추가
* Feat: HbtiScreen 추가
* Chore: compose material 및 preview 라이브러리 추가
* Feat: Hbti화면 완성
* Design: 향BTI 화면 디자인 구성 완료
* Feat: 향BTI 테스트 데이터계층 클래스 생성
* Rename: SurveyAnswerResponseDto -> SurveyOptionResponseDto
* Feat: fcm token 저장 함수 추가
* Fix: 파라미터 이름 오류 수정
* Fix: 토큰 저장 알고리즘 수정
* Feat: 향수 추천 화면 추가
* Design: 공백 수정
* Feat: 데이터 계층 hilt 주입코드 추가
* Feat: HbtiSurvey 화면 추가(미완성)
* Feat: 가격 선택 화면 추가
* Design: 아이템 간 간격 조절
* Rename: 컴포넌트 이름 변경
* Rename: 컴포넌트 이름 변경
* Feat: 향료 선택 화면 추가
* Refactor: 화면 구성 변경
* Fix: 파라미터 변경
* Resource: icon 추가
* Fix: 파라미터 수정
* Feat: 향료 선택 화면 추가
* Style: 공백 스타일 변경
* Fix: 푸쉬 오류 수정
* Style: 코드 스타일 변경
* Feat: 향수 추천 결과 화면 추가
* Rename: 컴포넌트 이름 변경
* Ignore
* Delete
* Chore: test 라이브러리 추가
* Feat: HbtiSurveyViewmodel 생성
* Test: HbtiSurveyViewModel 테스트 생성
* Test: 테스트 기대값 수정
* Feat: Dto 추가
* Feat: Api 추가
* Style: 코드 라인 변경
* Feat: 비즈니스 로직 추가
* Remove: 삭제
* Feat: 향료 데이터 클래스 추가
* Comment: 주석 추가
* Fix: 서버에 정보 전달 로직 임의 대체
* Rename: 함수 명 변경
* Feat: 비즈니스 로직 추가
* Feat: 비즈니스 로직 추가
* Feat: 비즈니스 로직 추가
* Feat: UI 상태 기준 분기
* Feat: Navigation 설정
* Design: On/Off 버튼 디자인
* Test: UI 테스트
* Chore: Firebase 의존성 추가
* Feat: onNewToken 함수 추가
* Feat: 알림 On/Off 알고리즘 추가
* Test: Hbti2 API 테스트 세팅
* Docs: resource 위치 이동
* Chore: 권한 추가
* Remove: 불필요 함수 제거
* Refactor: 파라미터 수정
* Refactor: 파라미터 수정
* Refactor: 파라미터 수정
* Feat: 갤러리 권한 추가
* Refactor: 파라미터 수정
* Style: 공백 제거
* Refactor: 함수 변경
* Fix: 알림 설정 저장 오류 수정
* Feat: 권한 관련 Common 파일 추가
* Fix: Intent Flag 오류 수정
* Fix: 권한 허가 로직 수정
* Fix: Pending Intent 플래그 수정
* Fix: Pending Intent 플래그 수정
* Fix: Conflict
* Refactor: 조건 수정
* Style: 공백 정리
* Feat: Error State 추가
* Feat: Error State 추가
* Rename: View Model 이름 변경
* Style: 공백 제거
* Feat: UiState와 ErrorState combine
* Fix: 조건 수정
* Feat: Error 상태 관리 추가
* Feat: navigation ci옵션 추가
* Fix: Navigation 변경
* Feat: navigation 스택 제거 함수 추가
* Feat: navigation 스택 조정
* Feat: error state 추가
* Feat: error state 추가
* Feat: error state와 ui state 연결
* Hotfix: Token 오류 수정
* Feat: ErrorUiState 추가 및 유저화면 적용
* Chore: 버전코드 변경 12->13
* Hotfix: 토큰 빈값 방출 수정
* Hotfix: ErrorUiSetView onCloseClick 콜백 동작 수정 및 Rename
* Design: 에러메세지 문구 수정
* Chore: 버전코드 수정 13->14
* Feat: 토큰리프레싱 후 기존 토큰 삭제 과정 추가
* Fix: 비동기 처리 완료 후 네비게이팅 하도록 수정
* Hotfix: memberNotFoundError 처리 누락 추가
* Chore: 버전코드 수정 (14->15)
* Hotfix: hpedia 커뮤니티 MemberNotFound 상태변수 추가
* Chore: 15->16 버전 코드 수정
* Chore: 버전 코드 수정 16->17
* Hotfix: ErrorState 타입캐스팅 디버깅 구문 삭제
* Chore: 버전코드 수정 (17->18)
* Remove: 기능없는 이용약관 삭제
구글 Broken Functionality policy 위반을 피하기 위한 조치입니다!
* Delete: 서비스 알림 배너 삭제
* Chore: 패키지명 변경 hmoa -> hyangmoa
* Chore: 패키지 명 변경 (hmoa -> hyangmoa)
* Chore: 버전코드 1로 초기화
* Revert "Chore: 패키지 명 변경 (hmoa -> hyangmoa)"
This reverts commit 811f817ebf54089de05ebabe42bdee964b52d3e1.
* Revert "Chore: 버전코드 1로 초기화"
This reverts commit 529e65abe5c96a90943b6ffd466ae5a4742570ef.
* Revert "Chore: 패키지명 변경 hmoa -> hyangmoa"
This reverts commit bfe2d86153421276a831ad4e69dd4ab50dfee72c.
* Chore: 테스트 라이브러리 추가
* Test: DataPreference 인풋 아웃풋 비교 테스트 추가
* Chore: 테스트 라이브러리 라이브러리 변경
* Test: DataStorePreference 인풋, 아웃풋 결과값 테스트
* Fix: 토큰이 null일 경우 빈 문자열 처리
* Feat: 이용약관 및 개인정보처리방침 url 수정
* Delete: 주석 삭제
* HotFix: 토큰 빈값 나오는 현상 수정
* HotFix: 토큰 초기화 및 유지 이슈 해결
* Chore: apk 파일 추출 명령어 추가
* Chore: 깃허브 시크릿 카피 스크립트 파일 추가
* Chore: APK 명령어는 master에서만 실행하도록 수정
* Delete: CI환경에 부적합 + 필요없음
* Delete: PR할 때만 CI되도록 수정
* Delete
* Delete
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Ignore
* Chore: 업데이트 버전명 수정 1.0.0 -> 1.1.0
* Fix: 버전정보 매개변수로 주입하기 추가
* Design: 로그인 버튼 마진 및 구글아이콘 수정
* Design: 향수 검색 화면 마진 수정
* Update README.md
* Update README.md
* Update README.md
* Design: 디자인 디테일 수정 (패딩 및 아이콘 크기)
* Design: 아이콘 크기 변경
* Chore: 버전 코드 증가(18->19)
* Design: 스위치 on포인트 색상 변경
* Chore: targetSdk 업그레이드 (33 -> 34)
* Chore: 버전코드 업데이트
* Chore: action/upload-artifact 버전 변경
* v1.1.1 release로 머지합니다 (#161)
* Chore: action/upload-artifact 버전 변경
* Delete: 필요없는 테스트 삭제
* Delete: 불필요 코드 제거
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Feat: 에러핸들링 메서드 추가
* Fix: 에러처리 구문 수정
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Chore: CI/CD 공통 작업 분리 및 CD 워크플로우 작성
* Feat: 버전 수정 1.1.1(22)
* Chore: 프로덕션으로 수정
* Hotfix/hpedia (#160)
* Rename: 네비게이션 이벤트 명 변경
* Feat: error state 추가
* Fix: UI state에서 throw를 처리하지 못하는 부분 수정
* Feat: type 설정 변경
* Feat: 변수 관리 조정 및 Error 상태 추가
* Fix: action.yml 추가 (#162)
* Chore: v1.1.1 - CD 작업 테스트
* Chore: 환경설정 구문 추가
* Fix: cdWorkflow 파일 수정
환경 설정 구문 삭제
* Fix: ciWorkFlow 파일 수정
환경설정 구문 삭제
* Update whatsnew-ko-KR.txt
* Fix: 파일 경로 오타 수정
* Fix: 파일 경로 오타 수정
* Fix: 깃헙 액션 워크플로우 일시 중지
---------
Co-authored-by: Seo Hojun <101941674+uselessnaming@users.noreply.github.com>
* Chore: android.yml 워크플로우 일시중지 (#164)
* Releasse/1.1.1 CI 구문 롤백 및 새로운 CI/CD 구문 분리 (#165)
* Chore: android.yml 워크플로우 일시중지
* Chore: 예전 CI 코드로 rollback 및 새로운 파일 분리
* Chore: actions upload-artifact 라이브러리 버전 업그레이드
* Rename: 이름 변경
---------
Co-authored-by: uselessNaming
Co-authored-by: Seo Hojun <101941674+uselessnaming@users.noreply.github.com>
* Fix: 파라미터 명시적으로 구분
* Fix: RouteScreen 파라미터 변수명 변경 반영
* Chore: 버전코드 수정 22->23
* Ignore
* Fix: 백업데이터 설정 해제
* Chore: 버전 업데이트
* Release 1.1.2버전 master로 푸시 (#167)
* Feat: Fcm 관련 함수 추가
* Chore: FCM 모듈 의존성 추가
* Feat: 알림 수신 여부 저장 이벤트 추가
* Feat: 알림 수신 여부 저장 이벤트 추가
* Chore: fcm 모듈 환경 설정 추가
* Feat: App Navigation 이벤트 추가
* Chore: FCM 모듈 환경 설정
* Resource: 아이콘 추가
* Feat: 알림 수신 여부 이벤트 추가
* Feat: 알림 화면 추가
* Feat: 알림 화면 비즈니스 로직 추가
* Feat: FCM 모듈 추가
* Feat: 알림 Response 모델 추가
* Feat: 알림 화면 네비게이션 추가
* Design: 읽음 여부에 따른 배경색 조절
* Test: 테스트 코드 추가
* Feat: App Scheme 추가
* Feat: Deeplink Navigation 추가
* Ignore
* Delete: sample-app 모듈 삭제
* Delete: Hhmoa_android_secret 로컬 폴더 삭제
* Design: Button 컴포넌트 disabled color 이름 적용
* Feat: Hbti설문 아이템 컴포넌트 추가
* Feat: ProgressBar 컴포넌트 생성
* Feat: VerticalStepBar 컴포넌트 생성
* Design: 홈화면 상단 로고 아이콘 추가
* Design: 디자인시스템 모듈 내 컴포넌트에 pretendard 폰트 적용
* Feat: profile 속성 추가
* Feat: send top notification 파라미터 수정
* Feat: profile 속성 추가
* Chore: Activity single top 속성 설정
* Fix: Error Ui State 업데이트 안되는 오류 수정
* Feat: deeplink 처리 함수 추가
* Refactor: Community, HPedia 네비게이션 분리
* Refactor: Community, HPedia 네비게이션 분리
* Feat: deeplink 설정
* Fix: 경로 설정 오류 수정
* Fix: deeplink 위치 오류 수정
* Fix: Response Dto 형식 오류 수정
* Design: Profile 반영
* Feat: 선택 이벤트 추가
* Feat: Navigation 설정
* Feat: 읽음 처리 함수 추가
* Fix: read 변경 가능하도록 수정
* Test: import 수정
* ignore: git pull
* Design: 색상 변경
* Feat: NoteImageItem 생성
* Feat: 권한 설정 여부 정보를 확인
* Feat: 권한 설정 함수 추가
* Ignore
* Ignore
* Feat: feature-hbti 모듈 생성
* Feat:선택지 무효화 기능 추가 및 SurveyOptionList로 수정
* Rename: SurveyOptionItem -> SurveyOptionList
* Feat: ProgressBarPreview에 +/- 효과 추가
* Chore: gradle 의존성 추가
* Fix: intent 이름 변경
* Feat: 알림 선택 시 읽음 처리 이벤트 추가
* Feat: 포그라운드 알림 처리
* Fix: Navigation Deeplink 오류 수정
* Chore: mockito 라이브러리 추가
* Feat: HbtiScreen 추가
* Chore: compose material 및 preview 라이브러리 추가
* Feat: Hbti화면 완성
* Design: 향BTI 화면 디자인 구성 완료
* Feat: 향BTI 테스트 데이터계층 클래스 생성
* Rename: SurveyAnswerResponseDto -> SurveyOptionResponseDto
* Feat: fcm token 저장 함수 추가
* Fix: 파라미터 이름 오류 수정
* Fix: 토큰 저장 알고리즘 수정
* Feat: 향수 추천 화면 추가
* Design: 공백 수정
* Feat: 데이터 계층 hilt 주입코드 추가
* Feat: HbtiSurvey 화면 추가(미완성)
* Feat: 가격 선택 화면 추가
* Design: 아이템 간 간격 조절
* Rename: 컴포넌트 이름 변경
* Rename: 컴포넌트 이름 변경
* Feat: 향료 선택 화면 추가
* Refactor: 화면 구성 변경
* Fix: 파라미터 변경
* Resource: icon 추가
* Fix: 파라미터 수정
* Feat: 향료 선택 화면 추가
* Style: 공백 스타일 변경
* Fix: 푸쉬 오류 수정
* Style: 코드 스타일 변경
* Feat: 향수 추천 결과 화면 추가
* Rename: 컴포넌트 이름 변경
* Ignore
* Delete
* Chore: test 라이브러리 추가
* Feat: HbtiSurveyViewmodel 생성
* Test: HbtiSurveyViewModel 테스트 생성
* Test: 테스트 기대값 수정
* Feat: Dto 추가
* Feat: Api 추가
* Style: 코드 라인 변경
* Feat: 비즈니스 로직 추가
* Remove: 삭제
* Feat: 향료 데이터 클래스 추가
* Comment: 주석 추가
* Fix: 서버에 정보 전달 로직 임의 대체
* Rename: 함수 명 변경
* Feat: 비즈니스 로직 추가
* Feat: 비즈니스 로직 추가
* Feat: 비즈니스 로직 추가
* Feat: UI 상태 기준 분기
* Feat: Navigation 설정
* Design: On/Off 버튼 디자인
* Test: UI 테스트
* Chore: Firebase 의존성 추가
* Feat: onNewToken 함수 추가
* Feat: 알림 On/Off 알고리즘 추가
* Test: Hbti2 API 테스트 세팅
* Docs: resource 위치 이동
* Chore: 권한 추가
* Remove: 불필요 함수 제거
* Refactor: 파라미터 수정
* Refactor: 파라미터 수정
* Refactor: 파라미터 수정
* Feat: 갤러리 권한 추가
* Refactor: 파라미터 수정
* Style: 공백 제거
* Refactor: 함수 변경
* Fix: 알림 설정 저장 오류 수정
* Feat: 권한 관련 Common 파일 추가
* Fix: Intent Flag 오류 수정
* Fix: 권한 허가 로직 수정
* Fix: Pending Intent 플래그 수정
* Fix: Pending Intent 플래그 수정
* Fix: Conflict
* Refactor: 조건 수정
* Style: 공백 정리
* Feat: Error State 추가
* Feat: Error State 추가
* Rename: View Model 이름 변경
* Style: 공백 제거
* Feat: UiState와 ErrorState combine
* Fix: 조건 수정
* Feat: Error 상태 관리 추가
* Feat: navigation ci옵션 추가
* Fix: Navigation 변경
* Feat: navigation 스택 제거 함수 추가
* Feat: navigation 스택 조정
* Feat: error state 추가
* Feat: error state 추가
* Feat: error state와 ui state 연결
* Hotfix: Token 오류 수정
* Feat: ErrorUiState 추가 및 유저화면 적용
* Chore: 버전코드 변경 12->13
* Hotfix: 토큰 빈값 방출 수정
* Hotfix: ErrorUiSetView onCloseClick 콜백 동작 수정 및 Rename
* Design: 에러메세지 문구 수정
* Chore: 버전코드 수정 13->14
* Feat: 토큰리프레싱 후 기존 토큰 삭제 과정 추가
* Fix: 비동기 처리 완료 후 네비게이팅 하도록 수정
* Hotfix: memberNotFoundError 처리 누락 추가
* Chore: 버전코드 수정 (14->15)
* Hotfix: hpedia 커뮤니티 MemberNotFound 상태변수 추가
* Chore: 15->16 버전 코드 수정
* Chore: 버전 코드 수정 16->17
* Hotfix: ErrorState 타입캐스팅 디버깅 구문 삭제
* Chore: 버전코드 수정 (17->18)
* Remove: 기능없는 이용약관 삭제
구글 Broken Functionality policy 위반을 피하기 위한 조치입니다!
* Delete: 서비스 알림 배너 삭제
* Chore: 패키지명 변경 hmoa -> hyangmoa
* Chore: 패키지 명 변경 (hmoa -> hyangmoa)
* Chore: 버전코드 1로 초기화
* Revert "Chore: 패키지 명 변경 (hmoa -> hyangmoa)"
This reverts commit 811f817ebf54089de05ebabe42bdee964b52d3e1.
* Revert "Chore: 버전코드 1로 초기화"
This reverts commit 529e65abe5c96a90943b6ffd466ae5a4742570ef.
* Revert "Chore: 패키지명 변경 hmoa -> hyangmoa"
This reverts commit bfe2d86153421276a831ad4e69dd4ab50dfee72c.
* Chore: 테스트 라이브러리 추가
* Test: DataPreference 인풋 아웃풋 비교 테스트 추가
* Chore: 테스트 라이브러리 라이브러리 변경
* Test: DataStorePreference 인풋, 아웃풋 결과값 테스트
* Fix: 토큰이 null일 경우 빈 문자열 처리
* Feat: 이용약관 및 개인정보처리방침 url 수정
* Delete: 주석 삭제
* HotFix: 토큰 빈값 나오는 현상 수정
* HotFix: 토큰 초기화 및 유지 이슈 해결
* Chore: apk 파일 추출 명령어 추가
* Chore: 깃허브 시크릿 카피 스크립트 파일 추가
* Chore: APK 명령어는 master에서만 실행하도록 수정
* Delete: CI환경에 부적합 + 필요없음
* Delete: PR할 때만 CI되도록 수정
* Delete
* Delete
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Ignore
* Chore: 업데이트 버전명 수정 1.0.0 -> 1.1.0
* Fix: 버전정보 매개변수로 주입하기 추가
* Design: 로그인 버튼 마진 및 구글아이콘 수정
* Design: 향수 검색 화면 마진 수정
* Update README.md
* Update README.md
* Update README.md
* Design: 디자인 디테일 수정 (패딩 및 아이콘 크기)
* Design: 아이콘 크기 변경
* Chore: 버전 코드 증가(18->19)
* Design: 스위치 on포인트 색상 변경
* Chore: targetSdk 업그레이드 (33 -> 34)
* Chore: 버전코드 업데이트
* Chore: action/upload-artifact 버전 변경
* v1.1.1 release로 머지합니다 (#161)
* Chore: action/upload-artifact 버전 변경
* Delete: 필요없는 테스트 삭제
* Delete: 불필요 코드 제거
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Feat: 에러핸들링 메서드 추가
* Fix: 에러처리 구문 수정
* Hotfix: 토큰 리프레시 작업 반복구문 추가
* Chore: CI/CD 공통 작업 분리 및 CD 워크플로우 작성
* Feat: 버전 수정 1.1.1(22)
* Chore: 프로덕션으로 수정
* Hotfix/hpedia (#160)
* Rename: 네비게이션 이벤트 명 변경
* Feat: error state 추가
* Fix: UI state에서 throw를 처리하지 못하는 부분 수정
* Feat: type 설정 변경
* Feat: 변수 관리 조정 및 Error 상태 추가
* Fix: action.yml 추가 (#162)
* Chore: v1.1.1 - CD 작업 테스트
* Chore: 환경설정 구문 추가
* Fix: cdWorkflow 파일 수정
환경 설정 구문 삭제
* Fix: ciWorkFlow 파일 수정
환경설정 구문 삭제
* Update whatsnew-ko-KR.txt
* Fix: 파일 경로 오타 수정
* Fix: 파일 경로 오타 수정
* Fix: 깃헙 액션 워크플로우 일시 중지
---------
Co-authored-by: Seo Hojun <101941674+uselessnaming@users.noreply.github.com>
* Chore: android.yml 워크플로우 일시중지 (#164)
* Releasse/1.1.1 CI 구문 롤백 및 새로운 CI/CD 구문 분리 (#165)
* Chore: android.yml 워크플로우 일시중지
* Chore: 예전 CI 코드로 rollback 및 새로운 파일 분리
* Chore: actions upload-artifact 라이브러리 버전 업그레이드
* Rename: 이름 변경
---------
Co-authored-by: uselessNaming
Co-authored-by: Seo Hojun <101941674+uselessnaming@users.noreply.github.com>
* Revert "Chore: 버전 업데이트"
This reverts commit 031fc2f141d3ffbc07b0954eda874c58d7e1c834.
* Revert "Fix: 백업데이터 설정 해제"
This reverts commit bb68a8d265be89d74bcc2feed66baca5355cd475.
* HotFix: 카카오 sdk 버전 업그레이드
* HotFix: 카카오 sdk 버전 업그레이드 (#170)
* HotFix: 카카오 sdk 버전 업그레이드
* Feat: gradlew clean 작업 추가
* Delete
* Delete: refreshToken 추상메서드 삭제
* Delete: 토큰 리프레싱 임시방안 코드 삭제
* HotFix: 카카오 sdk 버전 업그레이드 (#174)
* Hotfix/community (#176)
* Fix: 좋아요 반영 안되는 오류 수정
* Fix: response에 wrapping 추가
* Design: 내용 및 사진 누락 추가
* Fix: response wrapping
* Design: 디자인 누락 추가
* Refactor: 불필요 로직 삭제
* Feat: 파라미터 명 변경
* Design: 버튼 가려지는 현상 수정
* Fix: hbti 향료개수 자유선택 후 튕기는 현상 수정
* Fix: hbti 향료 선택결과 제출로직 변경
* Fix: hbti 향료선택화면 하단버튼 disabled 상태관리 추가
* Fix: hbti 향료 카테고리 선택화면 로직 변경 반영
* Test: hbti 향료 카테고리 선택화면 로직 변경사항 테스트
* Design: 백버튼 추가
* Feat: 향료 제품 가격 추가
* Refactor: 플래그 제거 및 콜백으로 대체
* Design: 디자인 마진 변경
---------
Co-authored-by: Lee YongIn <67788699+LeeYongIn0517@users.noreply.github.com>
Co-authored-by: 이용인
---
.github/temporary/action.yml | 40 ++++
.github/temporary/cdWorkflow.yml | 56 +++++
.github/temporary/ciWorkflow.yml | 34 +++
.github/temporary/gradleCaching.yml | 16 ++
.github/temporary/setup-jdk.yml | 13 ++
.github/temporary/whatsnew-ko-KR.txt | 1 +
.github/workflows/android.yml | 14 +-
.idea/deploymentTargetSelector.xml | 8 +
.idea/git_toolbox_blame.xml | 6 +
.idea/other.xml | 11 +
.../inspectionProfiles/Project_Default.xml | 41 ++++
Hhmoa_android_scecret/.idea/vcs.xml | 7 +
Hhmoa_android_scecret/.idea/workspace.xml | 61 +++++
README.md | 57 ++++-
app/build.gradle.kts | 21 +-
app/src/main/AndroidManifest.xml | 1 +
.../main/java/com/hmoa/app/AppViewModel.kt | 24 +-
.../main/java/com/hmoa/app/FcmAppService.kt | 5 +-
.../main/java/com/hmoa/app/MainActivity.kt | 188 +++++++--------
.../java/com/hmoa/app/navigation/NavHost.kt | 118 +++-------
.../hmoa/core_common/ErrorHandleFunctions.kt | 6 +
.../com/hmoa/core_common/ErrorMessageType.kt | 3 +-
.../java/com/hmoa/core_common/ErrorUiState.kt | 1 +
.../com/hmoa/core_common/ManagePermission.kt | 20 ++
core-database/build.gradle.kts | 25 +-
.../com/hmoa/core_database/AppInfoManager.kt | 2 +
.../hmoa/core_database/AppInfoManagerImpl.kt | 13 +-
.../hmoa/core_database/TokenManagerImpl.kt | 3 +
.../com/hmoa/core_database/ExampleUnitTest.kt | 17 --
.../core_datastore/Admin/AdminDataStore.kt | 12 -
.../Admin/AdminDataStoreImpl.kt | 30 ---
.../core_datastore/Brand/BrandDataStore.kt | 3 -
.../Brand/BrandDataStoreImpl.kt | 56 +++--
.../BrandHPedia/BrandHPediaDataStore.kt | 10 +-
.../BrandHPedia/BrandHPediaDataStoreImpl.kt | 12 -
.../Community/CommunityDataStoreImpl.kt | 101 ++++++--
.../CommunityCommentDataStoreImpl.kt | 92 ++++++--
.../hmoa/core_datastore/DatastoreModule.kt | 5 -
.../Fcm/FcmRemoteDataStoreImpl.kt | 53 +++--
.../Login/LoginRemoteDataStoreImpl.kt | 25 +-
.../Magazine/MagazineDataStoreImpl.kt | 67 ++++--
.../core_datastore/Main/MainDataStoreImpl.kt | 52 +++--
.../Member/MemberDataStoreImpl.kt | 191 +++++++++------
.../core_datastore/Note/NoteDataStoreImpl.kt | 24 +-
.../Perfume/PerfumeDataStoreImpl.kt | 95 +++++---
.../PerfumeCommentDataStoreImpl.kt | 47 +++-
.../Perfumer/PerfumerDataStoreImpl.kt | 17 +-
.../core_datastore/Report/ReportDataStore.kt | 4 +-
.../Report/ReportDataStoreImpl.kt | 47 +++-
.../Search/SearchDataStoreImpl.kt | 52 +++--
.../Survey/SurveyRemoteDataStoreImpl.kt | 77 +++++--
.../core_datastore/Term/TermDataStoreImpl.kt | 15 +-
.../core_designsystem/component/Button.kt | 9 +-
.../core_designsystem/component/Comment.kt | 50 ++--
.../component/ErrorUiSetView.kt | 152 ++++++------
.../component/MagazineTag.kt | 47 ++++
.../component/OAuthLoginButton.kt | 49 ++--
.../component/OnAndOffBtn.kt | 55 ++++-
.../component/PerfumeItemView.kt | 2 +-
.../component/PostContent.kt | 122 ++++++----
.../component/SurveyOptionList.kt | 4 +-
.../core_designsystem/component/TopBar.kt | 32 ++-
.../core_designsystem/theme/CustomColor.kt | 1 +
.../src/main/res/drawable/checked_btn.xml | 14 ++
.../src/main/res/drawable/ic_google.xml | 18 ++
.../src/main/res/drawable/not_checked_btn.xml | 11 +
.../main/res/drawable/profile_edit_btn.xml | 16 ++
.../main/res/mipmap-anydpi-v26/ic_google.xml | 5 -
.../res/mipmap-anydpi-v26/ic_google_round.xml | 5 -
.../src/main/res/mipmap-hdpi/ic_google.webp | Bin 2484 -> 0 bytes
.../res/mipmap-hdpi/ic_google_foreground.webp | Bin 1448 -> 0 bytes
.../main/res/mipmap-hdpi/ic_google_round.webp | Bin 4456 -> 0 bytes
.../src/main/res/mipmap-mdpi/ic_google.webp | Bin 2130 -> 0 bytes
.../res/mipmap-mdpi/ic_google_foreground.webp | Bin 1344 -> 0 bytes
.../main/res/mipmap-mdpi/ic_google_round.webp | Bin 2964 -> 0 bytes
.../src/main/res/mipmap-xhdpi/ic_google.webp | Bin 3764 -> 0 bytes
.../mipmap-xhdpi/ic_google_foreground.webp | Bin 1372 -> 0 bytes
.../res/mipmap-xhdpi/ic_google_round.webp | Bin 5828 -> 0 bytes
.../src/main/res/mipmap-xxhdpi/ic_google.webp | Bin 4580 -> 0 bytes
.../mipmap-xxhdpi/ic_google_foreground.webp | Bin 1350 -> 0 bytes
.../res/mipmap-xxhdpi/ic_google_round.webp | Bin 8780 -> 0 bytes
.../main/res/mipmap-xxxhdpi/ic_google.webp | Bin 6128 -> 0 bytes
.../mipmap-xxxhdpi/ic_google_foreground.webp | Bin 1420 -> 0 bytes
.../res/mipmap-xxxhdpi/ic_google_round.webp | Bin 11158 -> 0 bytes
.../hmoa/core_domain/ErrorHandleFunctions.kt | 15 ++
.../entity/data/NoteOrderQuantity.kt | 2 +-
.../entity/navigation/HbtiRoute.kt | 1 -
.../core_domain/repository/AdminRepository.kt | 12 -
.../repository/BrandHPediaRepository.kt | 7 -
.../core_domain/repository/BrandRepository.kt | 3 -
.../repository/ReportRepository.kt | 4 +-
.../core_domain/usecase/GetPerfumeUsecase.kt | 67 +++---
.../usecase/UpdatePerfumeAgeUseCase.kt | 3 +-
.../com/hmoa/core_model/data/NoteSelect.kt | 7 +
.../core_model/response/ProductResponseDto.kt | 3 +-
core-network/build.gradle.kts | 2 +-
.../authentication/AuthAuthenticator.kt | 57 -----
.../authentication/Authenticator.kt | 21 ++
.../authentication/AuthenticatorImpl.kt | 93 ++++++++
.../authentication/RefreshTokenManager.kt | 2 +
.../authentication/RefreshTokenManagerImpl.kt | 34 ++-
...catorModule.kt => AuthenticationModule.kt} | 6 +-
.../com/hmoa/core_network/di/ServiceModule.kt | 36 +--
.../hmoa/core_network/service/AdminService.kt | 26 ---
.../service/BrandHPediaService.kt | 11 -
.../hmoa/core_network/service/BrandService.kt | 15 --
.../core_network/service/ReportService.kt | 4 +-
.../core_repository/AdminRepositoryImpl.kt | 30 ---
.../BrandHPediaRepositoryImpl.kt | 12 -
.../core_repository/BrandRepositoryImpl.kt | 13 --
.../core_repository/LoginRepositoryImpl.kt | 1 +
.../core_repository/ReportRepositoryImpl.kt | 4 +-
.../hmoa/core_repository/RepositoryModule.kt | 29 +--
feature-authentication/build.gradle.kts | 13 +-
.../feature_authentication/LoginScreen.kt | 6 +-
.../feature_brand/screen/BrandSearchScreen.kt | 25 +-
.../feature_community/Navigation/NavGraph.kt | 45 ++--
.../Screen/CommunityDescriptionPage.kt | 182 +++++++--------
.../Screen/CommunityEditPage.kt | 12 +-
.../feature_community/Screen/CommunityHome.kt | 57 ++---
.../Screen/CommunityPreview.kt | 42 +---
.../Screen/CommunitySearchPage.kt | 105 +++++----
.../CommunityCommentEditViewModel.kt | 78 ++++---
.../ViewModel/CommunityDescViewModel.kt | 194 +++++++---------
.../ViewModel/CommunityEditViewModel.kt | 95 ++++----
.../ViewModel/CommunityHomeViewModel.kt | 23 +-
.../ViewModel/CommunityMainViewModel.kt | 26 +--
.../ViewModel/CommunitySearchViewModel.kt | 62 +++--
.../java/com/hmoa/feature_fcm/AlarmScreen.kt | 9 +-
feature-hbti/build.gradle.kts | 1 -
.../hmoa/feature_hbti/NoteOrderQuantity.kt | 5 +
.../feature_hbti/navigation/HbtiNavigation.kt | 166 +++++++-------
.../hmoa/feature_hbti/navigation/HbtiRoute.kt | 0
.../feature_hbti/screen/AddAddressScreen.kt | 162 +++++++------
.../feature_hbti/screen/EditReviewScreen.kt | 100 ++++----
.../feature_hbti/screen/HbtiProcessScreen.kt | 12 +-
.../hmoa/feature_hbti/screen/HbtiScreen.kt | 206 ++++++++---------
.../screen/HbtiSurveyLoadingScreen.kt | 16 +-
.../screen/HbtiSurveyResultScreen.kt | 10 +-
.../feature_hbti/screen/HbtiSurveyScreen.kt | 20 +-
.../screen/NoteOrderQuantityPickScreen.kt | 61 ++++-
.../screen/NotePickResultScreen.kt | 24 +-
.../feature_hbti/screen/NotePickScreen.kt | 72 +++---
.../hmoa/feature_hbti/screen/OrderScreen.kt | 147 ++++++------
.../PerfumeRecommendationResultScreen.kt | 31 +--
.../screen/PerfumeRecommendationScreen.kt | 38 +--
.../hmoa/feature_hbti/screen/ReviewScreen.kt | 81 ++++---
.../viewmodel/NotePickViewmodel.kt | 55 ++---
.../PerfumeRecommendationResultViewModel.kt | 5 +-
.../PerfumeRecommendationViewModel.kt | 6 +-
.../feature_hbti/NotePickViewmodelTest.kt | 217 +++++++-----------
.../hmoa/feature_hbti/TestCoroutineRule.kt | 1 -
.../feature_home/screen/AllPerfumeScreen.kt | 12 +-
.../hmoa/feature_home/screen/HomeScreen.kt | 13 +-
.../screen/PerfumeSearchScreen.kt | 74 +++++-
.../feature_hpedia/Screen/HPediaDescScreen.kt | 26 ++-
.../ViewModel/HPediaDescViewModel.kt | 178 +++++++-------
.../feature_magazine/Screen/MagazineDesc.kt | 191 +++++++--------
.../feature_magazine/Screen/MagazineMain.kt | 113 +++++----
.../feature_perfume/screen/PerfumeScreen.kt | 7 +-
.../viewmodel/PerfumeViewmodel.kt | 50 ++--
feature-userInfo/build.gradle.kts | 11 +-
.../Screen/EditProfilePage.kt | 118 +++++-----
.../feature_userinfo/Screen/MyBirthPage.kt | 50 ++--
.../feature_userinfo/Screen/MyCommentPage.kt | 43 +---
.../Screen/MyFavoriteCommentPage.kt | 46 ++--
.../Screen/MyFavoritePrefumePage.kt | 56 ++---
.../feature_userinfo/Screen/MyGenderPage.kt | 45 ++--
.../hmoa/feature_userinfo/Screen/MyPage.kt | 115 ++++++----
.../hmoa/feature_userinfo/Screen/MyReview.kt | 33 +--
.../Screen/OrderRecordPage.kt | 51 ++--
.../feature_userinfo/Screen/RefundPage.kt | 31 ++-
.../Screen/RefundRecordPage.kt | 81 +++----
.../feature_userinfo/navigation/NavGraph.kt | 60 ++---
.../viewModel/MyBirthViewModel.kt | 65 ++++--
.../viewModel/MyGenderViewModel.kt | 66 ++++--
.../viewModel/MyPageViewModel.kt | 104 +++++++--
177 files changed, 3930 insertions(+), 3130 deletions(-)
create mode 100644 .github/temporary/action.yml
create mode 100644 .github/temporary/cdWorkflow.yml
create mode 100644 .github/temporary/ciWorkflow.yml
create mode 100644 .github/temporary/gradleCaching.yml
create mode 100644 .github/temporary/setup-jdk.yml
create mode 100644 .github/temporary/whatsnew-ko-KR.txt
create mode 100644 .idea/git_toolbox_blame.xml
create mode 100644 Hhmoa_android_scecret/.idea/inspectionProfiles/Project_Default.xml
create mode 100644 Hhmoa_android_scecret/.idea/vcs.xml
create mode 100644 Hhmoa_android_scecret/.idea/workspace.xml
create mode 100644 core-common/src/main/java/com/hmoa/core_common/ManagePermission.kt
delete mode 100644 core-database/src/test/java/com/hmoa/core_database/ExampleUnitTest.kt
delete mode 100644 core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStore.kt
delete mode 100644 core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStoreImpl.kt
create mode 100644 core-designsystem/src/main/java/com/hmoa/core_designsystem/component/MagazineTag.kt
create mode 100644 core-designsystem/src/main/res/drawable/checked_btn.xml
create mode 100644 core-designsystem/src/main/res/drawable/ic_google.xml
create mode 100644 core-designsystem/src/main/res/drawable/not_checked_btn.xml
create mode 100644 core-designsystem/src/main/res/drawable/profile_edit_btn.xml
delete mode 100644 core-designsystem/src/main/res/mipmap-anydpi-v26/ic_google.xml
delete mode 100644 core-designsystem/src/main/res/mipmap-anydpi-v26/ic_google_round.xml
delete mode 100644 core-designsystem/src/main/res/mipmap-hdpi/ic_google.webp
delete mode 100644 core-designsystem/src/main/res/mipmap-hdpi/ic_google_foreground.webp
delete mode 100644 core-designsystem/src/main/res/mipmap-hdpi/ic_google_round.webp
delete mode 100644 core-designsystem/src/main/res/mipmap-mdpi/ic_google.webp
delete mode 100644 core-designsystem/src/main/res/mipmap-mdpi/ic_google_foreground.webp
delete mode 100644 core-designsystem/src/main/res/mipmap-mdpi/ic_google_round.webp
delete mode 100644 core-designsystem/src/main/res/mipmap-xhdpi/ic_google.webp
delete mode 100644 core-designsystem/src/main/res/mipmap-xhdpi/ic_google_foreground.webp
delete mode 100644 core-designsystem/src/main/res/mipmap-xhdpi/ic_google_round.webp
delete mode 100644 core-designsystem/src/main/res/mipmap-xxhdpi/ic_google.webp
delete mode 100644 core-designsystem/src/main/res/mipmap-xxhdpi/ic_google_foreground.webp
delete mode 100644 core-designsystem/src/main/res/mipmap-xxhdpi/ic_google_round.webp
delete mode 100644 core-designsystem/src/main/res/mipmap-xxxhdpi/ic_google.webp
delete mode 100644 core-designsystem/src/main/res/mipmap-xxxhdpi/ic_google_foreground.webp
delete mode 100644 core-designsystem/src/main/res/mipmap-xxxhdpi/ic_google_round.webp
create mode 100644 core-domain/src/main/java/com/hmoa/core_domain/ErrorHandleFunctions.kt
delete mode 100644 core-domain/src/main/java/com/hmoa/core_domain/repository/AdminRepository.kt
create mode 100644 core-model/src/main/java/com/hmoa/core_model/data/NoteSelect.kt
delete mode 100644 core-network/src/main/java/com/hmoa/core_network/authentication/AuthAuthenticator.kt
create mode 100644 core-network/src/main/java/com/hmoa/core_network/authentication/Authenticator.kt
create mode 100644 core-network/src/main/java/com/hmoa/core_network/authentication/AuthenticatorImpl.kt
rename core-network/src/main/java/com/hmoa/core_network/di/{AuthenticatorModule.kt => AuthenticationModule.kt} (80%)
delete mode 100644 core-network/src/main/java/com/hmoa/core_network/service/AdminService.kt
delete mode 100644 core-repository/src/main/java/com/hmoa/core_repository/AdminRepositoryImpl.kt
create mode 100644 feature-hbti/src/main/java/com/hmoa/feature_hbti/NoteOrderQuantity.kt
create mode 100644 feature-hbti/src/main/java/com/hmoa/feature_hbti/navigation/HbtiRoute.kt
diff --git a/.github/temporary/action.yml b/.github/temporary/action.yml
new file mode 100644
index 000000000..c91fb12f5
--- /dev/null
+++ b/.github/temporary/action.yml
@@ -0,0 +1,40 @@
+name: Conditional Workflows
+
+on:
+ workflow_dispatch:
+#on:
+# push:
+# branches:
+# - develop
+# - release
+# - master
+#
+#jobs:
+# ci-workflow:
+# runs-on: ubuntu-latest
+# if: contains(github.event.head_commit.message, '[CI]')
+# steps:
+# - uses: actions/checkout@v4
+#
+# - name: Setup JDK
+# uses: ./.github/workflows/setup-jdk.yml
+#
+# - name: Run CI workflow
+# run: |
+# gh workflow run ciWorkflow.yml
+#
+# cd-workflow:
+# runs-on: ubuntu-latest
+# if: contains(github.event.head_commit.message, '[CD]')
+# steps:
+# - uses: actions/checkout@v4
+#
+# - name: Setup JDK
+# uses: ./.github/workflows/setup-jdk.yml
+#
+# - name: Checkout repository
+# uses: actions/checkout@v4
+#
+# - name: Run CD workflow
+# run: |
+# gh workflow run cdWorkflow.yml
diff --git a/.github/temporary/cdWorkflow.yml b/.github/temporary/cdWorkflow.yml
new file mode 100644
index 000000000..8a814611c
--- /dev/null
+++ b/.github/temporary/cdWorkflow.yml
@@ -0,0 +1,56 @@
+name: Android develop CD
+
+on:
+ push:
+ branches:
+ - "master"
+
+jobs:
+ cd:
+
+ runs-on: ubuntu-latest
+ env:
+ HMOA_ANDROID_SECRET_TOKEN: ${{secrets.HMOA_ANDROID_SECRET_TOKEN}}
+ RELEASE_KEYSTORE: ${{secrets.RELEASE_KEYSTORE}}
+ KEY_ALIAS: ${{secrets.KEY_ALIAS}}
+ KEY_STORE_PASSWORD: ${{KEY_STORE_PASSWORD}}
+ KEY_PASSWORD: ${{KEY_PASSWORD}}
+ SERVICE_ACCOUNT_JSON: ${{ SERVICE_ACCOUNT_JSON }}
+
+ steps:
+ - name: Grant execute permissions for scripts
+ run: |
+ chmod +x ./copy-hmoa-android-secrets.sh
+
+ - name: Generate release.keystore
+ run: echo '${{ secrets.RELEASE_KEYSTORE }}' | base64 --d > ./app/release.keystore
+
+ - name: Run copy secrets
+ run: ./copy-hmoa-android-secrets.sh
+
+ - name: Gradle Caching
+ uses: ./.github/workflows/gradleCaching.yml
+
+ - name: Grant execute permission for gradlew
+ run: chmod +x gradlew
+
+ - name: Build release AAB
+ run: ./gradlew bundleRelease
+
+ - name: Sign app APK
+ uses: r0adkll/sign-android-release@v1
+ id: sign_app
+ with:
+ releaseDirectory: app/build/outputs/apk/release
+ signingKeyBase64: ${{ secrets.RELEASE_KEYSTORE }}
+ alias: ${{ secrets.KEY_ALIAS }}
+ keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
+ keyPassword: ${{ secrets.KEY_PASSWORD }}
+
+ - name: Deploy to Play Store
+ uses: r0adkll/upload-google-play@v1
+ with:
+ serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
+ packageName: com.hmoa.app
+ releaseFiles: build/app/outputs/bundle/release/app-release.aab
+ whatsNewDirectory: ./.github/workflows/whatsnew-ko-KR.txt
diff --git a/.github/temporary/ciWorkflow.yml b/.github/temporary/ciWorkflow.yml
new file mode 100644
index 000000000..17f927e8d
--- /dev/null
+++ b/.github/temporary/ciWorkflow.yml
@@ -0,0 +1,34 @@
+name: Android develop CI
+
+on:
+ pull_request:
+ branches:
+ - "feature/hbti"
+ - "release"
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ env:
+ HMOA_ANDROID_SECRET_TOKEN: ${{secrets.HMOA_ANDROID_SECRET_TOKEN}}
+ RELEASE_KEYSTORE: ${{secrets.RELEASE_KEYSTORE}}
+ steps:
+ - name: Grant execute permissions for scripts
+ run: |
+ chmod +x ./copy-hmoa-android-secrets.sh
+
+ - name: Generate release.keystore
+ run: echo '${{ secrets.RELEASE_KEYSTORE }}' | base64 --d > ./app/release.keystore
+
+ - name: Run copy secrets
+ run: ./copy-hmoa-android-secrets.sh
+
+ - name: Gradle Caching
+ uses: ./.github/workflows/gradleCaching.yml
+
+ - name: Grant execute permission for gradlew
+ run: chmod +x gradlew
+
+ - name: Build for debug with Gradle
+ run: ./gradlew assembleDebug
diff --git a/.github/temporary/gradleCaching.yml b/.github/temporary/gradleCaching.yml
new file mode 100644
index 000000000..608572852
--- /dev/null
+++ b/.github/temporary/gradleCaching.yml
@@ -0,0 +1,16 @@
+name: gradleCaching
+on: workflow_call
+
+jobs:
+ gradleCaching:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Gradle Caching
+ uses: actions/cache@v3
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
\ No newline at end of file
diff --git a/.github/temporary/setup-jdk.yml b/.github/temporary/setup-jdk.yml
new file mode 100644
index 000000000..73ad10413
--- /dev/null
+++ b/.github/temporary/setup-jdk.yml
@@ -0,0 +1,13 @@
+name: Setup JDK
+on: workflow_call
+
+jobs:
+ setup-jdk:
+ runs-on: ubuntu-latest
+ steps:
+ - name: set up JDK 17
+ uses: actions/setup-java@v3
+ with:
+ java-version: '17'
+ distribution: 'temurin'
+ cache: gradle
\ No newline at end of file
diff --git a/.github/temporary/whatsnew-ko-KR.txt b/.github/temporary/whatsnew-ko-KR.txt
new file mode 100644
index 000000000..0678176fc
--- /dev/null
+++ b/.github/temporary/whatsnew-ko-KR.txt
@@ -0,0 +1 @@
+로그인 유지 버그 현상 임시 개선
diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index 07e1af09a..56dafa4a3 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -1,10 +1,11 @@
name: Android develop CI
on:
- push:
- branches: [ "feature/hbti" ]
pull_request:
- branches: [ "feature/hbti" ]
+ branches:
+ - "develop"
+ - "release"
+ - "master"
jobs:
build:
@@ -45,8 +46,11 @@ jobs:
- name: Grant execute permission for gradlew
run: chmod +x gradlew
+ - name: Clear Gradle Cache
+ run: ./gradlew clean
+
- name: Build for debug with Gradle
run: ./gradlew assembleDebug
- - name: unit test
- run: ./gradlew test
\ No newline at end of file
+# - name: unit test
+# run: ./gradlew test
\ No newline at end of file
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
index b268ef36c..5ac6d449e 100644
--- a/.idea/deploymentTargetSelector.xml
+++ b/.idea/deploymentTargetSelector.xml
@@ -4,6 +4,14 @@
+
+
+
+
+
+
+
+
diff --git a/.idea/git_toolbox_blame.xml b/.idea/git_toolbox_blame.xml
new file mode 100644
index 000000000..7dc124965
--- /dev/null
+++ b/.idea/git_toolbox_blame.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/other.xml b/.idea/other.xml
index 94c96f631..a76f1180a 100644
--- a/.idea/other.xml
+++ b/.idea/other.xml
@@ -25,6 +25,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Hhmoa_android_scecret/.idea/inspectionProfiles/Project_Default.xml b/Hhmoa_android_scecret/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 000000000..fa3982ebc
--- /dev/null
+++ b/Hhmoa_android_scecret/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Hhmoa_android_scecret/.idea/vcs.xml b/Hhmoa_android_scecret/.idea/vcs.xml
new file mode 100644
index 000000000..62bd7a01e
--- /dev/null
+++ b/Hhmoa_android_scecret/.idea/vcs.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Hhmoa_android_scecret/.idea/workspace.xml b/Hhmoa_android_scecret/.idea/workspace.xml
new file mode 100644
index 000000000..94209a055
--- /dev/null
+++ b/Hhmoa_android_scecret/.idea/workspace.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ "associatedIndex": 7
+}
+
+
+
+
+
+
+
+
+
+
+ 1718249473219
+
+
+ 1718249473219
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 8acc6915b..c8ede7100 100644
--- a/README.md
+++ b/README.md
@@ -1,19 +1,52 @@
# 향모아 HMOA
내 손안에 향기를 담다
-향수 리뷰 및 정보 커뮤니티 어플 HMOA
+당신을 위한 향수 커뮤니티 어플 HMOA
-## ✅ 주요 기능
+🙏gif가 조금 깨질 수 있으며 개선하기 위해 노력 중이니 양해부탁드립니다
+# 🎉구글 플레이 스토어에서 만나요
+[구글 플레이 스토어 링크](https://play.google.com/store/apps/details?id=com.hmoa.app&hl=ko)
+
+# ✅ 주요 기능
향수 추천 정보, 향수 리뷰 및 커뮤니티, 브랜드 별 향수정보를 제공함으로써
사용자가 본인에게 최적화된 향수를 찾을 수 있도록 도와줍니다.
-
-
-
-
-
-
-
-
-## 프로젝트 아키텍처 및 모듈구성
-
+
+### 🌹다양한 향수를 검색하고 정보를 얻어봐요🌹
+| 홈 | 향수 투표 및 정보| 향수 검색 기능 |
+|------------|---------------|----------------|
+|향모아의 추천 향수들을 만나보세요.|테이스팅 노트와 향수에 대한 사용자들의 평가를 확인해보세요.
향수마다 계절감, 성별, 연령대 투표에 참여해주세요.
모호했던 향수의 정체를 알게될 거에요!😍|다양한 향수를 검색해보세요.|
+|
|
|
|
+
+### 다양한 브랜드 향수를 검색하고 향수를 찾아봐요
+| 브랜드 | 같은 브랜드 향수 보기 | 브랜드 검색 |
+|--------|----------------------|-------------|
+|80여개의 브랜드의 향수 정보를 확인해보세요.|같은 브랜드 향수의 향수를 확인해보세요.|궁금한 브랜드가 있다면 빠르게 찾아줄 수 있어요.|
+|
|
|
|
+
+
+### 🪻향수 용어와 새로운 소식을 소개해줄게요🪻
+| HPedia 용어 | 향모아 매거진 | 향모아 매거진 콘텐츠 |
+|--------|----------------------|-------------|
+|HPedia는 그동안 알기 어려웠던 향수, 향료 용어들을 알려줄거에요.|최근 출시향수, Top 시향기, 매거진 콘텐츠 등을 구경해보세요.|향수를 사랑하는 여러분에게 들려주고 싶은 향수 이야기, 최신 트렌드 및 소식이에요.|
+|
|
|
|
+
+### 🍀사용자들과 향수 이야기를 나눠봐요🍀
+| 커뮤니티 게시글 | 시향기 글쓰기 |
+|--------|----------------------|
+|향수를 추천하고, 후기를 공유해주세요! 다양한 정보로 향수에 대한 여러분의 경험을 풍부하게 만들어줄거에요.|향수 추천, 시향기, 자유 게시판에서 향수이야기를 작성해주세요.|
+|
|
|
+
+# 프로젝트 아키텍처 및 모듈구성
+## 안드로이드 권장 아키텍처 적용 구조
+
+
+## 멀티 모듈의 관심사 분리 및 아키텍처 적용
+
+
+## MVVM 적용
+
+
+### 데이터 전달 및 상태관리 구체화 구조
+
+
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 6135f48c9..c3998389c 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -1,4 +1,4 @@
-import java.util.Properties
+import java.util.*
plugins {
id("com.android.application")
@@ -21,9 +21,9 @@ android {
defaultConfig {
applicationId = "com.hmoa.app"
minSdk = 26
- targetSdk = 33
- versionCode = 12
- versionName = "1.0.0"
+ targetSdk = 34
+ versionCode = 23
+ versionName = "1.1.4"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
manifestPlaceholders["REDIRECTION_PATH"] = localProperties["REDIRECTION_PATH"] as String
@@ -78,6 +78,7 @@ dependencies {
val hilt_version = "2.48.1"
val hilt_viewmodel_version = "1.0.0-alpha03"
val hilt_nav_compose_version = "1.0.0"
+ val kakao_version = "2.20.5"
implementation(project(":feature-home"))
implementation(project(":feature-authentication"))
@@ -97,12 +98,12 @@ dependencies {
implementation("io.github.bootpay:android:4.4.0") //boot pay
- implementation("com.kakao.sdk:v2-all:2.19.0")// 전체 모듈 설치, 2.11.0 버전부터 지원
- implementation("com.kakao.sdk:v2-user:2.19.0") // 카카오 로그인 API 모듈
- implementation("com.kakao.sdk:v2-talk:2.19.0") // 카카오톡 채널, 카카오톡 소셜, 카카오톡 메시지 API 모듈
- implementation("com.kakao.sdk:v2-share:2.19.0") // 카카오톡 공유 API 모듈
- implementation("com.kakao.sdk:v2-friend:2.19.0") // 피커 API 모듈
- implementation("com.kakao.sdk:v2-cert:2.19.0") // 카카오 인증서비스 API 모듈
+ implementation("com.kakao.sdk:v2-all:${kakao_version}")// 전체 모듈 설치, 2.11.0 버전부터 지원
+ implementation("com.kakao.sdk:v2-user:${kakao_version}") // 카카오 로그인 API 모듈
+ implementation("com.kakao.sdk:v2-talk:${kakao_version}") // 카카오톡 채널, 카카오톡 소셜, 카카오톡 메시지 API 모듈
+ implementation("com.kakao.sdk:v2-share:${kakao_version}") // 카카오톡 공유 API 모듈
+ implementation("com.kakao.sdk:v2-friend:${kakao_version}") // 피커 API 모듈
+ implementation("com.kakao.sdk:v2-cert:${kakao_version}") // 카카오 인증서비스 API 모듈
implementation("com.google.dagger:hilt-android:$hilt_version")
implementation("com.google.dagger:hilt-compiler:$hilt_version")
kapt("com.google.dagger:hilt-android-compiler:$hilt_version")
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e1bce12e9..d250ee1f8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,6 +5,7 @@
+
diff --git a/app/src/main/java/com/hmoa/app/AppViewModel.kt b/app/src/main/java/com/hmoa/app/AppViewModel.kt
index e5a9ebb1a..daaaf2b65 100644
--- a/app/src/main/java/com/hmoa/app/AppViewModel.kt
+++ b/app/src/main/java/com/hmoa/app/AppViewModel.kt
@@ -7,6 +7,8 @@ import com.hmoa.core_domain.repository.LoginRepository
import com.hmoa.core_model.request.FCMTokenSaveRequestDto
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
@@ -15,24 +17,30 @@ class AppViewModel @Inject constructor(
private val loginRepository: LoginRepository,
private val fcmRepository: FcmRepository,
) : ViewModel() {
- suspend fun authToken(): Flow = loginRepository.getAuthToken()
- suspend fun rememberedToken(): Flow = loginRepository.getRememberedToken()
- suspend fun getFcmToken(): Flow = fcmRepository.getLocalFcmToken()
+ suspend fun authTokenFlow(): Flow = loginRepository.getAuthToken()
+ suspend fun rememberedTokenFlow(): Flow = loginRepository.getRememberedToken()
+
+ suspend fun fcmTokenFlow(): Flow = fcmRepository.getLocalFcmToken()
fun delFcmToken() {
- viewModelScope.launch{
+ viewModelScope.launch {
fcmRepository.deleteLocalFcmToken()
fcmRepository.deleteRemoteFcmToken()
}
}
+
fun postFcmToken(fcmToken: String) {
viewModelScope.launch {
val requestDto = FCMTokenSaveRequestDto(fcmToken)
fcmRepository.postRemoteFcmToken(requestDto)
}
}
- fun saveFcmToken(token : String) = viewModelScope.launch{fcmRepository.saveLocalFcmToken(token)}
- fun checkAlarm(id : Int) = viewModelScope.launch{fcmRepository.checkAlarm(id)}
- suspend fun getNotificationEnabled() : Flow = fcmRepository.getNotificationEnabled()
- suspend fun saveNotificationEnabled(isEnabled : Boolean) = fcmRepository.saveNotificationEnabled(isEnabled)
+
+ fun saveFcmToken(token: String) = viewModelScope.launch { fcmRepository.saveLocalFcmToken(token) }
+ fun checkAlarm(id: Int) = viewModelScope.launch { fcmRepository.checkAlarm(id) }
+ suspend fun getNotificationEnabled(): Flow = fcmRepository.getNotificationEnabled()
+
+ suspend fun saveNotificationEnabled(isEnabled: Boolean) =
+ viewModelScope.launch { fcmRepository.saveNotificationEnabled(isEnabled) }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/hmoa/app/FcmAppService.kt b/app/src/main/java/com/hmoa/app/FcmAppService.kt
index d05225b82..10828577e 100644
--- a/app/src/main/java/com/hmoa/app/FcmAppService.kt
+++ b/app/src/main/java/com/hmoa/app/FcmAppService.kt
@@ -10,6 +10,9 @@ import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
class FcmAppService : FirebaseMessagingService() {
+ override fun onNewToken(token: String) {
+ super.onNewToken(token)
+ }
override fun onMessageReceived(remoteMessage: RemoteMessage) {
super.onMessageReceived(remoteMessage)
@@ -26,7 +29,7 @@ class FcmAppService : FirebaseMessagingService() {
putExtra("deeplink",fcmData["deeplink"])
putExtra("id",fcmData["id"])
}
- val pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT)
+ val pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT)
val notification = Notification.Builder(this, CHANNEL_DEFAULT_IMPORTANCE)
.setContentTitle(fcmData["title"])
diff --git a/app/src/main/java/com/hmoa/app/MainActivity.kt b/app/src/main/java/com/hmoa/app/MainActivity.kt
index 5d896ee8b..b39f360f4 100644
--- a/app/src/main/java/com/hmoa/app/MainActivity.kt
+++ b/app/src/main/java/com/hmoa/app/MainActivity.kt
@@ -25,22 +25,18 @@ import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.WindowCompat
-import androidx.lifecycle.coroutineScope
+import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.google.firebase.messaging.FirebaseMessaging
import com.hmoa.app.navigation.SetUpNavGraph
+import com.hmoa.core_common.permissions
import com.hmoa.core_designsystem.BottomScreen
import com.hmoa.core_designsystem.component.HomeTopBar
import com.hmoa.core_designsystem.component.MainBottomBar
-import com.hmoa.core_domain.entity.navigation.AuthenticationRoute
-import com.hmoa.core_domain.entity.navigation.CommunityRoute
-import com.hmoa.core_domain.entity.navigation.HPediaRoute
-import com.hmoa.core_domain.entity.navigation.HomeRoute
-import com.hmoa.core_domain.entity.navigation.MagazineRoute
-import com.hmoa.core_domain.entity.navigation.PerfumeRoute
-import com.hmoa.core_domain.entity.navigation.UserInfoRoute
+import com.hmoa.core_domain.entity.navigation.*
import com.hmoa.feature_brand.navigation.navigateToBrandSearch
import com.hmoa.feature_fcm.navigateToAlarmScreen
import com.hmoa.feature_home.navigation.navigateToHome
@@ -49,14 +45,8 @@ import com.hmoa.feature_hpedia.Navigation.navigateToHPedia
import com.hmoa.feature_magazine.Navigation.navigateToMagazineHome
import com.hmoa.feature_userinfo.navigation.navigateToUserInfoGraph
import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.coroutines.*
import kotlinx.coroutines.flow.collectLatest
-import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.stateIn
-import kotlinx.coroutines.flow.zip
-import kotlinx.coroutines.job
import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
import kr.co.bootpay.android.BootpayAnalytics
@AndroidEntryPoint
@@ -90,51 +80,28 @@ class MainActivity : AppCompatActivity() {
private val needTopBarScreens = HomeRoute.Home.name
override fun onCreate(savedInstanceState: Bundle?) {
-
super.onCreate(savedInstanceState)
installSplashScreen()
WindowCompat.setDecorFitsSystemWindows(window, false)
requestNotificationPermission()
- initFirebaseSetting()
BootpayAnalytics.init(this, BuildConfig.BOOTPAY_APPLICATION_ID)
lifecycleScope.launch {
- val currentJob = coroutineContext.job
- val authTokenState = viewModel.authToken().stateIn(this)
- val rememberedTokenState = viewModel.rememberedToken().stateIn(this)
- val newFlow = authTokenState.zip(rememberedTokenState) { authtoken, rememberedToken ->
- Pair(authtoken, rememberedToken)
- }
- launch {
- newFlow.collectLatest { token ->
- Log.d("LOGIN TOKEN", "access : ${token.first} refresh : ${token.second}")
- if (token.first == null && token.second == null) {
- initialRoute = AuthenticationRoute.Login.name
- currentJob.cancel()
- } else {
- Log.d("LOGIN TOKEN", "access : ${token.first} refresh : ${token.second}")
- initialRoute = HomeRoute.Home.name
- currentJob.cancel()
+ repeatOnLifecycle(Lifecycle.State.CREATED) {
+ viewModel.fcmTokenFlow().collectLatest { fcmToken ->
+ viewModel.getNotificationEnabled().collectLatest { isEnabled ->
+ Log.d("POST PERMISSION", "is granted : ${isEnabled}")
+ Log.d("FCM TEST", "fcm token : ${fcmToken}")
+ initializeFirebaseSetting(
+ fcmToken = fcmToken,
+ onSaveFcmToken = { token -> viewModel.saveFcmToken(token) })
+ initializeRoute(
+ onRouteToLogin = { checkFcmToken(fcmToken, isEnabled) })
}
}
}
}
- //fcm token post
- lifecycleScope.launch {
- val authToken = viewModel.authToken()
- val rememberToken = viewModel.rememberedToken()
- val fcmToken = viewModel.getFcmToken()
- combine(authToken, rememberToken, fcmToken) { authToken, rememberToken, fcmToken -> }.collectLatest {
- val auth = authToken.stateIn(this).value
- val remember = rememberToken.stateIn(this).value
- val fcm = fcmToken.stateIn(this).value
- if (auth != null && remember != null && fcm != null) {
- withContext(Dispatchers.IO) { checkFcmToken(fcm) }
- lifecycle.coroutineScope.cancel()
- }
- }
- }
setContent {
val navHostController = rememberNavController()
@@ -149,13 +116,9 @@ class MainActivity : AppCompatActivity() {
}
isBottomBarVisible = route in needBottomBarScreens
isTopBarVisible = route in needTopBarScreens
- }
- navHostController.addOnDestinationChangedListener { controller, destination, arguments ->
- val backStack = controller.currentBackStack.value
- val stackLog = backStack.joinToString(" -> ") {
- it.destination.route ?: "Unknown"
- }
- Log.d("NAVIGATION ROUTE TEST", "current stack : $stackLog")
+ } ?: run {
+ isBottomBarVisible = false
+ isTopBarVisible = false
}
val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
val deeplink = remember { handleDeeplink(intent) }
@@ -191,7 +154,11 @@ class MainActivity : AppCompatActivity() {
Box(
modifier = Modifier.padding(bottom = it.calculateBottomPadding())
) {
- SetUpNavGraph(navHostController, initialRoute)
+ SetUpNavGraph(
+ navController = navHostController,
+ startDestination = initialRoute,
+ appVersion = BuildConfig.VERSION_NAME
+ )
LaunchedEffect(Unit) {
if (deeplink.first != null) {
navHostController.navigate(deeplink.first!!)
@@ -204,21 +171,52 @@ class MainActivity : AppCompatActivity() {
}
//firebase 초기 토큰 처리
- private fun initFirebaseSetting() {
+ private fun initializeFirebaseSetting(fcmToken: String?, onSaveFcmToken: (token: String) -> Unit) {
FirebaseMessaging.getInstance().token.addOnSuccessListener {
- CoroutineScope(Dispatchers.IO).launch {
- val fcmToken = viewModel.getFcmToken().stateIn(this).value
- Log.d("FCM TEST", "fcm token : ${fcmToken}")
- if (it != fcmToken) {
- Log.d("FCM TEST", "firebase messaging fcm token : ${it}")
- viewModel.saveFcmToken(it)
- }
+ if (it != fcmToken) {
+ Log.d("FCM TEST", "firebase messaging fcm token : ${it}")
+ onSaveFcmToken(it)
}
}.addOnFailureListener {
Log.e("FCM TEST", "${it.message} \n ${it.stackTrace}")
}
}
+ private suspend fun initializeRoute(
+ onRouteToLogin: suspend () -> Unit
+ ) {
+ viewModel.authTokenFlow().collectLatest { authToken ->
+ viewModel.rememberedTokenFlow().collectLatest { rememberToken ->
+ Log.d("LOGIN TOKEN", "auth : ${authToken} remember : ${rememberToken}")
+ if (authToken == null && rememberToken == null) {
+ initialRoute = AuthenticationRoute.Login.name
+ onRouteToLogin()
+ } else {
+ initialRoute = HomeRoute.Home.name
+ }
+ }
+ }
+ }
+
+ private suspend fun checkFcmToken(fcmToken: String?, isEnabled: Boolean) {
+ if (fcmToken != null) {
+ handleFcmToken(fcmToken, isEnabled)
+ }
+ Log.d("FCM TEST", "checkFcmToken의 fcmToken 값: ${fcmToken}")
+ }
+
+ private suspend fun handleFcmToken(
+ fcmToken: String, isEnabled: Boolean
+ ) {
+ if (isEnabled) {
+ Log.d("FCM TEST", "post fcm token")
+ viewModel.postFcmToken(fcmToken)
+ } else {
+ Log.d("FCM TEST", "delete fcm token")
+ viewModel.delFcmToken()
+ }
+ }
+
//deeplink 처리 함수
private fun handleDeeplink(intent: Intent?): Pair {
var deeplink: String? = intent?.getStringExtra("deeplink") ?: return Pair(null, null)
@@ -236,40 +234,26 @@ class MainActivity : AppCompatActivity() {
return Pair(deeplink, alarm_id)
}
- private suspend fun checkFcmToken(
- fcmToken: String
- ) {
- CoroutineScope(Dispatchers.IO).launch {
- val isEnabled = viewModel.getNotificationEnabled().stateIn(this)
- // isEnabled 가 true 면
- if (isEnabled.value) {
- Log.d("FCM TEST", "post fcm token")
- viewModel.postFcmToken(fcmToken)
- } else {
- Log.d("FCM TEST", "delete fcm token")
- viewModel.delFcmToken()
- }
- }
- }
-
private fun requestNotificationPermission() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
- ContextCompat.checkSelfPermission(
- this,
- android.Manifest.permission.POST_NOTIFICATIONS
- ) != PackageManager.PERMISSION_GRANTED
- ) {
- ActivityCompat.requestPermissions(
- this,
- arrayOf(Manifest.permission.POST_NOTIFICATIONS),
- PERMISSION_REQUEST_CODE
- )
- CoroutineScope(Dispatchers.IO).launch {
- viewModel.saveNotificationEnabled(false)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+ val deniedPermissions = permissions.filter { !com.hmoa.core_common.checkPermission(this, it) }
+ Log.d("PERMISSION TEST", "permissions : ${permissions}")
+ Log.d("PERMISSION TEST", "denied : ${deniedPermissions}")
+ if (deniedPermissions.isNotEmpty()) {
+ ActivityCompat.requestPermissions(this, deniedPermissions.toTypedArray(), PERMISSION_REQUEST_CODE)
}
} else {
- CoroutineScope(Dispatchers.IO).launch {
- viewModel.saveNotificationEnabled(true)
+ //13 버전 미만 카메라 권한 (READ_EXTERNAL_STORAGE) 요청
+ if (ContextCompat.checkSelfPermission(
+ this,
+ Manifest.permission.READ_EXTERNAL_STORAGE
+ ) == PackageManager.PERMISSION_DENIED
+ ) {
+ ActivityCompat.requestPermissions(
+ this,
+ permissions,
+ PERMISSION_REQUEST_CODE
+ )
}
}
}
@@ -287,20 +271,14 @@ class MainActivity : AppCompatActivity() {
Manifest.permission.POST_NOTIFICATIONS
) == PackageManager.PERMISSION_GRANTED
) {
- // 권한 부여되면 그 때 fcm token을 서버에 보내도록 해야 할 듯?
- CoroutineScope(Dispatchers.IO).launch {
- viewModel.saveNotificationEnabled(true)
- }
+ /** 알림 권한 유 */
+ lifecycleScope.launch { viewModel.saveNotificationEnabled(true) }
} else {
- // 알림 권한 설정을 안할 시 알림을 받지 않도록 함
- lifecycleScope.launch {
- viewModel.saveNotificationEnabled(false)
- }
+ /** 알림 권한 무 */
+ lifecycleScope.launch { viewModel.saveNotificationEnabled(false) }
}
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
- CoroutineScope(Dispatchers.IO).launch {
- viewModel.saveNotificationEnabled(true)
- }
+ lifecycleScope.launch { viewModel.saveNotificationEnabled(true) }
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/hmoa/app/navigation/NavHost.kt b/app/src/main/java/com/hmoa/app/navigation/NavHost.kt
index 5d41a4bd8..0e2f2262a 100644
--- a/app/src/main/java/com/hmoa/app/navigation/NavHost.kt
+++ b/app/src/main/java/com/hmoa/app/navigation/NavHost.kt
@@ -3,63 +3,14 @@ package com.hmoa.app.navigation
import androidx.compose.runtime.Composable
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
-import com.hmoa.feature_authentication.navigation.loginScreen
-import com.hmoa.feature_authentication.navigation.navigateToLogin
-import com.hmoa.feature_authentication.navigation.navigateToPickNickname
-import com.hmoa.feature_authentication.navigation.navigateToPickPersonalInfo
-import com.hmoa.feature_authentication.navigation.navigateToSignup
-import com.hmoa.feature_authentication.navigation.pickNicknameScreen
-import com.hmoa.feature_authentication.navigation.pickPersonalInfoScreen
-import com.hmoa.feature_authentication.navigation.signupScreen
+import com.hmoa.feature_authentication.navigation.*
import com.hmoa.feature_brand.navigation.brandScreen
import com.hmoa.feature_brand.navigation.brandSearchScreen
import com.hmoa.feature_brand.navigation.navigateToBrand
-import com.hmoa.feature_community.Navigation.navigateToCommunityCommentEditRoute
-import com.hmoa.feature_community.Navigation.navigateToCommunityDescriptionRoute
-import com.hmoa.feature_community.Navigation.navigateToCommunityEditRoute
-import com.hmoa.feature_community.Navigation.navigateToCommunityPage
-import com.hmoa.feature_community.Navigation.navigateToCommunityPostRoute
-import com.hmoa.feature_community.Navigation.navigateToCommunityRoute
-import com.hmoa.feature_community.Navigation.navigateToCommunitySearchRoute
-import com.hmoa.feature_community.Navigation.nestedCommunityGraph
+import com.hmoa.feature_community.Navigation.*
import com.hmoa.feature_fcm.alarmRoute
-import com.hmoa.feature_hbti.navigation.addAddress
-import com.hmoa.feature_hbti.navigation.editReview
-import com.hmoa.feature_hbti.navigation.hbtiProcessScreen
-import com.hmoa.feature_hbti.navigation.hbtiScreen
-import com.hmoa.feature_hbti.navigation.hbtiSurveyLoadingScreen
-import com.hmoa.feature_hbti.navigation.hbtiSurveyResultScreen
-import com.hmoa.feature_hbti.navigation.hbtiSurveyScreen
-import com.hmoa.feature_hbti.navigation.navigateToAddAddress
-import com.hmoa.feature_hbti.navigation.navigateToEditReview
-import com.hmoa.feature_hbti.navigation.navigateToHbti
-import com.hmoa.feature_hbti.navigation.navigateToHbtiProcess
-import com.hmoa.feature_hbti.navigation.navigateToHbtiSurvey
-import com.hmoa.feature_hbti.navigation.navigateToHbtiSurveyLoading
-import com.hmoa.feature_hbti.navigation.navigateToHbtiSurveyResult
-import com.hmoa.feature_hbti.navigation.navigateToNoteOrderQuantityPick
-import com.hmoa.feature_hbti.navigation.navigateToNotePick
-import com.hmoa.feature_hbti.navigation.navigateToNotePickResult
-import com.hmoa.feature_hbti.navigation.navigateToOrder
-import com.hmoa.feature_hbti.navigation.navigateToOrderResult
-import com.hmoa.feature_hbti.navigation.navigateToPerfumeRecommendation
-import com.hmoa.feature_hbti.navigation.navigateToPerfumeRecommendationResult
-import com.hmoa.feature_hbti.navigation.navigateToReview
-import com.hmoa.feature_hbti.navigation.navigateToWriteReview
-import com.hmoa.feature_hbti.navigation.noteOrderQuantityPickScreen
-import com.hmoa.feature_hbti.navigation.notePickResult
-import com.hmoa.feature_hbti.navigation.notePickScreen
-import com.hmoa.feature_hbti.navigation.order
-import com.hmoa.feature_hbti.navigation.orderResult
-import com.hmoa.feature_hbti.navigation.perfumeRecommendationResultRoute
-import com.hmoa.feature_hbti.navigation.perfumeRecommendationRoute
-import com.hmoa.feature_hbti.navigation.review
-import com.hmoa.feature_hbti.navigation.writeReview
-import com.hmoa.feature_home.navigation.allPerfumeScreen
-import com.hmoa.feature_home.navigation.homeScreen
-import com.hmoa.feature_home.navigation.navigateToAllPerfume
-import com.hmoa.feature_home.navigation.navigateToHome
-import com.hmoa.feature_home.navigation.perfumeSearchScreen
+import com.hmoa.feature_hbti.navigation.*
+import com.hmoa.feature_home.navigation.*
import com.hmoa.feature_hpedia.Navigation.navigateToHPedia
import com.hmoa.feature_hpedia.Navigation.navigateToHPediaDescRoute
import com.hmoa.feature_hpedia.Navigation.navigateToHPediaSearchRoute
@@ -67,35 +18,14 @@ import com.hmoa.feature_hpedia.Navigation.nestedHPediaGraph
import com.hmoa.feature_magazine.Navigation.magazineDesc
import com.hmoa.feature_magazine.Navigation.magazineMain
import com.hmoa.feature_magazine.Navigation.navigateToMagazineDesc
-import com.hmoa.feature_perfume.navigation.createNewPerfumeComment
-import com.hmoa.feature_perfume.navigation.editMyPerfumeComment
-import com.hmoa.feature_perfume.navigation.navigateToCreateNewperfumeComment
-import com.hmoa.feature_perfume.navigation.navigateToPerfume
-import com.hmoa.feature_perfume.navigation.navigateToPerfumeComment
-import com.hmoa.feature_perfume.navigation.navigateToSpecificPerfumeComment
-import com.hmoa.feature_perfume.navigation.perfumeComment
-import com.hmoa.feature_perfume.navigation.perfumeScreen
-import com.hmoa.feature_perfume.navigation.specificComment
-import com.hmoa.feature_userinfo.navigation.navigateToBack
-import com.hmoa.feature_userinfo.navigation.navigateToEditProfilePage
-import com.hmoa.feature_userinfo.navigation.navigateToMyActivity
-import com.hmoa.feature_userinfo.navigation.navigateToMyBirth
-import com.hmoa.feature_userinfo.navigation.navigateToMyCommentPage
-import com.hmoa.feature_userinfo.navigation.navigateToMyFavoriteCommentPage
-import com.hmoa.feature_userinfo.navigation.navigateToMyFavoritePerfume
-import com.hmoa.feature_userinfo.navigation.navigateToMyGenderPage
-import com.hmoa.feature_userinfo.navigation.navigateToMyInfoPage
-import com.hmoa.feature_userinfo.navigation.navigateToMyPostPage
-import com.hmoa.feature_userinfo.navigation.navigateToMyReview
-import com.hmoa.feature_userinfo.navigation.navigateToOrderRecord
-import com.hmoa.feature_userinfo.navigation.navigateToRefund
-import com.hmoa.feature_userinfo.navigation.navigateToRefundRecord
-import com.hmoa.feature_userinfo.navigation.nestedUserInfoGraph
+import com.hmoa.feature_perfume.navigation.*
+import com.hmoa.feature_userinfo.navigation.*
@Composable
fun SetUpNavGraph(
navController: NavHostController,
- startDestination: String
+ startDestination: String,
+ appVersion: String
) {
NavHost(
navController = navController,
@@ -156,7 +86,8 @@ fun SetUpNavGraph(
navOrderRecord = navController::navigateToOrderRecord,
navReviewWrite = navController::navigateToWriteReview,
navRefund = navController::navigateToRefund,
- navRefundRecord = navController::navigateToRefundRecord
+ navRefundRecord = navController::navigateToRefundRecord,
+ appVersion = appVersion
)
/** HPedia 모듈 (내부에 Community 모듈 포함) */
@@ -180,7 +111,8 @@ fun SetUpNavGraph(
onErrorHandleLoginAgain = navController::navigateToLogin,
navLogin = navController::navigateToLogin,
navHome = navController::navigateToHome,
- navHPedia = navController::navigateToHPedia
+ navHPedia = navController::navigateToHPedia,
+ popStack = { navController.popBackStack() }
)
/** perfume 모듈 */
@@ -243,7 +175,8 @@ fun SetUpNavGraph(
navHome = navController::navigateToHome,
navReview = navController::navigateToReview,
onHbtiSurveyClick = navController::navigateToHbtiSurvey,
- onAfterOrderClick = navController::navigateToPerfumeRecommendation
+ onAfterOrderClick = navController::navigateToPerfumeRecommendation,
+ navLogin = navController::navigateToLogin,
)
hbtiSurveyScreen(
onBackClick = navController::navigateToBack,
@@ -256,15 +189,12 @@ fun SetUpNavGraph(
onHbtiProcessClick = navController::navigateToHbtiProcess
)
hbtiSurveyLoadingScreen(
- onNextScreen = navController::navigateToHbtiSurveyResult
- )
- hbtiProcessScreen(
+ onNextScreen = navController::navigateToHbtiSurveyResult,
onBackClick = navController::navigateToBack,
- onNoteOrderQuantityPickClick = navController::navigateToNoteOrderQuantityPick
)
- noteOrderQuantityPickScreen(
+ hbtiProcessScreen(
onBackClick = navController::navigateToBack,
- onNextClick = { noteOrderQuantity -> navController.navigateToNotePick(noteOrderQuantity) }
+ onNextClick = navController::navigateToNotePick
)
notePickScreen(
onBackClick = navController::navigateToBack,
@@ -280,10 +210,12 @@ fun SetUpNavGraph(
order(
navBack = navController::navigateToBack,
navAddAddress = navController::navigateToAddAddress,
- navOrderResult = navController::navigateToOrderResult
+ navOrderResult = navController::navigateToOrderResult,
+ navLogin = navController::navigateToLogin
)
addAddress(
- navOrder = navController::navigateToOrder
+ navOrder = navController::navigateToOrder,
+ navLogin = navController::navigateToLogin
)
orderResult(
navBack = navController::navigateToBack,
@@ -296,14 +228,16 @@ fun SetUpNavGraph(
perfumeRecommendationResultRoute(
onBackClick = navController::navigateToBack,
navPerfumeDescription = { id -> navController.navigateToPerfume(id) },
- navHome = navController::navigateToHome
+ navHome = navController::navigateToHome,
+ navLogin = navController::navigateToLogin
)
writeReview(navBack = navController::navigateToBack)
review(
navBack = navController::navigateToBack,
navWriteReview = navController::navigateToWriteReview,
- navEditReview = navController::navigateToEditReview
+ navEditReview = navController::navigateToEditReview,
+ navLogin = navController::navigateToLogin
)
- editReview(navReview = navController::navigateToReview)
+ editReview(navReview = navController::navigateToReview, navLogin = navController::navigateToLogin)
}
}
\ No newline at end of file
diff --git a/core-common/src/main/java/com/hmoa/core_common/ErrorHandleFunctions.kt b/core-common/src/main/java/com/hmoa/core_common/ErrorHandleFunctions.kt
index 3d3816ef1..b369475d4 100644
--- a/core-common/src/main/java/com/hmoa/core_common/ErrorHandleFunctions.kt
+++ b/core-common/src/main/java/com/hmoa/core_common/ErrorHandleFunctions.kt
@@ -3,10 +3,16 @@ package com.hmoa.core_common
import ResultResponse
suspend fun ResultResponse.emitOrThrow(emit: suspend (ResultResponse) -> Unit) {
+ android.util.Log.d(
+ "core-common/ErrorHandleFunctions",
+ "emitOrThrow --- data: ${data}, errorMessage: ${errorMessage?.message}"
+ )
if (this.data != null) {
emit(this)
} else if (this.errorMessage != null) {
throw Exception(this.errorMessage!!.message)
+ } else { //모두 Null인 경우
+ throw Exception("알 수 없는 에러입니다 :(")
}
}
diff --git a/core-common/src/main/java/com/hmoa/core_common/ErrorMessageType.kt b/core-common/src/main/java/com/hmoa/core_common/ErrorMessageType.kt
index 8a34edc2b..126168a89 100644
--- a/core-common/src/main/java/com/hmoa/core_common/ErrorMessageType.kt
+++ b/core-common/src/main/java/com/hmoa/core_common/ErrorMessageType.kt
@@ -3,5 +3,6 @@ package com.hmoa.core_common
enum class ErrorMessageType(val code: Int, val message: String) {
EXPIRED_TOKEN(401, "ACCESS Token이 만료되었습니다."),
WRONG_TYPE_TOKEN(401, "변조된 토큰입니다."),
- UNKNOWN_ERROR(404, "jwt가 존재하지 않습니다.")
+ UNKNOWN_ERROR(404, "jwt가 존재하지 않습니다."),
+ MEMBER_NOT_FOUND(404, "등록된 멤버가 없습니다.")
}
\ No newline at end of file
diff --git a/core-common/src/main/java/com/hmoa/core_common/ErrorUiState.kt b/core-common/src/main/java/com/hmoa/core_common/ErrorUiState.kt
index 61355baaf..9f62097d2 100644
--- a/core-common/src/main/java/com/hmoa/core_common/ErrorUiState.kt
+++ b/core-common/src/main/java/com/hmoa/core_common/ErrorUiState.kt
@@ -5,6 +5,7 @@ sealed interface ErrorUiState {
val expiredTokenError: Boolean,
val wrongTypeTokenError: Boolean,
val unknownError: Boolean,
+ val memberNotFoundError: Boolean? = null,
val generalError: Pair
) : ErrorUiState {
fun isValidate(): Boolean{
diff --git a/core-common/src/main/java/com/hmoa/core_common/ManagePermission.kt b/core-common/src/main/java/com/hmoa/core_common/ManagePermission.kt
new file mode 100644
index 000000000..80d3fa677
--- /dev/null
+++ b/core-common/src/main/java/com/hmoa/core_common/ManagePermission.kt
@@ -0,0 +1,20 @@
+package com.hmoa.core_common
+
+import android.Manifest
+import android.content.Context
+import android.content.pm.PackageManager
+import android.os.Build
+import androidx.core.content.ContextCompat
+
+const val PERMISSION_REQUEST_CODE = 1001
+val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) arrayOf(
+ Manifest.permission.POST_NOTIFICATIONS,
+ Manifest.permission.READ_MEDIA_IMAGES
+) else {
+ arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)
+}
+
+val galleryPermission = if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) Manifest.permission.READ_MEDIA_IMAGES
+ else Manifest.permission.READ_EXTERNAL_STORAGE
+
+fun checkPermission(context: Context, permission: String): Boolean = ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED
\ No newline at end of file
diff --git a/core-database/build.gradle.kts b/core-database/build.gradle.kts
index 4b7e71227..78d34cb8f 100644
--- a/core-database/build.gradle.kts
+++ b/core-database/build.gradle.kts
@@ -35,6 +35,12 @@ android {
kotlinOptions {
jvmTarget = "1.8"
}
+ sourceSets {
+ // 기존의 test 소스셋을 unitTest로 변경
+ getByName("test") {
+ java.srcDirs("src/unitTest/java")
+ }
+ }
}
dependencies {
@@ -48,12 +54,25 @@ dependencies {
kapt("androidx.room:room-compiler:$room_version")
implementation("com.google.dagger:hilt-android:$hilt_version")
implementation("com.google.dagger:hilt-compiler:$hilt_version")
- testAnnotationProcessor("com.google.dagger:hilt-compiler:$hilt_version")
implementation("androidx.datastore:datastore-preferences:$datastore_version")
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.11.0")
+
+ testAnnotationProcessor("com.google.dagger:hilt-android-compiler:2.44")
+
+ testImplementation("junit:junit:4.13.2")
+ implementation("androidx.test.ext:junit-ktx:1.2.1")
+ //unit test
+ val mockito_version = "4.8.0"
testImplementation("junit:junit:4.13.2")
- androidTestImplementation("androidx.test.ext:junit:1.1.5")
- androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
+ debugImplementation("androidx.compose.ui:ui-tooling:1.6.0")
+ testImplementation("org.mockito:mockito-core:$mockito_version")
+ testImplementation("org.mockito:mockito-inline:$mockito_version")
+ testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.2")
+ testImplementation("org.jetbrains.kotlin:kotlin-reflect:1.5.30")
+ //hilt test
+ kaptTest("com.google.dagger:hilt-android-compiler:$hilt_version") // ...with Kotlin.
+ testImplementation("com.google.dagger:hilt-android-testing:$hilt_version") // For Robolectric tests.
+ testAnnotationProcessor("com.google.dagger:hilt-android-compiler:2.44") // ...with Java.
}
\ No newline at end of file
diff --git a/core-database/src/main/java/com/hmoa/core_database/AppInfoManager.kt b/core-database/src/main/java/com/hmoa/core_database/AppInfoManager.kt
index 52398d494..892a00a8a 100644
--- a/core-database/src/main/java/com/hmoa/core_database/AppInfoManager.kt
+++ b/core-database/src/main/java/com/hmoa/core_database/AppInfoManager.kt
@@ -5,4 +5,6 @@ import kotlinx.coroutines.flow.Flow
interface AppInfoManager {
suspend fun saveNotificationEnabled(isEnabled : Boolean)
suspend fun getNotificationEnabled() : Flow
+ suspend fun updateGalleryEnabled(isEnabled : Boolean)
+ suspend fun isGalleryEnabled() : Flow
}
\ No newline at end of file
diff --git a/core-database/src/main/java/com/hmoa/core_database/AppInfoManagerImpl.kt b/core-database/src/main/java/com/hmoa/core_database/AppInfoManagerImpl.kt
index 1a71a579a..bb6b64b60 100644
--- a/core-database/src/main/java/com/hmoa/core_database/AppInfoManagerImpl.kt
+++ b/core-database/src/main/java/com/hmoa/core_database/AppInfoManagerImpl.kt
@@ -13,6 +13,7 @@ class AppInfoManagerImpl @Inject constructor(
) : AppInfoManager {
companion object{
private val IS_NOTIFICATION_ENABLED = booleanPreferencesKey("is_notification_enabled")
+ private val IS_GALLERY_ENABLED = booleanPreferencesKey("is_gallery_enabled")
}
private val dataStore = context.datastore
@@ -21,10 +22,20 @@ class AppInfoManagerImpl @Inject constructor(
it[IS_NOTIFICATION_ENABLED] = isEnabled
}
}
-
override suspend fun getNotificationEnabled(): Flow {
return dataStore.data.map{
it[IS_NOTIFICATION_ENABLED] ?: false
}
}
+ override suspend fun updateGalleryEnabled(isEnabled: Boolean) {
+ dataStore.edit{
+ it[IS_GALLERY_ENABLED] = isEnabled
+ }
+ }
+
+ override suspend fun isGalleryEnabled(): Flow {
+ return dataStore.data.map{
+ it[IS_GALLERY_ENABLED] ?: false
+ }
+ }
}
\ No newline at end of file
diff --git a/core-database/src/main/java/com/hmoa/core_database/TokenManagerImpl.kt b/core-database/src/main/java/com/hmoa/core_database/TokenManagerImpl.kt
index 8a9ddc873..f4c08e916 100644
--- a/core-database/src/main/java/com/hmoa/core_database/TokenManagerImpl.kt
+++ b/core-database/src/main/java/com/hmoa/core_database/TokenManagerImpl.kt
@@ -61,6 +61,7 @@ class TokenManagerImpl @Inject constructor(@ApplicationContext context: Context)
}
}
+
override suspend fun getRememberedToken(): Flow {
return dataStore.data.map { preferences ->
preferences[REMEMBERED_TOKEN_KEY]
@@ -75,6 +76,8 @@ class TokenManagerImpl @Inject constructor(@ApplicationContext context: Context)
override suspend fun getGoogleAccessToken(): Flow {
return dataStore.data.map { preferences ->
+ val p = preferences[GOOGLE_ACCESS_TOKEN_KEY]
+ Log.d("TokenManagerImpl", "${p}")
preferences[GOOGLE_ACCESS_TOKEN_KEY]
}
}
diff --git a/core-database/src/test/java/com/hmoa/core_database/ExampleUnitTest.kt b/core-database/src/test/java/com/hmoa/core_database/ExampleUnitTest.kt
deleted file mode 100644
index 2208b69ff..000000000
--- a/core-database/src/test/java/com/hmoa/core_database/ExampleUnitTest.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.hmoa.core_database
-
-import org.junit.Test
-
-import org.junit.Assert.*
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-class ExampleUnitTest {
- @Test
- fun addition_isCorrect() {
- assertEquals(4, 2 + 2)
- }
-}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStore.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStore.kt
deleted file mode 100644
index d3d249024..000000000
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStore.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.hmoa.core_datastore.Admin
-
-import com.hmoa.core_model.request.HomeMenuSaveRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.HomeMenuPerfumeResponseDto
-
-interface AdminDataStore {
- suspend fun deleteHomeMenu(homeMenuId : Int) : DataResponseDto
- suspend fun postHomeMenu(homeMenuId : Int, homeMenuSaveRequestDto : HomeMenuSaveRequestDto) : DataResponseDto
- suspend fun postHomePerfume(dto : HomeMenuPerfumeResponseDto) : DataResponseDto
- suspend fun postHomePerfumeAdd(homeId : Int, perfumeId : Int) : DataResponseDto
-}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStoreImpl.kt
deleted file mode 100644
index f7cef87d8..000000000
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Admin/AdminDataStoreImpl.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.hmoa.core_datastore.Admin
-
-import com.hmoa.core_model.request.HomeMenuSaveRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.HomeMenuPerfumeResponseDto
-import com.hmoa.core_network.service.AdminService
-import javax.inject.Inject
-
-class AdminDataStoreImpl @Inject constructor(
- private val adminService: AdminService
-) : AdminDataStore {
- override suspend fun deleteHomeMenu(homeMenuId: Int): DataResponseDto {
- return adminService.deleteHomeMenu(homeMenuId)
- }
-
- override suspend fun postHomeMenu(
- homeMenuId: Int,
- homeMenuSaveRequestDto: HomeMenuSaveRequestDto
- ): DataResponseDto {
- return adminService.postHomeMenu(homeMenuId, homeMenuSaveRequestDto)
- }
-
- override suspend fun postHomePerfume(dto: HomeMenuPerfumeResponseDto): DataResponseDto {
- return adminService.postHomePerfume(dto)
- }
-
- override suspend fun postHomePerfumeAdd(homeId: Int, perfumeId: Int): DataResponseDto {
- return adminService.postHomePerfumeAdd(homeId, perfumeId)
- }
-}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStore.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStore.kt
index 1e6e6a4f9..02b695900 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStore.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStore.kt
@@ -4,14 +4,11 @@ import ResultResponse
import com.hmoa.core_model.response.BrandDefaultResponseDto
import com.hmoa.core_model.response.BrandPerfumeBriefPagingResponseDto
import com.hmoa.core_model.response.DataResponseDto
-import java.io.File
interface BrandDataStore {
suspend fun getBrand(brandId: Int): ResultResponse>
suspend fun putBrandLike(brandId: Int): DataResponseDto
suspend fun deleteBrandLike(brandId: Int): DataResponseDto
- suspend fun postBrandTestSave(image: File, brandId: Int): DataResponseDto //임시?
- suspend fun postBrand(image: File, brandName: String, englishName: String): DataResponseDto
suspend fun getPerfumesSortedChar(
brandId: Int,
pageNum: Int
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStoreImpl.kt
index b4493e75c..3337f447e 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Brand/BrandDataStoreImpl.kt
@@ -1,28 +1,33 @@
package com.hmoa.core_datastore.Brand
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.BrandDefaultResponseDto
import com.hmoa.core_model.response.BrandPerfumeBriefPagingResponseDto
import com.hmoa.core_model.response.DataResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.BrandService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
-import kotlinx.serialization.json.Json
-import java.io.File
+import com.skydoves.sandwich.suspendOnSuccess
import javax.inject.Inject
class BrandDataStoreImpl @Inject constructor(
- private val brandService: BrandService
+ private val brandService: BrandService,
+ private val authenticator: Authenticator
) : BrandDataStore {
override suspend fun getBrand(brandId: Int): ResultResponse> {
val result = ResultResponse>()
brandService.getBrand(brandId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ brandService.getBrand(brandId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -35,18 +40,6 @@ class BrandDataStoreImpl @Inject constructor(
return brandService.deleteBrandLike(brandId)
}
- override suspend fun postBrandTestSave(image: File, brandId: Int): DataResponseDto {
- return brandService.postBrandTestSave(image = image, brandId = brandId)
- }
-
- override suspend fun postBrand(
- image: File,
- brandName: String,
- englishName: String
- ): DataResponseDto {
- return brandService.postBrand(image, brandName, englishName)
- }
-
override suspend fun getPerfumesSortedChar(
brandId: Int,
pageNum: Int
@@ -55,8 +48,13 @@ class BrandDataStoreImpl @Inject constructor(
brandService.getPerfumesSortedChar(brandId, pageNum).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ brandService.getPerfumesSortedChar(brandId, pageNum).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -69,8 +67,13 @@ class BrandDataStoreImpl @Inject constructor(
brandService.getPerfumesSortedLike(brandId, pageNum).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ brandService.getPerfumesSortedLike(brandId, pageNum).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -83,8 +86,13 @@ class BrandDataStoreImpl @Inject constructor(
brandService.getPerfumesSortedUpdate(brandId, pageNum).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ brandService.getPerfumesSortedUpdate(brandId, pageNum).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStore.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStore.kt
index 3f6cbacbe..f0a1f96cd 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStore.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStore.kt
@@ -3,10 +3,8 @@ package com.hmoa.core_datastore.BrandHPedia
import com.hmoa.core_model.response.DataResponseDto
interface BrandHPediaDataStore {
- suspend fun getBrandStoryAll(pageNum : Int) : DataResponseDto
- suspend fun getBrandStory(brandStoryId : Int) : DataResponseDto
- suspend fun deleteBrandStory(brandStoryId : Int) : DataResponseDto
- suspend fun updateBrandStory(brandStoryId : Int, content : String) : DataResponseDto
- suspend fun postBrandStory(brandStorySubtitle : String, brandStoryTitle : String, content : String) : DataResponseDto
- suspend fun postTestSave() : DataResponseDto //Test
+ suspend fun getBrandStoryAll(pageNum: Int): DataResponseDto
+ suspend fun getBrandStory(brandStoryId: Int): DataResponseDto
+ suspend fun deleteBrandStory(brandStoryId: Int): DataResponseDto
+ suspend fun updateBrandStory(brandStoryId: Int, content: String): DataResponseDto
}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStoreImpl.kt
index c210f47e8..fc99440c9 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/BrandHPedia/BrandHPediaDataStoreImpl.kt
@@ -25,16 +25,4 @@ class BrandHPediaDataStoreImpl @Inject constructor(
): DataResponseDto {
return brandHPediaService.updateBrandStory(brandStoryId, content)
}
-
- override suspend fun postBrandStory(
- brandStorySubtitle: String,
- brandStoryTitle: String,
- content: String
- ): DataResponseDto {
- return brandHPediaService.postBrandStory(brandStorySubtitle, brandStoryTitle, content)
- }
-
- override suspend fun postTestSave(): DataResponseDto {
- return brandHPediaService.postTestSave()
- }
}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Community/CommunityDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Community/CommunityDataStoreImpl.kt
index 1da6a5ea4..5b3db0aef 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Community/CommunityDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Community/CommunityDataStoreImpl.kt
@@ -4,27 +4,33 @@ import ResultResponse
import com.hmoa.core_datastore.Mapper.transformMultipartBody
import com.hmoa.core_datastore.Mapper.transformRequestBody
import com.hmoa.core_datastore.Mapper.transformToMultipartBody
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.CommunityService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.decodeFromString
-import kotlinx.serialization.json.Json
import java.io.File
import javax.inject.Inject
-class CommunityDataStoreImpl @Inject constructor(private val communityService: CommunityService) :
+class CommunityDataStoreImpl @Inject constructor(
+ private val communityService: CommunityService,
+ private val authenticator: Authenticator
+) :
CommunityDataStore {
override suspend fun getCommunity(communityId: Int): ResultResponse {
val result = ResultResponse()
communityService.getCommunity(communityId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.getCommunity(communityId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -46,8 +52,19 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.postCommunityUpdate(
+ images.transformToMultipartBody(),
+ deleteCommunityPhotoIds.transformRequestBody(),
+ title.transformRequestBody(),
+ content.transformRequestBody(),
+ communityId
+ ).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -57,8 +74,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.deleteCommunity(communityId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.deleteCommunity(communityId).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -68,8 +90,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.putCommunityLike(communityId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.putCommunityLike(communityId).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -79,8 +106,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.deleteCommunityLike(communityId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.deleteCommunityLike(communityId).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -97,8 +129,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.getCommunitiesHome().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.getCommunitiesHome().suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -118,8 +155,18 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.postCommunitySave(
+ images.transformToMultipartBody(),
+ category.transformMultipartBody("category"),
+ title.transformMultipartBody("title"),
+ content.transformMultipartBody("content")
+ ).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -129,8 +176,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.getMyCommunitiesByHeart(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.getMyCommunitiesByHeart(cursor).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
@@ -140,8 +192,13 @@ class CommunityDataStoreImpl @Inject constructor(private val communityService: C
communityService.getMyCommunities(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityService.getMyCommunities(cursor).suspendMapSuccess { result.data = this }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/CommunityComment/CommunityCommentDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/CommunityComment/CommunityCommentDataStoreImpl.kt
index 5239962dc..70531dc57 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/CommunityComment/CommunityCommentDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/CommunityComment/CommunityCommentDataStoreImpl.kt
@@ -1,22 +1,20 @@
package com.hmoa.core_datastore.CommunityComment
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.CommunityCommentDefaultRequestDto
-import com.hmoa.core_model.response.CommunityCommentAllResponseDto
-import com.hmoa.core_model.response.CommunityCommentDefaultResponseDto
-import com.hmoa.core_model.response.CommunityCommentWithLikedResponseDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.PagingData
+import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.CommunityCommentService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class CommunityCommentDataStoreImpl @Inject constructor(private val communityCommentService: CommunityCommentService) :
+class CommunityCommentDataStoreImpl @Inject constructor(
+ private val communityCommentService: CommunityCommentService,
+ private val authenticator: Authenticator
+) :
CommunityCommentDataStore {
override suspend fun getCommunityComment(
commentId: Int
@@ -25,8 +23,13 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.getCommunityComment(commentId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.getCommunityComment(commentId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -39,8 +42,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.putCommunityComment(commentId, dto).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.putCommunityComment(commentId, dto)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -50,8 +59,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.deleteCommunityComment(commentId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.deleteCommunityComment(commentId)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -63,8 +78,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.putCommunityCommentLiked(commentId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.putCommunityCommentLiked(commentId)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -74,8 +95,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.deleteCommunityCommentLiked(commentId).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.deleteCommunityCommentLiked(commentId)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -95,8 +122,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.postCommunityComment(communityId, dto).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.postCommunityComment(communityId, dto)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -106,8 +139,14 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.getMyCommunityCommentsByHeart(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.getMyCommunityCommentsByHeart(cursor)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -117,8 +156,13 @@ class CommunityCommentDataStoreImpl @Inject constructor(private val communityCom
communityCommentService.getMyCommunityComments(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ communityCommentService.getMyCommunityComments(cursor).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/DatastoreModule.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/DatastoreModule.kt
index eeb4a1bf3..51419b773 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/DatastoreModule.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/DatastoreModule.kt
@@ -1,7 +1,5 @@
package com.hmoa.core_datastore
-import com.hmoa.core_datastore.Admin.AdminDataStore
-import com.hmoa.core_datastore.Admin.AdminDataStoreImpl
import com.hmoa.core_datastore.Bootpay.BootpayDataStore
import com.hmoa.core_datastore.Bootpay.BootpayDataStoreImpl
import com.hmoa.core_datastore.Brand.BrandDataStore
@@ -59,9 +57,6 @@ import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
interface DatastoreModule {
- @Singleton
- @Binds
- fun provideAdminDatastore(adminDataStoreImpl: AdminDataStoreImpl): AdminDataStore
@Singleton
@Binds
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Fcm/FcmRemoteDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Fcm/FcmRemoteDataStoreImpl.kt
index 5e88c68c9..cf50b7a16 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Fcm/FcmRemoteDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Fcm/FcmRemoteDataStoreImpl.kt
@@ -1,19 +1,19 @@
package com.hmoa.core_datastore.Fcm
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.FCMTokenSaveRequestDto
import com.hmoa.core_model.response.AlarmResponse
import com.hmoa.core_model.response.DataResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.FcmService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
class FcmRemoteDataStoreImpl @Inject constructor(
- private val fcmDataService: FcmService
+ private val fcmDataService: FcmService,
+ private val authenticator: Authenticator
) : FcmRemoteDataStore {
override suspend fun deleteFcmToken(): ResultResponse {
@@ -21,38 +21,61 @@ class FcmRemoteDataStoreImpl @Inject constructor(
fcmDataService.deleteFcmToken().suspendOnSuccess {
result.data = this.data.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ fcmDataService.deleteFcmToken().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun getFcmList(): ResultResponse>> {
var result = ResultResponse>>()
- fcmDataService.getAlarmList().suspendOnSuccess{
+ fcmDataService.getAlarmList().suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ fcmDataService.getAlarmList().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun checkAlarm(alarmId: Int): ResultResponse> {
var result = ResultResponse>()
- fcmDataService.checkAlarm(alarmId).suspendOnSuccess{
+ fcmDataService.checkAlarm(alarmId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ fcmDataService.checkAlarm(alarmId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun saveFcmToken(fcmTokenSaveRequest: FCMTokenSaveRequestDto): ResultResponse {
var result = ResultResponse()
fcmDataService.saveFcmToken(fcmTokenSaveRequest).suspendOnSuccess {
result.data = this.data.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ fcmDataService.saveFcmToken(fcmTokenSaveRequest).suspendOnSuccess { result.data = this.data.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStoreImpl.kt
index 8e8c55dec..cdd3e1b56 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Login/LoginRemoteDataStoreImpl.kt
@@ -2,24 +2,25 @@ package com.hmoa.core_datastore.Login
import ResultResponse
import com.hmoa.core_model.Provider
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.GoogleAccessTokenRequestDto
import com.hmoa.core_model.request.OauthLoginRequestDto
import com.hmoa.core_model.request.RememberedLoginRequestDto
import com.hmoa.core_model.response.GoogleAccessTokenResponseDto
import com.hmoa.core_model.response.MemberLoginResponseDto
import com.hmoa.core_model.response.TokenResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.authentication.GoogleServerAuthCodeService
import com.hmoa.core_network.service.LoginService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
-import kotlinx.serialization.json.Json
+import com.skydoves.sandwich.suspendOnSuccess
import javax.inject.Inject
class LoginRemoteDataStoreImpl @Inject constructor(
private val loginService: LoginService,
- private val googleServerAuthCodeService: GoogleServerAuthCodeService
+ private val googleServerAuthCodeService: GoogleServerAuthCodeService,
+ private val authenticator: Authenticator
) : LoginRemoteDataStore {
@@ -31,8 +32,13 @@ class LoginRemoteDataStoreImpl @Inject constructor(
loginService.postOAuth(accessToken, provider).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ loginService.postOAuth(accessToken, provider).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -42,8 +48,13 @@ class LoginRemoteDataStoreImpl @Inject constructor(
loginService.postRemembered(dto).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ loginService.postRemembered(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Magazine/MagazineDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Magazine/MagazineDataStoreImpl.kt
index 61154c3ff..24b088c6e 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Magazine/MagazineDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Magazine/MagazineDataStoreImpl.kt
@@ -1,66 +1,97 @@
package com.hmoa.core_datastore.Magazine
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.MagazineResponseDto
import com.hmoa.core_model.response.MagazineSummaryResponseDto
import com.hmoa.core_model.response.MagazineTastingCommentResponseDto
import com.hmoa.core_model.response.PagingData
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.MagazineService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
class MagazineDataStoreImpl @Inject constructor(
- private val magazineService: MagazineService
+ private val magazineService: MagazineService,
+ private val authenticator: Authenticator
) : MagazineDataStore {
override suspend fun getMagazine(magazineId: Int): ResultResponse {
val result = ResultResponse()
- magazineService.getMagazine(magazineId).suspendOnSuccess{
+ magazineService.getMagazine(magazineId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.getMagazine(magazineId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun putMagazineHeart(magazineId: Int): ResultResponse {
val result = ResultResponse()
- magazineService.putMagazineHeart(magazineId).suspendOnSuccess{
+ magazineService.putMagazineHeart(magazineId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.putMagazineHeart(magazineId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
override suspend fun deleteMagazineHeart(magazineId: Int): ResultResponse {
val result = ResultResponse()
- magazineService.deleteMagazineHeart(magazineId).suspendOnSuccess{
+ magazineService.deleteMagazineHeart(magazineId).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.deleteMagazineHeart(magazineId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
override suspend fun getMagazineList(cursor: Int): ResultResponse> {
val result = ResultResponse>()
- magazineService.getMagazineList(cursor).suspendOnSuccess{
+ magazineService.getMagazineList(cursor).suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.getMagazineList(cursor).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
override suspend fun getMagazineTastingComment(): ResultResponse {
val result = ResultResponse()
- magazineService.getMagazineTastingComment().suspendOnSuccess{
+ magazineService.getMagazineTastingComment().suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ magazineService.getMagazineTastingComment().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Main/MainDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Main/MainDataStoreImpl.kt
index 33ac9a8b5..a8bb6269d 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Main/MainDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Main/MainDataStoreImpl.kt
@@ -1,27 +1,33 @@
package com.hmoa.core_datastore.Main
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.HomeMenuAllResponseDto
import com.hmoa.core_model.response.HomeMenuDefaultResponseDto
import com.hmoa.core_model.response.HomeMenuFirstResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.MainService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
-import kotlinx.serialization.json.Json
+import com.skydoves.sandwich.suspendOnSuccess
import javax.inject.Inject
class MainDataStoreImpl @Inject constructor(
- private val mainService: MainService
+ private val mainService: MainService,
+ private val authenticator: Authenticator
) : MainDataStore {
override suspend fun getFirst(): ResultResponse {
val result = ResultResponse()
mainService.getFirst().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getFirst().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -31,8 +37,13 @@ class MainDataStoreImpl @Inject constructor(
mainService.getFirstMenu().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getFirstMenu().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -42,8 +53,13 @@ class MainDataStoreImpl @Inject constructor(
mainService.getSecond().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getSecond().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -53,8 +69,13 @@ class MainDataStoreImpl @Inject constructor(
mainService.getSecondMenu().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getSecondMenu().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -64,8 +85,13 @@ class MainDataStoreImpl @Inject constructor(
mainService.getThirdMenu().suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ mainService.getThirdMenu().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Member/MemberDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Member/MemberDataStoreImpl.kt
index af36af5b9..0a73aa61b 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Member/MemberDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Member/MemberDataStoreImpl.kt
@@ -14,6 +14,7 @@ import com.hmoa.core_model.response.CommunityCommentDefaultResponseDto
import com.hmoa.core_model.response.DataResponseDto
import com.hmoa.core_model.response.GetRefundRecordResponseDto
import com.hmoa.core_model.response.MemberResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_model.response.OrderRecordDto
import com.hmoa.core_model.response.PagingData
import com.hmoa.core_network.service.MemberService
@@ -27,16 +28,23 @@ import java.io.File
import javax.inject.Inject
class MemberDataStoreImpl @Inject constructor(
- private val memberService: MemberService
+ private val memberService: MemberService,
+ private val authenticator: Authenticator
) : MemberDataStore {
override suspend fun getMember(): ResultResponse {
val result = ResultResponse()
- memberService.getMember().suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getMember()
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getMember().suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun getAddress(): ResultResponse {
@@ -67,23 +75,35 @@ class MemberDataStoreImpl @Inject constructor(
override suspend fun getCommunities(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getCommunities(page).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getCommunities(page)
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getCommunities(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun getCommunityComments(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getCommunityComments(page).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getCommunityComments(page)
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getCommunityComments(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
@@ -93,38 +113,56 @@ class MemberDataStoreImpl @Inject constructor(
override suspend fun postExistsNickname(request: NickNameRequestDto): ResultResponse {
val result = ResultResponse()
- memberService.postExistsNickname(request).suspendOnSuccess {
- result.data = false
- }.suspendOnError {
- if (this.statusCode.code == 409) {
- result.data = true
- } else {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ memberService.postExistsNickname(request)
+ .suspendOnSuccess {
+ result.data = false
+ }.suspendOnError {
+ if (this.statusCode.code == 409) {
+ result.data = true
+ } else {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.postExistsNickname(request).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
}
- }
return result
}
override suspend fun updateJoin(request: JoinUpdateRequestDto): ResultResponse {
val result = ResultResponse()
- memberService.updateJoin(request).suspendMapSuccess {
- result.data = this
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.updateJoin(request)
+ .suspendMapSuccess {
+ result.data = this
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.updateJoin(request).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun updateNickname(request: NickNameRequestDto): ResultResponse> {
val result = ResultResponse>()
- memberService.updateNickname(request).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.updateNickname(request)
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.updateNickname(request).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
@@ -174,45 +212,70 @@ class MemberDataStoreImpl @Inject constructor(
override suspend fun getCommunityFavoriteComments(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getCommunityFavoriteComments(page).suspendMapSuccess {
- result.data = this
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getCommunityFavoriteComments(page)
+ .suspendMapSuccess {
+ result.data = this
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getCommunityFavoriteComments(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun getPerfumeFavoriteComments(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getPerfumeFavoriteComments(page).suspendMapSuccess {
- result.data = this
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getPerfumeFavoriteComments(page)
+ .suspendMapSuccess {
+ result.data = this
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getPerfumeFavoriteComments(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun getPerfumeComments(page: Int): ResultResponse> {
val result = ResultResponse>()
- memberService.getPerfumeComments(page).suspendMapSuccess {
- result.data = this
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.getPerfumeComments(page)
+ .suspendMapSuccess {
+ result.data = this
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.getPerfumeComments(page).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
override suspend fun postProfilePhoto(image: File): ResultResponse> {
val result = ResultResponse>()
- memberService.postProfilePhoto(image.transformToMultipartBody()).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ memberService.postProfilePhoto(image.transformToMultipartBody())
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ memberService.postProfilePhoto(image.transformToMultipartBody())
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Note/NoteDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Note/NoteDataStoreImpl.kt
index a3bc2e7cb..f434b5f31 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Note/NoteDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Note/NoteDataStoreImpl.kt
@@ -1,18 +1,18 @@
package com.hmoa.core_datastore.Note
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.DataResponseDto
import com.hmoa.core_model.response.NoteDescResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.NoteService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
class NoteDataStoreImpl @Inject constructor(
- private val noteService: NoteService
+ private val noteService: NoteService,
+ private val authenticator: Authenticator
) : NoteDataStore {
override suspend fun getNoteAll(pageNum: Int): DataResponseDto {
return noteService.getNoteAll(pageNum)
@@ -20,12 +20,18 @@ class NoteDataStoreImpl @Inject constructor(
override suspend fun getNote(noteId: Int): ResultResponse> {
val result = ResultResponse>()
- noteService.getNote(noteId).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ noteService.getNote(noteId)
+ .suspendOnSuccess {
+ result.data = this.data
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ noteService.getNote(noteId).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Perfume/PerfumeDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Perfume/PerfumeDataStoreImpl.kt
index b5817d071..6b9475a9f 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Perfume/PerfumeDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Perfume/PerfumeDataStoreImpl.kt
@@ -1,45 +1,53 @@
package com.hmoa.core_datastore.Perfume
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.AgeRequestDto
import com.hmoa.core_model.request.PerfumeGenderRequestDto
import com.hmoa.core_model.request.PerfumeWeatherRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.PerfumeAgeResponseDto
-import com.hmoa.core_model.response.PerfumeDetailResponseDto
-import com.hmoa.core_model.response.PerfumeDetailSecondResponseDto
-import com.hmoa.core_model.response.PerfumeGenderResponseDto
-import com.hmoa.core_model.response.PerfumeLikeResponseDto
-import com.hmoa.core_model.response.PerfumeWeatherResponseDto
-import com.hmoa.core_model.response.RecentPerfumeResponseDto
+import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.PerfumeService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: PerfumeService) : PerfumeDataStore {
+class PerfumeDataStoreImpl @Inject constructor(
+ private val perfumeService: PerfumeService,
+ private val authenticator: Authenticator
+) : PerfumeDataStore {
override suspend fun getPerfumeTopDetail(perfumeId: String): ResultResponse {
var result = ResultResponse()
- perfumeService.getPerfumeTopDetail(perfumeId).suspendOnSuccess {
- result.data = this.data
- }.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
- }
+ perfumeService.getPerfumeTopDetail(perfumeId)
+ .suspendOnSuccess {
+ result.data = this.data
+ }
+ .suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.getPerfumeTopDetail(perfumeId).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }
return result
}
+
override suspend fun getPerfumeBottomDetail(perfumeId: String): ResultResponse {
var result = ResultResponse()
perfumeService.getPerfumeBottomDetail(perfumeId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.getPerfumeBottomDetail(perfumeId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -49,8 +57,13 @@ class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: Perfu
perfumeService.postPerfumeAge(dto, perfumeId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.postPerfumeAge(dto, perfumeId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -67,8 +80,13 @@ class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: Perfu
perfumeService.postPerfumeGender(dto, perfumeId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.postPerfumeGender(dto, perfumeId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -93,8 +111,13 @@ class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: Perfu
perfumeService.postPerfumeWeather(perfumeId, dto).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.postPerfumeWeather(perfumeId, dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -108,17 +131,29 @@ class PerfumeDataStoreImpl @Inject constructor(private val perfumeService: Perfu
perfumeService.getLikePerfumes().suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.getLikePerfumes().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
+
override suspend fun getRecentPerfumes(): ResultResponse {
val result = ResultResponse()
- perfumeService.getRecentPerfumes().suspendOnSuccess{
+ perfumeService.getRecentPerfumes().suspendOnSuccess {
result.data = this.data
- }.suspendOnError{
- result.errorMessage = Json.decodeFromString(this.message())
+ }.suspendOnError {
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeService.getRecentPerfumes().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/PerfumeComment/PerfumeCommentDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/PerfumeComment/PerfumeCommentDataStoreImpl.kt
index 3e6a02c2e..fbaeee8ad 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/PerfumeComment/PerfumeCommentDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/PerfumeComment/PerfumeCommentDataStoreImpl.kt
@@ -1,17 +1,19 @@
package com.hmoa.core_datastore.PerfumeComment
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.PerfumeCommentRequestDto
import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.PerfumeCommentService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeCommentService: PerfumeCommentService) :
+class PerfumeCommentDataStoreImpl @Inject constructor(
+ private val perfumeCommentService: PerfumeCommentService,
+ private val authenticator: Authenticator
+) :
PerfumeCommentDataStore {
override suspend fun getPerfumeComment(commentId: Int): PerfumeCommentResponseDto {
return perfumeCommentService.getPerfumeComment(commentId)
@@ -42,8 +44,13 @@ class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeComment
perfumeCommentService.putPerfumeCommentLike(commentId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeCommentService.putPerfumeCommentLike(commentId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -53,8 +60,14 @@ class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeComment
perfumeCommentService.deletePerfumeCommentLike(commentId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeCommentService.deletePerfumeCommentLike(commentId)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -73,8 +86,14 @@ class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeComment
perfumeCommentService.getPerfumeCommentsWithHeart(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeCommentService.getPerfumeCommentsWithHeart(cursor)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -86,8 +105,14 @@ class PerfumeCommentDataStoreImpl @Inject constructor(private val perfumeComment
perfumeCommentService.getMyPerfumeComments(cursor).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumeCommentService.getMyPerfumeComments(cursor)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Perfumer/PerfumerDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Perfumer/PerfumerDataStoreImpl.kt
index 04973e286..1e48370cc 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Perfumer/PerfumerDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Perfumer/PerfumerDataStoreImpl.kt
@@ -1,17 +1,19 @@
package com.hmoa.core_datastore.Perfumer
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.DataResponseDto
import com.hmoa.core_model.response.PerfumerDescResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.PerfumerService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
-class PerfumerDataStoreImpl @Inject constructor(private val perfumerService: PerfumerService) :
+class PerfumerDataStoreImpl @Inject constructor(
+ private val perfumerService: PerfumerService,
+ private val authenticator: Authenticator
+) :
PerfumerDataStore {
override suspend fun getPerfumers(pageNum: String): DataResponseDto {
return perfumerService.getPerfumers(pageNum)
@@ -22,8 +24,13 @@ class PerfumerDataStoreImpl @Inject constructor(private val perfumerService: Per
perfumerService.getPerfumer(perfumerId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ perfumerService.getPerfumer(perfumerId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStore.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStore.kt
index 286119136..52c07fd99 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStore.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStore.kt
@@ -6,7 +6,7 @@ import com.hmoa.core_model.response.DataResponseDto
interface ReportDataStore {
suspend fun reportPerfumeComment(dto: TargetRequestDto): ResultResponse>
- suspend fun reportCommunity(dto: TargetRequestDto): DataResponseDto
- suspend fun reportCommunityComment(dto: TargetRequestDto): DataResponseDto
+ suspend fun reportCommunity(dto: TargetRequestDto): ResultResponse>
+ suspend fun reportCommunityComment(dto: TargetRequestDto): ResultResponse>
suspend fun reportReview(reviewId: Int): ResultResponse>
}
\ No newline at end of file
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStoreImpl.kt
index 6d0291ca2..da2b95874 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Report/ReportDataStoreImpl.kt
@@ -4,6 +4,7 @@ import ResultResponse
import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.request.TargetRequestDto
import com.hmoa.core_model.response.DataResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.ReportService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
@@ -12,13 +13,40 @@ import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import javax.inject.Inject
-class ReportDataStoreImpl @Inject constructor(private val reportService: ReportService) : ReportDataStore {
- override suspend fun reportCommunity(dto: TargetRequestDto): DataResponseDto {
- return reportService.postReportCommunity(dto)
+class ReportDataStoreImpl @Inject constructor(
+ private val reportService: ReportService,
+ private val authenticator: Authenticator
+) : ReportDataStore {
+ override suspend fun reportCommunity(dto: TargetRequestDto): ResultResponse> {
+ val result = ResultResponse>()
+ reportService.postReportCommunity(dto).suspendOnError{
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ reportService.postReportCommunityComment(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }.suspendOnSuccess{
+ result.data = this.data
+ }
+ return result
}
- override suspend fun reportCommunityComment(dto: TargetRequestDto): DataResponseDto {
- return reportService.postReportCommunityComment(dto)
+ override suspend fun reportCommunityComment(dto: TargetRequestDto): ResultResponse> {
+ val result = ResultResponse>()
+ reportService.postReportCommunityComment(dto).suspendOnError{
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ reportService.postReportCommunityComment(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
+ }.suspendOnSuccess{
+ result.data = this.data
+ }
+ return result
}
override suspend fun reportPerfumeComment(dto: TargetRequestDto): ResultResponse> {
@@ -26,8 +54,13 @@ class ReportDataStoreImpl @Inject constructor(private val reportService: ReportS
reportService.postReportPerfumeComment(dto).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ reportService.postReportPerfumeComment(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Search/SearchDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Search/SearchDataStoreImpl.kt
index 26d382b02..5c225665d 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Search/SearchDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Search/SearchDataStoreImpl.kt
@@ -1,25 +1,31 @@
package com.hmoa.core_datastore.Search
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.SearchService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendMapSuccess
import com.skydoves.sandwich.suspendOnError
-import kotlinx.serialization.json.Json
+import com.skydoves.sandwich.suspendOnSuccess
import javax.inject.Inject
class SearchDataStoreImpl @Inject constructor(
- private val searchService: SearchService
+ private val searchService: SearchService,
+ private val authenticator: Authenticator
) : SearchDataStore {
override suspend fun getBrand(searchWord: String): ResultResponse> {
val result = ResultResponse>()
searchService.getBrand(searchWord).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getBrand(searchWord).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -29,8 +35,13 @@ class SearchDataStoreImpl @Inject constructor(
searchService.getBrandAll(consonant).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getBrandAll(consonant).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -50,8 +61,13 @@ class SearchDataStoreImpl @Inject constructor(
searchService.getCommunity(page, searchWord).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getCommunity(page, searchWord).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -73,8 +89,13 @@ class SearchDataStoreImpl @Inject constructor(
searchService.getPerfume(page, searchWord).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getPerfume(page, searchWord).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -87,8 +108,13 @@ class SearchDataStoreImpl @Inject constructor(
searchService.getPerfumeName(page, searchWord).suspendMapSuccess {
result.data = this
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ searchService.getPerfumeName(page, searchWord).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Survey/SurveyRemoteDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Survey/SurveyRemoteDataStoreImpl.kt
index 15d414497..18fe2964e 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Survey/SurveyRemoteDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Survey/SurveyRemoteDataStoreImpl.kt
@@ -3,31 +3,33 @@ package com.hmoa.core_datastore.Survey
import ResultResponse
import com.hmoa.core_model.PerfumeRecommendType
import com.hmoa.core_model.data.ErrorMessage
-import com.hmoa.core_model.request.ContentRequestDto
-import com.hmoa.core_model.request.PerfumeSurveyAnswerRequestDto
-import com.hmoa.core_model.request.SurveyRespondRequestDto
-import com.hmoa.core_model.request.SurveySaveAnswerRequestDtos
-import com.hmoa.core_model.request.SurveySaveRequestDto
-import com.hmoa.core_model.response.DataResponseDto
-import com.hmoa.core_model.response.PerfumeRecommendsResponseDto
-import com.hmoa.core_model.response.PerfumeSurveyResponseDto
-import com.hmoa.core_model.response.RecommendNotesResponseDto
-import com.hmoa.core_model.response.SurveyQuestionsResponseDto
+import com.hmoa.core_model.request.*
+import com.hmoa.core_model.response.*
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.SurveyService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import javax.inject.Inject
-class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: SurveyService) : SurveyRemoteDataStore {
+
+class SurveyRemoteDataStoreImpl @Inject constructor(
+ private val surveyService: SurveyService,
+ private val authenticator: Authenticator
+) : SurveyRemoteDataStore {
override suspend fun getSurveyQuestions(): ResultResponse {
val result = ResultResponse()
surveyService.getSurveyQuestions().suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- result.errorMessage = Json.decodeFromString(this.message())
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.getSurveyQuestions().suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -37,7 +39,13 @@ class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: S
surveyService.postSurveyResponds(dto).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- result.errorMessage = Json.decodeFromString(this.message())
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.postSurveyResponds(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -47,7 +55,13 @@ class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: S
surveyService.saveSurvey(dto).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- result.errorMessage = Json.decodeFromString(this.message())
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.saveSurvey(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -57,7 +71,13 @@ class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: S
surveyService.saveAnswerNote(dto).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- result.errorMessage = Json.decodeFromString(this.message())
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.saveAnswerNote(dto).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -70,7 +90,13 @@ class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: S
surveyService.saveAnswerByQuestionId(dto, questionId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- result.errorMessage = Json.decodeFromString(this.message())
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.saveAnswerByQuestionId(dto, questionId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -83,7 +109,13 @@ class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: S
surveyService.saveQuestionBySurveyId(dto, surveyId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- result.errorMessage = Json.decodeFromString(this.message())
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.saveQuestionBySurveyId(dto, surveyId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
@@ -106,7 +138,14 @@ class SurveyRemoteDataStoreImpl @Inject constructor(private val surveyService: S
surveyService.postPerfumeSurveyAnswer(dto, recommendType.name).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- result.errorMessage = Json.decodeFromString(this.message())
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ surveyService.postPerfumeSurveyAnswer(dto, recommendType.name)
+ .suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-datastore/src/main/java/com/hmoa/core_datastore/Term/TermDataStoreImpl.kt b/core-datastore/src/main/java/com/hmoa/core_datastore/Term/TermDataStoreImpl.kt
index 3491d0bd6..c9b0097b7 100644
--- a/core-datastore/src/main/java/com/hmoa/core_datastore/Term/TermDataStoreImpl.kt
+++ b/core-datastore/src/main/java/com/hmoa/core_datastore/Term/TermDataStoreImpl.kt
@@ -1,19 +1,19 @@
package com.hmoa.core_datastore.Term
import ResultResponse
-import com.hmoa.core_model.data.ErrorMessage
import com.hmoa.core_model.response.DataResponseDto
import com.hmoa.core_model.response.TermDefaultResponseDto
import com.hmoa.core_model.response.TermDescResponseDto
+import com.hmoa.core_network.authentication.Authenticator
import com.hmoa.core_network.service.TermService
import com.skydoves.sandwich.message
import com.skydoves.sandwich.suspendOnError
import com.skydoves.sandwich.suspendOnSuccess
-import kotlinx.serialization.json.Json
import javax.inject.Inject
class TermDataStoreImpl @Inject constructor(
- private val termService: TermService
+ private val termService: TermService,
+ private val authenticator: Authenticator
) : TermDataStore {
override suspend fun getTerms(page: Int): DataResponseDto> {
@@ -25,8 +25,13 @@ class TermDataStoreImpl @Inject constructor(
termService.getTerm(termId).suspendOnSuccess {
result.data = this.data
}.suspendOnError {
- val errorMessage = Json.decodeFromString(this.message())
- result.errorMessage = errorMessage
+ authenticator.handleApiError(
+ rawMessage = this.message(),
+ handleErrorMesssage = { result.errorMessage = it },
+ onCompleteTokenRefresh = {
+ termService.getTerm(termId).suspendOnSuccess { result.data = this.data }
+ }
+ )
}
return result
}
diff --git a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/Button.kt b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/Button.kt
index 1423882e9..7ff08acc5 100644
--- a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/Button.kt
+++ b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/Button.kt
@@ -33,7 +33,12 @@ fun Button(
modifier = Modifier
.background(
color = if (isEnabled) Color.Black else CustomColor.gray2,
- shape = RoundedCornerShape(roundCorner)
+ shape = RoundedCornerShape(
+ topStart = roundCorner.dp,
+ topEnd = roundCorner.dp,
+ bottomStart = roundCorner.dp,
+ bottomEnd = roundCorner.dp
+ )
)
.clickable {
if (isEnabled) {
@@ -61,7 +66,7 @@ fun Button(
}
}
-@Preview(showBackground = true)
+@Preview
@Composable
fun TestBottomButton() {
diff --git a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/Comment.kt b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/Comment.kt
index 14ef60840..8b78dfc3e 100644
--- a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/Comment.kt
+++ b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/Comment.kt
@@ -6,11 +6,13 @@ import androidx.compose.foundation.layout.*
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
+import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
@@ -18,7 +20,6 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.hmoa.core_designsystem.R
import com.hmoa.core_designsystem.theme.CustomColor
-import com.hmoa.core_designsystem.theme.CustomFont
@Composable
fun Comment(
@@ -29,16 +30,22 @@ fun Comment(
comment: String,
isFirst: Boolean,
isSelected: Boolean,
- onChangeSelect: () -> Unit,
heartCount: Int,
+ onHeartClick: (Boolean) -> Unit,
onOpenBottomDialog: () -> Unit,
navCommunity: () -> Unit,
) {
+ var isLiked by remember { mutableStateOf(isSelected) }
+ var heartCount by remember { mutableStateOf(heartCount) }
Column(
modifier = Modifier
.fillMaxWidth()
.background(color = Color.White)
- .clickable {navCommunity()}
+ .clickable {
+ navCommunity()
+ }
+ .padding(horizontal = 16.dp)
+ .padding(bottom = 16.dp)
) {
Spacer(Modifier.height(11.dp))
@@ -52,9 +59,9 @@ fun Comment(
text = nickname,
fontSize = 14.sp,
lineHeight = 14.sp,
- fontWeight = FontWeight(400),
- color = Color.Black,
- fontFamily = CustomFont.regular
+ fontWeight = FontWeight.Normal,
+ fontFamily = FontFamily(Font(R.font.pretendard_regular)),
+ color = Color.Black
)
Spacer(Modifier.width(7.dp))
if (isFirst) {
@@ -74,7 +81,6 @@ fun Comment(
fontSize = 12.sp,
lineHeight = 19.6.sp,
fontWeight = FontWeight(300),
- fontFamily = CustomFont.regular,
color = CustomColor.gray3
)
Spacer(Modifier.weight(1f))
@@ -87,13 +93,16 @@ fun Comment(
) {
if (isEditable) {
IconButton(
- modifier = Modifier.size(16.dp),
- onClick = onChangeSelect
+ onClick = {
+ if (isLiked) heartCount-- else heartCount++
+ onHeartClick(isLiked)
+ isLiked = !isLiked
+ }
) {
Icon(
- modifier = Modifier.fillMaxSize(1f),
+ modifier = Modifier.size(22.dp),
painter = painterResource(R.drawable.ic_heart_selectable_not_selected),
- tint = if (isSelected) CustomColor.red else CustomColor.gray2,
+ tint = if (isLiked) CustomColor.red else CustomColor.gray2,
contentDescription = "Comment Like Button"
)
}
@@ -106,21 +115,20 @@ fun Comment(
)
}
Spacer(Modifier.width(8.dp))
- Text(
- text = if (heartCount <= 999) heartCount.toString() else "999+",
- color = Color.Black,
- fontSize = 12.sp,
- fontFamily = CustomFont.regular
- )
}
+ Text(
+ text = if (heartCount <= 999) heartCount.toString() else "999+",
+ color = Color.Black,
+ fontSize = 12.sp
+ )
if (isEditable) {
- Spacer(Modifier.width(8.dp))
-
IconButton(
onClick = onOpenBottomDialog
) {
Icon(
+ modifier = Modifier.size(16.dp),
painter = painterResource(R.drawable.three_dot_menu_horizontal),
+ tint = CustomColor.gray2,
contentDescription = "Bottom Dialog Status Controller"
)
}
@@ -152,7 +160,7 @@ fun TestComment() {
comment = "아ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ",
isFirst = true,
isSelected = true,
- onChangeSelect = {},
+ onHeartClick = {},
heartCount = 10,
onOpenBottomDialog = {},
navCommunity = {},
diff --git a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/ErrorUiSetView.kt b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/ErrorUiSetView.kt
index daf979602..5cb74dba9 100644
--- a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/ErrorUiSetView.kt
+++ b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/ErrorUiSetView.kt
@@ -1,89 +1,107 @@
package com.hmoa.core_designsystem.component
-import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentHeight
-import androidx.compose.runtime.Composable
+import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalConfiguration
-import androidx.compose.ui.semantics.semantics
-import androidx.compose.ui.semantics.testTag
import androidx.compose.ui.unit.dp
import com.hmoa.core_common.ErrorUiState
@Composable
-fun ErrorUiSetView(isOpen: Boolean, onConfirmClick: () -> Unit, errorUiState: ErrorUiState, onCloseClick: () -> Unit) {
+fun ErrorUiSetView(onLoginClick: () -> Unit, errorUiState: ErrorUiState, onCloseClick: () -> Unit) {
+ var isOpen by remember { mutableStateOf(true) }
val screenWidth = LocalConfiguration.current.screenWidthDp.dp
+
when (errorUiState) {
is ErrorUiState.ErrorData -> {
if (errorUiState.expiredTokenError) {
- Box(modifier = Modifier.semantics { testTag = "expiredTokenError" }) {
- AppDesignDialog(
- isOpen = isOpen,
- modifier = Modifier.wrapContentHeight()
- .width(screenWidth - 88.dp),
- title = "리프레시 토큰이 만료되었습니다",
- content = "다시 로그인해주세요",
- buttonTitle = "로그인 하러가기",
- onOkClick = {
- onConfirmClick()
- },
- onCloseClick = {
- onCloseClick()
- }
- )
- }
+ AppDesignDialog(
+ isOpen = isOpen,
+ modifier = Modifier.wrapContentHeight()
+ .width(screenWidth - 88.dp),
+ title = "리프레시 토큰이 만료되었습니다",
+ content = "다시 로그인해주세요",
+ buttonTitle = "로그인 하러가기",
+ onOkClick = {
+ isOpen = false
+ onLoginClick()
+ },
+ onCloseClick = {
+ isOpen = false
+ onCloseClick()
+ }
+ )
} else if (errorUiState.wrongTypeTokenError) {
- Box(modifier = Modifier.semantics { testTag = "wrongTypeTokenError" }) {
- AppDesignDialog(
- isOpen = isOpen,
- modifier = Modifier.wrapContentHeight()
- .width(screenWidth - 88.dp),
- title = "유효하지 않은 토큰입니다",
- content = "유효하지 않은 토큰입니다",
- buttonTitle = "로그인 하러가기",
- onOkClick = {
- onConfirmClick()
- },
- onCloseClick = {
- onCloseClick()
- }
- )
- }
+ AppDesignDialog(
+ isOpen = isOpen,
+ modifier = Modifier.wrapContentHeight()
+ .width(screenWidth - 88.dp),
+ title = "유효하지 않은 토큰입니다",
+ content = "유효하지 않은 토큰입니다",
+ buttonTitle = "로그인 하러가기",
+ onOkClick = {
+ isOpen = false
+ onLoginClick()
+ },
+ onCloseClick = {
+ isOpen = false
+ onCloseClick()
+ }
+ )
} else if (errorUiState.unknownError) {
- Box(modifier = Modifier.semantics { testTag = "unknownError" }) {
- AppDesignDialog(
- isOpen = isOpen,
- modifier = Modifier.wrapContentHeight()
- .width(screenWidth - 88.dp),
- title = "로그인 후 이용가능한 서비스입니다",
- content = "입력하신 내용을 다시 확인해주세요",
- buttonTitle = "로그인 하러가기",
- onOkClick = {
- onConfirmClick()
- },
- onCloseClick = {
- onCloseClick()
- }
- )
- }
+ AppDesignDialog(
+ isOpen = isOpen,
+ modifier = Modifier.wrapContentHeight()
+ .width(screenWidth - 88.dp),
+ title = "로그인 후 이용가능한 서비스입니다",
+ content = "입력하신 내용을 다시 확인해주세요",
+ buttonTitle = "로그인 하러가기",
+ onOkClick = {
+ isOpen = false
+ onLoginClick()
+ },
+ onCloseClick = {
+ isOpen = false
+ onCloseClick()
+ }
+ )
+ } else if (errorUiState.memberNotFoundError ?: false) {
+ AppDesignDialog(
+ isOpen = isOpen,
+ modifier = Modifier.wrapContentHeight()
+ .width(screenWidth - 88.dp),
+ title = "사용자를 찾을 수 없습니다",
+ content = "다시 로그인해주세요",
+ buttonTitle = "로그인 하러가기",
+ onOkClick = {
+ isOpen = false
+ onLoginClick()
+ },
+ onCloseClick = {
+ isOpen = false
+ onCloseClick()
+ }
+ )
} else if (errorUiState.generalError.first) {
- Box(modifier = Modifier.semantics { testTag = "generalError" }) {
- AppDefaultDialog(
- isOpen = isOpen,
- title = "이런 오류가 발생했어요 :(",
- content = (errorUiState as ErrorUiState.ErrorData).generalError.second ?: "",
- onDismiss = {
- onCloseClick()
- },
- modifier = Modifier.wrapContentHeight()
- .width(screenWidth - 88.dp)
- )
- }
+ AppDefaultDialog(
+ isOpen = isOpen,
+ title = "오류가 발생했어요 :(",
+ content = (errorUiState as ErrorUiState.ErrorData).generalError.second
+ ?: "서비스 정상화를 위해 노력하고 있습니다 :)",
+ onDismiss = {
+ isOpen = false
+ onCloseClick()
+ },
+ modifier = Modifier.wrapContentHeight()
+ .width(screenWidth - 88.dp)
+ )
}
}
- ErrorUiState.Loading -> {}
+ ErrorUiState.Loading -> {
+ AppLoadingScreen()
+ }
}
-}
+}
\ No newline at end of file
diff --git a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/MagazineTag.kt b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/MagazineTag.kt
new file mode 100644
index 000000000..6c3c25180
--- /dev/null
+++ b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/MagazineTag.kt
@@ -0,0 +1,47 @@
+package com.hmoa.core_designsystem.component
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.wrapContentWidth
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import com.hmoa.core_designsystem.theme.CustomColor
+
+@Composable
+fun MagazineTag(
+ tag : String
+){
+ Text(
+ modifier = Modifier
+ .wrapContentWidth()
+ .height(28.dp)
+ .background(color = Color.White, shape = RoundedCornerShape(14.dp))
+ .border(width = 1.dp, color = CustomColor.gray3, shape = RoundedCornerShape(14.dp))
+ .padding(horizontal = 14.dp, vertical = 8.dp),
+ text = tag,
+ fontSize = 12.sp,
+ color = CustomColor.gray3,
+ textAlign = TextAlign.Center
+ )
+}
+
+@Preview
+@Composable
+fun MagazineTagTest(){
+ Row(
+ modifier = Modifier.fillMaxSize().background(color = Color.White)
+ ){
+ MagazineTag(tag = "#Test")
+ }
+}
\ No newline at end of file
diff --git a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/OAuthLoginButton.kt b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/OAuthLoginButton.kt
index af97a45d6..75272a003 100644
--- a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/OAuthLoginButton.kt
+++ b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/OAuthLoginButton.kt
@@ -46,29 +46,30 @@ fun OAuthLoginButton(
.clickable {
onPress()
}.addModifier(buttonModifier),
- horizontalArrangement = Arrangement.Start,
+ horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
) {
- Spacer(modifier = Modifier.padding(start = screenWidth / 6))
- Image(
- modifier = Modifier.size(iconSize.dp).addModifier(iconModifier),
- painter = painterResource(iconId),
- contentDescription = "OAuth Type Icon",
- )
+ Row(verticalAlignment = Alignment.CenterVertically) {
+ Image(
+ modifier = Modifier.size(iconSize.dp).addModifier(iconModifier),
+ painter = painterResource(iconId),
+ contentDescription = "OAuth Type Icon",
+ )
- Text(
- text = buttonText,
- fontSize = textSize.sp,
- color = textColor,
- modifier = Modifier.padding(start = 20.dp),
- style = TextStyle(fontWeight = FontWeight.Normal,
- fontFamily = pretendard
+ Text(
+ text = buttonText,
+ fontSize = textSize.sp,
+ color = textColor,
+ modifier = Modifier.padding(start = 20.dp),
+ style = TextStyle(
+ fontWeight = FontWeight.Normal,
+ fontFamily = pretendard
+ )
)
- )
+ }
}
}
-
@Preview(showBackground = true)
@Composable
fun TestOAuthLoginBtn() {
@@ -87,6 +88,18 @@ fun TestOAuthLoginBtn() {
},
- )
+ )
+
}
-}
\ No newline at end of file
+ OAuthLoginButton(
+ backgroundColor = Color.White,
+ iconId = com.hmoa.core_designsystem.R.drawable.ic_google,
+ iconSize = 16,
+ buttonText = " Google로 로그인",
+ textColor = Color.Black,
+ textSize = 16,
+ onPress = {
+
+ },
+ )
+}
diff --git a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/OnAndOffBtn.kt b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/OnAndOffBtn.kt
index a062591f7..2ccc88f95 100644
--- a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/OnAndOffBtn.kt
+++ b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/OnAndOffBtn.kt
@@ -1,15 +1,64 @@
package com.hmoa.core_designsystem.component
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.height
+import androidx.compose.material3.Switch
+import androidx.compose.material3.SwitchDefaults
+import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.hmoa.core_designsystem.theme.CustomColor
@Composable
-fun OnAndOffBtn(){
-
+fun OnAndOffBtn(
+ isChecked: Boolean,
+ onChangeChecked: (Boolean) -> Unit
+){
+ Switch(
+ checked = isChecked,
+ onCheckedChange = onChangeChecked,
+ colors = SwitchDefaults.colors(
+ checkedTrackColor = CustomColor.green,
+ uncheckedBorderColor = CustomColor.gray2,
+ uncheckedThumbColor = CustomColor.gray3
+ )
+ )
}
@Preview
@Composable
fun TestOnAndOffBtn(){
- OnAndOffBtn()
+ var checked by remember{mutableStateOf(false)}
+ var text by remember{mutableStateOf("알림 설정 해제")}
+ Box(
+ modifier = Modifier.fillMaxSize().background(color = Color.White),
+ contentAlignment = Alignment.Center
+ ){
+ Column(
+ horizontalAlignment = Alignment.CenterHorizontally
+ ){
+ OnAndOffBtn(
+ isChecked = checked,
+ onChangeChecked = {checked = it}
+ )
+ Spacer(Modifier.height(20.dp))
+ Text(text = text)
+ }
+ LaunchedEffect(checked){
+ text = if(checked) "알림 설정" else "알림 설정 해제"
+ }
+ }
}
\ No newline at end of file
diff --git a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/PerfumeItemView.kt b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/PerfumeItemView.kt
index 8aa349b63..959b92262 100644
--- a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/PerfumeItemView.kt
+++ b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/PerfumeItemView.kt
@@ -31,7 +31,7 @@ fun PerfumeItemView(
imageBackgroundColor: Color,
imageBorderStroke: BorderStroke?,
) {
- Column(modifier = Modifier.padding(end = 8.dp).width(containerWidth.dp)) {
+ Column(modifier = Modifier.width(containerWidth.dp)) {
Column(
modifier = Modifier.width(containerWidth.dp).height(containerHeight.dp)
.background(imageBackgroundColor).border(border = imageBorderStroke?: BorderStroke(width = 0.dp, color = Color.Transparent)),
diff --git a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/PostContent.kt b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/PostContent.kt
index deb0b70ad..7f7e8d743 100644
--- a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/PostContent.kt
+++ b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/PostContent.kt
@@ -1,6 +1,7 @@
package com.hmoa.core_designsystem.component
import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.Arrangement
@@ -38,6 +39,7 @@ import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.TextStyle
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.dp
import androidx.compose.ui.unit.sp
@@ -49,19 +51,19 @@ import com.hmoa.core_designsystem.theme.pretendard
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun PostContent(
- modifier : Modifier = Modifier,
- width : Dp,
- onChangeBottomSheetState : () -> Unit,
- profile : String,
- nickname : String,
- dateDiff : String,
- title : String,
- content : String,
- heartCount : String,
- isLiked : Boolean,
- onChangeLike : () -> Unit,
- pictures : List
-){
+ modifier: Modifier = Modifier,
+ width: Dp,
+ onChangeBottomSheetState: () -> Unit,
+ profile: String,
+ nickname: String,
+ dateDiff: String,
+ title: String,
+ content: String,
+ heartCount: Int,
+ isLiked: Boolean,
+ onChangeLike: (isLiked: Boolean) -> Unit,
+ pictures: List
+) {
//pager state
val state = rememberPagerState(
initialPage = 0,
@@ -72,66 +74,64 @@ fun PostContent(
val screenWidth = configuration.screenWidthDp.toFloat()
val screenHeight = configuration.screenHeightDp.toFloat()
+ var isLiked by remember{mutableStateOf(isLiked)}
+ var heartCount by remember{mutableStateOf(heartCount)}
+
val nicknameTextStyle = TextStyle(
fontSize = 14.sp,
color = Color.Black,
- fontWeight = FontWeight.Normal,fontFamily = pretendard
+ fontWeight = FontWeight.Normal, fontFamily = pretendard
)
val dateDiffTextStyle = TextStyle(
fontSize = 12.sp,
color = CustomColor.gray3,
- fontWeight = FontWeight.Normal,fontFamily = pretendard
+ fontWeight = FontWeight.Normal, fontFamily = pretendard
)
val titleTextStyle = TextStyle(
fontSize = 20.sp,
color = Color.Black,
- fontWeight = FontWeight.Normal,fontFamily = pretendard
+ fontWeight = FontWeight.Normal, fontFamily = pretendard
)
val contentTextStyle = TextStyle(
fontSize = 16.sp,
color = Color.Black,
- fontWeight = FontWeight.Normal,fontFamily = pretendard
+ fontWeight = FontWeight.Normal, fontFamily = pretendard
)
val viewNumberTextStyle = TextStyle(
fontSize = 14.sp,
color = Color.Black,
- fontWeight = FontWeight.Normal,fontFamily = pretendard
+ fontWeight = FontWeight.Normal, fontFamily = pretendard
)
Column(
modifier = modifier
.padding(horizontal = 16.dp),
- ){
+ ) {
Spacer(Modifier.height(16.dp))
Row(
modifier = Modifier
.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
- ){
+ ) {
//profile
CircleImageView(imgUrl = profile, height = 28, width = 28)
Spacer(Modifier.width(8.dp))
- Text(text = nickname,style = nicknameTextStyle)
+ Text(text = nickname, style = nicknameTextStyle)
Spacer(Modifier.width(7.dp))
- Text(text = dateDiff,style = dateDiffTextStyle)
+ Text(text = dateDiff, style = dateDiffTextStyle)
Spacer(Modifier.weight(1f))
//menu (isWritten true >> 수정, 삭제, 취소 / false >> 신고하기, 취소
IconButton(
- modifier = Modifier.size(16.dp),
onClick = { onChangeBottomSheetState() }
) {
- Icon(
- painter = painterResource(R.drawable.three_dot_menu_vertical),
- contentDescription = "Menu Button",
- tint = CustomColor.gray2
- )
+ Image(modifier=Modifier.size(20.dp),painter = painterResource(R.drawable.three_dot_menu_vertical), contentDescription = null)
}
}
@@ -140,7 +140,7 @@ fun PostContent(
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
- ){
+ ) {
Icon(
painter = painterResource(R.drawable.question_ic),
contentDescription = "Question Icon"
@@ -148,7 +148,7 @@ fun PostContent(
Spacer(Modifier.width(8.dp))
- Text(text = title,style = titleTextStyle)
+ Text(text = title, style = titleTextStyle)
}
Spacer(Modifier.height(15.dp))
@@ -194,28 +194,28 @@ fun PostContent(
Spacer(Modifier.height(17.dp))
+
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.End,
verticalAlignment = Alignment.CenterVertically
- ){
+ ) {
IconButton(
- modifier = Modifier.size(20.dp),
onClick = {
- onChangeLike()
+ if(isLiked) heartCount-- else heartCount++
+ onChangeLike(isLiked)
+ isLiked = !isLiked
}
) {
Icon(
- modifier = Modifier.fillMaxSize(),
+ modifier = Modifier.size(22.dp),
painter = painterResource(R.drawable.ic_heart_filled),
- tint = if(isLiked) CustomColor.red else CustomColor.gray2,
+ tint = if (isLiked) CustomColor.red else CustomColor.gray2,
contentDescription = "Like"
)
}
- Spacer(Modifier.width(5.dp))
-
- Text(text = heartCount,style = viewNumberTextStyle)
+ Text(text = if (heartCount > 999) "999+" else heartCount.toString(), style = viewNumberTextStyle)
}
Spacer(Modifier.height(14.dp))
@@ -224,22 +224,23 @@ fun PostContent(
@Composable
private fun ExpandableImage(
- modifier : Modifier,
- width : Float,
- height : Float,
- picture : String
-){
- var showDialog by remember{mutableStateOf(false)}
+ modifier: Modifier,
+ width: Float,
+ height: Float,
+ picture: String
+) {
+ var showDialog by remember { mutableStateOf(false) }
if (showDialog) {
Dialog(
onDismissRequest = { showDialog = false }
) {
Box(
- modifier = modifier.width(width.dp)
+ modifier = modifier
+ .width(width.dp)
.height(height.dp),
contentAlignment = Alignment.Center
- ){
+ ) {
ImageView(
imageUrl = picture,
width = 1f,
@@ -248,15 +249,16 @@ private fun ExpandableImage(
contentScale = ContentScale.FillWidth
)
Row(
- modifier = Modifier.fillMaxSize()
+ modifier = Modifier
+ .fillMaxSize()
.padding(start = 16.dp, top = 19.dp),
verticalAlignment = Alignment.Top,
horizontalArrangement = Arrangement.Start
- ){
+ ) {
IconButton(
modifier = Modifier.size(24.dp),
- onClick = {showDialog = false}
- ){
+ onClick = { showDialog = false }
+ ) {
Icon(
imageVector = Icons.Filled.Close,
contentDescription = "Close Dialog",
@@ -278,7 +280,7 @@ private fun ExpandableImage(
}
},
contentAlignment = Alignment.Center
- ){
+ ) {
//image view
ImageView(
imageUrl = picture,
@@ -288,4 +290,22 @@ private fun ExpandableImage(
contentScale = ContentScale.FillWidth
)
}
+}
+
+@Preview
+@Composable
+fun PostContentPreview() {
+ PostContent(
+ width = 300.dp,
+ onChangeBottomSheetState = {},
+ profile = "?",
+ nickname = "String",
+ dateDiff = "76",
+ title = "안녕하셈",
+ content = "반갑습니다 ㅎㅎ",
+ heartCount = 3,
+ isLiked = false,
+ onChangeLike = {},
+ pictures = emptyList()
+ )
}
\ No newline at end of file
diff --git a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/SurveyOptionList.kt b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/SurveyOptionList.kt
index bde2b7740..b1bea4788 100644
--- a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/SurveyOptionList.kt
+++ b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/SurveyOptionList.kt
@@ -62,7 +62,7 @@ fun SurveyOptionList(
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Top,
- modifier = Modifier.wrapContentHeight().verticalScroll(scrollState).background(color = Color.White)
+ modifier = Modifier.fillMaxHeight(0.92f).verticalScroll(scrollState).background(color = Color.White)
) {
surveyOptions.forEachIndexed { index, it ->
Column(modifier = Modifier.padding(bottom = 16.dp)) {
@@ -114,7 +114,7 @@ fun SurveyOptionItem(text: String, onClick: () -> Unit, isSelected: Boolean) {
@Preview
@Composable
fun SurveyOptionItemPreview() {
- val seasons = listOf("싱그럽고 활기찬 '봄'", "화창하고 에너지 넘치는 '여름'", "우아하고 고요한 분위기의 '가을'", "차가움과 아늑함이 공존하는 '겨울'")
+ val seasons = listOf("싱그럽고 활기찬 '봄'", "화창하고 에너지 넘치는 '여름'", "우아하고 고요한 분위기의 '가을'", "차가움과 아늑함이 공존하는 '겨울'","싱그럽고 활기찬 '봄'", "화창하고 에너지 넘치는 '여름'", "우아하고 고요한 분위기의 '가을'", "차가움과 아늑함이 공존하는 '겨울'","싱그럽고 활기찬 '봄'", "화창하고 에너지 넘치는 '여름'", "우아하고 고요한 분위기의 '가을'", "차가움과 아늑함이 공존하는 '겨울'")
Column(
verticalArrangement = Arrangement.Bottom,
modifier = Modifier.fillMaxHeight(1f)
diff --git a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/TopBar.kt b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/TopBar.kt
index 2a532512d..25a43a703 100644
--- a/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/TopBar.kt
+++ b/core-designsystem/src/main/java/com/hmoa/core_designsystem/component/TopBar.kt
@@ -2,13 +2,7 @@ package com.hmoa.core_designsystem.component
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.*
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -29,16 +23,16 @@ import com.hmoa.core_designsystem.theme.CustomFont
@Composable
fun TopBar(
color: Color = Color.White,
- iconSize : Dp = 20.dp, //icon 크기
- navIcon : Painter ?= null, //navigation 버튼
- onNavClick : () -> Unit = {}, //navigation click 이벤트
+ iconSize: Dp = 20.dp, //icon 크기
+ navIcon: Painter? = null, //navigation 버튼
+ onNavClick: () -> Unit = {}, //navigation click 이벤트
navIconColor: Color = Color.Black,
- menuIcon : Painter ?= null, //menu 버튼
- onMenuClick : () -> Unit = {}, //menu click 이벤트,
+ menuIcon: Painter? = null, //menu 버튼
+ onMenuClick: () -> Unit = {}, //menu click 이벤트,
menuIconColor: Color = CustomColor.black,
- title : String, //메인 타이틀
- titleColor : Color = Color.Black, //타이틀 글 색
-){
+ title: String, //메인 타이틀
+ titleColor: Color = Color.Black, //타이틀 글 색
+) {
Row(
modifier = Modifier
.fillMaxWidth()
@@ -47,8 +41,8 @@ fun TopBar(
.padding(horizontal = 16.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center
- ){
- if (navIcon != null){
+ ) {
+ if (navIcon != null) {
Icon(
modifier = Modifier.size(iconSize).clickable { onNavClick() },
painter = navIcon,
@@ -86,12 +80,12 @@ fun TopBar(
@Composable
@Preview(showBackground = true)
-fun TopBarPreview(){
+fun TopBarPreview() {
TopBar(
title = "댓글",
iconSize = 25.dp,
navIcon = painterResource(R.drawable.ic_back),
- onNavClick = { },
+ onNavClick = { },
menuIcon = painterResource(R.drawable.three_dot_menu_horizontal),
onMenuClick = {},
menuIconColor = CustomColor.gray2
diff --git a/core-designsystem/src/main/java/com/hmoa/core_designsystem/theme/CustomColor.kt b/core-designsystem/src/main/java/com/hmoa/core_designsystem/theme/CustomColor.kt
index 37a5116dc..9872862cf 100644
--- a/core-designsystem/src/main/java/com/hmoa/core_designsystem/theme/CustomColor.kt
+++ b/core-designsystem/src/main/java/com/hmoa/core_designsystem/theme/CustomColor.kt
@@ -19,6 +19,7 @@ object CustomColor {
val blue = Color(0xFF3596ef)
val blue2 = Color(0xFF1E62B5)
val black = Color(0xFF000000)
+ val green = Color(0xFF30d058)
val blackTrans30 = Color(0x2F000000)
val blackTrans70 = Color(0x9F000000)
diff --git a/core-designsystem/src/main/res/drawable/checked_btn.xml b/core-designsystem/src/main/res/drawable/checked_btn.xml
new file mode 100644
index 000000000..5cabd895b
--- /dev/null
+++ b/core-designsystem/src/main/res/drawable/checked_btn.xml
@@ -0,0 +1,14 @@
+
+
+
+
\ No newline at end of file
diff --git a/core-designsystem/src/main/res/drawable/ic_google.xml b/core-designsystem/src/main/res/drawable/ic_google.xml
new file mode 100644
index 000000000..f5dff4a2c
--- /dev/null
+++ b/core-designsystem/src/main/res/drawable/ic_google.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
diff --git a/core-designsystem/src/main/res/drawable/not_checked_btn.xml b/core-designsystem/src/main/res/drawable/not_checked_btn.xml
new file mode 100644
index 000000000..76215e3c6
--- /dev/null
+++ b/core-designsystem/src/main/res/drawable/not_checked_btn.xml
@@ -0,0 +1,11 @@
+
+
+
\ No newline at end of file
diff --git a/core-designsystem/src/main/res/drawable/profile_edit_btn.xml b/core-designsystem/src/main/res/drawable/profile_edit_btn.xml
new file mode 100644
index 000000000..e2a6cb63a
--- /dev/null
+++ b/core-designsystem/src/main/res/drawable/profile_edit_btn.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-designsystem/src/main/res/mipmap-anydpi-v26/ic_google.xml b/core-designsystem/src/main/res/mipmap-anydpi-v26/ic_google.xml
deleted file mode 100644
index 1e504efb5..000000000
--- a/core-designsystem/src/main/res/mipmap-anydpi-v26/ic_google.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/core-designsystem/src/main/res/mipmap-anydpi-v26/ic_google_round.xml b/core-designsystem/src/main/res/mipmap-anydpi-v26/ic_google_round.xml
deleted file mode 100644
index 1e504efb5..000000000
--- a/core-designsystem/src/main/res/mipmap-anydpi-v26/ic_google_round.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/core-designsystem/src/main/res/mipmap-hdpi/ic_google.webp b/core-designsystem/src/main/res/mipmap-hdpi/ic_google.webp
deleted file mode 100644
index 0f29609eaab74e06e547b063f1a93a456f234420..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2484
zcmV;l2}|};Nk&Gj2><|BMM6+kP&iDV2><{uN5ByfO(<&H22#8IQvQT@V2J4d1eEqR
zS?zp)BNwm)vQ6u(1)IpWooq?Y0-k?C)L#JM4b`tv;ka!iM^XT5h&AWk>+%n6aRD6M
zM3Ur43E?0dgyV0@e{&IBXsrf9|5KC@Kr9x!Xt(s1n;V2nPwxY^!X}fcsX=)#ad959
z_t0)im)`KN7r<5i9P^_4bmhC2_MpKf{B+JiXzi?5djOYAI{l(wygm?EcFPIF-(|j<
zU6Lh8S!AdB-_U>mI}3>&+qRZTa_)QIpG;zAW*$HdL5#jE9sp|snu08rT&?zM$zo<|
zW`=~w_~ZMY;AQ;Eh$i!tl2b(2wrw}Evi7;sttv@vRS)mICwei1KY(u_BqH|w46%n_
zu$lMXLwiZB)|Kv|V_Vy@tvTmrsD{OB&yt{=(^U)7uyd||^IXHMGeJ56OM|d=cvS6>*cyt8b0k(l
zR?#7`2Fi$GOJcjbXhMuiN`rQVm?DhIAQ}A(aw9ks7!t2POXqidbA52X>tVn$;R3Iq
zfJjKJkb$-!u>eCYSK^9LMMmNQfnru-5n2>WnHv{DI^5H{%!QeiN+&L9|I(eO%M
zEA8Sn5K2VNssRb%rE(oZEXoXJLW=?*Tqfij&QT&qNCuK{7?Lnh&v`D-XH=6ShSUL(
zP@{YTfY5)#k#9Hw5=rJbOH6SlujGUSb%aY4KnvRR0S*ks()ZZjD*v${8I
zzX4$7RNhTCpTJXp)8c@qe>cndn_k{!Lsn{tN|-3b!=1CcTajcFm-YC&>zmlA
zw5!=xpVTs<3Ib(a}@yI{DIbw^qS9iddUd=k9V8^c;}yw
zXYsSV@A2HFCjSNi-HjM8F**vTIsswr>2)Th8Cph`(?Vul;J_>A&poth3!pi_!|l(*aPnXs-S=
z-Adm;fMd-$4h_s
z#L~EkoKRBH_p~0E7&j0eBs%
zBFeQ+la?2r_5b(q|9>$#`c2tC%!F{k{dNh&B4xCp09ZZT;$R6aW>$!>vJFsBe3aF@;4#zjLLJso#Du59H
zaRK#c4YWXuCjA1wb6D3NQ}zxD!VIuAe*$DsM(eSi5BXVl3sBDe|eTX_WnD9htGyi
zdg@MWxazrJ<>W`u9q2wgZ*SOVH11K^0a(tzS(|>g)_t#@0id2k4p9ISoH%T5eSnYJ
zP5UVAbRVcBOsOr2sUrOYG;_Sm+f3INJmk^{++#)v+?$U6#JZ;-ABIRX3hh
zNMpc*29|>sL7B9+1h7+}M%^+_?odp^NwA!MXPQ0J-uL|cT0O^OGv=OQ(uV65Nlo}m
z33?RLeufYRfKZ_ELtEoJq#Zn*z{`B*!e;xAnfF45jBs>H$f2NmtfU-3
z89A?|)s*ksLIA#CVi?SAOo&Alx#PeWp~NV10}>2eBxX1}@IC23JrXfzyN31YET$r*m87s#F?#@WYFcd07rl}OUlsIwg4P)
zX4MXwOA`oyA-qCMh-EF5sz4fvpX?-(K7HlYwqQm!SFI%(@d)
yf_*3xDKhg1TnEiw&PaOaSBe;72
diff --git a/core-designsystem/src/main/res/mipmap-hdpi/ic_google_foreground.webp b/core-designsystem/src/main/res/mipmap-hdpi/ic_google_foreground.webp
deleted file mode 100644
index 817a334e8f7f2f4570f54f88008878e24a2a809d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1448
zcmV;Z1y}k~Nk&GX1pok7MM6+kP&iDJ1pojqp+G1Q#!%a~4I}^mcuAQfLT%eNjI`P*
zZ!oWRXpXSH0vma_X}9L`nMks=ZEc%{l~jFynQ05mG^RB$j8LD9We1eixxbT9Vbte=
zT-(<2q@}F9`~81{yHfxSz>pCYggG5(ElvgQ`kn8KyF;$EJ()5yxVyW<>bE=}4%y-)
zZ-N)VVM&8*X@M>%0m`*)Ya7YT%*=E2)s9gzlWS#Mxj$gMR8@_c@pEIIP4bR}erD8PdefOq
zSU0h4yUO+S|0gQQ88Jw~10^D;sB-ea{JUSOjuYFqmIZg0{w?CSi0}cOkajQb@I|(Gt7x5n
z57^yr7X}a@KnQ>x3-}7a+Kab}Ht1P;51HL>7ee#hk%Wf_!XpNN2B-mw2FL;bl>j+F
zQGo()0h`)|*80QJ00QCR>um~P3t%lU(*|d#PylOSmw^!oY_s`0iU*=-xZ#!;^||b)
z&FN~mUf!{silv~ZVks_*U`s9L)Z(q}U~JO$5Os0`;gv(w$p>STu7%@*!Xbi&ll&u3
zS8m#cop|1wD}2_N>44kit--Ug06h~6Sk_|B)|&|e(``Sp=FPh|Z{A;b-Jkj_f7*f0
z*X}^$m(Cy!Z<~`lPwLA659=%1`B=OG$Edmj)9Jw`CGfq%T*7E4
z4s4x89mH()yN$!3htaie-~E@~0Klv}sNAn^90K?1+nK9dHbUPk9bw6cDtmd9MMX0V
zdWMI75BzHA_XwN)UX!{t9*A0<0DUhxOSun0?%AQB0IMJ-wnT1FR=B-v==WU1(CH%24pUZ_iQ=baqAJ1#5c~xQe=0%Ej%x3BDc`
zQ{(L`fbrHfqy#{3qI*T7jx3<3T>ZE={m~h@m+g`ok!R4e3N6o%ocXk`kK|hIE=qB}0XjFq{?p^+|m|aL^vn8^K<%
zwU@#6b_*Va74os;DHs;6ixDd?7SO)SHZ5Wq7>|F>EF#*;YQjtq=
z@Jr>|wndWjh3u+L95X6rRLsoG%*@Qp%*;&7+{0L1RSh#8_!o1gsk&?azq+C3vXSmv|qlG7?G
zvchaplOv5fr__vWYuk=DdU|L*iEef9e)yF?`C}(P!rHcNcWZ3hwmrL$97$3n#nNfGb<>3jfK%fcqV+MZqnP-G&1RV-eq
zjHfSDvA9|pk2y&ZPw**KsO*wm^;6jeGoEykpo}Na-;W0%F3s9G>;RfV(VrG_g(7Mo
z8NtgrLlQ}nk&sl0RM5dda&pG1Hcn0?6#-u;lUhhtjQPb###cy9`UBW4tXK7qPr-b=7GNzFURFDJD-uZ`r-u{~yxKER
zQVA=@n2|24L`p$jF!1X=26nrdWa@$efTsRdil~#fN@~xjm+cb^#-tQg?HOUk6j9fq
z0Ex{a8(c5|t%^&|)hiwof)$MOn&Yx2f>S7>B0dF&&4;-Zm?SFl
zQY95`Hsktz%64oXJ_W{Xz&Hh#bMA8S$v9ZcW;0|co1|%}L13@d#sMqYiCCg+J^SHJ)
z6HGdBE$|d7B@dn*WA+vpOUb>Y>IxUv877=)2eN+5`7|%h$SyoP@1{!eSgF(lc4l%;
zulN+0Z8N684yN}O0U9Q2fwxdw_!O9ZSk6iDl8VTYco)M_7VsjDAQ^XHE+BA%i|%%e
znKQ9qF^=GTpHG1U0#1=RS}1&CGiGV<6l#bdXRKmo90jLSJYt1;R+wv!tFV{?^@!rq
zlGuz?l1@YdqWGlJlu$d>Y^RFjV-gWyib!==g>mhCtg)l~+@2N)&L4Qm1Qeh43Tb0V
zJpQ9?>^FP2nXxvjlg&0JOM%5D3?={mTM{m*e;}jr?#!+;qw}um;MNSTHR&iDp+GHNnBQ&Z{xc%m=M#uB&Q1bFb
zs&d7vH*Clqt*#;|tjR5CyESX>2ao)X%aPLM0B?RQ2be0A{l^qEa#Tz}yhSlh*=o
zO)lL*NhL1R6?B*xZvnxpp%K*it;F8?YD!|>v
zOr<5T(n`{T<{OhO*CvLycTaz1o_EK<)5t@KGna8hnI;)(jusB|tJ6gRVu))f_yaszS+ANN-G=QF9PH^;j_1({`
zhJamv?UBt_@Lysm9u?;~%ps^r$}X!eDu$Qcy&)J3<_TBj4OKq#%;iB~o={a)R&L`R
zsdn?DBEVmID8iU_zES_o78{Y)&-~BLY|0z!`iJv-Dlg9+sot=miny@uiR_z)bZ`x8
z_?Ji7*~pp34#yu5J2d#f=ZM%^NwghU|W2+{Zr0<;$0uQiO|7G88Bt;8I&
zaX%f;Uvc>cV0B(Wqx~5z*2c$vwT=I1-LT=C_Z#iYs6)>$40gDjQwWQG^<1El`p+?_Jiw(_X+kK73eeAA5pGwDmgAW8;!u1L^bIHK
z4z2|brn@_<#DtbGu!?WQO=kbus*=w1>3O0R8~zy3!#lW>hb++X5*|YbmI~?V>5p%F
zk%OfU4fhBi3wRR#bDtO}BH<+!VhovLoIOAsP2zmU-BTf2Di!t{|p%!V-OGI5-5?;it-lHawf;B;U#;fiZZuRaINl%&43mjp~HSSA7o
zr>Lp##Bl_OB82?{hle7$XUd5r6WaJ0|9=MSe+n7BS2t&?ZpL<9)pK3?9bx{?lPDoJ
zq0<1AOOg?*Ma+$o4yu_HUpTPxDA_8n~
zR`5$@7bpV0m{~tf+klz%V$DCvKbMGJ=aG>Ib+fkVrtgR?e;b?lLRkMM@;HYs2ILFn
zVvr86%whsFKls3c=i1DL9}rOP^!Thnl_zfBwry;|CPjLp$}`L(w?k67vBL6+*gp7=
z0H-K|1pyXWTHj{=9Pu`W`SmsP|EtE9m!dkJjcR{BGW#_m@&|QbMl0mh!o|48-;c6f
zVCcN_JVe~>$R$i=^Yf~wW)=;sK0ToN%(iV43f6|EMu$85Q#vQCA1P9r@kVAIJ!;W@
zKO8$@GC9Qj{lJKS+ln9AFT98=c%uyeP=W2|!FmB9{;JK)XXOO`LWx0UCW3G=H4BqqI|ti2uyyOB
zzhf$v9=FbNcbMtvGQ4o@w$+2nkG!n04e_CV4_nKU*@2NWl0xK2R8`%Bi@02*gyO6S
zghc5uDuZ|_+;-cpwD23KDipr>LXKlO4l;t=1N6TqBWM}H
zlAF|u9E%1sJ9#D-*F-aAFfJCNgrmAj@7-m*AcC&WmNtwC@R~T8-1I-lh@}BVLx+Et
zrozY<5Pwz>awVbHqIx%5d$)&~!{mn0VXF2a0=!0W#b_`dK!CNgnT1J&Do|2Ui0OBn
zXV5oYK*|U%r%@G&(UTZGgc^w&Ba(pABn?U;AQA}@gI0j5rI=DmGo=T3n+XiR
zFb<9g2t+_bk`zFi0?6R&ig)vlH9Y$h0fFBd83iK1(aG$>Y)`2m8DTYL+(lE7m5(fZ
zY|ztDFdYGa+6ZbRKJmnB!a)3OEJ$Nw$o4Q0OGX@tg3d2iL1ucivcA4J=yNcvu@lE;
z1O$zj&7KpSF=_n9kq|>cTNs6a5^_8Y>|$ZRZYK7M*gl1Trs5x2GQQ{{C~{6p=+F)I
zn?=%s5hK)zE~w@Ur-K|!uZ0hg@#Muq#Aw`7-OcmiL7h3R9*mW?V830%WBX7E*
z!O3vxZgl2s!Me|%Tfis;XexVn??6D*n0E0#^aa+b%M~OeC3Ki-{TTt#AvQ4HW(e>U
z^ZhqHLNv<9DcI&)G73L#Ru_c*`ImirGlL5TV5;V;msSM$*KzJ}Vzgk`BCx$bqA6O!
zC6d;fFC9<)zvio#R$#9Bi;qqOgtW1~x+0e8$zYO^V3Q=sI)}1_-OaTK2tCqf0$bHD
zp4|wD==@-Jv*+BB4AvB_as^xaSy#*xylh8T&bB{L`KuR?4NM6E+HzmLcw)D9?sQd@
zP|%E5%FNCp^Gba9SlrUw?)KW)Wxsy$LVy-bD_w>6U%e3!S<98MCI(#f?$|1a<@~mps{=To5D?*NN@wBPSsrhpV
zNd5C@8<>-=ysKB%;y-@`A|S4cyH{g}Xlh@@4ESXBbxUZW#Koq%_y$@iR7Jz~gEu#?
zD|vV|Zt9Pow1JuZRmR&lZv=!PAi1f7?d8Lj>+jCZjr7tS1d2%BaIuw%^zx6*D0r4vq`{R3Xljn|B^|-utaj3!R$Kwvq{0-MN%86X5Dxw!{eJsy37t9%@
zY%3;iZgR#RnEX53%;Mvo7gsJm_{e|n1pX1SEU;R-Ql7wcUeW>|ARr-AQ9x!1Cs$4uJ+gSCzm&$CRZ(Jd#^imfU7a(
zg$_V2N^IG-t-6u4&V7>1PR?RxX8hwGWGAXG)e-7L)E6@|Gn4S?-7|(ua@sX2{+9ym
zwDLuYa%|hG?Pjih?z#7UF*COnip=aR9Du6?VK@Z2=f1OG_ZY-_eBU{H(XF-Zk)+)B
z`>U!~YvEy%iMBQXA|L?pI2xZUIAlN=qyV1Q^ma}4|G}+oTeULJeeZwVT{8NB&OCKG
zvWP(??)KzfMQ+rq~jAHyiJmyd{^Ci_J3TO{N$tReDdL^Nzj6FX+X!*dnF(K
zkj^3bG=UEI!6#oWeEihyiHvIjSlq_$OjkTvAUo8%*Sg+J^5>17?>iPoErbg$WHNb`wOsAbT;|X(gTqr{{&~?;
z8$GX?9m!2M&sc|P(KjPEfC)i^P_ILw3JpS0+oeOjzPr|j*SQH{w}R}iQq*mbK>-MJ
zgPIz|H9|w+*yuBx2ow{LLd5}X+Y=Os(}S?_w#;+$;147JWEv0rb5U*{95X#)9NVsejfZT;}5i-vZzqR^DD2I;swfBN^ufBo%nOYN(@!|Khwy}k~wCUR~N(Aq_5E6Y_p0>fw*go)^zn9A8JPY5O`
z+MWN!^45wM2a-IQ^NTDrdJ+DRNyhv-%e0vu6WxD`bq6k3Y#K!K!E
za?Sd?5|d2OR8;T;7+3yM@BQS(SAQ3~JIbraUh?X$D8p3bf$8?C+4iYeL{#b;z^H9t
z2BKk72%#xNl+YDqPu3kX2^0)SgU~$p+TzyF4r{!q^U_27>5r$nT+muQ@be$v_x+zf
z5J5Vi0XD;pled3);Ypt7*VJ%HL5H9)am0n*VbVfG(qs#>99F3Stcp&Nnt}oWm@%be
zs8Y=3lyKn4Qqt{il!DL#S8nW6m=SjaE}}$VQHcT_lL$48#)BwZM*b1vZpJl!8!bm|n~CJ9rk8
z-*$PW)qAUYez8}}C>H&`%btgbm@-UEdMX|YaTv5J?N9(Qp&`|joH8d}dxuHO-IR?p
zB?)Lcc>756>bA-6hk7&WZ5E4*;uwjdVWfDjGEJk*YwVAkCKynTW@c@g5`YjG1Ra9H
z5XXlLDWhjk4d2{0yKd73%=5NXQLiZA*joek7>TAt1`&^oficFP0$o
z8~d6@ElOM5O`-;EFrS$v6%v5kGE756l!-G11)d-PO;I2znhHcXbbEE9A!^10HDGh5
zV7fO4VYjA4RO#9XK%t?)r~#=^1E8gfZiG-nEnU=93&%#UN5^j!J5MV($fN~IB>ydg
zcvjuqgivvLR_~`GXxfJYntI=}vIi6iWVBGtPrt4}_wBDg+