From a3b85bb902e12707b220a1103354907f98222f2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Mon, 24 Aug 2026 20:22:05 +0900 Subject: [PATCH] =?UTF-8?q?refactor(afternote):=20data/mapper=20=EB=A5=BC?= =?UTF-8?q?=20=EB=A0=88=ED=8F=AC=20=ED=91=9C=EC=A4=80=20=EB=AA=85=EB=AA=85?= =?UTF-8?q?=C2=B7=ED=8F=89=EB=A9=B4=20=EB=B0=B0=EC=B9=98=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 같은 방향(도메인 → wire) 매핑이 InputToDto·PlaylistInputToDto·InputToRequest 세 파일로 갈려 매핑 하나를 찾으려면 셋을 다 열어야 했다. 파일명 패턴도 InputTo*·*DtoToDomain·*Utils 로 레포 표준(*Mapper)과 어긋나 있었다. - 요청 매퍼 3파일을 AfternoteRequestMapper.kt 하나로 통합 - AfternoteListItemDtoToDomain.kt -> AfternoteListItemMapper.kt - mapper/response/ 를 없애고 AfternoteDetailMapper.kt 를 평면으로 옮김. mindrecord·timeletter 가 쓰는 배치라, 대칭인 request/ 를 새로 만드는 쪽이 아니라 평면으로 수렴하는 쪽이 표준이다 - MappingUtils.kt -> ServerDateFormat.kt. categoryToAfternoteType 은 값 표 정본인 AfternoteCategoryCodec.kt 옆으로 옮겨 KDoc 의 정본 안내가 불필요해졌다 - toDetailDomain() -> toDomain() (receiver·mindrecord·timeletter 와 같은 이름) 함수명 toDto/toRequest 는 통일하지 않았다. 레포 표준에서 둘은 역할이 다르다 -- toRequest 는 요청 바디 루트(*RequestDto), toDto 는 그 안에 실리는 부분 DTO 이고 mindrecord DiaryMapper.kt 가 한 파일에서 둘을 같이 쓴다. afternote 의 InputToDto(부분)/InputToRequest(루트) 분업은 이미 그 규약과 일치해, 하나로 합치면 오히려 표준에서 이탈한다. List?.toDto() 와 List.toDto() 는 제네릭 소거 후 JVM 시그니처가 toDto(List):List 로 같아 한 파일에 둘 수 없다 -- 파일이 갈려 있던 것이 이 충돌을 우회하고 있었다. 각각 호출부가 1곳뿐이라 map { it.toDto() } 로 인라인했다. AfternoteCategoryCodec 의 "BUSINESS·ESTATE 는 서버에 없고 보내면 400" 주석은 BE 가 2026-08-13(Afternote-BE 78ee857)에 BUSINESS 를 추가해 거짓이 됐으므로 걷어냈다. 그 낡음이 만든 동작 결함(사업자 애프터노트가 소셜로 둔갑)은 #1048 로 분리했다. --- .../data/mapper/AfternoteCategoryCodec.kt | 4 +- .../{response => }/AfternoteDetailMapper.kt | 7 +-- ...ToDomain.kt => AfternoteListItemMapper.kt} | 0 ...ToRequest.kt => AfternoteRequestMapper.kt} | 47 ++++++++++++++++++- .../afternote/data/mapper/InputToDto.kt | 30 ------------ .../afternote/data/mapper/MappingUtils.kt | 19 -------- .../data/mapper/PlaylistInputToDto.kt | 26 ---------- .../afternote/data/mapper/ServerDateFormat.kt | 10 ++++ .../author/AfternoteRepositoryImpl.kt | 4 +- .../AfternoteDetailMapperTest.kt | 32 ++++++------- ...Test.kt => AfternoteListItemMapperTest.kt} | 2 +- .../mapper/LeaveMessageBlockContractTest.kt | 7 ++- feature/receiver/data/build.gradle.kts | 2 +- 13 files changed, 84 insertions(+), 106 deletions(-) rename feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/{response => }/AfternoteDetailMapper.kt (89%) rename feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/{AfternoteListItemDtoToDomain.kt => AfternoteListItemMapper.kt} (100%) rename feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/{InputToRequest.kt => AfternoteRequestMapper.kt} (61%) delete mode 100644 feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/InputToDto.kt delete mode 100644 feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/MappingUtils.kt delete mode 100644 feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/PlaylistInputToDto.kt create mode 100644 feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/ServerDateFormat.kt rename feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/{response => }/AfternoteDetailMapperTest.kt (84%) rename feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/{AfternoteListItemDtoToDomainTest.kt => AfternoteListItemMapperTest.kt} (98%) diff --git a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/AfternoteCategoryCodec.kt b/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/AfternoteCategoryCodec.kt index 66b03a4631..a921648d53 100644 --- a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/AfternoteCategoryCodec.kt +++ b/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/AfternoteCategoryCodec.kt @@ -4,7 +4,6 @@ import com.afternote.feature.afternote.domain.AfternoteType /** * 서버 `category`(백엔드 `AfternoteCategoryType`) 값의 정본 — 도메인·화면은 [AfternoteType] 만 다룬다. - * 서버가 정의하지 않은 종류(BUSINESS: Afternote-BE#110, ESTATE: #491)는 여기 없고, 보내면 400 이다. */ private val serverCategoryByType: Map = mapOf( @@ -23,3 +22,6 @@ fun afternoteTypeFromServerCategory(value: String): AfternoteType? { if (normalized == LEGACY_MEMORIAL_CATEGORY) return AfternoteType.MEMORIAL return serverCategoryByType.entries.firstOrNull { it.value == normalized }?.key } + +/** 서버 `category` → [AfternoteType]. 대응이 없으면 [AfternoteType.SOCIAL_NETWORK] 로 폴백한다. */ +fun categoryToAfternoteType(category: String): AfternoteType = afternoteTypeFromServerCategory(category) ?: AfternoteType.SOCIAL_NETWORK diff --git a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/response/AfternoteDetailMapper.kt b/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/AfternoteDetailMapper.kt similarity index 89% rename from feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/response/AfternoteDetailMapper.kt rename to feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/AfternoteDetailMapper.kt index e41ca7d606..8d714ac6e7 100644 --- a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/response/AfternoteDetailMapper.kt +++ b/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/AfternoteDetailMapper.kt @@ -1,13 +1,10 @@ -package com.afternote.feature.afternote.data.mapper.response +package com.afternote.feature.afternote.data.mapper import com.afternote.feature.afternote.data.dto.AfternoteCredentialsDto import com.afternote.feature.afternote.data.dto.AfternoteDetailDto import com.afternote.feature.afternote.data.dto.AfternoteDetailReceiverDto import com.afternote.feature.afternote.data.dto.AfternotePlaylistDto import com.afternote.feature.afternote.data.dto.AfternoteSongDto -import com.afternote.feature.afternote.data.mapper.categoryToAfternoteType -import com.afternote.feature.afternote.data.mapper.formatDateFromServer -import com.afternote.feature.afternote.data.mapper.toLeaveMessageBlocks import com.afternote.feature.afternote.domain.model.author.Detail import com.afternote.feature.afternote.domain.model.author.DetailCredentials import com.afternote.feature.afternote.domain.model.author.DetailReceiver @@ -16,7 +13,7 @@ import com.afternote.feature.afternote.domain.model.author.playlist.DetailSong import com.afternote.feature.afternote.domain.model.author.playlist.MemorialDetail import com.afternote.feature.afternote.domain.model.author.playlist.MemorialMedia -fun AfternoteDetailDto.toDetailDomain(): Detail = +fun AfternoteDetailDto.toDomain(): Detail = Detail( id = afternoteId, category = category, diff --git a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/AfternoteListItemDtoToDomain.kt b/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/AfternoteListItemMapper.kt similarity index 100% rename from feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/AfternoteListItemDtoToDomain.kt rename to feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/AfternoteListItemMapper.kt diff --git a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/InputToRequest.kt b/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/AfternoteRequestMapper.kt similarity index 61% rename from feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/InputToRequest.kt rename to feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/AfternoteRequestMapper.kt index c9282ad44f..562d121efb 100644 --- a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/InputToRequest.kt +++ b/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/AfternoteRequestMapper.kt @@ -3,12 +3,25 @@ package com.afternote.feature.afternote.data.mapper import com.afternote.feature.afternote.data.dto.AfternoteCreateAccountRequestDto import com.afternote.feature.afternote.data.dto.AfternoteCreateGalleryRequestDto import com.afternote.feature.afternote.data.dto.AfternoteCreatePlaylistRequestDto +import com.afternote.feature.afternote.data.dto.AfternoteCredentialsDto +import com.afternote.feature.afternote.data.dto.AfternoteMemorialVideoDto +import com.afternote.feature.afternote.data.dto.AfternotePlaylistDto import com.afternote.feature.afternote.data.dto.AfternoteReceiverRefDto +import com.afternote.feature.afternote.data.dto.AfternoteSongDto import com.afternote.feature.afternote.data.dto.AfternoteUpdateRequestDto +import com.afternote.feature.afternote.domain.model.author.AfternoteAccountCredentials import com.afternote.feature.afternote.domain.model.author.AfternoteUpdatePayload import com.afternote.feature.afternote.domain.model.author.CreateAccountPayload import com.afternote.feature.afternote.domain.model.author.CreateGalleryPayload import com.afternote.feature.afternote.domain.model.author.CreateMemorialPayload +import com.afternote.feature.afternote.domain.model.author.MemorialSongPayload +import com.afternote.feature.afternote.domain.model.author.MemorialVideoPayload +import com.afternote.feature.afternote.domain.model.author.MemorialWritePayload +import com.afternote.feature.afternote.domain.model.author.ReceiverRefPayload + +/** + * 도메인 → 요청 wire. 요청 바디 루트는 `toRequest`, 그 안에 실리는 부분 DTO 는 `toDto` 다. + */ fun AfternoteUpdatePayload.toRequest() = AfternoteUpdateRequestDto( @@ -17,7 +30,7 @@ fun AfternoteUpdatePayload.toRequest() = processingMethods = processingMethods, leaveMessage = leaveMessageBlocks.toDto(), credentials = credentials?.toDto(), - receivers = receivers?.toDto(), + receivers = receivers?.map { it.toDto() }, memorial = memorial?.toDto(), ) @@ -58,3 +71,35 @@ fun CreateMemorialPayload.toRequest() = memorial = memorial.toDto(), receivers = receiverIds.map { AfternoteReceiverRefDto(receiverId = it) }, ) + +fun MemorialWritePayload.toDto() = + AfternotePlaylistDto( + memorialPhotoUrl = memorialPhotoUrl, + songs = songs.map { it.toDto() }, + memorialVideo = memorialVideo?.toDto(), + ) + +fun MemorialSongPayload.toDto() = + AfternoteSongDto( + id = id, + title = title, + artist = artist, + coverUrl = coverUrl, + ) + +fun MemorialVideoPayload.toDto() = + AfternoteMemorialVideoDto( + videoUrl = videoUrl, + thumbnailUrl = thumbnailUrl, + ) + +fun AfternoteAccountCredentials.toDto() = + AfternoteCredentialsDto( + id = id, + password = password, + ) + +fun ReceiverRefPayload.toDto() = + AfternoteReceiverRefDto( + receiverId = receiverId, + ) diff --git a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/InputToDto.kt b/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/InputToDto.kt deleted file mode 100644 index 33964bd7b6..0000000000 --- a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/InputToDto.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.afternote.feature.afternote.data.mapper - -import com.afternote.feature.afternote.data.dto.AfternoteCredentialsDto -import com.afternote.feature.afternote.data.dto.AfternoteMemorialVideoDto -import com.afternote.feature.afternote.data.dto.AfternoteReceiverRefDto -import com.afternote.feature.afternote.domain.model.author.AfternoteAccountCredentials -import com.afternote.feature.afternote.domain.model.author.MemorialVideoPayload -import com.afternote.feature.afternote.domain.model.author.ReceiverRefPayload - -fun MemorialVideoPayload.toDto() = - AfternoteMemorialVideoDto( - videoUrl = videoUrl, - thumbnailUrl = thumbnailUrl, - ) - -fun AfternoteAccountCredentials.toDto() = - AfternoteCredentialsDto( - id = id, - password = password, - ) - -fun ReceiverRefPayload.toDto() = - AfternoteReceiverRefDto( - receiverId = receiverId, - ) - -fun List?.toDto() = - this?.map { - it.toDto() - } diff --git a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/MappingUtils.kt b/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/MappingUtils.kt deleted file mode 100644 index 7fcb36b5cf..0000000000 --- a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/MappingUtils.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.afternote.feature.afternote.data.mapper - -import com.afternote.feature.afternote.domain.AfternoteType - -fun formatDateFromServer(serverDateTime: String): String = - try { - // Server returns "2025-11-26T14:30:00" -> display "2025.11.26" - val datePart = serverDateTime.substringBefore('T') - datePart.replace('-', '.') - } catch (_: Exception) { - serverDateTime - } - -/** - * 서버 `category` → [AfternoteType]. 대응이 없으면 [AfternoteType.SOCIAL_NETWORK] 로 폴백한다. - * - * 값 표는 [afternoteTypeFromServerCategory] 가 정본이다 — 여기에 다시 적으면 갈라진다. - */ -fun categoryToAfternoteType(category: String): AfternoteType = afternoteTypeFromServerCategory(category) ?: AfternoteType.SOCIAL_NETWORK diff --git a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/PlaylistInputToDto.kt b/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/PlaylistInputToDto.kt deleted file mode 100644 index 9e081f6a69..0000000000 --- a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/PlaylistInputToDto.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.afternote.feature.afternote.data.mapper - -import com.afternote.feature.afternote.data.dto.AfternotePlaylistDto -import com.afternote.feature.afternote.data.dto.AfternoteSongDto -import com.afternote.feature.afternote.domain.model.author.MemorialSongPayload -import com.afternote.feature.afternote.domain.model.author.MemorialWritePayload - -fun MemorialWritePayload.toDto() = - AfternotePlaylistDto( - memorialPhotoUrl = memorialPhotoUrl, - songs = songs.toDto(), - memorialVideo = memorialVideo?.toDto(), - ) - -fun MemorialSongPayload.toDto() = - AfternoteSongDto( - id = id, - title = title, - artist = artist, - coverUrl = coverUrl, - ) - -fun List.toDto() = - map { - it.toDto() - } diff --git a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/ServerDateFormat.kt b/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/ServerDateFormat.kt new file mode 100644 index 0000000000..2f66248f02 --- /dev/null +++ b/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/mapper/ServerDateFormat.kt @@ -0,0 +1,10 @@ +package com.afternote.feature.afternote.data.mapper + +fun formatDateFromServer(serverDateTime: String): String = + try { + // Server returns "2025-11-26T14:30:00" -> display "2025.11.26" + val datePart = serverDateTime.substringBefore('T') + datePart.replace('-', '.') + } catch (_: Exception) { + serverDateTime + } diff --git a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/repositoryimpl/author/AfternoteRepositoryImpl.kt b/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/repositoryimpl/author/AfternoteRepositoryImpl.kt index 2043fc57df..e94435283a 100644 --- a/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/repositoryimpl/author/AfternoteRepositoryImpl.kt +++ b/feature/afternote/data/src/main/kotlin/com/afternote/feature/afternote/data/repositoryimpl/author/AfternoteRepositoryImpl.kt @@ -7,8 +7,8 @@ import androidx.paging.PagingData import com.afternote.core.common.result.runCatchingCancellable import com.afternote.core.network.model.requireData import com.afternote.core.network.model.requireStatus -import com.afternote.feature.afternote.data.mapper.response.toDetailDomain import com.afternote.feature.afternote.data.mapper.toBusinessRequest +import com.afternote.feature.afternote.data.mapper.toDomain import com.afternote.feature.afternote.data.mapper.toRequest import com.afternote.feature.afternote.data.mapper.toServerCategory import com.afternote.feature.afternote.data.mapper.toSocialRequest @@ -55,7 +55,7 @@ class AfternoteRepositoryImpl override suspend fun getDetail(id: Long): Result = safeCall { - api.getAfternoteDetail(afternoteId = id).requireData().toDetailDomain() + api.getAfternoteDetail(afternoteId = id).requireData().toDomain() } override suspend fun createSocial(payload: CreateAccountPayload): Result = diff --git a/feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/response/AfternoteDetailMapperTest.kt b/feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/AfternoteDetailMapperTest.kt similarity index 84% rename from feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/response/AfternoteDetailMapperTest.kt rename to feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/AfternoteDetailMapperTest.kt index 06d09284c5..f40623c91a 100644 --- a/feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/response/AfternoteDetailMapperTest.kt +++ b/feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/AfternoteDetailMapperTest.kt @@ -1,4 +1,4 @@ -package com.afternote.feature.afternote.data.mapper.response +package com.afternote.feature.afternote.data.mapper import com.afternote.feature.afternote.data.dto.AfternoteCredentialsDto import com.afternote.feature.afternote.data.dto.AfternoteDetailDto @@ -13,20 +13,20 @@ import org.junit.Assert.assertTrue import org.junit.Test /** - * [AfternoteDetailDto.toDetailDomain] 회귀 가드 (작성자 상세). + * [AfternoteDetailDto.toDomain] 회귀 가드 (작성자 상세). * 핵심 경계: receivers null→emptyList, receiver 필드 null→"", processingMethods null→emptyList, * memorialVideo null→video/thumbnail null, * credentials·memorial nullable 매핑. */ class AfternoteDetailMapperTest { @Test - fun `toDetailDomain - 최소 응답은 nullable이 비거나 null`() { + fun `toDomain - 최소 응답은 nullable이 비거나 null`() { val result = AfternoteDetailDto( afternoteId = 1L, category = "SOCIAL", title = "t", - ).toDetailDomain() + ).toDomain() assertEquals(1L, result.id) assertEquals(AfternoteType.SOCIAL_NETWORK, result.type) @@ -37,7 +37,7 @@ class AfternoteDetailMapperTest { } @Test - fun `toDetailDomain - timestamps 포맷`() { + fun `toDomain - timestamps 포맷`() { val result = AfternoteDetailDto( afternoteId = 1L, @@ -45,21 +45,21 @@ class AfternoteDetailMapperTest { title = "t", createdAt = "2025-11-26T14:30:00", updatedAt = "2025-12-01T09:00:00", - ).toDetailDomain() + ).toDomain() assertEquals("2025.11.26", result.timestamps.createdAt) assertEquals("2025.12.01", result.timestamps.updatedAt) } @Test - fun `toDetailDomain - receiver의 null 필드는 빈 문자열`() { + fun `toDomain - receiver의 null 필드는 빈 문자열`() { val result = AfternoteDetailDto( afternoteId = 1L, category = "GALLERY", title = "t", receivers = listOf(AfternoteDetailReceiverDto(receiverId = 5L)), - ).toDetailDomain() + ).toDomain() val receiver = result.receivers.single() assertEquals(5L, receiver.receiverId) @@ -73,7 +73,7 @@ class AfternoteDetailMapperTest { * 이 필드 하나뿐). 도메인은 non-null 이므로 경계인 이 매퍼가 걸러야 한다. */ @Test - fun `toDetailDomain - receiverId 없는 항목은 도메인으로 올리지 않는다`() { + fun `toDomain - receiverId 없는 항목은 도메인으로 올리지 않는다`() { val result = AfternoteDetailDto( afternoteId = 1L, @@ -84,27 +84,27 @@ class AfternoteDetailMapperTest { AfternoteDetailReceiverDto(receiverId = null, name = "식별자없음"), AfternoteDetailReceiverDto(receiverId = 9L, name = "김수신"), ), - ).toDetailDomain() + ).toDomain() assertEquals(listOf(9L), result.receivers.map { it.receiverId }) } @Test - fun `toDetailDomain - credentials 매핑`() { + fun `toDomain - credentials 매핑`() { val result = AfternoteDetailDto( afternoteId = 1L, category = "SOCIAL", title = "t", credentials = AfternoteCredentialsDto(id = "user", password = "pw"), - ).toDetailDomain() + ).toDomain() assertEquals("user", result.credentials!!.id) assertEquals("pw", result.credentials!!.password) } @Test - fun `toDetailDomain - playlist 미디어·곡 매핑`() { + fun `toDomain - playlist 미디어·곡 매핑`() { val result = AfternoteDetailDto( afternoteId = 1L, @@ -116,7 +116,7 @@ class AfternoteDetailMapperTest { songs = listOf(AfternoteSongDto(id = 3L, title = "s", artist = "a")), memorialVideo = AfternoteMemorialVideoDto(videoUrl = "v.mp4", thumbnailUrl = "t.jpg"), ), - ).toDetailDomain() + ).toDomain() val media = result.memorial!!.media assertEquals("memorial.jpg", media.photoUrl) @@ -133,14 +133,14 @@ class AfternoteDetailMapperTest { } @Test - fun `toDetailDomain - memorialVideo null이면 video thumbnail null`() { + fun `toDomain - memorialVideo null이면 video thumbnail null`() { val result = AfternoteDetailDto( afternoteId = 1L, category = "PLAYLIST", title = "t", memorial = AfternotePlaylistDto(memorialVideo = null), - ).toDetailDomain() + ).toDomain() val media = result.memorial!!.media assertNull(media.videoUrl) diff --git a/feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/AfternoteListItemDtoToDomainTest.kt b/feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/AfternoteListItemMapperTest.kt similarity index 98% rename from feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/AfternoteListItemDtoToDomainTest.kt rename to feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/AfternoteListItemMapperTest.kt index 2c2e0cad79..8628eaadf5 100644 --- a/feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/AfternoteListItemDtoToDomainTest.kt +++ b/feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/AfternoteListItemMapperTest.kt @@ -10,7 +10,7 @@ import org.junit.Test * 작성자 목록 DTO→[com.afternote.feature.afternote.domain.model.author.ListItem] 매핑 + * 공유 헬퍼([formatDateFromServer]·[categoryToAfternoteType])의 경계 동작을 toDomain 경유로 검증. */ -class AfternoteListItemDtoToDomainTest { +class AfternoteListItemMapperTest { @Test fun `toDomain - 필드와 Long id를 그대로 매핑`() { val result = diff --git a/feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/LeaveMessageBlockContractTest.kt b/feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/LeaveMessageBlockContractTest.kt index 8719d54aa7..16dcb51009 100644 --- a/feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/LeaveMessageBlockContractTest.kt +++ b/feature/afternote/data/src/test/java/com/afternote/feature/afternote/data/mapper/LeaveMessageBlockContractTest.kt @@ -3,7 +3,6 @@ package com.afternote.feature.afternote.data.mapper import com.afternote.feature.afternote.data.dto.AfternoteCreateAccountRequestDto import com.afternote.feature.afternote.data.dto.AfternoteDetailDto import com.afternote.feature.afternote.data.dto.LeaveMessageBlockDto -import com.afternote.feature.afternote.data.mapper.response.toDetailDomain import com.afternote.feature.afternote.domain.model.LeaveMessageBlock import com.afternote.feature.receiver.data.dto.ReceivedAfternoteDetailDto import com.afternote.feature.receiver.data.dto.ReceivedAfternoteListDto @@ -44,7 +43,7 @@ class LeaveMessageBlockContractTest { "playlist":null,"updatedAt":"2026-08-07T06:21:14.553567"} """.trimIndent() - val detail = json.decodeFromString(response).toDetailDomain() + val detail = json.decodeFromString(response).toDomain() assertEquals( listOf( @@ -62,7 +61,7 @@ class LeaveMessageBlockContractTest { json .decodeFromString( """{"afternoteId":11,"category":"SOCIAL","title":"t","leaveMessage":[{"title":"","body":"재현용 남기실 말씀"}]}""", - ).toDetailDomain() + ).toDomain() assertEquals( listOf(LeaveMessageBlock(title = "", body = "재현용 남기실 말씀")), @@ -76,7 +75,7 @@ class LeaveMessageBlockContractTest { json .decodeFromString( """{"afternoteId":1,"category":"SOCIAL","title":"t","leaveMessage":null}""", - ).toDetailDomain() + ).toDomain() assertTrue(detail.leaveMessageBlocks.isEmpty()) } diff --git a/feature/receiver/data/build.gradle.kts b/feature/receiver/data/build.gradle.kts index 5777c4f4fb..83fb8d0b6e 100644 --- a/feature/receiver/data/build.gradle.kts +++ b/feature/receiver/data/build.gradle.kts @@ -13,7 +13,7 @@ dependencies { implementation(projects.core.domain) implementation(projects.core.model) implementation(projects.feature.receiver.domain) - // 수신 상세가 애프터노트 도메인 모델·공유 매퍼(MappingUtils 등)·author 서비스(내려받기)를 + // 수신 상세가 애프터노트 도메인 모델·공유 매퍼(ServerDateFormat 등)·author 서비스(내려받기)를 // 참조한다. 공유 지점의 receiver 몫 분리는 후속 판단. implementation(projects.feature.afternote.domain) implementation(projects.feature.afternote.data)