Skip to content

Commit

Permalink
Merge pull request #276 from TeamDATEROAD/feat-user-property
Browse files Browse the repository at this point in the history
[feat] User Property 트래킹 코드 심기
  • Loading branch information
t1nm1ksun authored Sep 26, 2024
2 parents 2dca194 + ec5eca2 commit 6ec6ff3
Show file tree
Hide file tree
Showing 31 changed files with 149 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import okhttp3.MultipartBody
import okhttp3.RequestBody
import org.sopt.dateroad.data.dataremote.model.response.ResponseCourseDetailDto
import org.sopt.dateroad.data.dataremote.model.response.ResponseCoursesDto
import org.sopt.dateroad.data.dataremote.model.response.ResponseEnrollCourseDto

interface CourseRemoteDataSource {
suspend fun deleteCourse(courseId: Int)
Expand All @@ -16,7 +17,7 @@ interface CourseRemoteDataSource {

suspend fun getSortedCourses(sortBy: String): ResponseCoursesDto

suspend fun postCourse(images: List<MultipartBody.Part>, course: RequestBody, tags: RequestBody, places: RequestBody)
suspend fun postCourse(images: List<MultipartBody.Part>, course: RequestBody, tags: RequestBody, places: RequestBody): ResponseEnrollCourseDto

suspend fun postCourseLike(courseId: Int)
}
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -14,5 +15,5 @@ interface TimelineRemoteDataSource {

suspend fun getNearestTimeline(): ResponseNearestTimelineDto

suspend fun postTimeline(requestTimelineDto: RequestTimelineDto)
suspend fun postTimeline(requestTimelineDto: RequestTimelineDto): ResponseEnrollTimelineDto
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ package org.sopt.dateroad.data.dataremote.datasource
import org.sopt.dateroad.data.dataremote.model.request.RequestUsePointDto
import org.sopt.dateroad.data.dataremote.model.response.ResponsePointHistoryDto
import org.sopt.dateroad.data.dataremote.model.response.ResponseUserPointDto
import org.sopt.dateroad.data.dataremote.model.response.ResponseUserUsePointDto

interface UserPointRemoteDataSource {
suspend fun getUserPoint(): ResponseUserPointDto

suspend fun getPointHistory(): ResponsePointHistoryDto

suspend fun postUsePoint(courseId: Int, requestUsePointDto: RequestUsePointDto)
suspend fun postUsePoint(courseId: Int, requestUsePointDto: RequestUsePointDto): ResponseUserUsePointDto
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import okhttp3.RequestBody
import org.sopt.dateroad.data.dataremote.datasource.CourseRemoteDataSource
import org.sopt.dateroad.data.dataremote.model.response.ResponseCourseDetailDto
import org.sopt.dateroad.data.dataremote.model.response.ResponseCoursesDto
import org.sopt.dateroad.data.dataremote.model.response.ResponseEnrollCourseDto
import org.sopt.dateroad.data.dataremote.service.CourseService

class CourseRemoteDataSourceImpl @Inject constructor(
Expand All @@ -21,7 +22,7 @@ class CourseRemoteDataSourceImpl @Inject constructor(

override suspend fun getSortedCourses(sortBy: String): ResponseCoursesDto = courseService.getSortedCourses(sortBy = sortBy)

override suspend fun postCourse(images: List<MultipartBody.Part>, course: RequestBody, tags: RequestBody, places: RequestBody) = courseService.postCourse(images = images, course = course, tags = tags, places = places)
override suspend fun postCourse(images: List<MultipartBody.Part>, course: RequestBody, tags: RequestBody, places: RequestBody): ResponseEnrollCourseDto = courseService.postCourse(images = images, course = course, tags = tags, places = places)

override suspend fun postCourseLike(courseId: Int) = courseService.postCourseLike(courseId = courseId)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import org.sopt.dateroad.data.dataremote.datasource.UserPointRemoteDataSource
import org.sopt.dateroad.data.dataremote.model.request.RequestUsePointDto
import org.sopt.dateroad.data.dataremote.model.response.ResponsePointHistoryDto
import org.sopt.dateroad.data.dataremote.model.response.ResponseUserPointDto
import org.sopt.dateroad.data.dataremote.model.response.ResponseUserUsePointDto
import org.sopt.dateroad.data.dataremote.service.UserPointService

class UserPointRemoteDataSourceImpl @Inject constructor(
Expand All @@ -14,5 +15,5 @@ class UserPointRemoteDataSourceImpl @Inject constructor(

override suspend fun getPointHistory(): ResponsePointHistoryDto = userPointService.getPointHistory()

override suspend fun postUsePoint(courseId: Int, requestUsePointDto: RequestUsePointDto) = userPointService.postUsePoint(courseId = courseId, requestUsePointDto = requestUsePointDto)
override suspend fun postUsePoint(courseId: Int, requestUsePointDto: RequestUsePointDto): ResponseUserUsePointDto = userPointService.postUsePoint(courseId = courseId, requestUsePointDto = requestUsePointDto)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.sopt.dateroad.data.dataremote.model.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class ResponseEnrollCourseDto(
@SerialName("userPoint")
val userPoint: Int,
@SerialName("userCourseCount")
val userCourseCount: Long
)
Original file line number Diff line number Diff line change
@@ -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
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.sopt.dateroad.data.dataremote.model.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class ResponseUserUsePointDto(
@SerialName("userPoint")
val userPoint: Int,
@SerialName("userFreeRemained")
val userFreeRemained: Int,
@SerialName("userPurchaseCount")
val userPurchaseCount: Long
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import okhttp3.MultipartBody
import okhttp3.RequestBody
import org.sopt.dateroad.data.dataremote.model.response.ResponseCourseDetailDto
import org.sopt.dateroad.data.dataremote.model.response.ResponseCoursesDto
import org.sopt.dateroad.data.dataremote.model.response.ResponseEnrollCourseDto
import org.sopt.dateroad.data.dataremote.util.ApiConstraints.API
import org.sopt.dateroad.data.dataremote.util.ApiConstraints.CITY
import org.sopt.dateroad.data.dataremote.util.ApiConstraints.COST
Expand Down Expand Up @@ -60,7 +61,7 @@ interface CourseService {
@Part(COURSE) course: RequestBody,
@Part(TAGS) tags: RequestBody,
@Part(PLACES) places: RequestBody
)
): ResponseEnrollCourseDto

@POST("$API/$VERSION/$COURSES/{$COURSE_ID}/$LIKES")
suspend fun postCourseLike(
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -39,5 +40,5 @@ interface TimelineService {
@POST("$API/$VERSION/$DATES")
suspend fun postTimeline(
@Body requestTimelineDto: RequestTimelineDto
)
): ResponseEnrollTimelineDto
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.sopt.dateroad.data.dataremote.service
import org.sopt.dateroad.data.dataremote.model.request.RequestUsePointDto
import org.sopt.dateroad.data.dataremote.model.response.ResponsePointHistoryDto
import org.sopt.dateroad.data.dataremote.model.response.ResponseUserPointDto
import org.sopt.dateroad.data.dataremote.model.response.ResponseUserUsePointDto
import org.sopt.dateroad.data.dataremote.util.ApiConstraints.API
import org.sopt.dateroad.data.dataremote.util.ApiConstraints.COURSES
import org.sopt.dateroad.data.dataremote.util.ApiConstraints.COURSE_ID
Expand All @@ -27,5 +28,5 @@ interface UserPointService {
suspend fun postUsePoint(
@Path(COURSE_ID) courseId: Int,
@Body requestUsePointDto: RequestUsePointDto
)
): ResponseUserUsePointDto
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.sopt.dateroad.data.mapper.todomain

import org.sopt.dateroad.data.dataremote.model.response.ResponseEnrollCourseDto
import org.sopt.dateroad.domain.model.EnrollCourseResult

fun ResponseEnrollCourseDto.toDomain(): EnrollCourseResult = EnrollCourseResult(
userPoint = this.userPoint,
userCourseCount = this.userCourseCount
)
Original file line number Diff line number Diff line change
@@ -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
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.sopt.dateroad.data.mapper.todomain

import org.sopt.dateroad.data.dataremote.model.response.ResponseUserUsePointDto
import org.sopt.dateroad.domain.model.PointUseResult

fun ResponseUserUsePointDto.toDomain(): PointUseResult = PointUseResult(
userPoint = this.userPoint,
userFreeRemained = this.userFreeRemained,
userPurchaseCount = this.userPurchaseCount
)
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import org.sopt.dateroad.data.mapper.todomain.toDomain
import org.sopt.dateroad.domain.model.Course
import org.sopt.dateroad.domain.model.CourseDetail
import org.sopt.dateroad.domain.model.Enroll
import org.sopt.dateroad.domain.model.EnrollCourseResult
import org.sopt.dateroad.domain.repository.CourseRepository
import org.sopt.dateroad.domain.type.GyeonggiAreaType
import org.sopt.dateroad.domain.type.IncheonAreaType
Expand Down Expand Up @@ -58,13 +59,13 @@ class CourseRepositoryImpl @Inject constructor(
courseRemoteDataSource.getSortedCourses(sortBy = sortedBy.name).toDomain()
}

override suspend fun postCourse(enroll: Enroll): Result<Unit> = runCatching {
override suspend fun postCourse(enroll: Enroll): Result<EnrollCourseResult> = runCatching {
courseRemoteDataSource.postCourse(
images = enroll.images.map { image -> ContentUriRequestBody(contentResolver = contentResolver, uri = Uri.parse(image)).toFormData() },
course = Json.encodeToString(enroll.toCourseData()).toRequestBody("application/json".toMediaType()),
places = Json.encodeToString(enroll.places.mapIndexed { index, place -> place.toData(sequence = index + 1) }).toRequestBody("application/json".toMediaType()),
tags = Json.encodeToString(enroll.tags.map { tag -> tag.toData() }).toRequestBody("application/json".toMediaType())
)
).toDomain()
}

override suspend fun postCourseLike(courseId: Int): Result<Unit> = runCatching {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<EnrollTimelineResult> = runCatching {
timelineRemoteDataSource.postTimeline(requestTimelineDto = enroll.toTimelineData()).toDomain()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import org.sopt.dateroad.data.dataremote.datasource.UserPointRemoteDataSource
import org.sopt.dateroad.data.mapper.todata.toData
import org.sopt.dateroad.data.mapper.todomain.toDomain
import org.sopt.dateroad.domain.model.PointHistory
import org.sopt.dateroad.domain.model.PointUseResult
import org.sopt.dateroad.domain.model.UsePoint
import org.sopt.dateroad.domain.model.UserPoint
import org.sopt.dateroad.domain.repository.UserPointRepository
Expand All @@ -20,7 +21,7 @@ class UserPointRepositoryImpl @Inject constructor(
userPointRemoteDataSource.getPointHistory().toDomain()
}

override suspend fun postUsePoint(courseId: Int, usePoint: UsePoint) {
userPointRemoteDataSource.postUsePoint(courseId = courseId, requestUsePointDto = usePoint.toData())
override suspend fun postUsePoint(courseId: Int, usePoint: UsePoint): Result<PointUseResult> = runCatching {
userPointRemoteDataSource.postUsePoint(courseId = courseId, requestUsePointDto = usePoint.toData()).toDomain()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.sopt.dateroad.domain.model

data class EnrollCourseResult(
val userPoint: Int,
val userCourseCount: Long
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.sopt.dateroad.domain.model

data class EnrollTimelineResult(
val dateScheduleNum: Long
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.sopt.dateroad.domain.model

data class PointUseResult(
val userPoint: Int,
val userFreeRemained: Int,
val userPurchaseCount: Long

)
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.sopt.dateroad.domain.repository
import org.sopt.dateroad.domain.model.Course
import org.sopt.dateroad.domain.model.CourseDetail
import org.sopt.dateroad.domain.model.Enroll
import org.sopt.dateroad.domain.model.EnrollCourseResult
import org.sopt.dateroad.domain.type.MoneyTagType
import org.sopt.dateroad.domain.type.RegionType
import org.sopt.dateroad.domain.type.SortByType
Expand All @@ -18,7 +19,7 @@ interface CourseRepository {

suspend fun getSortedCourses(sortedBy: SortByType): Result<List<Course>>

suspend fun postCourse(enroll: Enroll): Result<Unit>
suspend fun postCourse(enroll: Enroll): Result<EnrollCourseResult>

suspend fun postCourseLike(courseId: Int): Result<Unit>
}
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -15,5 +16,5 @@ interface TimelineRepository {

suspend fun getNearestTimeline(): Result<NearestTimeline>

suspend fun postTimeline(enroll: Enroll): Result<Unit>
suspend fun postTimeline(enroll: Enroll): Result<EnrollTimelineResult>
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.sopt.dateroad.domain.repository

import org.sopt.dateroad.domain.model.PointHistory
import org.sopt.dateroad.domain.model.PointUseResult
import org.sopt.dateroad.domain.model.UsePoint
import org.sopt.dateroad.domain.model.UserPoint

Expand All @@ -9,5 +10,5 @@ interface UserPointRepository {

suspend fun getPointHistory(): Result<PointHistory>

suspend fun postUsePoint(courseId: Int, usePoint: UsePoint)
suspend fun postUsePoint(courseId: Int, usePoint: UsePoint): Result<PointUseResult>
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.EnrollCourseResult
import org.sopt.dateroad.domain.repository.CourseRepository

@Singleton
class PostCourseUseCase @Inject constructor(
private val courseRepository: CourseRepository
) {
suspend operator fun invoke(enroll: Enroll): Result<Unit> = courseRepository.postCourse(enroll = enroll)
suspend operator fun invoke(enroll: Enroll): Result<EnrollCourseResult> = courseRepository.postCourse(enroll = enroll)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<Unit> = timelineRepository.postTimeline(enroll = enroll)
suspend operator fun invoke(enroll: Enroll): Result<EnrollTimelineResult> = timelineRepository.postTimeline(enroll = enroll)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ package org.sopt.dateroad.domain.usecase

import javax.inject.Inject
import javax.inject.Singleton
import org.sopt.dateroad.domain.model.PointUseResult
import org.sopt.dateroad.domain.model.UsePoint
import org.sopt.dateroad.domain.repository.UserPointRepository

@Singleton
class PostUsePointUseCase @Inject constructor(
private val userPointRepository: UserPointRepository
) {
suspend operator fun invoke(courseId: Int, usePoint: UsePoint): Result<Unit> = runCatching {
suspend operator fun invoke(courseId: Int, usePoint: UsePoint): Result<PointUseResult> =
userPointRepository.postUsePoint(courseId = courseId, usePoint = usePoint)
}
}
Loading

0 comments on commit 6ec6ff3

Please sign in to comment.