Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/develop' into feat/#128-add-map-api
Browse files Browse the repository at this point in the history
# Conflicts:
#	app/src/main/java/com/spoony/spoony/data/datasourceimpl/PostRemoteDataSourceImpl.kt
#	app/src/main/java/com/spoony/spoony/data/service/PostService.kt
#	app/src/main/java/com/spoony/spoony/presentation/placeDetail/PlaceDetailViewModel.kt
  • Loading branch information
Roel4990 committed Jan 22, 2025
2 parents 977d496 + fdd395e commit d0ddaae
Show file tree
Hide file tree
Showing 24 changed files with 334 additions and 173 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.spoony.spoony.data.datasource

import com.spoony.spoony.data.dto.base.BaseResponse
import com.spoony.spoony.data.dto.response.PlaceCheckResponseDto
import com.spoony.spoony.data.dto.response.SearchPlaceResponseDto

interface PlaceDataSource {
suspend fun getPlaces(query: String, display: Int): BaseResponse<SearchPlaceResponseDto>

suspend fun checkDuplicatePlace(
userId: Long,
latitude: Double,
longitude: Double
): BaseResponse<PlaceCheckResponseDto>
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.spoony.spoony.data.dto.base.BaseResponse
import com.spoony.spoony.data.dto.response.GetPostResponseDto

interface PostRemoteDataSource {
suspend fun postScoopPost(postId: Int, userId: Int): BaseResponse<Boolean>
suspend fun getPostData(postId: Int, userId: Int): BaseResponse<GetPostResponseDto>
suspend fun postAddMapData(postId: Int, userId: Int): BaseResponse<Boolean>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.spoony.spoony.data.datasourceimpl

import com.spoony.spoony.data.datasource.PlaceDataSource
import com.spoony.spoony.data.dto.base.BaseResponse
import com.spoony.spoony.data.dto.request.PlaceCheckRequestDto
import com.spoony.spoony.data.dto.response.PlaceCheckResponseDto
import com.spoony.spoony.data.dto.response.SearchPlaceResponseDto
import com.spoony.spoony.data.service.PlaceService
import javax.inject.Inject

class PlaceDataSourceImpl @Inject constructor(
private val placeService: PlaceService
) : PlaceDataSource {
override suspend fun getPlaces(
query: String,
display: Int
): BaseResponse<SearchPlaceResponseDto> =
placeService.getPlaces(query, display)

override suspend fun checkDuplicatePlace(
userId: Long,
latitude: Double,
longitude: Double
): BaseResponse<PlaceCheckResponseDto> =
placeService.postDuplicatePlace(
PlaceCheckRequestDto(
userId = userId,
latitude = latitude,
longitude = longitude
)
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.spoony.spoony.data.datasourceimpl

import com.spoony.spoony.data.datasource.PostRemoteDataSource
import com.spoony.spoony.data.dto.base.BaseResponse
import com.spoony.spoony.data.dto.request.PostScoopRequestDto
import com.spoony.spoony.data.dto.request.PostAddMapRequestDto
import com.spoony.spoony.data.dto.response.GetPostResponseDto
import com.spoony.spoony.data.service.PostService
Expand All @@ -16,4 +17,11 @@ class PostRemoteDataSourceImpl @Inject constructor(
postService.postAddMapPost(
PostAddMapRequestDto(postId = postId, userId = userId)
)
override suspend fun getPostData(postId: Int, userId: Int): BaseResponse<GetPostResponseDto> =
postService.getPost(userId = userId, postId = postId)

override suspend fun postScoopPost(postId: Int, userId: Int): BaseResponse<Boolean> =
postService.postScoopPost(
PostScoopRequestDto(postId = postId, userId = userId)
)
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.spoony.spoony.data.di

import com.spoony.spoony.data.datasource.DummyRemoteDataSource
import com.spoony.spoony.data.datasource.PlaceDataSource
import com.spoony.spoony.data.datasource.PostRemoteDataSource
import com.spoony.spoony.data.datasourceimpl.DummyRemoteDataSourceImpl
import com.spoony.spoony.data.datasourceimpl.PlaceDataSourceImpl
import com.spoony.spoony.data.datasourceimpl.PostRemoteDataSourceImpl
import dagger.Binds
import dagger.Module
Expand All @@ -20,4 +22,10 @@ abstract class DataSourceModule {
@Binds
@Singleton
abstract fun bindPostDataSource(postRemoteDataSourceImpl: PostRemoteDataSourceImpl): PostRemoteDataSource

@Binds
@Singleton
abstract fun bindPlaceDataSource(
placeDataSourceImpl: PlaceDataSourceImpl
): PlaceDataSource
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,5 @@ abstract class RepositoryModule {

@Binds
@Singleton
abstract fun provideRegisterRepository(registerRepositoryImpl: RegisterRepositoryImpl): RegisterRepository
abstract fun bindRegisterRepository(registerRepositoryImpl: RegisterRepositoryImpl): RegisterRepository
}
6 changes: 6 additions & 0 deletions app/src/main/java/com/spoony/spoony/data/di/ServiceModule.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.spoony.spoony.data.di

import com.spoony.spoony.data.service.DummyService
import com.spoony.spoony.data.service.PlaceService
import com.spoony.spoony.data.service.PostService
import dagger.Module
import dagger.Provides
Expand All @@ -21,4 +22,9 @@ object ServiceModule {
@Singleton
fun providePostService(retrofit: Retrofit): PostService =
retrofit.create(PostService::class.java)

@Provides
@Singleton
fun providePlaceService(retrofit: Retrofit): PlaceService =
retrofit.create(PlaceService::class.java)
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ data class BaseResponse<T>(
val error: ErrorResponse? = null,
@SerialName("data")
val data: T? = null
)

@Serializable
data class ErrorResponse(
@SerialName("message")
val message: String
)
) {
@Serializable
data class ErrorResponse(
@SerialName("message")
val message: String
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.spoony.spoony.data.dto.request

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

@Serializable
data class PlaceCheckRequestDto(
@SerialName("userId")
val userId: Long,
@SerialName("latitude")
val latitude: Double,
@SerialName("longitude")
val longitude: Double
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.spoony.spoony.data.dto.request

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

@Serializable
data class PostScoopRequestDto(
@SerialName("postId")
val postId: Int,
@SerialName("userId")
val userId: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.spoony.spoony.data.dto.response

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

@Serializable
data class PlaceCheckResponseDto(
@SerialName("duplicate")
val idDuplicated: Boolean
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.spoony.spoony.data.dto.response

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

@Serializable
data class SearchPlaceResponseDto(
@SerialName("placeList")
val placeList: List<PlaceResponseDto>
)

@Serializable
data class PlaceResponseDto(
@SerialName("placeName")
val placeName: String,
@SerialName("placeAddress")
val placeAddress: String,
@SerialName("placeRoadAddress")
val placeRoadAddress: String,
@SerialName("latitude")
val latitude: Double,
@SerialName("longitude")
val longitude: Double
)
13 changes: 13 additions & 0 deletions app/src/main/java/com/spoony/spoony/data/mapper/PlaceMapper.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.spoony.spoony.data.mapper

import com.spoony.spoony.data.dto.response.PlaceResponseDto
import com.spoony.spoony.domain.entity.PlaceEntity

fun PlaceResponseDto.toDomain(): PlaceEntity =
PlaceEntity(
placeName = placeName,
placeAddress = placeAddress,
placeRoadAddress = placeRoadAddress,
latitude = latitude,
longitude = longitude
)
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ class PostRepositoryImpl @Inject constructor(
}

override suspend fun postScoopPost(postId: Int, userId: Int): Result<Boolean> =
Result.success(
true
)
runCatching {
postRemoteDataSource.postScoopPost(postId = postId, userId = userId).success
}

override suspend fun postAddMap(postId: Int, userId: Int): Result<Boolean> =
runCatching {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,105 +1,74 @@
package com.spoony.spoony.data.repositoryimpl

import android.net.Uri
import com.spoony.spoony.data.datasource.PlaceDataSource
import com.spoony.spoony.data.mapper.toDomain
import com.spoony.spoony.domain.entity.CategoryEntity
import com.spoony.spoony.domain.entity.PlaceEntity
import com.spoony.spoony.domain.repository.RegisterRepository
import com.spoony.spoony.presentation.register.model.Category
import com.spoony.spoony.presentation.register.model.Place
import javax.inject.Inject

class RegisterRepositoryImpl @Inject constructor() : RegisterRepository {
override suspend fun getCategories(): Result<List<Category>> = Result.success(
class RegisterRepositoryImpl @Inject constructor(
private val placeDataSource: PlaceDataSource
) : RegisterRepository {
override suspend fun getCategories(): Result<List<CategoryEntity>> = Result.success(
listOf(
Category(
CategoryEntity(
categoryId = 2,
categoryName = "한식",
iconUrlSelected = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_white.png",
iconUrlNotSelected = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_black.png"
iconUrl = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_white.png",
unSelectedIconUrl = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_black.png"
),
Category(
CategoryEntity(
categoryId = 3,
categoryName = "일식",
iconUrlSelected = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_white.png",
iconUrlNotSelected = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_black.png"
iconUrl = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_white.png",
unSelectedIconUrl = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_black.png"
),
Category(
CategoryEntity(
categoryId = 4,
categoryName = "중식",
iconUrlSelected = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_white.png",
iconUrlNotSelected = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_black.png"
iconUrl = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_white.png",
unSelectedIconUrl = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_black.png"
),
Category(
CategoryEntity(
categoryId = 5,
categoryName = "양식",
iconUrlSelected = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_white.png",
iconUrlNotSelected = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_black.png"
iconUrl = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_white.png",
unSelectedIconUrl = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_black.png"
),
Category(
CategoryEntity(
categoryId = 6,
categoryName = "퓨전/세계요리",
iconUrlSelected = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_white.png",
iconUrlNotSelected = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_black.png"
iconUrl = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_white.png",
unSelectedIconUrl = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_black.png"
),
Category(
CategoryEntity(
categoryId = 7,
categoryName = "카페",
iconUrlSelected = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_white.png",
iconUrlNotSelected = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_black.png"
iconUrl = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_white.png",
unSelectedIconUrl = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_black.png"
),
Category(
CategoryEntity(
categoryId = 8,
categoryName = "주류",
iconUrlSelected = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_white.png",
iconUrlNotSelected = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_black.png"
iconUrl = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_white.png",
unSelectedIconUrl = "https://spoony-storage.s3.ap-northeast-2.amazonaws.com/category/icons/korean_black.png"
)
)
)

override suspend fun searchPlace(query: String, display: Int): Result<List<Place>> = Result.success(
listOf(
Place(
placeName = "스타벅스 강남대로점",
placeAddress = "서울특별시 서초구 서초동 1305-7",
placeRoadAddress = "서울특별시 서초구 강남대로 369 (서초동)",
latitude = 37.4979,
longitude = 127.0276
),
Place(
placeName = "스타벅스 신촌역점",
placeAddress = "서울특별시 서대문구 창천동 30-1",
placeRoadAddress = "서울특별시 서대문구 연세로 10-1 (창천동)",
latitude = 37.5598,
longitude = 126.9423
),
Place(
placeName = "스타벅스 홍대역점",
placeAddress = "서울특별시 마포구 서교동 358-11",
placeRoadAddress = "서울특별시 마포구 양화로 166 (서교동)",
latitude = 37.5569,
longitude = 126.9237
),
Place(
placeName = "스타벅스 부산센텀시티점",
placeAddress = "부산광역시 해운대구 우동 1505",
placeRoadAddress = "부산광역시 해운대구 센텀남대로 35 (우동)",
latitude = 35.1698,
longitude = 129.1315
),
Place(
placeName = "스타벅스 대구동성로점",
placeAddress = "대구광역시 중구 동성로3가 11",
placeRoadAddress = "대구광역시 중구 동성로 55 (동성로3가)",
latitude = 35.8703,
longitude = 128.5978
)
)
)
override suspend fun searchPlace(query: String, display: Int): Result<List<PlaceEntity>> = runCatching {
placeDataSource.getPlaces(query, display).data!!.placeList
.map { it.toDomain() }
}

override suspend fun checkDuplicatePlace(
userId: Long,
latitude: Double,
longitude: Double
): Result<Boolean> = runCatching {
latitude == 35.8703 && longitude == 128.5978
placeDataSource.checkDuplicatePlace(userId, latitude, longitude).data!!.idDuplicated
}

override suspend fun registerPost(
Expand Down
23 changes: 23 additions & 0 deletions app/src/main/java/com/spoony/spoony/data/service/PlaceService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.spoony.spoony.data.service

import com.spoony.spoony.data.dto.base.BaseResponse
import com.spoony.spoony.data.dto.request.PlaceCheckRequestDto
import com.spoony.spoony.data.dto.response.PlaceCheckResponseDto
import com.spoony.spoony.data.dto.response.SearchPlaceResponseDto
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Query

interface PlaceService {
@GET("api/v1/place/search")
suspend fun getPlaces(
@Query("query") query: String,
@Query("display") display: Int = 5
): BaseResponse<SearchPlaceResponseDto>

@POST("api/v1/place/check")
suspend fun postDuplicatePlace(
@Body request: PlaceCheckRequestDto
): BaseResponse<PlaceCheckResponseDto>
}
Loading

0 comments on commit d0ddaae

Please sign in to comment.