Skip to content

Commit 81bbc6f

Browse files
authored
Merge pull request #35 from YAPP-Github/feature/NDGL-112
[NDGL-112] 장소 즐겨찾기 관련 API 연동
2 parents 2af1983 + 845db06 commit 81bbc6f

7 files changed

Lines changed: 249 additions & 136 deletions

File tree

data/travel/src/main/java/com/yapp/ndgl/data/travel/api/PlaceApi.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.yapp.ndgl.data.travel.api
22

33
import com.yapp.ndgl.data.core.model.BaseResponse
4+
import com.yapp.ndgl.data.travel.model.GetBookmarkedPlacesResponse
45
import com.yapp.ndgl.data.travel.model.GetPlacePhotosResponse
56
import com.yapp.ndgl.data.travel.model.PlaceDetailResponse
67
import com.yapp.ndgl.data.travel.model.SavePlaceRequest
78
import retrofit2.http.Body
9+
import retrofit2.http.DELETE
810
import retrofit2.http.GET
911
import retrofit2.http.POST
1012
import retrofit2.http.Query
@@ -24,4 +26,20 @@ interface PlaceApi {
2426
suspend fun getPlacePhotos(
2527
@Query("googlePlaceId") googlePlaceId: String,
2628
): BaseResponse<GetPlacePhotosResponse>
29+
30+
@GET("/api/v1/places/favorite")
31+
suspend fun getBookmarkedPlaces(
32+
@Query("page") page: Int? = null,
33+
@Query("size")size: Int? = null,
34+
): BaseResponse<GetBookmarkedPlacesResponse>
35+
36+
@POST("/api/v1/places/favorite")
37+
suspend fun bookmarkPlace(
38+
@Query("googlePlaceId") googlePlaceId: String,
39+
): BaseResponse<Unit>
40+
41+
@DELETE("/api/v1/places/favorite")
42+
suspend fun unBookmarkPlace(
43+
@Query("googlePlaceId") googlePlaceId: String,
44+
): BaseResponse<Unit>
2745
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.yapp.ndgl.data.travel.model
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class GetBookmarkedPlacesResponse(
8+
@SerialName("content")
9+
val places: List<PlaceInfo>,
10+
val hasNext: Boolean,
11+
)
12+
13+
@Serializable
14+
data class PlaceInfo(
15+
val id: Long,
16+
val googlePlaceId: String,
17+
val name: String,
18+
val formattedAddress: String?,
19+
val latitude: Double,
20+
val longitude: Double,
21+
val thumbnail: String?,
22+
val rating: Double?,
23+
val userRatingCount: Int?,
24+
val category: PlaceCategory,
25+
)

data/travel/src/main/java/com/yapp/ndgl/data/travel/repository/PlaceRepository.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.google.android.libraries.places.api.net.PlacesClient
66
import com.yapp.ndgl.data.core.model.error.HttpResponseException
77
import com.yapp.ndgl.data.core.model.getData
88
import com.yapp.ndgl.data.travel.api.PlaceApi
9+
import com.yapp.ndgl.data.travel.model.GetBookmarkedPlacesResponse
910
import com.yapp.ndgl.data.travel.model.GetPlacePhotosResponse
1011
import com.yapp.ndgl.data.travel.model.PlaceDetailResponse
1112
import com.yapp.ndgl.data.travel.model.SavePlaceRequest
@@ -63,4 +64,16 @@ class PlaceRepository @Inject constructor(
6364
suspend fun getPlacePhotos(googlePlaceId: String): GetPlacePhotosResponse {
6465
return placeApi.getPlacePhotos(googlePlaceId).getData()
6566
}
67+
68+
suspend fun getBookmarkedPlaces(page: Int? = null, size: Int? = null): GetBookmarkedPlacesResponse {
69+
return placeApi.getBookmarkedPlaces(page = page, size = size).getData()
70+
}
71+
72+
suspend fun bookmarkPlace(googlePlaceId: String) {
73+
placeApi.bookmarkPlace(googlePlaceId).getData()
74+
}
75+
76+
suspend fun unBookmarkPlace(googlePlaceId: String) {
77+
placeApi.unBookmarkPlace(googlePlaceId).getData()
78+
}
6679
}

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryContract.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ data class SelectablePlace(
5858
val googlePlaceId: String,
5959
val name: String,
6060
val placeType: PlaceType = PlaceType.ATTRACTION,
61-
val thumbnail: String,
61+
val thumbnail: String?,
6262
)
6363

6464
data class SelectedPlaceDetail(

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryScreen.kt

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -178,47 +178,34 @@ private fun AddItineraryScreen(
178178
}
179179
}
180180

181-
private val previewRecommendedPlaces = listOf(
182-
SelectablePlace(
183-
googlePlaceId = "place_1",
184-
name = "카피톨리니 박물관 (Musei Capitolini)",
185-
placeType = PlaceType.ATTRACTION,
186-
thumbnail = "https://picsum.photos/seed/capitolini/200",
187-
),
188-
SelectablePlace(
189-
googlePlaceId = "place_2",
190-
name = "콜로세움 (Colosseo)",
191-
placeType = PlaceType.ATTRACTION,
192-
thumbnail = "https://picsum.photos/seed/colosseo/200",
193-
),
194-
SelectablePlace(
195-
googlePlaceId = "place_3",
196-
name = "젤라테리아 파씨 (Gelateria Fassi)",
197-
placeType = PlaceType.CAFE,
198-
thumbnail = "https://picsum.photos/seed/gelato/200",
199-
),
200-
)
201-
202-
private val previewSelectedPlaceDetail = SelectedPlaceDetail(
203-
placeInfo = PlaceInfo(
204-
googlePlaceId = "1",
205-
name = "콜로세움",
206-
placeType = PlaceType.ATTRACTION,
207-
rating = 4.8,
208-
userRatingCount = 12450,
209-
address = "Piazza del Colosseo, 1, 00184 Roma RM, Italy",
210-
phoneNumber = "+39 06 3996 7700",
211-
websiteUrl = "https://www.colosseo.it",
212-
estimatedDuration = 2.hours,
213-
),
214-
)
215-
216181
@Preview(showBackground = true)
217182
@Composable
218183
private fun AddItineraryScreenWithAddItineraryBottomSheetPreview() {
219184
NDGLTheme {
220185
AddItineraryScreen(
221-
state = AddItineraryState(day = 1, recommendedPlaces = previewRecommendedPlaces),
186+
state = AddItineraryState(
187+
day = 1,
188+
recommendedPlaces = listOf(
189+
SelectablePlace(
190+
googlePlaceId = "place_1",
191+
name = "카피톨리니 박물관 (Musei Capitolini)",
192+
placeType = PlaceType.ATTRACTION,
193+
thumbnail = "https://picsum.photos/seed/capitolini/200",
194+
),
195+
SelectablePlace(
196+
googlePlaceId = "place_2",
197+
name = "콜로세움 (Colosseo)",
198+
placeType = PlaceType.ATTRACTION,
199+
thumbnail = "https://picsum.photos/seed/colosseo/200",
200+
),
201+
SelectablePlace(
202+
googlePlaceId = "place_3",
203+
name = "젤라테리아 파씨 (Gelateria Fassi)",
204+
placeType = PlaceType.CAFE,
205+
thumbnail = "https://picsum.photos/seed/gelato/200",
206+
),
207+
),
208+
),
222209
clickBack = {},
223210
updateKeyword = {},
224211
searchKeyword = {},
@@ -243,7 +230,19 @@ private fun AddItineraryWithSearchedPlaceBottomSheetPreview() {
243230
state = AddItineraryState(
244231
day = 1,
245232
isSearched = true,
246-
selectedPlaceDetail = previewSelectedPlaceDetail,
233+
selectedPlaceDetail = SelectedPlaceDetail(
234+
placeInfo = PlaceInfo(
235+
googlePlaceId = "1",
236+
name = "콜로세움",
237+
placeType = PlaceType.ATTRACTION,
238+
rating = 4.8,
239+
userRatingCount = 12450,
240+
address = "Piazza del Colosseo, 1, 00184 Roma RM, Italy",
241+
phoneNumber = "+39 06 3996 7700",
242+
websiteUrl = "https://www.colosseo.it",
243+
estimatedDuration = 2.hours,
244+
),
245+
),
247246
),
248247
clickBack = {},
249248
updateKeyword = {},

0 commit comments

Comments
 (0)