diff --git a/.github/workflows/android_cd.yml b/.github/workflows/android_cd.yml index fabb7b541..82e6fb3cb 100644 --- a/.github/workflows/android_cd.yml +++ b/.github/workflows/android_cd.yml @@ -64,6 +64,12 @@ jobs: - name: Build AAB for Firebase run: ./gradlew bundleRelease --stacktrace + - name: Upload AAB artifact + uses: actions/upload-artifact@v3 + with: + name: app-release.aab + path: app/build/outputs/bundle/release/app-release.aab + - name: Build APK for Testing run: ./gradlew assembleRelease --stacktrace @@ -77,4 +83,4 @@ jobs: firebase appdistribution:distribute app/build/outputs/apk/release/app-release.apk \ --app ${{ secrets.FIREBASE_APP_ID }} \ --release-notes "~새로운 릴리즈 버전이 날라왔어용~" \ - --groups "세얼간이" + --groups "세얼간이" \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d78a46759..a3f4bcba8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,8 +11,8 @@ android { namespace = "com.idle.care" defaultConfig { - versionCode = 8 - versionName = "1.1.1" + versionCode = 9 + versionName = "1.1.2" targetSdk = 34 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" diff --git a/core/data/src/main/java/com/idle/data/repository/auth/AuthRepositoryImpl.kt b/core/data/src/main/java/com/idle/data/repository/auth/AuthRepositoryImpl.kt index 44c01134c..b4b6da06d 100644 --- a/core/data/src/main/java/com/idle/data/repository/auth/AuthRepositoryImpl.kt +++ b/core/data/src/main/java/com/idle/data/repository/auth/AuthRepositoryImpl.kt @@ -18,7 +18,6 @@ import com.idle.network.model.auth.WithdrawalWorkerRequest import com.idle.network.model.token.TokenResponse import com.idle.network.source.auth.AuthDataSource import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.async import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Inject @@ -116,21 +115,21 @@ class AuthRepositoryImpl @Inject constructor( ) override suspend fun logoutWorker(): Result { - tokenRepository.deleteDeviceToken() + tokenRepository.deleteDeviceToken(getDeviceToken()) return authDataSource.logoutWorker() .onSuccess { clearUserData() } } override suspend fun logoutCenter(): Result { - tokenRepository.deleteDeviceToken() + tokenRepository.deleteDeviceToken(getDeviceToken()) return authDataSource.logoutCenter() .onSuccess { clearUserData() } } override suspend fun withdrawalCenter(reason: String, password: String): Result { - tokenRepository.deleteDeviceToken() + tokenRepository.deleteDeviceToken(getDeviceToken()) return authDataSource.withdrawalCenter( WithdrawalCenterRequest(reason = reason, password = password) @@ -138,7 +137,7 @@ class AuthRepositoryImpl @Inject constructor( } override suspend fun withdrawalWorker(reason: String): Result { - tokenRepository.deleteDeviceToken() + tokenRepository.deleteDeviceToken(getDeviceToken()) return authDataSource.withdrawalWorker(WithdrawalWorkerRequest(reason)) .onSuccess { clearUserData() } @@ -163,10 +162,10 @@ class AuthRepositoryImpl @Inject constructor( ) = withContext(Dispatchers.IO) { launch { tokenDataSource.setRefreshToken(tokenResponse.refreshToken) } launch { userInfoDataSource.setUserType(userType) } - launch { tokenDataSource.setAccessToken(tokenResponse.accessToken) } + launch { tokenDataSource.setAccessToken(tokenResponse.accessToken) }.join() - val deviceToken = async { getDeviceToken() } - tokenRepository.postDeviceToken(deviceToken.await(), userType = userType) + val deviceToken = getDeviceToken() + tokenRepository.postDeviceToken(deviceToken, userType = userType) } private suspend fun clearUserData() = withContext(Dispatchers.IO) { diff --git a/core/data/src/main/java/com/idle/data/repository/auth/TokenRepositoryImpl.kt b/core/data/src/main/java/com/idle/data/repository/auth/TokenRepositoryImpl.kt index 9ed0f25bd..9c37d8172 100644 --- a/core/data/src/main/java/com/idle/data/repository/auth/TokenRepositoryImpl.kt +++ b/core/data/src/main/java/com/idle/data/repository/auth/TokenRepositoryImpl.kt @@ -2,7 +2,8 @@ package com.idle.data.repository.auth import com.idle.datastore.datasource.TokenDataSource import com.idle.domain.repositorry.auth.TokenRepository -import com.idle.network.model.auth.FCMTokenRequest +import com.idle.network.model.notification.DeleteFcmTokenRequest +import com.idle.network.model.notification.PostFcmTokenRequest import com.idle.network.source.notification.NotificationDataSource import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first @@ -19,11 +20,12 @@ class TokenRepositoryImpl @Inject constructor( override suspend fun postDeviceToken(deviceToken: String, userType: String): Result = notificationDataSource.postFCMToken( - FCMTokenRequest( + PostFcmTokenRequest( deviceToken = deviceToken, userType = userType, ) ) - override suspend fun deleteDeviceToken(): Result = notificationDataSource.deleteFCMToken() + override suspend fun deleteDeviceToken(deviceToken: String): Result = + notificationDataSource.deleteFCMToken(DeleteFcmTokenRequest(deviceToken)) } \ No newline at end of file diff --git a/core/data/src/test/java/com/idle/data/repository/auth/AuthRepositoryImplTest.kt b/core/data/src/test/java/com/idle/data/repository/auth/AuthRepositoryImplTest.kt index 3a8ba3af4..0e55285ea 100644 --- a/core/data/src/test/java/com/idle/data/repository/auth/AuthRepositoryImplTest.kt +++ b/core/data/src/test/java/com/idle/data/repository/auth/AuthRepositoryImplTest.kt @@ -44,7 +44,7 @@ class AuthRepositoryImplTest { coEvery { userInfoDataSource.clearUserInfo() } just Runs coEvery { authDataSource.getDeviceToken() } returns "testToken" coEvery { tokenRepository.postDeviceToken(any(), any()) } returns Result.success(Unit) - coEvery { tokenRepository.deleteDeviceToken() } returns Result.success(Unit) + coEvery { tokenRepository.deleteDeviceToken(any()) } returns Result.success(Unit) } @Test @@ -109,7 +109,7 @@ class AuthRepositoryImplTest { // Then assertTrue(result.isSuccess) coVerify { tokenDataSource.clearToken() } - coVerify { tokenRepository.deleteDeviceToken() } + coVerify { tokenRepository.deleteDeviceToken(any()) } coVerify { userInfoDataSource.clearUserType() } coVerify { userInfoDataSource.clearUserInfo() } } @@ -125,7 +125,7 @@ class AuthRepositoryImplTest { // Then assertTrue(result.isSuccess) coVerify { tokenDataSource.clearToken() } - coVerify { tokenRepository.deleteDeviceToken() } + coVerify { tokenRepository.deleteDeviceToken(any()) } coVerify { userInfoDataSource.clearUserType() } coVerify { userInfoDataSource.clearUserInfo() } } @@ -141,7 +141,7 @@ class AuthRepositoryImplTest { // Then assertTrue(result.isSuccess) coVerify { tokenDataSource.clearToken() } - coVerify { tokenRepository.deleteDeviceToken() } + coVerify { tokenRepository.deleteDeviceToken(any()) } coVerify { userInfoDataSource.clearUserType() } coVerify { userInfoDataSource.clearUserInfo() } } @@ -157,7 +157,7 @@ class AuthRepositoryImplTest { // Then assertTrue(result.isSuccess) coVerify { tokenDataSource.clearToken() } - coVerify { tokenRepository.deleteDeviceToken() } + coVerify { tokenRepository.deleteDeviceToken(any()) } coVerify { userInfoDataSource.clearUserType() } coVerify { userInfoDataSource.clearUserInfo() } } diff --git a/core/domain/src/main/kotlin/com/idle/domain/repositorry/auth/TokenRepository.kt b/core/domain/src/main/kotlin/com/idle/domain/repositorry/auth/TokenRepository.kt index 6049ae003..921190011 100644 --- a/core/domain/src/main/kotlin/com/idle/domain/repositorry/auth/TokenRepository.kt +++ b/core/domain/src/main/kotlin/com/idle/domain/repositorry/auth/TokenRepository.kt @@ -2,7 +2,6 @@ package com.idle.domain.repositorry.auth interface TokenRepository { suspend fun getAccessToken(): String - suspend fun postDeviceToken(deviceToken: String, userType: String): Result - suspend fun deleteDeviceToken(): Result + suspend fun deleteDeviceToken(deviceToken: String): Result } \ No newline at end of file diff --git a/core/network/src/main/java/com/idle/network/api/NotificationApi.kt b/core/network/src/main/java/com/idle/network/api/NotificationApi.kt index 5b331677f..9d0ed9f8c 100644 --- a/core/network/src/main/java/com/idle/network/api/NotificationApi.kt +++ b/core/network/src/main/java/com/idle/network/api/NotificationApi.kt @@ -1,12 +1,13 @@ package com.idle.network.api -import com.idle.network.model.auth.FCMTokenRequest +import com.idle.network.model.notification.DeleteFcmTokenRequest import com.idle.network.model.notification.GetMyNotificationResponse import com.idle.network.model.notification.GetUnreadNotificationCountResponse +import com.idle.network.model.notification.PostFcmTokenRequest import retrofit2.Response import retrofit2.http.Body -import retrofit2.http.DELETE import retrofit2.http.GET +import retrofit2.http.HTTP import retrofit2.http.PATCH import retrofit2.http.POST import retrofit2.http.Path @@ -14,13 +15,10 @@ import retrofit2.http.Query interface NotificationApi { @POST("/api/v1/fcm/token") - suspend fun postFCMToken(@Body fcmTokenRequest: FCMTokenRequest): Response + suspend fun postFCMToken(@Body postFcmTokenRequest: PostFcmTokenRequest): Response - @PATCH("/api/v1/fcm/token") - suspend fun patchFCMToken(@Body fcmTokenRequest: FCMTokenRequest): Response - - @DELETE("/api/v1/fcm/token") - suspend fun deleteFCMToken(): Response + @HTTP(method = "DELETE", path = "/api/v1/fcm/token", hasBody = true) + suspend fun deleteFCMToken(@Body deleteFcmTokenRequest: DeleteFcmTokenRequest): Response @GET("/api/v1/notifications/my") suspend fun getMyNotifications( @@ -33,4 +31,4 @@ interface NotificationApi { @GET("/api/v1/notifications/count") suspend fun getUnreadNotificationCount(): Response -} \ No newline at end of file +} diff --git a/core/network/src/main/java/com/idle/network/model/notification/DeleteFcmTokenRequest.kt b/core/network/src/main/java/com/idle/network/model/notification/DeleteFcmTokenRequest.kt new file mode 100644 index 000000000..53ab2b6cb --- /dev/null +++ b/core/network/src/main/java/com/idle/network/model/notification/DeleteFcmTokenRequest.kt @@ -0,0 +1,8 @@ +package com.idle.network.model.notification + +import kotlinx.serialization.Serializable + +@Serializable +data class DeleteFcmTokenRequest( + val deviceToken: String, +) diff --git a/core/network/src/main/java/com/idle/network/model/auth/FCMTokenRequest.kt b/core/network/src/main/java/com/idle/network/model/notification/PostFcmTokenRequest.kt similarity index 60% rename from core/network/src/main/java/com/idle/network/model/auth/FCMTokenRequest.kt rename to core/network/src/main/java/com/idle/network/model/notification/PostFcmTokenRequest.kt index f3dc2921a..f589ff43f 100644 --- a/core/network/src/main/java/com/idle/network/model/auth/FCMTokenRequest.kt +++ b/core/network/src/main/java/com/idle/network/model/notification/PostFcmTokenRequest.kt @@ -1,9 +1,9 @@ -package com.idle.network.model.auth +package com.idle.network.model.notification import kotlinx.serialization.Serializable @Serializable -data class FCMTokenRequest( +data class PostFcmTokenRequest( val deviceToken: String, val userType: String, ) \ No newline at end of file diff --git a/core/network/src/main/java/com/idle/network/source/notification/NotificationDataSource.kt b/core/network/src/main/java/com/idle/network/source/notification/NotificationDataSource.kt index 8f8c50a0e..cadb2bb89 100644 --- a/core/network/src/main/java/com/idle/network/source/notification/NotificationDataSource.kt +++ b/core/network/src/main/java/com/idle/network/source/notification/NotificationDataSource.kt @@ -1,7 +1,8 @@ package com.idle.network.source.notification import com.idle.network.api.NotificationApi -import com.idle.network.model.auth.FCMTokenRequest +import com.idle.network.model.notification.DeleteFcmTokenRequest +import com.idle.network.model.notification.PostFcmTokenRequest import com.idle.network.model.notification.GetMyNotificationResponse import com.idle.network.model.notification.GetUnreadNotificationCountResponse import com.idle.network.util.safeApiCall @@ -12,10 +13,11 @@ import javax.inject.Singleton class NotificationDataSource @Inject constructor( private val notificationApi: NotificationApi ) { - suspend fun postFCMToken(fcmTokenRequest: FCMTokenRequest): Result = - safeApiCall { notificationApi.postFCMToken(fcmTokenRequest) } + suspend fun postFCMToken(postFcmTokenRequest: PostFcmTokenRequest): Result = + safeApiCall { notificationApi.postFCMToken(postFcmTokenRequest) } - suspend fun deleteFCMToken(): Result = safeApiCall { notificationApi.deleteFCMToken() } + suspend fun deleteFCMToken(deleteFcmTokenRequest: DeleteFcmTokenRequest): Result = + safeApiCall { notificationApi.deleteFCMToken(deleteFcmTokenRequest) } suspend fun getMyNotifications( next: String?,