Skip to content

Commit 1404107

Browse files
authored
Merge pull request #95 from Nexters/feature/change-diary-get-patch-api-FD-306
[FD-306] change diary get patch api
2 parents 1ccf79f + 4602f5f commit 1404107

20 files changed

Lines changed: 325 additions & 47 deletions

File tree

app/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ android {
6060
minSdk = libs.versions.minSdk.get().toInt()
6161
targetSdk = libs.versions.targetSdk.get().toInt()
6262
versionCode = project.findProperty("versionCode")?.toString()?.toInt() ?: 1
63-
versionName = "1.2"
63+
versionName = "1.3.0"
6464

6565
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
6666

app/src/main/java/com/nexters/fooddiary/navigation/FoodDiaryNavHost.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import com.nexters.fooddiary.presentation.mypage.navigation.MyPageRoute
6262
import com.nexters.fooddiary.presentation.mypage.navigation.WebViewPage
6363
import com.nexters.fooddiary.presentation.mypage.navigation.myPageScreen
6464
import com.nexters.fooddiary.presentation.modify.navigation.ModifyRoute
65+
import com.nexters.fooddiary.presentation.modify.navigation.MODIFY_SEARCH_RESULT_ADDRESS_NAME
6566
import com.nexters.fooddiary.presentation.modify.navigation.MODIFY_SEARCH_RESULT_NAME
6667
import com.nexters.fooddiary.presentation.modify.navigation.MODIFY_SEARCH_RESULT_ROAD_ADDRESS
6768
import com.nexters.fooddiary.presentation.modify.navigation.MODIFY_SEARCH_RESULT_URL
@@ -420,6 +421,10 @@ fun FoodDiaryNavHost(
420421
MODIFY_SEARCH_RESULT_ROAD_ADDRESS,
421422
restaurant.roadAddress,
422423
)
424+
navController.previousBackStackEntry?.savedStateHandle?.set(
425+
MODIFY_SEARCH_RESULT_ADDRESS_NAME,
426+
restaurant.addressName.orEmpty(),
427+
)
423428
navController.previousBackStackEntry?.savedStateHandle?.set(
424429
MODIFY_SEARCH_RESULT_URL,
425430
restaurant.url,

data/src/main/java/com/nexters/fooddiary/data/mapper/DiaryMapper.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ class DiaryMapper @Inject constructor() {
2121
createdAt = diary.createdAt,
2222
restaurantName = diary.restaurantName,
2323
category = diary.category,
24-
location = diary.roadAddress,
24+
addressName = diary.addressName,
25+
roadAddress = diary.roadAddress,
26+
location = diary.addressName ?: diary.roadAddress,
2527
tags = diary.tags,
2628
note = diary.note,
2729
coverPhotoUrl = diary.coverPhotoUrl,

data/src/main/java/com/nexters/fooddiary/data/mapper/RestaurantMapper.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.nexters.fooddiary.domain.model.RestaurantSearchResult
88
internal fun RestaurantResponseItem.toDomainModel(): RestaurantItem {
99
return RestaurantItem(
1010
name = name,
11+
addressName = addressName,
1112
roadAddress = roadAddress,
1213
url = url,
1314
)

data/src/main/java/com/nexters/fooddiary/data/remote/diary/model/DiaryDetailResponse.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ data class DiarySummaryResponse(
2323
val restaurantName: String?,
2424
@SerialName("restaurant_url")
2525
val restaurantUrl: String? = null,
26+
@SerialName("address_name")
27+
val addressName: String? = null,
2628
@SerialName("category")
2729
val category: String?,
2830
@SerialName("note")

data/src/main/java/com/nexters/fooddiary/data/remote/diary/model/UpdateDiaryRequest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ data class UpdateDiaryRequest(
1111
val restaurantName: String? = null,
1212
@SerialName("restaurant_url")
1313
val restaurantUrl: String? = null,
14+
@SerialName("address_name")
15+
val addressName: String? = null,
1416
@SerialName("road_address")
1517
val roadAddress: String? = null,
1618
@SerialName("tags")

data/src/main/java/com/nexters/fooddiary/data/remote/restaurant/model/response/RestaurantSearchResponse.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ data class RestaurantSearchResponse(
2121
data class RestaurantResponseItem(
2222
@SerialName("name")
2323
val name: String,
24+
@SerialName("address_name")
25+
val addressName: String? = null,
2426
@SerialName("road_address")
2527
val roadAddress: String,
2628
@SerialName("url")

data/src/main/java/com/nexters/fooddiary/data/repository/DiaryRepositoryImpl.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class DiaryRepositoryImpl @Inject constructor(
8888
category = param.category,
8989
restaurantName = param.restaurantName,
9090
restaurantUrl = param.restaurantUrl,
91+
addressName = param.addressName,
9192
roadAddress = param.roadAddress,
9293
tags = param.tags,
9394
note = param.note,
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.nexters.fooddiary.data.mapper
2+
3+
import com.nexters.fooddiary.data.remote.restaurant.model.response.RestaurantResponseItem
4+
import org.junit.Assert.assertEquals
5+
import org.junit.Test
6+
7+
class RestaurantMapperTest {
8+
9+
@Test
10+
fun `address_name 과 road_address 를 각각 보존해 매핑한다`() {
11+
val item = RestaurantResponseItem(
12+
name = "식당",
13+
addressName = "서울시 강남구 역삼동 123-4",
14+
roadAddress = "서울시 강남구 테헤란로 123",
15+
url = "https://example.com",
16+
)
17+
18+
val mapped = item.toDomainModel()
19+
20+
assertEquals("서울시 강남구 역삼동 123-4", mapped.addressName)
21+
assertEquals("서울시 강남구 테헤란로 123", mapped.roadAddress)
22+
}
23+
24+
@Test
25+
fun `address_name 이 없으면 road_address 를 매핑한다`() {
26+
val item = RestaurantResponseItem(
27+
name = "식당",
28+
addressName = null,
29+
roadAddress = "서울시 강남구 테헤란로 123",
30+
url = "https://example.com",
31+
)
32+
33+
val mapped = item.toDomainModel()
34+
35+
assertEquals("서울시 강남구 테헤란로 123", mapped.roadAddress)
36+
}
37+
}

data/src/test/java/com/nexters/fooddiary/data/remote/diary/DiaryApiTest.kt

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@ package com.nexters.fooddiary.data.remote.diary
22

33
import com.nexters.fooddiary.data.mock.BaseMockServerTest
44
import com.nexters.fooddiary.data.remote.diary.model.CreateDiaryRequest
5+
import com.nexters.fooddiary.data.remote.diary.model.UpdateDiaryRequest
56
import kotlinx.coroutines.test.runTest
67
import kotlinx.serialization.json.Json
78
import okhttp3.MediaType.Companion.toMediaType
89
import okhttp3.OkHttpClient
10+
import okhttp3.mockwebserver.Dispatcher
11+
import okhttp3.mockwebserver.MockResponse
12+
import okhttp3.mockwebserver.RecordedRequest
913
import org.junit.Assert.assertEquals
1014
import org.junit.Assert.assertNotNull
15+
import org.junit.Assert.assertTrue
1116
import org.junit.Before
1217
import org.junit.Test
1318
import retrofit2.Retrofit
@@ -101,4 +106,69 @@ class DiaryApiTest : BaseMockServerTest() {
101106
recordedRequest.path,
102107
)
103108
}
109+
110+
@Test
111+
fun `다이어리_수정시_address_name을_요청_바디에_포함한다`() = runTest {
112+
// Given
113+
val fallbackDispatcher = mockWebServer.dispatcher
114+
mockWebServer.dispatcher = object : Dispatcher() {
115+
override fun dispatch(request: RecordedRequest): MockResponse {
116+
return if (request.method == "PATCH" && request.path == "/diaries/42") {
117+
MockResponse()
118+
.setResponseCode(200)
119+
.setHeader("Content-Type", "application/json")
120+
.setBody(
121+
"""
122+
{
123+
"id": 42,
124+
"diary_date": "2026-03-12T15:09:52.066Z",
125+
"time_type": "lunch",
126+
"analysis_status": "done",
127+
"restaurant_name": "식당",
128+
"restaurant_url": "https://example.com",
129+
"address_name": "서울시 강남구 테헤란로 123",
130+
"road_address": "서울시 강남구 테헤란로 123",
131+
"category": "한식",
132+
"note": "노트",
133+
"tags": ["점심"],
134+
"cover_photo_url": "https://example.com/cover.jpg",
135+
"user_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
136+
"cover_photo_id": 100,
137+
"created_at": "2026-03-12T15:09:52.066Z",
138+
"updated_at": "2026-03-12T15:09:52.066Z",
139+
"photo_count": 1,
140+
"photos": [
141+
{ "photo_id": 100, "image_url": "https://example.com/cover.jpg" }
142+
]
143+
}
144+
""".trimIndent()
145+
)
146+
} else {
147+
fallbackDispatcher.dispatch(request)
148+
}
149+
}
150+
}
151+
152+
val request = UpdateDiaryRequest(
153+
category = "한식",
154+
restaurantName = "식당",
155+
restaurantUrl = "https://example.com",
156+
addressName = "서울시 강남구 테헤란로 123",
157+
roadAddress = "서울시 강남구 테헤란로 123",
158+
tags = listOf("점심"),
159+
note = "노트",
160+
coverPhotoId = 100,
161+
photoIds = listOf(100),
162+
)
163+
164+
// When
165+
diaryApi.updateDiary(diaryId = 42, request = request)
166+
167+
// Then
168+
val recordedRequest = mockWebServer.takeRequest()
169+
assertEquals("PATCH", recordedRequest.method)
170+
assertEquals("/diaries/42", recordedRequest.path)
171+
val body = recordedRequest.body.readUtf8()
172+
assertTrue(body.contains("\"address_name\":\"서울시 강남구 테헤란로 123\""))
173+
}
104174
}

0 commit comments

Comments
 (0)