From ec5eca2ffd3eb38b523cec304a348c3997663eba Mon Sep 17 00:00:00 2001 From: t1nm1ksun Date: Wed, 25 Sep 2024 16:23:31 +0900 Subject: [PATCH] =?UTF-8?q?[feat]=20#268=20=EC=9D=BC=EC=A0=95=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EC=8B=9C=20UserProperty=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataremote/datasource/TimelineRemoteDataSource.kt | 3 ++- .../datasourceimpl/TimelineRemoteDataSourceImpl.kt | 3 ++- .../model/response/ResponseEnrollTimelineDto.kt | 10 ++++++++++ .../data/dataremote/service/TimelineService.kt | 3 ++- .../mapper/todomain/ResponseEnrollTimelineDtoMapper.kt | 8 ++++++++ .../data/repositoryimpl/TimelineRepositoryImpl.kt | 5 +++-- .../sopt/dateroad/domain/model/EnrollTimelineResult.kt | 5 +++++ .../dateroad/domain/repository/TimelineRepository.kt | 3 ++- .../dateroad/domain/usecase/PostTimelineUseCase.kt | 3 ++- .../dateroad/presentation/ui/enroll/EnrollViewModel.kt | 4 +++- .../org/sopt/dateroad/presentation/util/Constraints.kt | 2 +- 11 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/org/sopt/dateroad/data/dataremote/model/response/ResponseEnrollTimelineDto.kt create mode 100644 app/src/main/java/org/sopt/dateroad/data/mapper/todomain/ResponseEnrollTimelineDtoMapper.kt create mode 100644 app/src/main/java/org/sopt/dateroad/domain/model/EnrollTimelineResult.kt diff --git a/app/src/main/java/org/sopt/dateroad/data/dataremote/datasource/TimelineRemoteDataSource.kt b/app/src/main/java/org/sopt/dateroad/data/dataremote/datasource/TimelineRemoteDataSource.kt index b210627c5..b24f55919 100644 --- a/app/src/main/java/org/sopt/dateroad/data/dataremote/datasource/TimelineRemoteDataSource.kt +++ b/app/src/main/java/org/sopt/dateroad/data/dataremote/datasource/TimelineRemoteDataSource.kt @@ -1,6 +1,7 @@ package org.sopt.dateroad.data.dataremote.datasource import org.sopt.dateroad.data.dataremote.model.request.RequestTimelineDto +import org.sopt.dateroad.data.dataremote.model.response.ResponseEnrollTimelineDto import org.sopt.dateroad.data.dataremote.model.response.ResponseNearestTimelineDto import org.sopt.dateroad.data.dataremote.model.response.ResponseTimelineDetailDto import org.sopt.dateroad.data.dataremote.model.response.ResponseTimelinesDto @@ -14,5 +15,5 @@ interface TimelineRemoteDataSource { suspend fun getNearestTimeline(): ResponseNearestTimelineDto - suspend fun postTimeline(requestTimelineDto: RequestTimelineDto) + suspend fun postTimeline(requestTimelineDto: RequestTimelineDto): ResponseEnrollTimelineDto } diff --git a/app/src/main/java/org/sopt/dateroad/data/dataremote/datasourceimpl/TimelineRemoteDataSourceImpl.kt b/app/src/main/java/org/sopt/dateroad/data/dataremote/datasourceimpl/TimelineRemoteDataSourceImpl.kt index 66624bb6b..e98ab11ea 100644 --- a/app/src/main/java/org/sopt/dateroad/data/dataremote/datasourceimpl/TimelineRemoteDataSourceImpl.kt +++ b/app/src/main/java/org/sopt/dateroad/data/dataremote/datasourceimpl/TimelineRemoteDataSourceImpl.kt @@ -3,6 +3,7 @@ package org.sopt.dateroad.data.dataremote.datasourceimpl import javax.inject.Inject import org.sopt.dateroad.data.dataremote.datasource.TimelineRemoteDataSource import org.sopt.dateroad.data.dataremote.model.request.RequestTimelineDto +import org.sopt.dateroad.data.dataremote.model.response.ResponseEnrollTimelineDto import org.sopt.dateroad.data.dataremote.model.response.ResponseNearestTimelineDto import org.sopt.dateroad.data.dataremote.model.response.ResponseTimelineDetailDto import org.sopt.dateroad.data.dataremote.model.response.ResponseTimelinesDto @@ -19,5 +20,5 @@ class TimelineRemoteDataSourceImpl @Inject constructor( override suspend fun getNearestTimeline(): ResponseNearestTimelineDto = timelineService.getNearestTimeline() - override suspend fun postTimeline(requestTimelineDto: RequestTimelineDto) = timelineService.postTimeline(requestTimelineDto = requestTimelineDto) + override suspend fun postTimeline(requestTimelineDto: RequestTimelineDto): ResponseEnrollTimelineDto = timelineService.postTimeline(requestTimelineDto = requestTimelineDto) } diff --git a/app/src/main/java/org/sopt/dateroad/data/dataremote/model/response/ResponseEnrollTimelineDto.kt b/app/src/main/java/org/sopt/dateroad/data/dataremote/model/response/ResponseEnrollTimelineDto.kt new file mode 100644 index 000000000..8779af0a0 --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/data/dataremote/model/response/ResponseEnrollTimelineDto.kt @@ -0,0 +1,10 @@ +package org.sopt.dateroad.data.dataremote.model.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseEnrollTimelineDto( + @SerialName("dateScheduleNum") + val dateScheduleNum: Long +) diff --git a/app/src/main/java/org/sopt/dateroad/data/dataremote/service/TimelineService.kt b/app/src/main/java/org/sopt/dateroad/data/dataremote/service/TimelineService.kt index 8665d5bb3..107e25bd5 100644 --- a/app/src/main/java/org/sopt/dateroad/data/dataremote/service/TimelineService.kt +++ b/app/src/main/java/org/sopt/dateroad/data/dataremote/service/TimelineService.kt @@ -1,6 +1,7 @@ package org.sopt.dateroad.data.dataremote.service import org.sopt.dateroad.data.dataremote.model.request.RequestTimelineDto +import org.sopt.dateroad.data.dataremote.model.response.ResponseEnrollTimelineDto import org.sopt.dateroad.data.dataremote.model.response.ResponseNearestTimelineDto import org.sopt.dateroad.data.dataremote.model.response.ResponseTimelineDetailDto import org.sopt.dateroad.data.dataremote.model.response.ResponseTimelinesDto @@ -39,5 +40,5 @@ interface TimelineService { @POST("$API/$VERSION/$DATES") suspend fun postTimeline( @Body requestTimelineDto: RequestTimelineDto - ) + ): ResponseEnrollTimelineDto } diff --git a/app/src/main/java/org/sopt/dateroad/data/mapper/todomain/ResponseEnrollTimelineDtoMapper.kt b/app/src/main/java/org/sopt/dateroad/data/mapper/todomain/ResponseEnrollTimelineDtoMapper.kt new file mode 100644 index 000000000..59fe13410 --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/data/mapper/todomain/ResponseEnrollTimelineDtoMapper.kt @@ -0,0 +1,8 @@ +package org.sopt.dateroad.data.mapper.todomain + +import org.sopt.dateroad.data.dataremote.model.response.ResponseEnrollTimelineDto +import org.sopt.dateroad.domain.model.EnrollTimelineResult + +fun ResponseEnrollTimelineDto.toDomain(): EnrollTimelineResult = EnrollTimelineResult( + dateScheduleNum = this.dateScheduleNum +) diff --git a/app/src/main/java/org/sopt/dateroad/data/repositoryimpl/TimelineRepositoryImpl.kt b/app/src/main/java/org/sopt/dateroad/data/repositoryimpl/TimelineRepositoryImpl.kt index 5d9e1452d..8aae57646 100644 --- a/app/src/main/java/org/sopt/dateroad/data/repositoryimpl/TimelineRepositoryImpl.kt +++ b/app/src/main/java/org/sopt/dateroad/data/repositoryimpl/TimelineRepositoryImpl.kt @@ -7,6 +7,7 @@ import org.sopt.dateroad.data.mapper.todomain.toDomain import org.sopt.dateroad.data.mapper.todomain.toFutureTimelineDomain import org.sopt.dateroad.data.mapper.todomain.toPastTimelineDomain import org.sopt.dateroad.domain.model.Enroll +import org.sopt.dateroad.domain.model.EnrollTimelineResult import org.sopt.dateroad.domain.model.NearestTimeline import org.sopt.dateroad.domain.model.Timeline import org.sopt.dateroad.domain.model.TimelineDetail @@ -37,7 +38,7 @@ class TimelineRepositoryImpl @Inject constructor( timelineRemoteDataSource.getNearestTimeline().toDomain() } - override suspend fun postTimeline(enroll: Enroll) = runCatching { - timelineRemoteDataSource.postTimeline(requestTimelineDto = enroll.toTimelineData()) + override suspend fun postTimeline(enroll: Enroll): Result = runCatching { + timelineRemoteDataSource.postTimeline(requestTimelineDto = enroll.toTimelineData()).toDomain() } } diff --git a/app/src/main/java/org/sopt/dateroad/domain/model/EnrollTimelineResult.kt b/app/src/main/java/org/sopt/dateroad/domain/model/EnrollTimelineResult.kt new file mode 100644 index 000000000..7f61470d4 --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/domain/model/EnrollTimelineResult.kt @@ -0,0 +1,5 @@ +package org.sopt.dateroad.domain.model + +data class EnrollTimelineResult( + val dateScheduleNum: Long +) diff --git a/app/src/main/java/org/sopt/dateroad/domain/repository/TimelineRepository.kt b/app/src/main/java/org/sopt/dateroad/domain/repository/TimelineRepository.kt index 46d1ffe09..0b67d3f37 100644 --- a/app/src/main/java/org/sopt/dateroad/domain/repository/TimelineRepository.kt +++ b/app/src/main/java/org/sopt/dateroad/domain/repository/TimelineRepository.kt @@ -1,6 +1,7 @@ package org.sopt.dateroad.domain.repository import org.sopt.dateroad.domain.model.Enroll +import org.sopt.dateroad.domain.model.EnrollTimelineResult import org.sopt.dateroad.domain.model.NearestTimeline import org.sopt.dateroad.domain.model.Timeline import org.sopt.dateroad.domain.model.TimelineDetail @@ -15,5 +16,5 @@ interface TimelineRepository { suspend fun getNearestTimeline(): Result - suspend fun postTimeline(enroll: Enroll): Result + suspend fun postTimeline(enroll: Enroll): Result } diff --git a/app/src/main/java/org/sopt/dateroad/domain/usecase/PostTimelineUseCase.kt b/app/src/main/java/org/sopt/dateroad/domain/usecase/PostTimelineUseCase.kt index 1d13755aa..91885b8a3 100644 --- a/app/src/main/java/org/sopt/dateroad/domain/usecase/PostTimelineUseCase.kt +++ b/app/src/main/java/org/sopt/dateroad/domain/usecase/PostTimelineUseCase.kt @@ -3,11 +3,12 @@ package org.sopt.dateroad.domain.usecase import javax.inject.Inject import javax.inject.Singleton import org.sopt.dateroad.domain.model.Enroll +import org.sopt.dateroad.domain.model.EnrollTimelineResult import org.sopt.dateroad.domain.repository.TimelineRepository @Singleton class PostTimelineUseCase @Inject constructor( private val timelineRepository: TimelineRepository ) { - suspend operator fun invoke(enroll: Enroll): Result = timelineRepository.postTimeline(enroll = enroll) + suspend operator fun invoke(enroll: Enroll): Result = timelineRepository.postTimeline(enroll = enroll) } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/enroll/EnrollViewModel.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/enroll/EnrollViewModel.kt index de6cf2a0f..e62022ee9 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/enroll/EnrollViewModel.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/enroll/EnrollViewModel.kt @@ -13,6 +13,7 @@ import org.sopt.dateroad.domain.usecase.PostCourseUseCase import org.sopt.dateroad.domain.usecase.PostTimelineUseCase import org.sopt.dateroad.presentation.type.EnrollScreenType import org.sopt.dateroad.presentation.type.EnrollType +import org.sopt.dateroad.presentation.util.UserPropertyAmplitude.DATE_SCHEDULE_NUM import org.sopt.dateroad.presentation.util.UserPropertyAmplitude.USER_COURSE_COUNT import org.sopt.dateroad.presentation.util.UserPropertyAmplitude.USER_POINT import org.sopt.dateroad.presentation.util.amplitude.AmplitudeUtils @@ -158,8 +159,9 @@ class EnrollViewModel @Inject constructor( private fun postTimeline() { viewModelScope.launch { setEvent(EnrollContract.EnrollEvent.Enroll(loadState = LoadState.Loading)) - postTimelineUseCase(enroll = currentState.enroll).onSuccess { + postTimelineUseCase(enroll = currentState.enroll).onSuccess { result -> setEvent(EnrollContract.EnrollEvent.Enroll(loadState = LoadState.Success)) + AmplitudeUtils.updateIntUserProperty(propertyName = DATE_SCHEDULE_NUM, propertyValue = result.dateScheduleNum.toInt()) }.onFailure { setEvent(EnrollContract.EnrollEvent.Enroll(loadState = LoadState.Error)) } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/util/Constraints.kt b/app/src/main/java/org/sopt/dateroad/presentation/util/Constraints.kt index c6894b405..9423a0e45 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/util/Constraints.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/util/Constraints.kt @@ -121,5 +121,5 @@ object UserPropertyAmplitude { const val USER_FREE_REMAINED = "user_free_remained" const val USER_PURCHASE_COUNT = "user_purchase_count" const val USER_COURSE_COUNT = "user_course_count" - const val USER_SCHEDULE_NUM = "user_schedule_num" + const val DATE_SCHEDULE_NUM = "date_schedule_num" }