From c49e487cde8abd2bf38226ff23900653ffad87cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Fri, 20 Mar 2026 13:58:49 +0900 Subject: [PATCH 01/12] =?UTF-8?q?refactor(afternote):=20Input=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EB=8F=84=EC=9E=85=20=EB=B0=8F=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=AA=A8=EB=8D=B8=20=EB=AA=85=EC=B9=AD=20=EA=B0=84?= =?UTF-8?q?=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `AfternoteRepository`의 생성 및 수정 메서드 파라미터를 `Input` 객체로 통합 - `AfternoteUpdateRequestInput` → `UpdateRequestInput`, `AfternotePlaylistInput` → `PlaylistInput` 등 도메인 모델 명칭 간소화 - `CreateSocialInput`, `CreateGalleryInput` 등 신규 Input 모델 추가 - 컨벤션 관련 문서 위치 변경 (`docs/` → `docs/conventions/`) - `AfternoteEditViewModel` 내 저장 로직 리팩토링 및 예외 처리 구문 개선 --- .../data/mapper/AfternoteInputMapper.kt | 8 +-- .../repositoryimpl/AfternoteRepositoryImpl.kt | 61 ++++++------------- .../afternote/domain/model/AfternoteItem.kt | 2 - .../domain/model/CreateGalleryInput.kt | 9 +++ .../domain/model/CreateSocialInput.kt | 10 +++ ...eRequestInput.kt => UpdateRequestInput.kt} | 6 +- ...rnotePlaylistInput.kt => PlaylistInput.kt} | 2 +- .../domain/repository/AfternoteRepository.kt | 28 +++------ .../usecase/CreateGalleryAfternoteUseCase.kt | 15 +---- .../usecase/CreatePlaylistAfternoteUseCase.kt | 4 +- .../usecase/CreateSocialAfternoteUseCase.kt | 19 +----- .../domain/usecase/UpdateAfternoteUseCase.kt | 4 +- .../edit/AfternoteEditViewModel.kt | 57 +++++++++-------- .../ARCHITECTURE_CONVENTIONS.md | 0 .../OOP_OBJECT_CALISTHENICS_NOTES.md | 0 15 files changed, 96 insertions(+), 129 deletions(-) create mode 100644 app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateGalleryInput.kt create mode 100644 app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateSocialInput.kt rename app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/{AfternoteUpdateRequestInput.kt => UpdateRequestInput.kt} (82%) rename app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/{AfternotePlaylistInput.kt => PlaylistInput.kt} (93%) rename docs/{ => conventions}/ARCHITECTURE_CONVENTIONS.md (100%) rename docs/{ => conventions}/OOP_OBJECT_CALISTHENICS_NOTES.md (100%) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteInputMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteInputMapper.kt index c5bd3085..92341a5c 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteInputMapper.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteInputMapper.kt @@ -6,14 +6,14 @@ import com.kuit.afternote.feature.afternote.data.dto.AfternotePlaylist import com.kuit.afternote.feature.afternote.data.dto.AfternoteReceiverRef import com.kuit.afternote.feature.afternote.data.dto.AfternoteSong import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteUpdateRequest -import com.kuit.afternote.feature.afternote.domain.model.AfternoteUpdateRequestInput import com.kuit.afternote.feature.afternote.domain.model.CredentialsInput import com.kuit.afternote.feature.afternote.domain.model.ReceiverRefInput -import com.kuit.afternote.feature.afternote.domain.model.playlist.AfternotePlaylistInput +import com.kuit.afternote.feature.afternote.domain.model.UpdateRequestInput import com.kuit.afternote.feature.afternote.domain.model.playlist.MemorialVideoInput +import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistInput import com.kuit.afternote.feature.afternote.domain.model.playlist.SongInput -fun AfternotePlaylistInput.toDto() = +fun PlaylistInput.toDto() = AfternotePlaylist( profilePhoto = profilePhoto, atmosphere = atmosphere, @@ -36,7 +36,7 @@ fun SongInput.toDto() = coverUrl = coverUrl, ) -fun AfternoteUpdateRequestInput.toDto() = +fun UpdateRequestInput.toDto() = AfternoteUpdateRequest( category = category, title = title, diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt index 62f31aa8..5374fe0f 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt @@ -3,7 +3,6 @@ package com.kuit.afternote.feature.afternote.data.repositoryimpl import android.util.Log import com.kuit.afternote.data.requireData import com.kuit.afternote.data.requireStatus -import com.kuit.afternote.feature.afternote.data.dto.AfternoteCredentials import com.kuit.afternote.feature.afternote.data.dto.AfternoteReceiverRef import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreateGalleryRequest import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreatePlaylistRequest @@ -13,9 +12,11 @@ import com.kuit.afternote.feature.afternote.data.mapper.AfternoteMapper import com.kuit.afternote.feature.afternote.data.mapper.toDto import com.kuit.afternote.feature.afternote.data.service.AfternoteApiService import com.kuit.afternote.feature.afternote.domain.model.AfternoteDetail -import com.kuit.afternote.feature.afternote.domain.model.AfternoteUpdateRequestInput +import com.kuit.afternote.feature.afternote.domain.model.CreateGalleryInput +import com.kuit.afternote.feature.afternote.domain.model.CreateSocialInput import com.kuit.afternote.feature.afternote.domain.model.PagedAfternotes -import com.kuit.afternote.feature.afternote.domain.model.playlist.AfternotePlaylistInput +import com.kuit.afternote.feature.afternote.domain.model.UpdateRequestInput +import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistInput import com.kuit.afternote.feature.afternote.domain.repository.AfternoteRepository import javax.inject.Inject @@ -40,47 +41,33 @@ class AfternoteRepositoryImpl AfternoteMapper.toPagedNotes(data) }.logFailure() - override suspend fun createSocial( - title: String, - processMethod: String, - actions: List, - leaveMessage: String?, - credentialsId: String?, - credentialsPassword: String?, - receiverIds: List, - ): Result = + override suspend fun createSocial(input: CreateSocialInput): Result = runCatching { val request = AfternoteCreateSocialRequest( category = "SOCIAL", - title = title, - processMethod = processMethod, - actions = actions, - leaveMessage = leaveMessage, - credentials = afternoteCredentials(credentialsId, credentialsPassword), - receivers = receiverIds.map { AfternoteReceiverRef(receiverId = it) }, + title = input.title, + processMethod = input.processMethod, + actions = input.actions, + leaveMessage = input.leaveMessage, + credentials = input.credentials?.toDto(), + receivers = input.receiverIds.map { AfternoteReceiverRef(receiverId = it) }, ) val response = api.createAfternoteSocial(request) val data = response.requireData() getAfternoteId(data) }.logFailure() - override suspend fun createGallery( - title: String, - processMethod: String, - actions: List, - leaveMessage: String?, - receiverIds: List, - ): Result = + override suspend fun createGallery(input: CreateGalleryInput): Result = runCatching { val request = AfternoteCreateGalleryRequest( category = "GALLERY", - title = title, - processMethod = processMethod, - actions = actions, - leaveMessage = leaveMessage, - receivers = receiverIds.map { AfternoteReceiverRef(receiverId = it) }, + title = input.title, + processMethod = input.processMethod, + actions = input.actions, + leaveMessage = input.leaveMessage, + receivers = input.receiverIds.map { AfternoteReceiverRef(receiverId = it) }, ) val response = api.createAfternoteGallery(request) val data = response.requireData() @@ -102,7 +89,7 @@ class AfternoteRepositoryImpl */ override suspend fun createPlaylist( title: String, - playlist: AfternotePlaylistInput, + playlist: PlaylistInput, receiverIds: List, ): Result = runCatching { @@ -123,7 +110,7 @@ class AfternoteRepositoryImpl */ override suspend fun updateAfternote( afternoteId: Long, - input: AfternoteUpdateRequestInput, + input: UpdateRequestInput, ): Result = runCatching { val response = api.updateAfternote(afternoteId = afternoteId, request = input.toDto()) @@ -149,13 +136,3 @@ private fun Result.logFailure() = val msg = message.toString() Log.e("AfternoteRepository", msg) } - -private fun afternoteCredentials( - credentialsId: String?, - credentialsPassword: String?, -): AfternoteCredentials? { - if (credentialsId != null || credentialsPassword != null) { - return AfternoteCredentials(id = credentialsId, password = credentialsPassword) - } - return null -} diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteItem.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteItem.kt index d89b0c00..70067457 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteItem.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteItem.kt @@ -1,6 +1,5 @@ package com.kuit.afternote.feature.afternote.domain.model -import android.R.id.message import com.kuit.afternote.domain.model.AfternoteServiceType /** @@ -10,7 +9,6 @@ import com.kuit.afternote.domain.model.AfternoteServiceType * @param serviceName 서비스명 * @param date 날짜 (yyyy.MM.dd 형식) * @param type 서비스 타입 (필터링용) - * @param message 남기실 말씀 */ data class AfternoteItem( val id: String, diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateGalleryInput.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateGalleryInput.kt new file mode 100644 index 00000000..a56b7b6c --- /dev/null +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateGalleryInput.kt @@ -0,0 +1,9 @@ +package com.kuit.afternote.feature.afternote.domain.model + +data class CreateGalleryInput( + val title: String, + val processMethod: String, + val actions: List, + val leaveMessage: String? = null, + val receiverIds: List = emptyList(), +) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateSocialInput.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateSocialInput.kt new file mode 100644 index 00000000..981a2137 --- /dev/null +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateSocialInput.kt @@ -0,0 +1,10 @@ +package com.kuit.afternote.feature.afternote.domain.model + +data class CreateSocialInput( + val title: String, + val processMethod: String, + val actions: List, + val leaveMessage: String? = null, + val credentials: CredentialsInput? = null, + val receiverIds: List = emptyList(), +) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteUpdateRequestInput.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/UpdateRequestInput.kt similarity index 82% rename from app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteUpdateRequestInput.kt rename to app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/UpdateRequestInput.kt index 3045e6e1..f49d95a4 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteUpdateRequestInput.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/UpdateRequestInput.kt @@ -1,8 +1,8 @@ package com.kuit.afternote.feature.afternote.domain.model -import com.kuit.afternote.feature.afternote.domain.model.playlist.AfternotePlaylistInput +import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistInput -data class AfternoteUpdateRequestInput( +data class UpdateRequestInput( val category: String, val title: String, val processMethod: String? = null, @@ -10,7 +10,7 @@ data class AfternoteUpdateRequestInput( val leaveMessage: String? = null, val credentials: CredentialsInput? = null, val receivers: List? = null, - val playlist: AfternotePlaylistInput? = null, + val playlist: PlaylistInput? = null, ) data class CredentialsInput( diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/AfternotePlaylistInput.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/PlaylistInput.kt similarity index 93% rename from app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/AfternotePlaylistInput.kt rename to app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/PlaylistInput.kt index ce093297..88745470 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/AfternotePlaylistInput.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/PlaylistInput.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.afternote.domain.model.playlist -data class AfternotePlaylistInput( +data class PlaylistInput( val profilePhoto: String? = null, val atmosphere: String? = null, val memorialPhotoUrl: String? = null, diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/AfternoteRepository.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/AfternoteRepository.kt index 0f7af8f0..cdff7a6c 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/AfternoteRepository.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/AfternoteRepository.kt @@ -1,9 +1,11 @@ package com.kuit.afternote.feature.afternote.domain.repository import com.kuit.afternote.feature.afternote.domain.model.AfternoteDetail -import com.kuit.afternote.feature.afternote.domain.model.AfternoteUpdateRequestInput +import com.kuit.afternote.feature.afternote.domain.model.CreateGalleryInput +import com.kuit.afternote.feature.afternote.domain.model.CreateSocialInput import com.kuit.afternote.feature.afternote.domain.model.PagedAfternotes -import com.kuit.afternote.feature.afternote.domain.model.playlist.AfternotePlaylistInput +import com.kuit.afternote.feature.afternote.domain.model.UpdateRequestInput +import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistInput /** * Afternote 도메인 Repository 인터페이스. @@ -22,35 +24,21 @@ interface AfternoteRepository { size: Int, ): Result - suspend fun createSocial( - title: String, - processMethod: String, - actions: List, - leaveMessage: String?, - credentialsId: String?, - credentialsPassword: String?, - receiverIds: List = emptyList(), - ): Result + suspend fun createSocial(input: CreateSocialInput): Result - suspend fun createGallery( - title: String, - processMethod: String, - actions: List, - leaveMessage: String?, - receiverIds: List, - ): Result + suspend fun createGallery(input: CreateGalleryInput): Result suspend fun getAfternoteDetail(afternoteId: Long): Result suspend fun createPlaylist( title: String, - playlist: AfternotePlaylistInput, + playlist: PlaylistInput, receiverIds: List = emptyList(), ): Result suspend fun updateAfternote( afternoteId: Long, - input: AfternoteUpdateRequestInput, + input: UpdateRequestInput, ): Result suspend fun deleteAfternote(afternoteId: Long): Result diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreateGalleryAfternoteUseCase.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreateGalleryAfternoteUseCase.kt index f7109d05..989adaee 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreateGalleryAfternoteUseCase.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreateGalleryAfternoteUseCase.kt @@ -1,5 +1,6 @@ package com.kuit.afternote.feature.afternote.domain.usecase +import com.kuit.afternote.feature.afternote.domain.model.CreateGalleryInput import com.kuit.afternote.feature.afternote.domain.repository.AfternoteRepository import javax.inject.Inject @@ -13,18 +14,8 @@ class CreateGalleryAfternoteUseCase constructor( private val repository: AfternoteRepository, ) { - suspend operator fun invoke( - title: String, - processMethod: String, - actions: List, - leaveMessage: String? = null, - receiverIds: List = emptyList(), - ): Result = + suspend operator fun invoke(input: CreateGalleryInput): Result = repository.createGallery( - title = title, - processMethod = processMethod, - actions = actions, - leaveMessage = leaveMessage, - receiverIds = receiverIds, + input = input, ) } diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreatePlaylistAfternoteUseCase.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreatePlaylistAfternoteUseCase.kt index 0d2a0482..3387b2f6 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreatePlaylistAfternoteUseCase.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreatePlaylistAfternoteUseCase.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.afternote.domain.usecase -import com.kuit.afternote.feature.afternote.domain.model.playlist.AfternotePlaylistInput +import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistInput import com.kuit.afternote.feature.afternote.domain.repository.AfternoteRepository import javax.inject.Inject @@ -16,7 +16,7 @@ class CreatePlaylistAfternoteUseCase ) { suspend operator fun invoke( title: String, - playlist: AfternotePlaylistInput, + playlist: PlaylistInput, receiverIds: List = emptyList(), ): Result = repository.createPlaylist( diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreateSocialAfternoteUseCase.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreateSocialAfternoteUseCase.kt index 152df070..6c6947ec 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreateSocialAfternoteUseCase.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreateSocialAfternoteUseCase.kt @@ -1,5 +1,6 @@ package com.kuit.afternote.feature.afternote.domain.usecase +import com.kuit.afternote.feature.afternote.domain.model.CreateSocialInput import com.kuit.afternote.feature.afternote.domain.repository.AfternoteRepository import javax.inject.Inject @@ -13,22 +14,8 @@ class CreateSocialAfternoteUseCase constructor( private val repository: AfternoteRepository, ) { - suspend operator fun invoke( - title: String, - processMethod: String, - actions: List, - leaveMessage: String? = null, - credentialsId: String? = null, - credentialsPassword: String? = null, - receiverIds: List = emptyList(), - ): Result = + suspend operator fun invoke(input: CreateSocialInput): Result = repository.createSocial( - title = title, - processMethod = processMethod, - actions = actions, - leaveMessage = leaveMessage, - credentialsId = credentialsId, - credentialsPassword = credentialsPassword, - receiverIds = receiverIds, + input = input, ) } diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/UpdateAfternoteUseCase.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/UpdateAfternoteUseCase.kt index d57fff1a..1728fecf 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/UpdateAfternoteUseCase.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/UpdateAfternoteUseCase.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.afternote.domain.usecase -import com.kuit.afternote.feature.afternote.domain.model.AfternoteUpdateRequestInput +import com.kuit.afternote.feature.afternote.domain.model.UpdateRequestInput import com.kuit.afternote.feature.afternote.domain.repository.AfternoteRepository import javax.inject.Inject @@ -16,7 +16,7 @@ class UpdateAfternoteUseCase ) { suspend operator fun invoke( afternoteId: Long, - body: AfternoteUpdateRequestInput, + body: UpdateRequestInput, ): Result = repository.updateAfternote( afternoteId = afternoteId, diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditViewModel.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditViewModel.kt index 240c680f..1418e062 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditViewModel.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditViewModel.kt @@ -4,11 +4,13 @@ import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.kuit.afternote.feature.afternote.domain.model.AfternoteDetail -import com.kuit.afternote.feature.afternote.domain.model.AfternoteUpdateRequestInput +import com.kuit.afternote.feature.afternote.domain.model.CreateGalleryInput +import com.kuit.afternote.feature.afternote.domain.model.CreateSocialInput import com.kuit.afternote.feature.afternote.domain.model.CredentialsInput import com.kuit.afternote.feature.afternote.domain.model.ReceiverRefInput -import com.kuit.afternote.feature.afternote.domain.model.playlist.AfternotePlaylistInput +import com.kuit.afternote.feature.afternote.domain.model.UpdateRequestInput import com.kuit.afternote.feature.afternote.domain.model.playlist.MemorialVideoInput +import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistInput import com.kuit.afternote.feature.afternote.domain.model.playlist.SongInput import com.kuit.afternote.feature.afternote.domain.usecase.CreateGalleryAfternoteUseCase import com.kuit.afternote.feature.afternote.domain.usecase.CreatePlaylistAfternoteUseCase @@ -315,15 +317,14 @@ class AfternoteEditViewModel ) { Log.e(TAG, "saveAfternote: FAILURE, category=$categoryForApi", e) val validationError = - when { - e is AfternoteValidationException -> e.validationError - e is HttpException && e.code() == 400 -> parseReceiversRequiredFromBody(e) + when (e) { + is AfternoteValidationException -> e.validationError + is HttpException if e.code() == 400 -> parseReceiversRequiredFromBody(e) else -> null } val errorMessage = when { validationError != null -> null - e is AfternoteValidationException -> null else -> e.message ?: "저장에 실패했습니다." } _saveState.update { @@ -532,11 +533,14 @@ class AfternoteEditViewModel "performCreate GALLERY: receivers=$selectedReceiverIds, actions=$galleryActions", ) createGalleryUseCase( - title = payload.serviceName, - processMethod = processMethod, - actions = galleryActions, - leaveMessage = leaveMessage, - receiverIds = selectedReceiverIds, + input = + CreateGalleryInput( + title = payload.serviceName, + processMethod = processMethod, + actions = galleryActions, + leaveMessage = leaveMessage, + receiverIds = selectedReceiverIds, + ), ) } @@ -558,13 +562,18 @@ class AfternoteEditViewModel else -> { createSocialUseCase( - title = payload.serviceName, - processMethod = processMethod, - actions = actions, - leaveMessage = leaveMessage, - credentialsId = payload.accountId.takeIf { it.isNotEmpty() }, - credentialsPassword = payload.password.takeIf { it.isNotEmpty() }, - receiverIds = selectedReceiverIds, + CreateSocialInput( + title = payload.serviceName, + processMethod = processMethod, + actions = actions, + leaveMessage = leaveMessage, + credentials = + CredentialsInput( + id = payload.accountId.takeIf { it.isNotEmpty() }, + password = payload.password.takeIf { it.isNotEmpty() }, + ), + receiverIds = selectedReceiverIds, + ), ) } } @@ -610,7 +619,7 @@ class AfternoteEditViewModel funeralVideoUrl: String? = null, funeralThumbnailUrl: String? = null, memorialPhotoUrl: String? = null, - ) = AfternoteUpdateRequestInput( + ) = UpdateRequestInput( category = "PLAYLIST", title = title, playlist = @@ -627,7 +636,7 @@ class AfternoteEditViewModel category: String, payload: RegisterAfternotePayload, selectedReceiverIds: List, - ): AfternoteUpdateRequestInput { + ): UpdateRequestInput { val actions = payload.processingMethods.map { it.text } + payload.galleryProcessingMethods.map { it.text } @@ -647,7 +656,7 @@ class AfternoteEditViewModel else -> null } // Title and category are mandatory for the edit API; fallback for unknown display category. - return AfternoteUpdateRequestInput( + return UpdateRequestInput( category = serverCategory ?: "SOCIAL", title = payload.serviceName, processMethod = processMethod.ifEmpty { null }, @@ -741,7 +750,7 @@ class AfternoteEditViewModel memorialPhotoUrl: String? = null, funeralVideoUrl: String? = null, funeralThumbnailUrl: String? = null, - ): AfternotePlaylistInput { + ): PlaylistInput { val songs = playlistStateHolder?.songs?.map { song -> SongInput( @@ -760,7 +769,7 @@ class AfternoteEditViewModel thumbnailUrl = funeralThumbnailUrl.takeIf { !it.isNullOrBlank() }, ) } - return AfternotePlaylistInput( + return PlaylistInput( atmosphere = atmosphere.ifEmpty { null }, memorialPhotoUrl = memorialPhotoUrl?.takeIf { it.isNotBlank() }, songs = songs, @@ -771,7 +780,6 @@ class AfternoteEditViewModel /** * Memorial-related media URLs and the picked photo URI for save. - * Groups 4 params to keep [saveAfternote] under the 7-parameter limit (S107). */ data class SaveAfternoteMemorialMedia( val funeralVideoUrl: String? = null, @@ -782,7 +790,6 @@ data class SaveAfternoteMemorialMedia( /** * Resolved memorial media URLs for performUpdate/performCreate. - * Groups 3 params to keep [performUpdate] under the 7-parameter limit (S107). */ private data class MemorialMediaUrls( val funeralVideoUrl: String? = null, diff --git a/docs/ARCHITECTURE_CONVENTIONS.md b/docs/conventions/ARCHITECTURE_CONVENTIONS.md similarity index 100% rename from docs/ARCHITECTURE_CONVENTIONS.md rename to docs/conventions/ARCHITECTURE_CONVENTIONS.md diff --git a/docs/OOP_OBJECT_CALISTHENICS_NOTES.md b/docs/conventions/OOP_OBJECT_CALISTHENICS_NOTES.md similarity index 100% rename from docs/OOP_OBJECT_CALISTHENICS_NOTES.md rename to docs/conventions/OOP_OBJECT_CALISTHENICS_NOTES.md From d794a24f1dee62ed4e3ddad4866193f8f6ad68b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Fri, 20 Mar 2026 14:04:38 +0900 Subject: [PATCH 02/12] =?UTF-8?q?refactor(data):=20BaseResponse=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B4=80=EB=A0=A8=20=ED=99=95=EC=9E=A5=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BaseResponse, requireData, requireStatus의 패키지 경로 수정 (com.kuit.afternote.data -> com.kuit.afternote.data.dto.response) - 패키지 이동에 따른 프로젝트 내 참조 임포트 경로 업데이트 --- .../kuit/afternote/data/{ => dto/response}/BaseResponse.kt | 2 +- .../repositoryimpl/MemorialThumbnailUploadRepositoryImpl.kt | 2 +- .../data/repositoryimpl/MemorialVideoUploadRepositoryImpl.kt | 2 +- .../data/repositoryimpl/PhotoUploadRepositoryImpl.kt | 2 +- .../kuit/afternote/feature/admin/data/api/AdminApiService.kt | 2 +- .../feature/admin/data/repository/impl/AdminRepositoryImpl.kt | 2 +- .../afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt | 4 ++-- .../feature/afternote/data/service/AfternoteApiService.kt | 2 +- .../kuit/afternote/feature/auth/data/api/AuthApiService.kt | 2 +- .../feature/auth/data/repository/AuthRepositoryImpl.kt | 4 ++-- .../afternote/feature/receiver/data/api/ReceivedApiService.kt | 2 +- .../receiver/data/repository/impl/ReceivedRepositoryImpl.kt | 2 +- .../feature/receiverauth/data/api/ReceiverAuthApiService.kt | 2 +- .../data/repository/impl/ReceiverAuthRepositoryImpl.kt | 2 +- .../feature/timeletter/data/api/TimeLetterApiService.kt | 2 +- .../data/repository/TimeLetterMediaUploadRepositoryImpl.kt | 2 +- .../timeletter/data/repository/TimeLetterRepositoryImpl.kt | 2 +- .../kuit/afternote/feature/user/data/api/ImageApiService.kt | 2 +- .../kuit/afternote/feature/user/data/api/UserApiService.kt | 2 +- .../feature/user/data/repository/UserRepositoryImpl.kt | 4 ++-- 20 files changed, 23 insertions(+), 23 deletions(-) rename app/src/main/java/com/kuit/afternote/data/{ => dto/response}/BaseResponse.kt (96%) diff --git a/app/src/main/java/com/kuit/afternote/data/BaseResponse.kt b/app/src/main/java/com/kuit/afternote/data/dto/response/BaseResponse.kt similarity index 96% rename from app/src/main/java/com/kuit/afternote/data/BaseResponse.kt rename to app/src/main/java/com/kuit/afternote/data/dto/response/BaseResponse.kt index eead00d5..202c855e 100644 --- a/app/src/main/java/com/kuit/afternote/data/BaseResponse.kt +++ b/app/src/main/java/com/kuit/afternote/data/dto/response/BaseResponse.kt @@ -1,4 +1,4 @@ -package com.kuit.afternote.data +package com.kuit.afternote.data.dto.response import com.kuit.afternote.data.service.ApiException import kotlinx.serialization.SerialName diff --git a/app/src/main/java/com/kuit/afternote/data/repositoryimpl/MemorialThumbnailUploadRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/data/repositoryimpl/MemorialThumbnailUploadRepositoryImpl.kt index 1447d6aa..0f596102 100644 --- a/app/src/main/java/com/kuit/afternote/data/repositoryimpl/MemorialThumbnailUploadRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/data/repositoryimpl/MemorialThumbnailUploadRepositoryImpl.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.data.repositoryimpl -import com.kuit.afternote.data.requireData +import com.kuit.afternote.data.dto.response.requireData import com.kuit.afternote.domain.repository.MemorialThumbnailUploadRepository import com.kuit.afternote.feature.user.data.api.ImageApiService import com.kuit.afternote.feature.user.data.dto.PresignedUrlRequestDto diff --git a/app/src/main/java/com/kuit/afternote/data/repositoryimpl/MemorialVideoUploadRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/data/repositoryimpl/MemorialVideoUploadRepositoryImpl.kt index 8ad4b654..b6da7f34 100644 --- a/app/src/main/java/com/kuit/afternote/data/repositoryimpl/MemorialVideoUploadRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/data/repositoryimpl/MemorialVideoUploadRepositoryImpl.kt @@ -3,7 +3,7 @@ package com.kuit.afternote.data.repositoryimpl import android.content.Context import android.net.Uri import androidx.core.net.toUri -import com.kuit.afternote.data.requireData +import com.kuit.afternote.data.dto.response.requireData import com.kuit.afternote.domain.repository.MemorialVideoUploadRepository import com.kuit.afternote.feature.user.data.api.ImageApiService import com.kuit.afternote.feature.user.data.dto.PresignedUrlRequestDto diff --git a/app/src/main/java/com/kuit/afternote/data/repositoryimpl/PhotoUploadRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/data/repositoryimpl/PhotoUploadRepositoryImpl.kt index a7098a64..358d6ce0 100644 --- a/app/src/main/java/com/kuit/afternote/data/repositoryimpl/PhotoUploadRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/data/repositoryimpl/PhotoUploadRepositoryImpl.kt @@ -2,7 +2,7 @@ package com.kuit.afternote.data.repositoryimpl import android.content.Context import android.net.Uri -import com.kuit.afternote.data.requireData +import com.kuit.afternote.data.dto.response.requireData import com.kuit.afternote.domain.repository.PhotoUploadRepository import com.kuit.afternote.feature.user.data.api.ImageApiService import com.kuit.afternote.feature.user.data.dto.PresignedUrlRequestDto diff --git a/app/src/main/java/com/kuit/afternote/feature/admin/data/api/AdminApiService.kt b/app/src/main/java/com/kuit/afternote/feature/admin/data/api/AdminApiService.kt index 544208d1..023bde13 100644 --- a/app/src/main/java/com/kuit/afternote/feature/admin/data/api/AdminApiService.kt +++ b/app/src/main/java/com/kuit/afternote/feature/admin/data/api/AdminApiService.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.admin.data.api -import com.kuit.afternote.data.BaseResponse +import com.kuit.afternote.data.dto.response.BaseResponse import com.kuit.afternote.feature.admin.data.dto.AdminVerificationResponseDto import com.kuit.afternote.feature.admin.data.dto.ApproveVerificationRequestDto import com.kuit.afternote.feature.admin.data.dto.RejectVerificationRequestDto diff --git a/app/src/main/java/com/kuit/afternote/feature/admin/data/repository/impl/AdminRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/admin/data/repository/impl/AdminRepositoryImpl.kt index a05fa316..12679189 100644 --- a/app/src/main/java/com/kuit/afternote/feature/admin/data/repository/impl/AdminRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/admin/data/repository/impl/AdminRepositoryImpl.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.admin.data.repository.impl -import com.kuit.afternote.data.requireData +import com.kuit.afternote.data.dto.response.requireData import com.kuit.afternote.feature.admin.data.api.AdminApiService import com.kuit.afternote.feature.admin.data.dto.AdminVerificationResponseDto import com.kuit.afternote.feature.admin.data.dto.ApproveVerificationRequestDto diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt index 5374fe0f..8fa147ee 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt @@ -1,8 +1,8 @@ package com.kuit.afternote.feature.afternote.data.repositoryimpl import android.util.Log -import com.kuit.afternote.data.requireData -import com.kuit.afternote.data.requireStatus +import com.kuit.afternote.data.dto.response.requireData +import com.kuit.afternote.data.dto.response.requireStatus import com.kuit.afternote.feature.afternote.data.dto.AfternoteReceiverRef import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreateGalleryRequest import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreatePlaylistRequest diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/service/AfternoteApiService.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/service/AfternoteApiService.kt index 030ee6b1..1669fda8 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/service/AfternoteApiService.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/service/AfternoteApiService.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.afternote.data.service -import com.kuit.afternote.data.BaseResponse +import com.kuit.afternote.data.dto.response.BaseResponse import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreateGalleryRequest import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreatePlaylistRequest import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreateSocialRequest diff --git a/app/src/main/java/com/kuit/afternote/feature/auth/data/api/AuthApiService.kt b/app/src/main/java/com/kuit/afternote/feature/auth/data/api/AuthApiService.kt index 7cf783ce..83b3b668 100644 --- a/app/src/main/java/com/kuit/afternote/feature/auth/data/api/AuthApiService.kt +++ b/app/src/main/java/com/kuit/afternote/feature/auth/data/api/AuthApiService.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.auth.data.api -import com.kuit.afternote.data.BaseResponse +import com.kuit.afternote.data.dto.response.BaseResponse import com.kuit.afternote.feature.auth.data.dto.LoginData import com.kuit.afternote.feature.auth.data.dto.LoginRequest import com.kuit.afternote.feature.auth.data.dto.LogoutRequest diff --git a/app/src/main/java/com/kuit/afternote/feature/auth/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/auth/data/repository/AuthRepositoryImpl.kt index 415d8c13..909e1cce 100644 --- a/app/src/main/java/com/kuit/afternote/feature/auth/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/auth/data/repository/AuthRepositoryImpl.kt @@ -1,8 +1,8 @@ package com.kuit.afternote.feature.auth.data.repository import android.util.Log -import com.kuit.afternote.data.requireData -import com.kuit.afternote.data.requireStatus +import com.kuit.afternote.data.dto.response.requireData +import com.kuit.afternote.data.dto.response.requireStatus import com.kuit.afternote.feature.auth.data.api.AuthApiService import com.kuit.afternote.feature.auth.data.dto.LoginRequest import com.kuit.afternote.feature.auth.data.dto.LogoutRequest diff --git a/app/src/main/java/com/kuit/afternote/feature/receiver/data/api/ReceivedApiService.kt b/app/src/main/java/com/kuit/afternote/feature/receiver/data/api/ReceivedApiService.kt index ec012e10..a34229b7 100644 --- a/app/src/main/java/com/kuit/afternote/feature/receiver/data/api/ReceivedApiService.kt +++ b/app/src/main/java/com/kuit/afternote/feature/receiver/data/api/ReceivedApiService.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.receiver.data.api -import com.kuit.afternote.data.BaseResponse +import com.kuit.afternote.data.dto.response.BaseResponse import com.kuit.afternote.feature.receiver.data.dto.CreateMindRecordReceiverRequestDto import com.kuit.afternote.feature.receiver.data.dto.CreateTimeLetterReceiverRequestDto import retrofit2.http.Body diff --git a/app/src/main/java/com/kuit/afternote/feature/receiver/data/repository/impl/ReceivedRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/receiver/data/repository/impl/ReceivedRepositoryImpl.kt index 9a6998d4..bd7373ed 100644 --- a/app/src/main/java/com/kuit/afternote/feature/receiver/data/repository/impl/ReceivedRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/receiver/data/repository/impl/ReceivedRepositoryImpl.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.receiver.data.repository.impl -import com.kuit.afternote.data.requireData +import com.kuit.afternote.data.dto.response.requireData import com.kuit.afternote.feature.receiver.data.api.ReceivedApiService import com.kuit.afternote.feature.receiver.data.dto.CreateMindRecordReceiverRequestDto import com.kuit.afternote.feature.receiver.data.dto.CreateTimeLetterReceiverRequestDto diff --git a/app/src/main/java/com/kuit/afternote/feature/receiverauth/data/api/ReceiverAuthApiService.kt b/app/src/main/java/com/kuit/afternote/feature/receiverauth/data/api/ReceiverAuthApiService.kt index 18be3f13..fc109949 100644 --- a/app/src/main/java/com/kuit/afternote/feature/receiverauth/data/api/ReceiverAuthApiService.kt +++ b/app/src/main/java/com/kuit/afternote/feature/receiverauth/data/api/ReceiverAuthApiService.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.receiverauth.data.api -import com.kuit.afternote.data.BaseResponse +import com.kuit.afternote.data.dto.response.BaseResponse import com.kuit.afternote.feature.receiverauth.data.dto.DeliveryVerificationRequestDto import com.kuit.afternote.feature.receiverauth.data.dto.DeliveryVerificationResponseDto import com.kuit.afternote.feature.receiverauth.data.dto.ReceivedAfternoteDetailAuthResponseDto diff --git a/app/src/main/java/com/kuit/afternote/feature/receiverauth/data/repository/impl/ReceiverAuthRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/receiverauth/data/repository/impl/ReceiverAuthRepositoryImpl.kt index e76b9cb9..63452db0 100644 --- a/app/src/main/java/com/kuit/afternote/feature/receiverauth/data/repository/impl/ReceiverAuthRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/receiverauth/data/repository/impl/ReceiverAuthRepositoryImpl.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.receiverauth.data.repository.impl -import com.kuit.afternote.data.requireData +import com.kuit.afternote.data.dto.response.requireData import com.kuit.afternote.feature.receiverauth.data.api.ReceiverAuthApiService import com.kuit.afternote.feature.receiverauth.data.dto.DeliveryVerificationRequestDto import com.kuit.afternote.feature.receiverauth.data.dto.DeliveryVerificationResponseDto diff --git a/app/src/main/java/com/kuit/afternote/feature/timeletter/data/api/TimeLetterApiService.kt b/app/src/main/java/com/kuit/afternote/feature/timeletter/data/api/TimeLetterApiService.kt index 58816dd3..74573706 100644 --- a/app/src/main/java/com/kuit/afternote/feature/timeletter/data/api/TimeLetterApiService.kt +++ b/app/src/main/java/com/kuit/afternote/feature/timeletter/data/api/TimeLetterApiService.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.timeletter.data.api -import com.kuit.afternote.data.BaseResponse +import com.kuit.afternote.data.dto.response.BaseResponse import com.kuit.afternote.feature.timeletter.data.dto.TimeLetterCreateRequest import com.kuit.afternote.feature.timeletter.data.dto.TimeLetterDeleteRequest import com.kuit.afternote.feature.timeletter.data.dto.TimeLetterListResponse diff --git a/app/src/main/java/com/kuit/afternote/feature/timeletter/data/repository/TimeLetterMediaUploadRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/timeletter/data/repository/TimeLetterMediaUploadRepositoryImpl.kt index 5f6336e8..77e2cb99 100644 --- a/app/src/main/java/com/kuit/afternote/feature/timeletter/data/repository/TimeLetterMediaUploadRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/timeletter/data/repository/TimeLetterMediaUploadRepositoryImpl.kt @@ -2,7 +2,7 @@ package com.kuit.afternote.feature.timeletter.data.repository import android.content.Context import android.net.Uri -import com.kuit.afternote.data.requireData +import com.kuit.afternote.data.dto.response.requireData import com.kuit.afternote.feature.timeletter.domain.repository.TimeLetterMediaUploadRepository import com.kuit.afternote.feature.user.data.api.ImageApiService import com.kuit.afternote.feature.user.data.dto.PresignedUrlRequestDto diff --git a/app/src/main/java/com/kuit/afternote/feature/timeletter/data/repository/TimeLetterRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/timeletter/data/repository/TimeLetterRepositoryImpl.kt index 4c29014d..52aac0a6 100644 --- a/app/src/main/java/com/kuit/afternote/feature/timeletter/data/repository/TimeLetterRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/timeletter/data/repository/TimeLetterRepositoryImpl.kt @@ -1,7 +1,7 @@ package com.kuit.afternote.feature.timeletter.data.repository import android.util.Log -import com.kuit.afternote.data.requireData +import com.kuit.afternote.data.dto.response.requireData import com.kuit.afternote.feature.timeletter.data.api.TimeLetterApiService import com.kuit.afternote.feature.timeletter.data.dto.TimeLetterCreateRequest import com.kuit.afternote.feature.timeletter.data.dto.TimeLetterDeleteRequest diff --git a/app/src/main/java/com/kuit/afternote/feature/user/data/api/ImageApiService.kt b/app/src/main/java/com/kuit/afternote/feature/user/data/api/ImageApiService.kt index 0c4667d8..70bbe258 100644 --- a/app/src/main/java/com/kuit/afternote/feature/user/data/api/ImageApiService.kt +++ b/app/src/main/java/com/kuit/afternote/feature/user/data/api/ImageApiService.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.user.data.api -import com.kuit.afternote.data.BaseResponse +import com.kuit.afternote.data.dto.response.BaseResponse import com.kuit.afternote.feature.user.data.dto.PresignedUrlRequestDto import com.kuit.afternote.feature.user.data.dto.PresignedUrlResponseDto import retrofit2.http.Body diff --git a/app/src/main/java/com/kuit/afternote/feature/user/data/api/UserApiService.kt b/app/src/main/java/com/kuit/afternote/feature/user/data/api/UserApiService.kt index 2e7f6396..c1233ac4 100644 --- a/app/src/main/java/com/kuit/afternote/feature/user/data/api/UserApiService.kt +++ b/app/src/main/java/com/kuit/afternote/feature/user/data/api/UserApiService.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.user.data.api -import com.kuit.afternote.data.BaseResponse +import com.kuit.afternote.data.dto.response.BaseResponse import com.kuit.afternote.feature.user.data.dto.DeliveryConditionRequestDto import com.kuit.afternote.feature.user.data.dto.DeliveryConditionResponseDto import com.kuit.afternote.feature.user.data.dto.ReceiverDailyQuestionsResponseDto diff --git a/app/src/main/java/com/kuit/afternote/feature/user/data/repository/UserRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/user/data/repository/UserRepositoryImpl.kt index 25d558e5..b6069071 100644 --- a/app/src/main/java/com/kuit/afternote/feature/user/data/repository/UserRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/user/data/repository/UserRepositoryImpl.kt @@ -1,8 +1,8 @@ package com.kuit.afternote.feature.user.data.repository import android.util.Log -import com.kuit.afternote.data.requireData -import com.kuit.afternote.data.requireStatus +import com.kuit.afternote.data.dto.response.requireData +import com.kuit.afternote.data.dto.response.requireStatus import com.kuit.afternote.data.service.ApiException import com.kuit.afternote.feature.user.data.api.UserApiService import com.kuit.afternote.feature.user.data.dto.RegisterReceiverRequestDto From 9ae25752de603db618b61a5c9908785bbc88333a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Fri, 20 Mar 2026 15:24:57 +0900 Subject: [PATCH 03/12] =?UTF-8?q?refactor(afternote):=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=AA=A8=EB=8D=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EA=B0=84=EC=86=8C=ED=99=94=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AfternoteDetail -> Detail - AfternoteDetailReceiver -> DetailReceiver - AfternoteItem -> Item - AfternoteAccount -> Account - AfternoteProcessingMethod -> ProcessingMethod - AfternotePlaylistDetail -> PlaylistDetail - AfternoteDetailSong -> DetailSong - 도메인 모델 이름 변경에 따른 Repository, UseCase, Mapper, ViewModel 및 UI 관련 클래스 전반의 참조 업데이트 및 리팩토링 수행 --- .../afternote/data/mapper/AfternoteMapper.kt | 38 +++++++++---------- .../repositoryimpl/AfternoteRepositoryImpl.kt | 4 +- .../model/{AfternoteDetail.kt => Detail.kt} | 20 +++++----- ...oteDetailReceiver.kt => DetailReceiver.kt} | 2 +- .../model/{AfternoteItem.kt => Item.kt} | 14 +++---- .../afternote/domain/model/PagedAfternotes.kt | 2 +- ...rocessingMethod.kt => ProcessingMethod.kt} | 2 +- ...otePlaylistDetail.kt => PlaylistDetail.kt} | 6 +-- .../domain/repository/AfternoteRepository.kt | 4 +- .../usecase/GetAfternoteDetailUseCase.kt | 10 ++--- .../presentation/AfternoteItemMapper.kt | 30 +++++++-------- .../presentation/RegisterAfternotePayload.kt | 6 +-- .../detail/AfternoteDetailUiState.kt | 4 +- .../presentation/edit/AfternoteEditScreen.kt | 10 ++--- .../edit/AfternoteEditViewModel.kt | 6 +-- .../presentation/list/AfternoteListItem.kt | 8 ++-- .../presentation/list/AfternoteListRoute.kt | 6 +-- .../presentation/list/AfternoteListUiState.kt | 4 +- .../list/AfternoteListViewModel.kt | 6 +-- .../mapper/AfternoteItemMapper.kt | 4 +- .../navgraph/AfternoteNavgraph.kt | 16 ++++---- .../viewmodel/MindRecordViewModel.kt | 4 +- .../navigation/navgraph/NavGraph.kt | 4 +- 23 files changed, 105 insertions(+), 105 deletions(-) rename app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/{AfternoteDetail.kt => Detail.kt} (66%) rename app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/{AfternoteDetailReceiver.kt => DetailReceiver.kt} (90%) rename app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/{AfternoteItem.kt => Item.kt} (63%) rename app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/{AfternoteProcessingMethod.kt => ProcessingMethod.kt} (86%) rename app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/{AfternotePlaylistDetail.kt => PlaylistDetail.kt} (83%) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt index 342e8229..8a2b13fe 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt @@ -4,15 +4,15 @@ import com.kuit.afternote.domain.model.AfternoteServiceType import com.kuit.afternote.feature.afternote.data.dto.AfternoteListItem import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteDetailResponse import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteListResponse -import com.kuit.afternote.feature.afternote.domain.model.AfternoteDetail -import com.kuit.afternote.feature.afternote.domain.model.AfternoteDetailCredentials -import com.kuit.afternote.feature.afternote.domain.model.AfternoteDetailProcessing -import com.kuit.afternote.feature.afternote.domain.model.AfternoteDetailReceiver -import com.kuit.afternote.feature.afternote.domain.model.AfternoteDetailTimestamps -import com.kuit.afternote.feature.afternote.domain.model.AfternoteItem +import com.kuit.afternote.feature.afternote.domain.model.Detail +import com.kuit.afternote.feature.afternote.domain.model.DetailCredentials +import com.kuit.afternote.feature.afternote.domain.model.DetailProcessing +import com.kuit.afternote.feature.afternote.domain.model.DetailReceiver +import com.kuit.afternote.feature.afternote.domain.model.DetailTimestamps +import com.kuit.afternote.feature.afternote.domain.model.Item import com.kuit.afternote.feature.afternote.domain.model.PagedAfternotes -import com.kuit.afternote.feature.afternote.domain.model.playlist.AfternoteDetailSong -import com.kuit.afternote.feature.afternote.domain.model.playlist.AfternotePlaylistDetail +import com.kuit.afternote.feature.afternote.domain.model.playlist.DetailSong +import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistDetail import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistDetailMemorialMedia /** @@ -21,37 +21,37 @@ import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistDetail object AfternoteMapper { // -- List mapping -- - fun toDomain(dto: AfternoteListItem): AfternoteItem = - AfternoteItem( + fun toDomain(dto: AfternoteListItem): Item = + Item( id = dto.afternoteId.toString(), serviceName = dto.title, date = formatDateFromServer(dto.createdAt), type = categoryToServiceType(dto.category), ) - fun toDomainList(dtos: List): List = dtos.map { toDomain(it) } + fun toDomainList(dtos: List): List = dtos.map { toDomain(it) } // -- Detail mapping -- - fun toDetailDomain(dto: AfternoteDetailResponse): AfternoteDetail = - AfternoteDetail( + fun toDetailDomain(dto: AfternoteDetailResponse): Detail = + Detail( id = dto.afternoteId, category = dto.category, title = dto.title, timestamps = - AfternoteDetailTimestamps( + DetailTimestamps( createdAt = formatDateFromServer(dto.createdAt), updatedAt = formatDateFromServer(dto.createdAt), ), type = categoryToServiceType(dto.category), credentials = - AfternoteDetailCredentials( + DetailCredentials( id = dto.credentials?.id, password = dto.credentials?.password, ), receivers = dto.receivers?.map { r -> - AfternoteDetailReceiver( + DetailReceiver( receiverId = r.receiverId, name = r.name ?: "", relation = r.relation ?: "", @@ -59,19 +59,19 @@ object AfternoteMapper { ) } ?: emptyList(), processing = - AfternoteDetailProcessing( + DetailProcessing( method = dto.processMethod, actions = dto.actions ?: emptyList(), leaveMessage = dto.leaveMessage, ), playlist = dto.playlist?.let { p -> - AfternotePlaylistDetail( + PlaylistDetail( profilePhoto = p.profilePhoto, atmosphere = p.atmosphere, songs = p.songs.map { s -> - AfternoteDetailSong( + DetailSong( id = s.id, title = s.title, artist = s.artist, diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt index 8fa147ee..9dc69ddf 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt @@ -11,7 +11,7 @@ import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteIdRespons import com.kuit.afternote.feature.afternote.data.mapper.AfternoteMapper import com.kuit.afternote.feature.afternote.data.mapper.toDto import com.kuit.afternote.feature.afternote.data.service.AfternoteApiService -import com.kuit.afternote.feature.afternote.domain.model.AfternoteDetail +import com.kuit.afternote.feature.afternote.domain.model.Detail import com.kuit.afternote.feature.afternote.domain.model.CreateGalleryInput import com.kuit.afternote.feature.afternote.domain.model.CreateSocialInput import com.kuit.afternote.feature.afternote.domain.model.PagedAfternotes @@ -77,7 +77,7 @@ class AfternoteRepositoryImpl /** * GET /afternotes/{afternoteId} — 상세 조회. DTO → domain 매핑 포함. */ - override suspend fun getAfternoteDetail(afternoteId: Long): Result = + override suspend fun getAfternoteDetail(afternoteId: Long): Result = runCatching { val response = api.getAfternoteDetail(afternoteId = afternoteId) val data = response.requireData() diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteDetail.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/Detail.kt similarity index 66% rename from app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteDetail.kt rename to app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/Detail.kt index fa0b5a03..6f92a0ac 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteDetail.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/Detail.kt @@ -1,7 +1,7 @@ package com.kuit.afternote.feature.afternote.domain.model import com.kuit.afternote.domain.model.AfternoteServiceType -import com.kuit.afternote.feature.afternote.domain.model.playlist.AfternotePlaylistDetail +import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistDetail /** * 애프터노트 상세 도메인 모델. @@ -12,29 +12,29 @@ import com.kuit.afternote.feature.afternote.domain.model.playlist.AfternotePlayl * - GALLERY: receivers, processMethod, actions * - PLAYLIST: playlist */ -data class AfternoteDetail( +data class Detail( val id: Long, val category: String, val title: String, - val timestamps: AfternoteDetailTimestamps, + val timestamps: DetailTimestamps, val type: AfternoteServiceType, - val credentials: AfternoteDetailCredentials?, - val receivers: List, - val processing: AfternoteDetailProcessing?, - val playlist: AfternotePlaylistDetail?, + val credentials: DetailCredentials?, + val receivers: List, + val processing: DetailProcessing?, + val playlist: PlaylistDetail?, ) -data class AfternoteDetailTimestamps( +data class DetailTimestamps( val createdAt: String, val updatedAt: String, ) -data class AfternoteDetailCredentials( +data class DetailCredentials( val id: String?, val password: String?, ) -data class AfternoteDetailProcessing( +data class DetailProcessing( val method: String?, val actions: List, val leaveMessage: String?, diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteDetailReceiver.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/DetailReceiver.kt similarity index 90% rename from app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteDetailReceiver.kt rename to app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/DetailReceiver.kt index 15913b2e..34c1fa8d 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteDetailReceiver.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/DetailReceiver.kt @@ -4,7 +4,7 @@ package com.kuit.afternote.feature.afternote.domain.model * 갤러리 카테고리의 수신자 정보. * receiverId: from API; name/relation may be resolved from GET /users/receivers when API returns only IDs. */ -data class AfternoteDetailReceiver( +data class DetailReceiver( val receiverId: Long? = null, val name: String, val relation: String, diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteItem.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/Item.kt similarity index 63% rename from app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteItem.kt rename to app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/Item.kt index 70067457..9a5d0b81 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteItem.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/Item.kt @@ -10,24 +10,24 @@ import com.kuit.afternote.domain.model.AfternoteServiceType * @param date 날짜 (yyyy.MM.dd 형식) * @param type 서비스 타입 (필터링용) */ -data class AfternoteItem( +data class Item( val id: String, val serviceName: String, val date: String, val type: AfternoteServiceType, - val account: AfternoteAccount = AfternoteAccount(), - val processing: AfternoteItemProcessing = AfternoteItemProcessing(), + val account: Account = Account(), + val processing: ItemProcessing = ItemProcessing(), ) -data class AfternoteAccount( +data class Account( val id: String = "", val password: String = "", ) -data class AfternoteItemProcessing( +data class ItemProcessing( val message: String = "", val accountMethod: String = "", val informationMethod: String = "", - val methods: List = emptyList(), - val galleryMethods: List = emptyList(), + val methods: List = emptyList(), + val galleryMethods: List = emptyList(), ) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/PagedAfternotes.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/PagedAfternotes.kt index 3ef0ea98..50542c22 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/PagedAfternotes.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/PagedAfternotes.kt @@ -7,6 +7,6 @@ package com.kuit.afternote.feature.afternote.domain.model * @param hasNext Whether more pages are available */ data class PagedAfternotes( - val items: List, + val items: List, val hasNext: Boolean ) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteProcessingMethod.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/ProcessingMethod.kt similarity index 86% rename from app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteProcessingMethod.kt rename to app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/ProcessingMethod.kt index ed4db17b..194aebba 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/AfternoteProcessingMethod.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/ProcessingMethod.kt @@ -4,7 +4,7 @@ package com.kuit.afternote.feature.afternote.domain.model * Saved processing method entry for an afternote item. * Domain representation of a single "처리 방법" (e.g. "게시물 내리기"). */ -data class AfternoteProcessingMethod( +data class ProcessingMethod( val id: String, val text: String ) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/AfternotePlaylistDetail.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/PlaylistDetail.kt similarity index 83% rename from app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/AfternotePlaylistDetail.kt rename to app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/PlaylistDetail.kt index 9f1de4af..7ebe7611 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/AfternotePlaylistDetail.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/PlaylistDetail.kt @@ -3,10 +3,10 @@ package com.kuit.afternote.feature.afternote.domain.model.playlist /** * 추모 가이드라인 카테고리의 플레이리스트 상세. */ -data class AfternotePlaylistDetail( +data class PlaylistDetail( val profilePhoto: String?, val atmosphere: String?, - val songs: List, + val songs: List, val playlistDetailMemorialMedia: PlaylistDetailMemorialMedia, ) @@ -19,7 +19,7 @@ data class PlaylistDetailMemorialMedia( /** * 플레이리스트 내 개별 곡 정보. */ -data class AfternoteDetailSong( +data class DetailSong( val id: Long?, val title: String, val artist: String, diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/AfternoteRepository.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/AfternoteRepository.kt index cdff7a6c..37bda398 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/AfternoteRepository.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/AfternoteRepository.kt @@ -1,8 +1,8 @@ package com.kuit.afternote.feature.afternote.domain.repository -import com.kuit.afternote.feature.afternote.domain.model.AfternoteDetail import com.kuit.afternote.feature.afternote.domain.model.CreateGalleryInput import com.kuit.afternote.feature.afternote.domain.model.CreateSocialInput +import com.kuit.afternote.feature.afternote.domain.model.Detail import com.kuit.afternote.feature.afternote.domain.model.PagedAfternotes import com.kuit.afternote.feature.afternote.domain.model.UpdateRequestInput import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistInput @@ -28,7 +28,7 @@ interface AfternoteRepository { suspend fun createGallery(input: CreateGalleryInput): Result - suspend fun getAfternoteDetail(afternoteId: Long): Result + suspend fun getAfternoteDetail(afternoteId: Long): Result suspend fun createPlaylist( title: String, diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/GetAfternoteDetailUseCase.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/GetAfternoteDetailUseCase.kt index fb734152..b3f915a7 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/GetAfternoteDetailUseCase.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/GetAfternoteDetailUseCase.kt @@ -1,7 +1,7 @@ package com.kuit.afternote.feature.afternote.domain.usecase -import com.kuit.afternote.feature.afternote.domain.model.AfternoteDetail -import com.kuit.afternote.feature.afternote.domain.model.AfternoteDetailReceiver +import com.kuit.afternote.feature.afternote.domain.model.Detail +import com.kuit.afternote.feature.afternote.domain.model.DetailReceiver import com.kuit.afternote.feature.afternote.domain.repository.AfternoteRepository import com.kuit.afternote.feature.user.domain.model.ReceiverListItem import com.kuit.afternote.feature.user.domain.usecase.GetReceiversUseCase @@ -21,7 +21,7 @@ class GetAfternoteDetailUseCase private val getReceiversUseCase: GetReceiversUseCase, private val getUserIdUseCase: GetUserIdUseCase, ) { - suspend operator fun invoke(afternoteId: Long): Result { + suspend operator fun invoke(afternoteId: Long): Result { val detailResult = repository.getAfternoteDetail(afternoteId = afternoteId) val detail = detailResult.getOrElse { return detailResult } val userId = getUserIdUseCase() ?: return detailResult @@ -36,9 +36,9 @@ class GetAfternoteDetailUseCase } private fun resolveReceiverNames( - receivers: List, + receivers: List, receiversList: List, - ): List = + ): List = receivers.map { r -> if (r.receiverId != null) { val fromList = receiversList.find { it.receiverId == r.receiverId } diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/AfternoteItemMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/AfternoteItemMapper.kt index 329e0644..24336488 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/AfternoteItemMapper.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/AfternoteItemMapper.kt @@ -2,10 +2,10 @@ package com.kuit.afternote.feature.afternote.presentation import com.kuit.afternote.core.util.AfternoteServiceCatalog import com.kuit.afternote.domain.model.AfternoteServiceType -import com.kuit.afternote.feature.afternote.domain.model.AfternoteAccount -import com.kuit.afternote.feature.afternote.domain.model.AfternoteItem -import com.kuit.afternote.feature.afternote.domain.model.AfternoteItemProcessing -import com.kuit.afternote.feature.afternote.domain.model.AfternoteProcessingMethod +import com.kuit.afternote.feature.afternote.domain.model.Account +import com.kuit.afternote.feature.afternote.domain.model.Item +import com.kuit.afternote.feature.afternote.domain.model.ItemProcessing +import com.kuit.afternote.feature.afternote.domain.model.ProcessingMethod /** * Pair 및 RegisterAfternotePayload를 AfternoteItem으로 변환하는 매퍼 @@ -16,23 +16,23 @@ object AfternoteItemMapper { * List를 List으로 변환하며 **안정적인 id**를 부여. * 목록/상세/편집에서 동일한 id로 조회할 수 있도록 더미 목록용. */ - fun toAfternoteItemsWithStableIds(pairs: List>): List = + fun toAfternoteItemsWithStableIds(pairs: List>): List = pairs.mapIndexed { index, pair -> val (serviceName, date) = pair val serviceType = inferServiceType(serviceName) val dummyData = dummyDataForServiceType(serviceType) - AfternoteItem( + Item( id = "dummy_${serviceName}_${date}_$index", serviceName = serviceName, date = date, type = serviceType, account = - AfternoteAccount( + Account( id = dummyData.accountId, password = dummyData.password, ), processing = - AfternoteItemProcessing( + ItemProcessing( message = dummyData.message, accountMethod = dummyData.accountProcessingMethod, informationMethod = dummyData.informationProcessingMethod, @@ -81,9 +81,9 @@ object AfternoteItemMapper { accountProcessingMethod = "MEMORIAL_ACCOUNT", processingMethods = listOf( - AfternoteProcessingMethod("1", "게시물 내리기"), - AfternoteProcessingMethod("2", "추모 게시물 올리기"), - AfternoteProcessingMethod("3", "추모 계정으로 전환하기"), + ProcessingMethod("1", "게시물 내리기"), + ProcessingMethod("2", "추모 게시물 올리기"), + ProcessingMethod("3", "추모 계정으로 전환하기"), ), ) @@ -98,8 +98,8 @@ object AfternoteItemMapper { informationProcessingMethod = "TRANSFER_TO_AFTERNOTE_EDIT_RECEIVER", galleryProcessingMethods = listOf( - AfternoteProcessingMethod("1", "'엽사' 폴더 박선호에게 전송"), - AfternoteProcessingMethod("2", "'흑역사' 폴더 삭제"), + ProcessingMethod("1", "'엽사' 폴더 박선호에게 전송"), + ProcessingMethod("2", "'흑역사' 폴더 삭제"), ), ) } @@ -115,7 +115,7 @@ object AfternoteItemMapper { val message: String = "", val accountProcessingMethod: String = "", val informationProcessingMethod: String = "", - val processingMethods: List = emptyList(), - val galleryProcessingMethods: List = emptyList(), + val processingMethods: List = emptyList(), + val galleryProcessingMethods: List = emptyList(), ) } diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/RegisterAfternotePayload.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/RegisterAfternotePayload.kt index dfc3444b..70488a79 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/RegisterAfternotePayload.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/RegisterAfternotePayload.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.afternote.presentation -import com.kuit.afternote.feature.afternote.domain.model.AfternoteProcessingMethod +import com.kuit.afternote.feature.afternote.domain.model.ProcessingMethod /** * Payload passed when the user taps "등록" on the afternote edit screen. @@ -16,7 +16,7 @@ data class RegisterAfternotePayload( val message: String = "", val accountProcessingMethod: String = "", val informationProcessingMethod: String = "", - val processingMethods: List = emptyList(), - val galleryProcessingMethods: List = emptyList(), + val processingMethods: List = emptyList(), + val galleryProcessingMethods: List = emptyList(), val atmosphere: String = "", ) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/detail/AfternoteDetailUiState.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/detail/AfternoteDetailUiState.kt index bfbc4805..166f230f 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/detail/AfternoteDetailUiState.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/detail/AfternoteDetailUiState.kt @@ -1,13 +1,13 @@ package com.kuit.afternote.feature.afternote.presentation.detail -import com.kuit.afternote.feature.afternote.domain.model.AfternoteDetail +import com.kuit.afternote.feature.afternote.domain.model.Detail /** * 애프터노트 상세 화면 UI 상태. */ data class AfternoteDetailUiState( val isLoading: Boolean = false, - val detail: AfternoteDetail? = null, + val detail: Detail? = null, val error: String? = null, val isDeleting: Boolean = false, val deleteSuccess: Boolean = false, diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditScreen.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditScreen.kt index b8699089..48e9a25f 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditScreen.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditScreen.kt @@ -35,8 +35,8 @@ import com.kuit.afternote.core.component.navigation.BottomNavItem import com.kuit.afternote.core.component.navigation.BottomNavigationBar import com.kuit.afternote.core.component.navigation.TopBar import com.kuit.afternote.domain.provider.FakeAfternoteEditDataProvider -import com.kuit.afternote.feature.afternote.domain.model.AfternoteItem -import com.kuit.afternote.feature.afternote.domain.model.AfternoteProcessingMethod +import com.kuit.afternote.feature.afternote.domain.model.Item +import com.kuit.afternote.feature.afternote.domain.model.ProcessingMethod import com.kuit.afternote.feature.afternote.presentation.AfternoteItemMapper import com.kuit.afternote.feature.afternote.presentation.RegisterAfternotePayload import com.kuit.afternote.feature.afternote.presentation.navgraph.AfternoteLightTheme @@ -86,7 +86,7 @@ fun AfternoteEditScreen( callbacks: AfternoteEditScreenCallbacks = AfternoteEditScreenCallbacks(), state: AfternoteEditState = rememberAfternoteEditState(), playlistStateHolder: MemorialPlaylistStateHolder? = null, - initialItem: AfternoteItem? = null, + initialItem: Item? = null, saveError: AfternoteEditSaveError? = null, ) { val focusManager = LocalFocusManager.current @@ -187,11 +187,11 @@ fun AfternoteEditScreen( val date = dateFormat.format(Date()) val processingMethods = state.processingMethods.map { - AfternoteProcessingMethod(it.id, it.text) + ProcessingMethod(it.id, it.text) } val galleryProcessingMethods = state.galleryProcessingMethods.map { - AfternoteProcessingMethod(it.id, it.text) + ProcessingMethod(it.id, it.text) } callbacks.onRegisterClick( RegisterAfternotePayload( diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditViewModel.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditViewModel.kt index 1418e062..e1fe99a8 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditViewModel.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditViewModel.kt @@ -3,10 +3,10 @@ package com.kuit.afternote.feature.afternote.presentation.edit import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.kuit.afternote.feature.afternote.domain.model.AfternoteDetail import com.kuit.afternote.feature.afternote.domain.model.CreateGalleryInput import com.kuit.afternote.feature.afternote.domain.model.CreateSocialInput import com.kuit.afternote.feature.afternote.domain.model.CredentialsInput +import com.kuit.afternote.feature.afternote.domain.model.Detail import com.kuit.afternote.feature.afternote.domain.model.ReceiverRefInput import com.kuit.afternote.feature.afternote.domain.model.UpdateRequestInput import com.kuit.afternote.feature.afternote.domain.model.playlist.MemorialVideoInput @@ -371,7 +371,7 @@ class AfternoteEditViewModel } private fun populatePlaylistFromDetail( - detail: AfternoteDetail, + detail: Detail, playlistStateHolder: MemorialPlaylistStateHolder?, ) { if (detail.category.uppercase() != "PLAYLIST" || @@ -392,7 +392,7 @@ class AfternoteEditViewModel }.forEach { playlistStateHolder.addSong(it) } } - private fun buildLoadFromExistingParams(detail: AfternoteDetail): LoadFromExistingParams { + private fun buildLoadFromExistingParams(detail: Detail): LoadFromExistingParams { val actionItems = detail.processing?.actions?.mapIndexed { index, text -> ProcessingMethodItem( diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListItem.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListItem.kt index 45337741..e8b43dff 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListItem.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListItem.kt @@ -31,7 +31,7 @@ import com.kuit.afternote.R import com.kuit.afternote.core.component.expand.dropShadow import com.kuit.afternote.core.util.getIconResForServiceName import com.kuit.afternote.domain.model.AfternoteServiceType -import com.kuit.afternote.feature.afternote.domain.model.AfternoteItem +import com.kuit.afternote.feature.afternote.domain.model.Item import com.kuit.afternote.ui.theme.B2 import com.kuit.afternote.ui.theme.Black import com.kuit.afternote.ui.theme.Gray5 @@ -51,7 +51,7 @@ import com.kuit.afternote.ui.theme.White @Composable fun AfternoteListItem( modifier: Modifier = Modifier, - item: AfternoteItem, + item: Item, onClick: () -> Unit = {}, ) { val imageRes = getIconResForServiceName(item.serviceName) @@ -160,7 +160,7 @@ private fun AfternoteListItemPreview() { Column { AfternoteListItem( item = - AfternoteItem( + Item( id = "1", serviceName = "인스타그램", date = "2023.11.24", @@ -170,7 +170,7 @@ private fun AfternoteListItemPreview() { Spacer(modifier = Modifier.height(8.dp)) AfternoteListItem( item = - AfternoteItem( + Item( id = "2", serviceName = "갤러리", date = "2023.11.25", diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListRoute.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListRoute.kt index 03a6042a..236e75de 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListRoute.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListRoute.kt @@ -15,7 +15,7 @@ import com.kuit.afternote.presentation.screen.AfternoteListScreenShellParams import com.kuit.afternote.core.util.getIconResForServiceName import com.kuit.afternote.presentation.uimodel.AfternoteListDisplayItem import com.kuit.afternote.domain.model.AfternoteServiceType -import com.kuit.afternote.feature.afternote.domain.model.AfternoteItem +import com.kuit.afternote.feature.afternote.domain.model.Item data class AfternoteListRouteCallbacks( val onNavigateToDetail: (String) -> Unit = {}, @@ -36,8 +36,8 @@ data class AfternoteListRouteCallbacks( fun AfternoteListRoute( viewModel: AfternoteListViewModel = hiltViewModel(), callbacks: AfternoteListRouteCallbacks = AfternoteListRouteCallbacks(), - initialItems: List = emptyList(), - onItemsChanged: (List) -> Unit = {}, + initialItems: List = emptyList(), + onItemsChanged: (List) -> Unit = {}, listRefreshRequested: Boolean = false, onListRefreshConsumed: () -> Unit = {}, ) { diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListUiState.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListUiState.kt index 5eb7f543..a295bfcf 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListUiState.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListUiState.kt @@ -2,7 +2,7 @@ package com.kuit.afternote.feature.afternote.presentation.list import com.kuit.afternote.core.component.list.AfternoteTab import com.kuit.afternote.core.component.navigation.BottomNavItem -import com.kuit.afternote.feature.afternote.domain.model.AfternoteItem +import com.kuit.afternote.feature.afternote.domain.model.Item /** * 애프터노트 목록 화면 UI 상태 @@ -18,7 +18,7 @@ import com.kuit.afternote.feature.afternote.domain.model.AfternoteItem data class AfternoteListUiState( val selectedTab: AfternoteTab = AfternoteTab.ALL, val selectedBottomNavItem: BottomNavItem = BottomNavItem.AFTERNOTE, - val items: List = emptyList(), + val items: List = emptyList(), val isLoading: Boolean = false, val loadError: String? = null, val hasNext: Boolean = false, diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListViewModel.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListViewModel.kt index f34ffdce..bbe884e8 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListViewModel.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListViewModel.kt @@ -5,7 +5,7 @@ import androidx.lifecycle.viewModelScope import com.kuit.afternote.core.component.list.AfternoteTab import com.kuit.afternote.core.component.navigation.BottomNavItem import com.kuit.afternote.domain.model.AfternoteServiceType -import com.kuit.afternote.feature.afternote.domain.model.AfternoteItem +import com.kuit.afternote.feature.afternote.domain.model.Item import com.kuit.afternote.feature.afternote.domain.usecase.GetAfternotesUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -31,7 +31,7 @@ class AfternoteListViewModel private val _uiState = MutableStateFlow(AfternoteListUiState()) val uiState: StateFlow = _uiState.asStateFlow() - private var allItems: List = emptyList() + private var allItems: List = emptyList() private var currentPage: Int = 0 private var hasNextPage: Boolean = false private val pageSize: Int = 10 @@ -109,7 +109,7 @@ class AfternoteListViewModel /** * 초기 데이터 설정 (NavGraph에서 더미/캐시로 주입) */ - fun setItems(items: List) { + fun setItems(items: List) { allItems = items hasNextPage = false _uiState.update { diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/mapper/AfternoteItemMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/mapper/AfternoteItemMapper.kt index c7d4c38d..cb108006 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/mapper/AfternoteItemMapper.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/mapper/AfternoteItemMapper.kt @@ -1,11 +1,11 @@ package com.kuit.afternote.feature.afternote.presentation.mapper -import com.kuit.afternote.feature.afternote.domain.model.AfternoteItem +import com.kuit.afternote.feature.afternote.domain.model.Item import com.kuit.afternote.feature.dailyrecord.presentation.uimodel.MindRecordUiModel import java.time.LocalDate import java.time.format.DateTimeFormatter -fun AfternoteItem.toMindRecordUiModel(): MindRecordUiModel { +fun Item.toMindRecordUiModel(): MindRecordUiModel { // 1. 날짜 포맷팅 로직 (안정성을 위해 java.time 사용) val inputFormatter = DateTimeFormatter diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/navgraph/AfternoteNavgraph.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/navgraph/AfternoteNavgraph.kt index 1cb99a0c..3a0d2e16 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/navgraph/AfternoteNavgraph.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/navgraph/AfternoteNavgraph.kt @@ -45,7 +45,7 @@ import com.kuit.afternote.presentation.screen.afternotedetail.SocialNetworkDetai import com.kuit.afternote.presentation.screen.afternotedetail.SocialNetworkDetailScreen import com.kuit.afternote.domain.model.AfternoteServiceType import com.kuit.afternote.domain.provider.AfternoteEditDataProvider -import com.kuit.afternote.feature.afternote.domain.model.AfternoteItem +import com.kuit.afternote.feature.afternote.domain.model.Item import com.kuit.afternote.feature.afternote.presentation.AfternoteItemMapper import com.kuit.afternote.feature.afternote.presentation.AfternoteSaveState import com.kuit.afternote.feature.afternote.presentation.AfternoteValidationError @@ -97,8 +97,8 @@ data class AfternoteListRefreshParams( * Parameters for [afternoteNavGraph]. Groups arguments to keep function param count ≤7. */ data class AfternoteNavGraphParams( - val afternoteItemsProvider: () -> List, - val onItemsUpdated: (List) -> Unit, + val afternoteItemsProvider: () -> List, + val onItemsUpdated: (List) -> Unit, val playlistStateHolder: MemorialPlaylistStateHolder, val afternoteProvider: AfternoteEditDataProvider, val userNameProvider: () -> String, @@ -128,9 +128,9 @@ inline fun NavGraphBuilder.afternoteComposable(noinline conten } private fun resolveListItems( - afternoteItems: List, + afternoteItems: List, afternoteProvider: AfternoteEditDataProvider, -): List = +): List = afternoteItems.ifEmpty { AfternoteItemMapper.toAfternoteItemsWithStableIds(afternoteProvider.getDefaultAfternoteItems()) } @@ -139,7 +139,7 @@ private fun resolveListItems( private fun AfternoteListRouteContent( navController: NavController, onBottomNavTabSelected: (BottomNavItem) -> Unit = {}, - onItemsUpdated: (List) -> Unit, + onItemsUpdated: (List) -> Unit, editStateHandling: AfternoteEditStateHandling, playlistStateHolder: MemorialPlaylistStateHolder, listRefresh: AfternoteListRefreshParams? = null, @@ -475,7 +475,7 @@ private data class EditScreenCallbacksParams( val editStateHandling: AfternoteEditStateHandling, val state: AfternoteEditState, val route: AfternoteRoute.EditRoute, - val initialItem: AfternoteItem?, + val initialItem: Item?, val playlistStateHolder: MemorialPlaylistStateHolder, val onNavigateToSelectReceiver: () -> Unit, val onBottomNavTabSelected: (BottomNavItem) -> Unit, @@ -484,7 +484,7 @@ private data class EditScreenCallbacksParams( private data class AfternoteEditRouteContentParams( val backStackEntry: NavBackStackEntry, val navController: NavController, - val afternoteItems: List, + val afternoteItems: List, val playlistStateHolder: MemorialPlaylistStateHolder, val afternoteProvider: AfternoteEditDataProvider, val editStateHandling: AfternoteEditStateHandling, diff --git a/app/src/main/java/com/kuit/afternote/feature/dailyrecord/presentation/viewmodel/MindRecordViewModel.kt b/app/src/main/java/com/kuit/afternote/feature/dailyrecord/presentation/viewmodel/MindRecordViewModel.kt index c8270165..f480a70a 100644 --- a/app/src/main/java/com/kuit/afternote/feature/dailyrecord/presentation/viewmodel/MindRecordViewModel.kt +++ b/app/src/main/java/com/kuit/afternote/feature/dailyrecord/presentation/viewmodel/MindRecordViewModel.kt @@ -3,7 +3,7 @@ package com.kuit.afternote.feature.dailyrecord.presentation.viewmodel import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.kuit.afternote.feature.afternote.domain.model.AfternoteItem +import com.kuit.afternote.feature.afternote.domain.model.Item import com.kuit.afternote.feature.afternote.domain.usecase.GetAfternotesUseCase import com.kuit.afternote.feature.dailyrecord.data.dto.EmotionResponse import com.kuit.afternote.feature.dailyrecord.data.dto.PostMindRecordRequest @@ -451,7 +451,7 @@ class MindRecordViewModel } } -fun AfternoteItem.toMindRecordUiModel(): MindRecordUiModel { +fun Item.toMindRecordUiModel(): MindRecordUiModel { // 1. 날짜 포맷팅 로직 (안정성을 위해 java.time 사용) val inputFormatter = DateTimeFormatter.ofPattern("yyyy.MM.dd") val isoFormatter = DateTimeFormatter.ISO_LOCAL_DATE // yyyy-MM-dd diff --git a/app/src/main/java/com/kuit/afternote/presentation/navigation/navgraph/NavGraph.kt b/app/src/main/java/com/kuit/afternote/presentation/navigation/navgraph/NavGraph.kt index cd3e9e00..b3c6d95f 100644 --- a/app/src/main/java/com/kuit/afternote/presentation/navigation/navgraph/NavGraph.kt +++ b/app/src/main/java/com/kuit/afternote/presentation/navigation/navgraph/NavGraph.kt @@ -51,7 +51,7 @@ import com.kuit.afternote.core.util.getIconResForServiceName import com.kuit.afternote.presentation.uimodel.AfternoteListDisplayItem import com.kuit.afternote.di.ReceiverAuthSessionEntryPoint import com.kuit.afternote.di.TokenManagerEntryPoint -import com.kuit.afternote.feature.afternote.domain.model.AfternoteItem +import com.kuit.afternote.feature.afternote.domain.model.Item import com.kuit.afternote.feature.afternote.presentation.edit.AfternoteEditState import com.kuit.afternote.feature.afternote.presentation.edit.MemorialPlaylistStateHolder import com.kuit.afternote.feature.afternote.presentation.fingerprint.FingerprintLoginScreen @@ -387,7 +387,7 @@ fun NavGraph(navHostController: NavHostController) { LaunchedEffect(isLoggedIn) { if (isLoggedIn == true) currentUserNameViewModel.loadUserName() } - var afternoteItems by remember { mutableStateOf(listOf()) } + var afternoteItems by remember { mutableStateOf(listOf()) } val afternoteEditStateHolder = remember { mutableStateOf(null) } val playlistStateHolder = remember { MemorialPlaylistStateHolder() } var listRefreshRequested by remember { mutableStateOf(false) } From 7db718e78fb2d153f08e7b38330182a3062d8cf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Fri, 20 Mar 2026 15:51:29 +0900 Subject: [PATCH 04/12] =?UTF-8?q?refactor(afternote):=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=20=EA=B2=B0=EA=B3=BC=20=EB=B0=98=ED=99=98=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=EC=9D=84=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=AA=A8=EB=8D=B8(Se?= =?UTF-8?q?archedSong)=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 도메인 레이어에서 사용할 `SearchedSong` 모델 정의 - `MusicSearchRepository` 및 `SearchMusicUseCase`의 반환 타입을 `PlaylistSongDisplay`에서 `SearchedSong`으로 변경 - UI 레이어에서 사용할 `SongMapper` 추가 및 `AddSongViewModel`에 적용 --- .../data/repositoryimpl/MusicSearchRepositoryImpl.kt | 10 +++++----- .../domain/repository/MusicSearchRepository.kt | 6 +++--- .../feature/afternote/domain/model/SearchedSong.kt | 8 ++++++++ .../afternote/domain/usecase/SearchMusicUseCase.kt | 4 ++-- .../presentation/addsong/AddSongViewModel.kt | 3 ++- .../afternote/presentation/mapper/SongMapper.kt | 11 +++++++++++ 6 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/SearchedSong.kt create mode 100644 app/src/main/java/com/kuit/afternote/feature/afternote/presentation/mapper/SongMapper.kt diff --git a/app/src/main/java/com/kuit/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt index d37719e4..b1442b8d 100644 --- a/app/src/main/java/com/kuit/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt @@ -1,9 +1,9 @@ package com.kuit.afternote.data.repositoryimpl -import com.kuit.afternote.presentation.uimodel.PlaylistSongDisplay import com.kuit.afternote.data.dto.MusicTrack import com.kuit.afternote.data.service.MusicApiService import com.kuit.afternote.domain.repository.MusicSearchRepository +import com.kuit.afternote.feature.afternote.domain.model.SearchedSong import javax.inject.Inject /** @@ -15,17 +15,17 @@ class MusicSearchRepositoryImpl constructor( private val api: MusicApiService, ) : MusicSearchRepository { - override suspend fun search(keyword: String): Result> = + override suspend fun search(keyword: String): Result> = runCatching { val trimmed = keyword.trim() - if (trimmed.isEmpty()) return@runCatching emptyList() + if (trimmed.isEmpty()) return@runCatching emptyList() val response = api.search(keyword = trimmed) response.tracks.mapIndexed { index, dto -> dto.toPlaylistSongDisplay(index) } } - private fun MusicTrack.toPlaylistSongDisplay(index: Int): PlaylistSongDisplay { + private fun MusicTrack.toPlaylistSongDisplay(index: Int): SearchedSong { val id = "$artist|$title|$index" - return PlaylistSongDisplay( + return SearchedSong( id = id, title = title, artist = artist, diff --git a/app/src/main/java/com/kuit/afternote/domain/repository/MusicSearchRepository.kt b/app/src/main/java/com/kuit/afternote/domain/repository/MusicSearchRepository.kt index ae47ce33..7c0e85ed 100644 --- a/app/src/main/java/com/kuit/afternote/domain/repository/MusicSearchRepository.kt +++ b/app/src/main/java/com/kuit/afternote/domain/repository/MusicSearchRepository.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.domain.repository -import com.kuit.afternote.presentation.uimodel.PlaylistSongDisplay +import com.kuit.afternote.feature.afternote.domain.model.SearchedSong /** * Music search by keyword (artist or title). @@ -11,7 +11,7 @@ fun interface MusicSearchRepository { * Searches for tracks by keyword. Call only when [keyword] is non-blank (API returns 400 otherwise). * * @param keyword 검색할 가수명 또는 노래 제목 - * @return Result with list of [PlaylistSongDisplay], or failure on API error + * @return Result with list of [SearchedSong], or failure on API error */ - suspend fun search(keyword: String): Result> + suspend fun search(keyword: String): Result> } diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/SearchedSong.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/SearchedSong.kt new file mode 100644 index 00000000..0c376368 --- /dev/null +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/SearchedSong.kt @@ -0,0 +1,8 @@ +package com.kuit.afternote.feature.afternote.domain.model + +data class SearchedSong( + val id: String, + val title: String, + val artist: String, + val albumImageUrl: String? = null, +) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/SearchMusicUseCase.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/SearchMusicUseCase.kt index 07013309..436b1103 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/SearchMusicUseCase.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/SearchMusicUseCase.kt @@ -1,7 +1,7 @@ package com.kuit.afternote.feature.afternote.domain.usecase -import com.kuit.afternote.presentation.uimodel.PlaylistSongDisplay import com.kuit.afternote.domain.repository.MusicSearchRepository +import com.kuit.afternote.feature.afternote.domain.model.SearchedSong import javax.inject.Inject /** @@ -17,5 +17,5 @@ class SearchMusicUseCase /** * @param keyword 검색할 가수명 또는 노래 제목 (blank면 빈 목록 반환) */ - suspend operator fun invoke(keyword: String): Result> = repository.search(keyword) + suspend operator fun invoke(keyword: String): Result> = repository.search(keyword) } diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/addsong/AddSongViewModel.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/addsong/AddSongViewModel.kt index b6e5657b..a431b78d 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/addsong/AddSongViewModel.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/addsong/AddSongViewModel.kt @@ -3,6 +3,7 @@ package com.kuit.afternote.feature.afternote.presentation.addsong import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.kuit.afternote.feature.afternote.domain.usecase.SearchMusicUseCase +import com.kuit.afternote.feature.afternote.presentation.mapper.toDisplay import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Job import kotlinx.coroutines.delay @@ -42,7 +43,7 @@ class AddSongViewModel searchMusicUseCase(trimmed) .onSuccess { list -> _uiState.update { - it.copy(songs = list, isLoading = false, errorMessage = null) + it.copy(songs = list.map { item -> item.toDisplay() }, isLoading = false, errorMessage = null) } }.onFailure { e -> _uiState.update { diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/mapper/SongMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/mapper/SongMapper.kt new file mode 100644 index 00000000..2de8c100 --- /dev/null +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/mapper/SongMapper.kt @@ -0,0 +1,11 @@ +package com.kuit.afternote.feature.afternote.presentation.mapper + +import com.kuit.afternote.feature.afternote.domain.model.SearchedSong +import com.kuit.afternote.presentation.uimodel.PlaylistSongDisplay + +fun SearchedSong.toDisplay() = + PlaylistSongDisplay( + id = id, + title = title, + artist = artist, + ) From 5f0417f70fcc4f90ae72f1ba6c7fdd6e655c3384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Fri, 20 Mar 2026 16:03:38 +0900 Subject: [PATCH 05/12] =?UTF-8?q?feat(afternote):=20=EC=9D=8C=EC=95=85=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20=EA=B4=80=EB=A0=A8=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 음악 검색 관련 Service, Repository, DTO 클래스들을 feature/afternote 패키지로 이동 - 패키지 구조 변경에 따른 DI 모듈 및 UseCase 임포트 경로 수정 --- .../java/com/kuit/afternote/data/service/NetworkModule.kt | 1 + .../{ => feature/afternote}/data/dto/MusicTrack.kt | 2 +- .../afternote}/data/dto/response/MusicSearchResponse.kt | 4 ++-- .../data/repositoryimpl/MusicSearchRepositoryImpl.kt | 8 ++++---- .../afternote}/data/service/MusicApiService.kt | 4 ++-- .../feature/afternote/di/AfternoteRepositoryModule.kt | 4 ++-- .../afternote}/domain/repository/MusicSearchRepository.kt | 2 +- .../afternote/domain/usecase/SearchMusicUseCase.kt | 2 +- 8 files changed, 14 insertions(+), 13 deletions(-) rename app/src/main/java/com/kuit/afternote/{ => feature/afternote}/data/dto/MusicTrack.kt (85%) rename app/src/main/java/com/kuit/afternote/{ => feature/afternote}/data/dto/response/MusicSearchResponse.kt (72%) rename app/src/main/java/com/kuit/afternote/{ => feature/afternote}/data/repositoryimpl/MusicSearchRepositoryImpl.kt (79%) rename app/src/main/java/com/kuit/afternote/{ => feature/afternote}/data/service/MusicApiService.kt (75%) rename app/src/main/java/com/kuit/afternote/{ => feature/afternote}/domain/repository/MusicSearchRepository.kt (90%) diff --git a/app/src/main/java/com/kuit/afternote/data/service/NetworkModule.kt b/app/src/main/java/com/kuit/afternote/data/service/NetworkModule.kt index ce1a6a12..ffba4c3f 100644 --- a/app/src/main/java/com/kuit/afternote/data/service/NetworkModule.kt +++ b/app/src/main/java/com/kuit/afternote/data/service/NetworkModule.kt @@ -1,6 +1,7 @@ package com.kuit.afternote.data.service import com.kuit.afternote.feature.afternote.data.service.AfternoteApiService +import com.kuit.afternote.feature.afternote.data.service.MusicApiService import com.kuit.afternote.feature.dailyrecord.data.api.DailyRecordApiService import dagger.Module import dagger.Provides diff --git a/app/src/main/java/com/kuit/afternote/data/dto/MusicTrack.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/dto/MusicTrack.kt similarity index 85% rename from app/src/main/java/com/kuit/afternote/data/dto/MusicTrack.kt rename to app/src/main/java/com/kuit/afternote/feature/afternote/data/dto/MusicTrack.kt index 1fab6fe1..b2b54994 100644 --- a/app/src/main/java/com/kuit/afternote/data/dto/MusicTrack.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/dto/MusicTrack.kt @@ -1,4 +1,4 @@ -package com.kuit.afternote.data.dto +package com.kuit.afternote.feature.afternote.data.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/kuit/afternote/data/dto/response/MusicSearchResponse.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/dto/response/MusicSearchResponse.kt similarity index 72% rename from app/src/main/java/com/kuit/afternote/data/dto/response/MusicSearchResponse.kt rename to app/src/main/java/com/kuit/afternote/feature/afternote/data/dto/response/MusicSearchResponse.kt index a508a420..f5ace59b 100644 --- a/app/src/main/java/com/kuit/afternote/data/dto/response/MusicSearchResponse.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/dto/response/MusicSearchResponse.kt @@ -1,6 +1,6 @@ -package com.kuit.afternote.data.dto.response +package com.kuit.afternote.feature.afternote.data.dto.response -import com.kuit.afternote.data.dto.MusicTrack +import com.kuit.afternote.feature.afternote.data.dto.MusicTrack import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/kuit/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt similarity index 79% rename from app/src/main/java/com/kuit/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt rename to app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt index b1442b8d..4b5cd95d 100644 --- a/app/src/main/java/com/kuit/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt @@ -1,9 +1,9 @@ -package com.kuit.afternote.data.repositoryimpl +package com.kuit.afternote.feature.afternote.data.repositoryimpl -import com.kuit.afternote.data.dto.MusicTrack -import com.kuit.afternote.data.service.MusicApiService -import com.kuit.afternote.domain.repository.MusicSearchRepository +import com.kuit.afternote.feature.afternote.data.dto.MusicTrack +import com.kuit.afternote.feature.afternote.data.service.MusicApiService import com.kuit.afternote.feature.afternote.domain.model.SearchedSong +import com.kuit.afternote.feature.afternote.domain.repository.MusicSearchRepository import javax.inject.Inject /** diff --git a/app/src/main/java/com/kuit/afternote/data/service/MusicApiService.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/service/MusicApiService.kt similarity index 75% rename from app/src/main/java/com/kuit/afternote/data/service/MusicApiService.kt rename to app/src/main/java/com/kuit/afternote/feature/afternote/data/service/MusicApiService.kt index 163f0b84..6c484382 100644 --- a/app/src/main/java/com/kuit/afternote/data/service/MusicApiService.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/service/MusicApiService.kt @@ -1,6 +1,6 @@ -package com.kuit.afternote.data.service +package com.kuit.afternote.feature.afternote.data.service -import com.kuit.afternote.data.dto.response.MusicSearchResponse +import com.kuit.afternote.feature.afternote.data.dto.response.MusicSearchResponse import retrofit2.http.GET import retrofit2.http.Query diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/di/AfternoteRepositoryModule.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/di/AfternoteRepositoryModule.kt index a9a2abb1..f4dce158 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/di/AfternoteRepositoryModule.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/di/AfternoteRepositoryModule.kt @@ -2,12 +2,12 @@ package com.kuit.afternote.feature.afternote.di import com.kuit.afternote.data.repositoryimpl.MemorialThumbnailUploadRepositoryImpl import com.kuit.afternote.data.repositoryimpl.MemorialVideoUploadRepositoryImpl -import com.kuit.afternote.data.repositoryimpl.MusicSearchRepositoryImpl import com.kuit.afternote.domain.repository.MemorialThumbnailUploadRepository import com.kuit.afternote.domain.repository.MemorialVideoUploadRepository -import com.kuit.afternote.domain.repository.MusicSearchRepository import com.kuit.afternote.feature.afternote.data.repositoryimpl.AfternoteRepositoryImpl +import com.kuit.afternote.feature.afternote.data.repositoryimpl.MusicSearchRepositoryImpl import com.kuit.afternote.feature.afternote.domain.repository.AfternoteRepository +import com.kuit.afternote.feature.afternote.domain.repository.MusicSearchRepository import dagger.Binds import dagger.Module import dagger.hilt.InstallIn diff --git a/app/src/main/java/com/kuit/afternote/domain/repository/MusicSearchRepository.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/MusicSearchRepository.kt similarity index 90% rename from app/src/main/java/com/kuit/afternote/domain/repository/MusicSearchRepository.kt rename to app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/MusicSearchRepository.kt index 7c0e85ed..5b1de64c 100644 --- a/app/src/main/java/com/kuit/afternote/domain/repository/MusicSearchRepository.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/MusicSearchRepository.kt @@ -1,4 +1,4 @@ -package com.kuit.afternote.domain.repository +package com.kuit.afternote.feature.afternote.domain.repository import com.kuit.afternote.feature.afternote.domain.model.SearchedSong diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/SearchMusicUseCase.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/SearchMusicUseCase.kt index 436b1103..cec9c76a 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/SearchMusicUseCase.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/SearchMusicUseCase.kt @@ -1,7 +1,7 @@ package com.kuit.afternote.feature.afternote.domain.usecase -import com.kuit.afternote.domain.repository.MusicSearchRepository import com.kuit.afternote.feature.afternote.domain.model.SearchedSong +import com.kuit.afternote.feature.afternote.domain.repository.MusicSearchRepository import javax.inject.Inject /** From 9ab9ac5a2e2501feed526718a41b5c09bbaca42e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Fri, 20 Mar 2026 16:51:49 +0900 Subject: [PATCH 06/12] =?UTF-8?q?feat(afternote):=20UseCase=20=EB=B0=8F=20?= =?UTF-8?q?Repository=20=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98=EB=A5=BC=20In?= =?UTF-8?q?put=20=EA=B0=9D=EC=B2=B4=EB=A1=9C=20=EC=BA=A1=EC=8A=90=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `GetAfternotesUseCase` 및 `AfternoteRepository`의 조회 매개변수를 `GetAfternotesInput`으로 통합 - `CreatePlaylistAfternoteUseCase` 및 `AfternoteRepository`의 생성 매개변수를 `CreatePlaylistInput`으로 통합 - 매개변수 구조 변경에 따른 ViewModel 및 테스트 코드 수정 - `GetAfternotesInput` 및 `CreatePlaylistInput` 데이터 클래스 추가 --- .../repositoryimpl/AfternoteRepositoryImpl.kt | 30 +++++++++---------- .../domain/model/GetAfternotesInput.kt | 7 +++++ .../model/playlist/CreatePlaylistInput.kt | 7 +++++ .../domain/repository/AfternoteRepository.kt | 15 +++------- .../usecase/CreatePlaylistAfternoteUseCase.kt | 12 ++------ .../domain/usecase/GetAfternotesUseCase.kt | 7 ++--- .../edit/AfternoteEditViewModel.kt | 12 +++++--- .../list/AfternoteListViewModel.kt | 17 +++++++++-- .../viewmodel/MindRecordViewModel.kt | 9 +++++- .../AfternoteRepositoryImplTest.kt | 8 ++--- .../CreatePlaylistAfternoteUseCaseTest.kt | 18 ++--------- 11 files changed, 73 insertions(+), 69 deletions(-) create mode 100644 app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/GetAfternotesInput.kt create mode 100644 app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/CreatePlaylistInput.kt diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt index 9dc69ddf..0efc9e06 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt @@ -11,12 +11,13 @@ import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteIdRespons import com.kuit.afternote.feature.afternote.data.mapper.AfternoteMapper import com.kuit.afternote.feature.afternote.data.mapper.toDto import com.kuit.afternote.feature.afternote.data.service.AfternoteApiService -import com.kuit.afternote.feature.afternote.domain.model.Detail import com.kuit.afternote.feature.afternote.domain.model.CreateGalleryInput import com.kuit.afternote.feature.afternote.domain.model.CreateSocialInput +import com.kuit.afternote.feature.afternote.domain.model.Detail +import com.kuit.afternote.feature.afternote.domain.model.GetAfternotesInput import com.kuit.afternote.feature.afternote.domain.model.PagedAfternotes import com.kuit.afternote.feature.afternote.domain.model.UpdateRequestInput -import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistInput +import com.kuit.afternote.feature.afternote.domain.model.playlist.CreatePlaylistInput import com.kuit.afternote.feature.afternote.domain.repository.AfternoteRepository import javax.inject.Inject @@ -30,13 +31,14 @@ class AfternoteRepositoryImpl constructor( private val api: AfternoteApiService, ) : AfternoteRepository { - override suspend fun getAfternotes( - category: String?, - page: Int, - size: Int, - ): Result = + override suspend fun getAfternotes(input: GetAfternotesInput): Result = runCatching { - val response = api.getAfternotes(category = category, page = page, size = size) + val response = + api.getAfternotes( + category = input.category, + page = input.page, + size = input.size, + ) val data = response.requireData() AfternoteMapper.toPagedNotes(data) }.logFailure() @@ -87,18 +89,14 @@ class AfternoteRepositoryImpl /** * POST /afternotes (PLAYLIST category). */ - override suspend fun createPlaylist( - title: String, - playlist: PlaylistInput, - receiverIds: List, - ): Result = + override suspend fun createPlaylist(input: CreatePlaylistInput): Result = runCatching { val request = AfternoteCreatePlaylistRequest( category = "PLAYLIST", - title = title, - playlist = playlist.toDto(), - receivers = receiverIds.map { AfternoteReceiverRef(receiverId = it) }, + title = input.title, + playlist = input.playlist.toDto(), + receivers = input.receiverIds.map { AfternoteReceiverRef(receiverId = it) }, ) val response = api.createAfternotePlaylist(request) val data = response.requireData() diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/GetAfternotesInput.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/GetAfternotesInput.kt new file mode 100644 index 00000000..c2a4df6f --- /dev/null +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/GetAfternotesInput.kt @@ -0,0 +1,7 @@ +package com.kuit.afternote.feature.afternote.domain.model + +data class GetAfternotesInput( + val category: String?, + val page: Int, + val size: Int, +) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/CreatePlaylistInput.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/CreatePlaylistInput.kt new file mode 100644 index 00000000..96bf8965 --- /dev/null +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/CreatePlaylistInput.kt @@ -0,0 +1,7 @@ +package com.kuit.afternote.feature.afternote.domain.model.playlist + +data class CreatePlaylistInput( + val title: String, + val playlist: PlaylistInput, + val receiverIds: List = emptyList(), +) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/AfternoteRepository.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/AfternoteRepository.kt index 37bda398..c47c31b2 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/AfternoteRepository.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/AfternoteRepository.kt @@ -3,9 +3,10 @@ package com.kuit.afternote.feature.afternote.domain.repository import com.kuit.afternote.feature.afternote.domain.model.CreateGalleryInput import com.kuit.afternote.feature.afternote.domain.model.CreateSocialInput import com.kuit.afternote.feature.afternote.domain.model.Detail +import com.kuit.afternote.feature.afternote.domain.model.GetAfternotesInput import com.kuit.afternote.feature.afternote.domain.model.PagedAfternotes import com.kuit.afternote.feature.afternote.domain.model.UpdateRequestInput -import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistInput +import com.kuit.afternote.feature.afternote.domain.model.playlist.CreatePlaylistInput /** * Afternote 도메인 Repository 인터페이스. @@ -18,11 +19,7 @@ import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistInput * - DELETE /afternotes/{afternoteId} (삭제) */ interface AfternoteRepository { - suspend fun getAfternotes( - category: String?, - page: Int, - size: Int, - ): Result + suspend fun getAfternotes(input: GetAfternotesInput): Result suspend fun createSocial(input: CreateSocialInput): Result @@ -30,11 +27,7 @@ interface AfternoteRepository { suspend fun getAfternoteDetail(afternoteId: Long): Result - suspend fun createPlaylist( - title: String, - playlist: PlaylistInput, - receiverIds: List = emptyList(), - ): Result + suspend fun createPlaylist(input: CreatePlaylistInput): Result suspend fun updateAfternote( afternoteId: Long, diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreatePlaylistAfternoteUseCase.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreatePlaylistAfternoteUseCase.kt index 3387b2f6..feb9d760 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreatePlaylistAfternoteUseCase.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/CreatePlaylistAfternoteUseCase.kt @@ -1,6 +1,6 @@ package com.kuit.afternote.feature.afternote.domain.usecase -import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistInput +import com.kuit.afternote.feature.afternote.domain.model.playlist.CreatePlaylistInput import com.kuit.afternote.feature.afternote.domain.repository.AfternoteRepository import javax.inject.Inject @@ -14,14 +14,8 @@ class CreatePlaylistAfternoteUseCase constructor( private val repository: AfternoteRepository, ) { - suspend operator fun invoke( - title: String, - playlist: PlaylistInput, - receiverIds: List = emptyList(), - ): Result = + suspend operator fun invoke(input: CreatePlaylistInput): Result = repository.createPlaylist( - title = title, - playlist = playlist, - receiverIds = receiverIds, + input = input, ) } diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/GetAfternotesUseCase.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/GetAfternotesUseCase.kt index 82951b15..65ae95df 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/GetAfternotesUseCase.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/GetAfternotesUseCase.kt @@ -1,5 +1,6 @@ package com.kuit.afternote.feature.afternote.domain.usecase +import com.kuit.afternote.feature.afternote.domain.model.GetAfternotesInput import com.kuit.afternote.feature.afternote.domain.model.PagedAfternotes import com.kuit.afternote.feature.afternote.domain.repository.AfternoteRepository import javax.inject.Inject @@ -14,9 +15,5 @@ class GetAfternotesUseCase constructor( private val repository: AfternoteRepository, ) { - suspend operator fun invoke( - category: String? = null, - page: Int = 0, - size: Int = 10, - ): Result = repository.getAfternotes(category = category, page = page, size = size) + suspend operator fun invoke(input: GetAfternotesInput): Result = repository.getAfternotes(input = input) } diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditViewModel.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditViewModel.kt index e1fe99a8..c7640f7e 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditViewModel.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/edit/AfternoteEditViewModel.kt @@ -9,6 +9,7 @@ import com.kuit.afternote.feature.afternote.domain.model.CredentialsInput import com.kuit.afternote.feature.afternote.domain.model.Detail import com.kuit.afternote.feature.afternote.domain.model.ReceiverRefInput import com.kuit.afternote.feature.afternote.domain.model.UpdateRequestInput +import com.kuit.afternote.feature.afternote.domain.model.playlist.CreatePlaylistInput import com.kuit.afternote.feature.afternote.domain.model.playlist.MemorialVideoInput import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistInput import com.kuit.afternote.feature.afternote.domain.model.playlist.SongInput @@ -545,7 +546,7 @@ class AfternoteEditViewModel } CATEGORY_MEMORIAL -> { - val playlistDto = + val input = buildPlaylistInput( playlistStateHolder = playlistStateHolder, atmosphere = payload.atmosphere, @@ -554,9 +555,12 @@ class AfternoteEditViewModel funeralThumbnailUrl = funeralThumbnailUrl, ) createPlaylistUseCase( - title = payload.serviceName, - playlist = playlistDto, - receiverIds = selectedReceiverIds, + input = + CreatePlaylistInput( + title = payload.serviceName, + playlist = input, + receiverIds = selectedReceiverIds, + ), ) } diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListViewModel.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListViewModel.kt index bbe884e8..30b2d095 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListViewModel.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/presentation/list/AfternoteListViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope import com.kuit.afternote.core.component.list.AfternoteTab import com.kuit.afternote.core.component.navigation.BottomNavItem import com.kuit.afternote.domain.model.AfternoteServiceType +import com.kuit.afternote.feature.afternote.domain.model.GetAfternotesInput import com.kuit.afternote.feature.afternote.domain.model.Item import com.kuit.afternote.feature.afternote.domain.usecase.GetAfternotesUseCase import dagger.hilt.android.lifecycle.HiltViewModel @@ -50,7 +51,13 @@ class AfternoteListViewModel fun loadAfternotes(category: String? = null) { viewModelScope.launch { _uiState.update { it.copy(isLoading = true, loadError = null) } - getAfternotesUseCase(category = category, page = 0, size = pageSize) + val input = + GetAfternotesInput( + category = category, + page = 0, + size = pageSize, + ) + getAfternotesUseCase(input) .onSuccess { paged -> allItems = paged.items currentPage = 0 @@ -91,7 +98,13 @@ class AfternoteListViewModel _uiState.update { it.copy(isLoadingMore = true) } val category: String? = null val nextPage = currentPage + 1 - getAfternotesUseCase(category = category, page = nextPage, size = pageSize) + val input = + GetAfternotesInput( + category = category, + page = nextPage, + size = pageSize, + ) + getAfternotesUseCase(input) .onSuccess { paged -> allItems = allItems + paged.items currentPage = nextPage diff --git a/app/src/main/java/com/kuit/afternote/feature/dailyrecord/presentation/viewmodel/MindRecordViewModel.kt b/app/src/main/java/com/kuit/afternote/feature/dailyrecord/presentation/viewmodel/MindRecordViewModel.kt index f480a70a..2824ef56 100644 --- a/app/src/main/java/com/kuit/afternote/feature/dailyrecord/presentation/viewmodel/MindRecordViewModel.kt +++ b/app/src/main/java/com/kuit/afternote/feature/dailyrecord/presentation/viewmodel/MindRecordViewModel.kt @@ -3,6 +3,7 @@ package com.kuit.afternote.feature.dailyrecord.presentation.viewmodel import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.kuit.afternote.feature.afternote.domain.model.GetAfternotesInput import com.kuit.afternote.feature.afternote.domain.model.Item import com.kuit.afternote.feature.afternote.domain.usecase.GetAfternotesUseCase import com.kuit.afternote.feature.dailyrecord.data.dto.EmotionResponse @@ -179,7 +180,13 @@ class MindRecordViewModel private fun loadAfternoteRecords() { viewModelScope.launch { - getAfternotesUseCase(category = null, page = 0, size = 50).fold( + val input = + GetAfternotesInput( + category = null, + page = 0, + size = 50, + ) + getAfternotesUseCase(input).fold( onSuccess = { pagedData -> // 매핑 함수 사용 _afternoteRecords.value = pagedData.items.map { it.toMindRecordUiModel() } diff --git a/app/src/test/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImplTest.kt b/app/src/test/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImplTest.kt index 7fa75e4c..3ca64b58 100644 --- a/app/src/test/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImplTest.kt +++ b/app/src/test/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImplTest.kt @@ -62,7 +62,7 @@ class AfternoteRepositoryImplTest { coEvery { api.getAfternotes(category = null, page = 0, size = 10) } returns BaseResponse(status = 200, code = 0, message = "OK", data = listDto) - val result = repository.getAfternotes(category = null, page = 0, size = 10) + val result = repository.getAfternotes() assertTrue(result.isSuccess) val paged = result.getOrNull() @@ -202,11 +202,7 @@ class AfternoteRepositoryImplTest { ) val result = - repository.createPlaylist( - title = "마지막 플레이리스트", - playlist = playlist, - receiverIds = emptyList(), - ) + repository.createPlaylist() assertTrue(result.isSuccess) assertEquals(7L, result.getOrNull()) diff --git a/app/src/test/java/com/kuit/afternote/feature/afternote/domain/usecase/CreatePlaylistAfternoteUseCaseTest.kt b/app/src/test/java/com/kuit/afternote/feature/afternote/domain/usecase/CreatePlaylistAfternoteUseCaseTest.kt index ce7c9c51..a05b40c7 100644 --- a/app/src/test/java/com/kuit/afternote/feature/afternote/domain/usecase/CreatePlaylistAfternoteUseCaseTest.kt +++ b/app/src/test/java/com/kuit/afternote/feature/afternote/domain/usecase/CreatePlaylistAfternoteUseCaseTest.kt @@ -33,11 +33,7 @@ class CreatePlaylistAfternoteUseCaseTest { memorialVideo = null, ) coEvery { - repository.createPlaylist( - title = any(), - playlist = any(), - receiverIds = any(), - ) + repository.createPlaylist() } returns Result.success(7L) val result = useCase(title = "마지막 플레이리스트", playlist = playlist) @@ -45,11 +41,7 @@ class CreatePlaylistAfternoteUseCaseTest { assertTrue(result.isSuccess) assertEquals(7L, result.getOrNull()) coVerify(exactly = 1) { - repository.createPlaylist( - title = "마지막 플레이리스트", - playlist = playlist, - receiverIds = emptyList(), - ) + repository.createPlaylist() } } @@ -64,11 +56,7 @@ class CreatePlaylistAfternoteUseCaseTest { memorialVideo = null, ) coEvery { - repository.createPlaylist( - title = any(), - playlist = any(), - receiverIds = any(), - ) + repository.createPlaylist() } returns Result.failure(RuntimeException("Validation failed")) val result = useCase(title = "제목", playlist = playlist) From e0b83629deb30468a6457ad8a1b97d5a2b6d53fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Fri, 20 Mar 2026 20:29:58 +0900 Subject: [PATCH 07/12] =?UTF-8?q?refactor(afternote):=20AfternoteMapper?= =?UTF-8?q?=EB=A5=BC=20=ED=99=95=EC=9E=A5=20=ED=95=A8=EC=88=98=EB=A1=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AfternoteMapper object를 제거하고 Kotlin 확장 함수(Extension Functions) 형태로 전환 - AfternoteRepositoryImpl에서 변경된 확장 함수를 사용하도록 수정 - Detail 도메인 매핑 로직의 가독성 개선을 위해 내부 구조 정리 및 리팩토링 --- .../afternote/data/mapper/AfternoteMapper.kt | 185 ++++++++++-------- .../repositoryimpl/AfternoteRepositoryImpl.kt | 7 +- 2 files changed, 105 insertions(+), 87 deletions(-) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt index 8a2b13fe..109064c9 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt @@ -2,6 +2,8 @@ package com.kuit.afternote.feature.afternote.data.mapper import com.kuit.afternote.domain.model.AfternoteServiceType import com.kuit.afternote.feature.afternote.data.dto.AfternoteListItem +import com.kuit.afternote.feature.afternote.data.dto.AfternotePlaylist +import com.kuit.afternote.feature.afternote.data.dto.AfternoteSong import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteDetailResponse import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteListResponse import com.kuit.afternote.feature.afternote.domain.model.Detail @@ -18,98 +20,113 @@ import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistDetail /** * Maps server DTOs to domain models at the boundary only. */ -object AfternoteMapper { - // -- List mapping -- +// -- List mapping -- - fun toDomain(dto: AfternoteListItem): Item = - Item( - id = dto.afternoteId.toString(), - serviceName = dto.title, - date = formatDateFromServer(dto.createdAt), - type = categoryToServiceType(dto.category), - ) +fun AfternoteListItem.toDomain() = + Item( + id = afternoteId.toString(), + serviceName = title, + date = formatDateFromServer(createdAt), + type = categoryToServiceType(category), + ) - fun toDomainList(dtos: List): List = dtos.map { toDomain(it) } +fun List.toDomainList() = map { it.toDomain() } - // -- Detail mapping -- +// -- Detail mapping -- - fun toDetailDomain(dto: AfternoteDetailResponse): Detail = - Detail( - id = dto.afternoteId, - category = dto.category, - title = dto.title, - timestamps = - DetailTimestamps( - createdAt = formatDateFromServer(dto.createdAt), - updatedAt = formatDateFromServer(dto.createdAt), - ), - type = categoryToServiceType(dto.category), - credentials = - DetailCredentials( - id = dto.credentials?.id, - password = dto.credentials?.password, - ), - receivers = - dto.receivers?.map { r -> - DetailReceiver( - receiverId = r.receiverId, - name = r.name ?: "", - relation = r.relation ?: "", - phone = r.phone ?: "", - ) - } ?: emptyList(), - processing = - DetailProcessing( - method = dto.processMethod, - actions = dto.actions ?: emptyList(), - leaveMessage = dto.leaveMessage, - ), - playlist = - dto.playlist?.let { p -> - PlaylistDetail( - profilePhoto = p.profilePhoto, - atmosphere = p.atmosphere, - songs = - p.songs.map { s -> - DetailSong( - id = s.id, - title = s.title, - artist = s.artist, - coverUrl = s.coverUrl, - ) - }, - playlistDetailMemorialMedia = - PlaylistDetailMemorialMedia( - photoUrl = p.memorialPhotoUrl ?: p.profilePhoto, - videoUrl = p.memorialVideo?.videoUrl, - thumbnailUrl = p.memorialVideo?.thumbnailUrl, - ), - ) - }, +fun AfternoteDetailResponse.toDetailDomain(): Detail { + val timestamps = + DetailTimestamps( + createdAt = formatDateFromServer(createdAt), + updatedAt = formatDateFromServer(createdAt), ) - - fun toPagedNotes(data: AfternoteListResponse) = - PagedAfternotes( - items = toDomainList(data.content), - hasNext = data.hasNext, + val detailCredentials = + DetailCredentials( + id = credentials?.id, + password = credentials?.password, ) + val receivers = + receivers?.map { + DetailReceiver( + receiverId = it.receiverId, + name = it.name ?: "", + relation = it.relation ?: "", + phone = it.phone ?: "", + ) + } ?: emptyList() + val detailProcessing = + DetailProcessing( + method = processMethod, + actions = actions ?: emptyList(), + leaveMessage = leaveMessage, + ) + val detailSong: (AfternoteSong) -> DetailSong = { s -> + DetailSong( + id = s.id, + title = s.title, + artist = s.artist, + coverUrl = s.coverUrl, + ) + } - // -- Internal helpers -- - - private fun formatDateFromServer(createdAt: String): String = - try { - // Server returns "2025-11-26T14:30:00" -> display "2025.11.26" - val datePart = createdAt.substringBefore('T') - datePart.replace('-', '.') - } catch (_: Exception) { - createdAt + val songs: (AfternotePlaylist) -> List = { + val afternoteSongList = it.songs + afternoteSongList.map { afternoteSong -> + detailSong(afternoteSong) } + } - internal fun categoryToServiceType(category: String): AfternoteServiceType = - when (category.uppercase()) { - "SOCIAL" -> AfternoteServiceType.SOCIAL_NETWORK - "GALLERY" -> AfternoteServiceType.GALLERY_AND_FILES - "MUSIC", "PLAYLIST" -> AfternoteServiceType.MEMORIAL - else -> AfternoteServiceType.SOCIAL_NETWORK + val playlistDetailMemorialMedia: (AfternotePlaylist) -> PlaylistDetailMemorialMedia = { + PlaylistDetailMemorialMedia( + photoUrl = it.memorialPhotoUrl ?: it.profilePhoto, + videoUrl = it.memorialVideo?.videoUrl, + thumbnailUrl = it.memorialVideo?.thumbnailUrl, + ) + } + val playlist = + playlist?.let { + PlaylistDetail( + profilePhoto = it.profilePhoto, + atmosphere = it.atmosphere, + songs = songs(it), + playlistDetailMemorialMedia = playlistDetailMemorialMedia(it), + ) } + + return Detail( + id = afternoteId, + category = category, + title = title, + timestamps = timestamps, + type = categoryToServiceType(category), + credentials = detailCredentials, + receivers = receivers, + processing = detailProcessing, + playlist = playlist, + ) } + +fun AfternoteListResponse.toPagedNotes() = + PagedAfternotes( + items = content.toDomainList(), + hasNext = hasNext, + ) + +// -- Internal helpers -- + +private fun formatDateFromServer(createdAt: String): String = + try { + // Server returns "2025-11-26T14:30:00" -> display "2025.11.26" + val datePart = createdAt.substringBefore('T') + datePart.replace('-', '.') + } catch (_: Exception) { + createdAt + } + +internal fun categoryToServiceType(category: String): AfternoteServiceType = + when (category.uppercase()) { + "SOCIAL" -> AfternoteServiceType.SOCIAL_NETWORK + "GALLERY" -> AfternoteServiceType.GALLERY_AND_FILES + "MUSIC", "PLAYLIST" -> AfternoteServiceType.MEMORIAL + else -> AfternoteServiceType.SOCIAL_NETWORK + } diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt index 0efc9e06..6a013039 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt @@ -8,8 +8,9 @@ import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreateGall import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreatePlaylistRequest import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreateSocialRequest import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteIdResponse -import com.kuit.afternote.feature.afternote.data.mapper.AfternoteMapper +import com.kuit.afternote.feature.afternote.data.mapper.toDetailDomain import com.kuit.afternote.feature.afternote.data.mapper.toDto +import com.kuit.afternote.feature.afternote.data.mapper.toPagedNotes import com.kuit.afternote.feature.afternote.data.service.AfternoteApiService import com.kuit.afternote.feature.afternote.domain.model.CreateGalleryInput import com.kuit.afternote.feature.afternote.domain.model.CreateSocialInput @@ -40,7 +41,7 @@ class AfternoteRepositoryImpl size = input.size, ) val data = response.requireData() - AfternoteMapper.toPagedNotes(data) + data.toPagedNotes() }.logFailure() override suspend fun createSocial(input: CreateSocialInput): Result = @@ -83,7 +84,7 @@ class AfternoteRepositoryImpl runCatching { val response = api.getAfternoteDetail(afternoteId = afternoteId) val data = response.requireData() - AfternoteMapper.toDetailDomain(data) + data.toDetailDomain() }.logFailure() /** From 62363c72e4addf780a863cfc3848ff2bebfd2778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Fri, 20 Mar 2026 21:00:38 +0900 Subject: [PATCH 08/12] =?UTF-8?q?refactor(afternote):=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=A7=A4=ED=8D=BC=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EA=B5=AC=EC=A1=B0=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `AfternoteMapper.kt`에 집중되어 있던 매퍼 함수들을 역할에 따라 분리 - `PlaylistInputMapper.kt`: 플레이리스트 입력 관련 DTO 변환 로직 추가 - `ResponseMapper.kt`: API 응답값에 대한 도메인 모델 변환 로직 이동 및 가독성 개선 - `AfternoteInputMapper.kt`: 중복된 DTO 변환 로직 제거 - `formatDateFromServer` 함수 접근 제어자를 `internal`로 변경하여 공유 가능하도록 수정 --- .../data/mapper/AfternoteInputMapper.kt | 21 ---- .../afternote/data/mapper/AfternoteMapper.kt | 96 +----------------- .../data/mapper/PlaylistInputMapper.kt | 23 +++++ .../afternote/data/mapper/ResponseMapper.kt | 97 +++++++++++++++++++ 4 files changed, 121 insertions(+), 116 deletions(-) create mode 100644 app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/PlaylistInputMapper.kt create mode 100644 app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/ResponseMapper.kt diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteInputMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteInputMapper.kt index 92341a5c..53e0134a 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteInputMapper.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteInputMapper.kt @@ -2,25 +2,12 @@ package com.kuit.afternote.feature.afternote.data.mapper import com.kuit.afternote.feature.afternote.data.dto.AfternoteCredentials import com.kuit.afternote.feature.afternote.data.dto.AfternoteMemorialVideo -import com.kuit.afternote.feature.afternote.data.dto.AfternotePlaylist import com.kuit.afternote.feature.afternote.data.dto.AfternoteReceiverRef -import com.kuit.afternote.feature.afternote.data.dto.AfternoteSong import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteUpdateRequest import com.kuit.afternote.feature.afternote.domain.model.CredentialsInput import com.kuit.afternote.feature.afternote.domain.model.ReceiverRefInput import com.kuit.afternote.feature.afternote.domain.model.UpdateRequestInput import com.kuit.afternote.feature.afternote.domain.model.playlist.MemorialVideoInput -import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistInput -import com.kuit.afternote.feature.afternote.domain.model.playlist.SongInput - -fun PlaylistInput.toDto() = - AfternotePlaylist( - profilePhoto = profilePhoto, - atmosphere = atmosphere, - memorialPhotoUrl = memorialPhotoUrl, - songs = songs.map { it.toDto() }, - memorialVideo = memorialVideo?.toDto(), - ) fun MemorialVideoInput.toDto() = AfternoteMemorialVideo( @@ -28,14 +15,6 @@ fun MemorialVideoInput.toDto() = thumbnailUrl = thumbnailUrl, ) -fun SongInput.toDto() = - AfternoteSong( - id = id, - title = title, - artist = artist, - coverUrl = coverUrl, - ) - fun UpdateRequestInput.toDto() = AfternoteUpdateRequest( category = category, diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt index 109064c9..a0c15d16 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt @@ -2,25 +2,11 @@ package com.kuit.afternote.feature.afternote.data.mapper import com.kuit.afternote.domain.model.AfternoteServiceType import com.kuit.afternote.feature.afternote.data.dto.AfternoteListItem -import com.kuit.afternote.feature.afternote.data.dto.AfternotePlaylist -import com.kuit.afternote.feature.afternote.data.dto.AfternoteSong -import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteDetailResponse -import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteListResponse -import com.kuit.afternote.feature.afternote.domain.model.Detail -import com.kuit.afternote.feature.afternote.domain.model.DetailCredentials -import com.kuit.afternote.feature.afternote.domain.model.DetailProcessing -import com.kuit.afternote.feature.afternote.domain.model.DetailReceiver -import com.kuit.afternote.feature.afternote.domain.model.DetailTimestamps import com.kuit.afternote.feature.afternote.domain.model.Item -import com.kuit.afternote.feature.afternote.domain.model.PagedAfternotes -import com.kuit.afternote.feature.afternote.domain.model.playlist.DetailSong -import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistDetail -import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistDetailMemorialMedia /** * Maps server DTOs to domain models at the boundary only. */ -// -- List mapping -- fun AfternoteListItem.toDomain() = Item( @@ -32,89 +18,9 @@ fun AfternoteListItem.toDomain() = fun List.toDomainList() = map { it.toDomain() } -// -- Detail mapping -- - -fun AfternoteDetailResponse.toDetailDomain(): Detail { - val timestamps = - DetailTimestamps( - createdAt = formatDateFromServer(createdAt), - updatedAt = formatDateFromServer(createdAt), - ) - val detailCredentials = - DetailCredentials( - id = credentials?.id, - password = credentials?.password, - ) - val receivers = - receivers?.map { - DetailReceiver( - receiverId = it.receiverId, - name = it.name ?: "", - relation = it.relation ?: "", - phone = it.phone ?: "", - ) - } ?: emptyList() - val detailProcessing = - DetailProcessing( - method = processMethod, - actions = actions ?: emptyList(), - leaveMessage = leaveMessage, - ) - val detailSong: (AfternoteSong) -> DetailSong = { s -> - DetailSong( - id = s.id, - title = s.title, - artist = s.artist, - coverUrl = s.coverUrl, - ) - } - - val songs: (AfternotePlaylist) -> List = { - val afternoteSongList = it.songs - afternoteSongList.map { afternoteSong -> - detailSong(afternoteSong) - } - } - - val playlistDetailMemorialMedia: (AfternotePlaylist) -> PlaylistDetailMemorialMedia = { - PlaylistDetailMemorialMedia( - photoUrl = it.memorialPhotoUrl ?: it.profilePhoto, - videoUrl = it.memorialVideo?.videoUrl, - thumbnailUrl = it.memorialVideo?.thumbnailUrl, - ) - } - val playlist = - playlist?.let { - PlaylistDetail( - profilePhoto = it.profilePhoto, - atmosphere = it.atmosphere, - songs = songs(it), - playlistDetailMemorialMedia = playlistDetailMemorialMedia(it), - ) - } - - return Detail( - id = afternoteId, - category = category, - title = title, - timestamps = timestamps, - type = categoryToServiceType(category), - credentials = detailCredentials, - receivers = receivers, - processing = detailProcessing, - playlist = playlist, - ) -} - -fun AfternoteListResponse.toPagedNotes() = - PagedAfternotes( - items = content.toDomainList(), - hasNext = hasNext, - ) - // -- Internal helpers -- -private fun formatDateFromServer(createdAt: String): String = +internal fun formatDateFromServer(createdAt: String): String = try { // Server returns "2025-11-26T14:30:00" -> display "2025.11.26" val datePart = createdAt.substringBefore('T') diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/PlaylistInputMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/PlaylistInputMapper.kt new file mode 100644 index 00000000..080339eb --- /dev/null +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/PlaylistInputMapper.kt @@ -0,0 +1,23 @@ +package com.kuit.afternote.feature.afternote.data.mapper + +import com.kuit.afternote.feature.afternote.data.dto.AfternotePlaylist +import com.kuit.afternote.feature.afternote.data.dto.AfternoteSong +import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistInput +import com.kuit.afternote.feature.afternote.domain.model.playlist.SongInput + +fun PlaylistInput.toDto() = + AfternotePlaylist( + profilePhoto = profilePhoto, + atmosphere = atmosphere, + memorialPhotoUrl = memorialPhotoUrl, + songs = songs.map { it.toDto() }, + memorialVideo = memorialVideo?.toDto(), + ) + +fun SongInput.toDto() = + AfternoteSong( + id = id, + title = title, + artist = artist, + coverUrl = coverUrl, + ) \ No newline at end of file diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/ResponseMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/ResponseMapper.kt new file mode 100644 index 00000000..a1249bb2 --- /dev/null +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/ResponseMapper.kt @@ -0,0 +1,97 @@ +package com.kuit.afternote.feature.afternote.data.mapper + +import com.kuit.afternote.feature.afternote.data.dto.AfternoteDetailReceiver +import com.kuit.afternote.feature.afternote.data.dto.AfternotePlaylist +import com.kuit.afternote.feature.afternote.data.dto.AfternoteSong +import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteDetailResponse +import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteListResponse +import com.kuit.afternote.feature.afternote.domain.model.Detail +import com.kuit.afternote.feature.afternote.domain.model.DetailCredentials +import com.kuit.afternote.feature.afternote.domain.model.DetailProcessing +import com.kuit.afternote.feature.afternote.domain.model.DetailReceiver +import com.kuit.afternote.feature.afternote.domain.model.DetailTimestamps +import com.kuit.afternote.feature.afternote.domain.model.PagedAfternotes +import com.kuit.afternote.feature.afternote.domain.model.playlist.DetailSong +import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistDetail +import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistDetailMemorialMedia + +fun AfternoteDetailResponse.toDetailDomain(): Detail { + val timestamps = + DetailTimestamps( + createdAt = formatDateFromServer(createdAt), + updatedAt = formatDateFromServer(createdAt), + ) + val detailCredentials = + DetailCredentials( + id = credentials?.id, + password = credentials?.password, + ) + val toDetailReceiver: (AfternoteDetailReceiver) -> DetailReceiver = { + DetailReceiver( + receiverId = it.receiverId, + name = it.name ?: "", + relation = it.relation ?: "", + phone = it.phone ?: "", + ) + } + val receivers = + receivers?.map { + toDetailReceiver(it) + } ?: emptyList() + val detailProcessing = + DetailProcessing( + method = processMethod, + actions = actions ?: emptyList(), + leaveMessage = leaveMessage, + ) + val toDetailSong: (AfternoteSong) -> DetailSong = { s -> + DetailSong( + id = s.id, + title = s.title, + artist = s.artist, + coverUrl = s.coverUrl, + ) + } + + val toDetailSongList: (AfternotePlaylist) -> List = { + val afternoteSongList = it.songs + afternoteSongList.map { afternoteSong -> + toDetailSong(afternoteSong) + } + } + + val playlistDetailMemorialMedia: (AfternotePlaylist) -> PlaylistDetailMemorialMedia = { + PlaylistDetailMemorialMedia( + photoUrl = it.memorialPhotoUrl ?: it.profilePhoto, + videoUrl = it.memorialVideo?.videoUrl, + thumbnailUrl = it.memorialVideo?.thumbnailUrl, + ) + } + val playlist = + playlist?.let { + PlaylistDetail( + profilePhoto = it.profilePhoto, + atmosphere = it.atmosphere, + songs = toDetailSongList(it), + playlistDetailMemorialMedia = playlistDetailMemorialMedia(it), + ) + } + + return Detail( + id = afternoteId, + category = category, + title = title, + timestamps = timestamps, + type = categoryToServiceType(category), + credentials = detailCredentials, + receivers = receivers, + processing = detailProcessing, + playlist = playlist, + ) +} + +fun AfternoteListResponse.toPagedNotes() = + PagedAfternotes( + items = content.toDomainList(), + hasNext = hasNext, + ) From 50459bc8cd4927d452c5614232f6fee91949eee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Fri, 20 Mar 2026 21:51:42 +0900 Subject: [PATCH 09/12] =?UTF-8?q?refactor(afternote):=20ResponseMapper=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EB=A7=A4=ED=95=91=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=EC=A1=B0=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `ResponseMapper.kt`를 삭제하고 `DetailResponseMapper.kt`와 `ListResponseMapper.kt`로 분리 - `DetailResponseMapper` 내 복잡한 변환 로직을 도메인 모델별 확장 함수 및 private 함수로 분할하여 가독성 향상 - `AfternoteMapper.kt`의 날짜 포맷팅 함수 파라미터명 변경 및 `updatedAt` 매핑 오류 수정 - 파일 분리에 따른 `AfternoteRepositoryImpl.kt`의 import 경로 수정 --- .../afternote/data/mapper/AfternoteMapper.kt | 6 +- .../afternote/data/mapper/ResponseMapper.kt | 97 ------------------- .../mapper/response/DetailResponseMapper.kt | 85 ++++++++++++++++ .../mapper/response/ListResponseMapper.kt | 11 +++ .../repositoryimpl/AfternoteRepositoryImpl.kt | 4 +- 5 files changed, 101 insertions(+), 102 deletions(-) delete mode 100644 app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/ResponseMapper.kt create mode 100644 app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/DetailResponseMapper.kt create mode 100644 app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/ListResponseMapper.kt diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt index a0c15d16..77c32840 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt @@ -20,13 +20,13 @@ fun List.toDomainList() = map { it.toDomain() } // -- Internal helpers -- -internal fun formatDateFromServer(createdAt: String): String = +internal fun formatDateFromServer(serverDateTime: String): String = try { // Server returns "2025-11-26T14:30:00" -> display "2025.11.26" - val datePart = createdAt.substringBefore('T') + val datePart = serverDateTime.substringBefore('T') datePart.replace('-', '.') } catch (_: Exception) { - createdAt + serverDateTime } internal fun categoryToServiceType(category: String): AfternoteServiceType = diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/ResponseMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/ResponseMapper.kt deleted file mode 100644 index a1249bb2..00000000 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/ResponseMapper.kt +++ /dev/null @@ -1,97 +0,0 @@ -package com.kuit.afternote.feature.afternote.data.mapper - -import com.kuit.afternote.feature.afternote.data.dto.AfternoteDetailReceiver -import com.kuit.afternote.feature.afternote.data.dto.AfternotePlaylist -import com.kuit.afternote.feature.afternote.data.dto.AfternoteSong -import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteDetailResponse -import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteListResponse -import com.kuit.afternote.feature.afternote.domain.model.Detail -import com.kuit.afternote.feature.afternote.domain.model.DetailCredentials -import com.kuit.afternote.feature.afternote.domain.model.DetailProcessing -import com.kuit.afternote.feature.afternote.domain.model.DetailReceiver -import com.kuit.afternote.feature.afternote.domain.model.DetailTimestamps -import com.kuit.afternote.feature.afternote.domain.model.PagedAfternotes -import com.kuit.afternote.feature.afternote.domain.model.playlist.DetailSong -import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistDetail -import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistDetailMemorialMedia - -fun AfternoteDetailResponse.toDetailDomain(): Detail { - val timestamps = - DetailTimestamps( - createdAt = formatDateFromServer(createdAt), - updatedAt = formatDateFromServer(createdAt), - ) - val detailCredentials = - DetailCredentials( - id = credentials?.id, - password = credentials?.password, - ) - val toDetailReceiver: (AfternoteDetailReceiver) -> DetailReceiver = { - DetailReceiver( - receiverId = it.receiverId, - name = it.name ?: "", - relation = it.relation ?: "", - phone = it.phone ?: "", - ) - } - val receivers = - receivers?.map { - toDetailReceiver(it) - } ?: emptyList() - val detailProcessing = - DetailProcessing( - method = processMethod, - actions = actions ?: emptyList(), - leaveMessage = leaveMessage, - ) - val toDetailSong: (AfternoteSong) -> DetailSong = { s -> - DetailSong( - id = s.id, - title = s.title, - artist = s.artist, - coverUrl = s.coverUrl, - ) - } - - val toDetailSongList: (AfternotePlaylist) -> List = { - val afternoteSongList = it.songs - afternoteSongList.map { afternoteSong -> - toDetailSong(afternoteSong) - } - } - - val playlistDetailMemorialMedia: (AfternotePlaylist) -> PlaylistDetailMemorialMedia = { - PlaylistDetailMemorialMedia( - photoUrl = it.memorialPhotoUrl ?: it.profilePhoto, - videoUrl = it.memorialVideo?.videoUrl, - thumbnailUrl = it.memorialVideo?.thumbnailUrl, - ) - } - val playlist = - playlist?.let { - PlaylistDetail( - profilePhoto = it.profilePhoto, - atmosphere = it.atmosphere, - songs = toDetailSongList(it), - playlistDetailMemorialMedia = playlistDetailMemorialMedia(it), - ) - } - - return Detail( - id = afternoteId, - category = category, - title = title, - timestamps = timestamps, - type = categoryToServiceType(category), - credentials = detailCredentials, - receivers = receivers, - processing = detailProcessing, - playlist = playlist, - ) -} - -fun AfternoteListResponse.toPagedNotes() = - PagedAfternotes( - items = content.toDomainList(), - hasNext = hasNext, - ) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/DetailResponseMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/DetailResponseMapper.kt new file mode 100644 index 00000000..7321fa1f --- /dev/null +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/DetailResponseMapper.kt @@ -0,0 +1,85 @@ +package com.kuit.afternote.feature.afternote.data.mapper.response + +import com.kuit.afternote.feature.afternote.data.dto.AfternoteCredentials +import com.kuit.afternote.feature.afternote.data.dto.AfternoteDetailReceiver +import com.kuit.afternote.feature.afternote.data.dto.AfternotePlaylist +import com.kuit.afternote.feature.afternote.data.dto.AfternoteSong +import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteDetailResponse +import com.kuit.afternote.feature.afternote.data.mapper.categoryToServiceType +import com.kuit.afternote.feature.afternote.data.mapper.formatDateFromServer +import com.kuit.afternote.feature.afternote.domain.model.Detail +import com.kuit.afternote.feature.afternote.domain.model.DetailCredentials +import com.kuit.afternote.feature.afternote.domain.model.DetailProcessing +import com.kuit.afternote.feature.afternote.domain.model.DetailReceiver +import com.kuit.afternote.feature.afternote.domain.model.DetailTimestamps +import com.kuit.afternote.feature.afternote.domain.model.playlist.DetailSong +import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistDetail +import com.kuit.afternote.feature.afternote.domain.model.playlist.PlaylistDetailMemorialMedia + +fun AfternoteDetailResponse.toDetailDomain(): Detail = + Detail( + id = afternoteId, + category = category, + title = title, + timestamps = toTimestamps(), + type = categoryToServiceType(category), + credentials = credentials?.toDomain(), + receivers = receivers.toDomain(), + processing = toProcessing(), + playlist = playlist?.toDomain(), + ) + +fun List?.toDomain() = + this?.map { a -> + a.toDomain() + } ?: emptyList() + +private fun AfternoteDetailResponse.toTimestamps(): DetailTimestamps = + DetailTimestamps( + createdAt = formatDateFromServer(createdAt), + updatedAt = formatDateFromServer(updatedAt), + ) + +private fun AfternoteDetailResponse.toProcessing() = + DetailProcessing( + method = processMethod, + actions = actions ?: emptyList(), + leaveMessage = leaveMessage, + ) + +private fun AfternoteCredentials.toDomain() = + DetailCredentials( + id = id, + password = password, + ) + +private fun AfternotePlaylist.toDomain(): PlaylistDetail { + val playlistDetailMemorialMedia = + PlaylistDetailMemorialMedia( + photoUrl = memorialPhotoUrl ?: profilePhoto, + videoUrl = memorialVideo?.videoUrl, + thumbnailUrl = memorialVideo?.thumbnailUrl, + ) + return PlaylistDetail( + profilePhoto = profilePhoto, + atmosphere = atmosphere, + songs = songs.map { it.toDomain() }, + playlistDetailMemorialMedia = playlistDetailMemorialMedia, + ) +} + +private fun AfternoteDetailReceiver.toDomain() = + DetailReceiver( + receiverId = receiverId, + name = name ?: "", + relation = relation ?: "", + phone = phone ?: "", + ) + +private fun AfternoteSong.toDomain() = + DetailSong( + id = id, + title = title, + artist = artist, + coverUrl = coverUrl, + ) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/ListResponseMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/ListResponseMapper.kt new file mode 100644 index 00000000..a183cd8a --- /dev/null +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/ListResponseMapper.kt @@ -0,0 +1,11 @@ +package com.kuit.afternote.feature.afternote.data.mapper.response + +import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteListResponse +import com.kuit.afternote.feature.afternote.data.mapper.toDomainList +import com.kuit.afternote.feature.afternote.domain.model.PagedAfternotes + +fun AfternoteListResponse.toPagedNotes() = + PagedAfternotes( + items = content.toDomainList(), + hasNext = hasNext, + ) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt index 6a013039..b3f8674c 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt @@ -8,9 +8,9 @@ import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreateGall import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreatePlaylistRequest import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreateSocialRequest import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteIdResponse -import com.kuit.afternote.feature.afternote.data.mapper.toDetailDomain +import com.kuit.afternote.feature.afternote.data.mapper.response.toDetailDomain +import com.kuit.afternote.feature.afternote.data.mapper.response.toPagedNotes import com.kuit.afternote.feature.afternote.data.mapper.toDto -import com.kuit.afternote.feature.afternote.data.mapper.toPagedNotes import com.kuit.afternote.feature.afternote.data.service.AfternoteApiService import com.kuit.afternote.feature.afternote.domain.model.CreateGalleryInput import com.kuit.afternote.feature.afternote.domain.model.CreateSocialInput From 9493f21690402d825950ef89d022eba84bde6180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Fri, 20 Mar 2026 22:12:03 +0900 Subject: [PATCH 10/12] =?UTF-8?q?refactor(afternote):=20CreateInput=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=EC=97=90=20toRequest=20=EB=B3=80=ED=99=98=20?= =?UTF-8?q?=ED=99=95=EC=9E=A5=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A7=A4=ED=8D=BC=20=EA=B5=AC=EC=A1=B0=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `CreateSocialInput`, `CreateGalleryInput`, `CreatePlaylistInput`에 DTO 요청 객체로 변환하는 `toRequest()` 확장 함수 추가 - `AfternoteRepositoryImpl`에서 직접 요청 객체를 생성하던 로직을 도메인 모델의 `toRequest()` 호출로 간결화 - `PlaylistInputMapper`, `AfternoteInputMapper`, `DetailResponseMapper` 내부 변환 함수들을 `private`으로 캡슐화하고 리스트 변환 로직 개선 - `AfternoteRepositoryImpl`의 `updateAfternote` 로직 가독성 개선 및 로그 출력 구조 변경 --- .../data/mapper/AfternoteInputMapper.kt | 9 +++- .../data/mapper/PlaylistInputMapper.kt | 11 +++-- .../mapper/response/DetailResponseMapper.kt | 2 +- .../repositoryimpl/AfternoteRepositoryImpl.kt | 43 +++++-------------- .../domain/model/CreateGalleryInput.kt | 13 ++++++ .../domain/model/CreateSocialInput.kt | 15 +++++++ .../model/playlist/CreatePlaylistInput.kt | 12 ++++++ 7 files changed, 66 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteInputMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteInputMapper.kt index 53e0134a..beb6f444 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteInputMapper.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteInputMapper.kt @@ -23,7 +23,7 @@ fun UpdateRequestInput.toDto() = actions = actions, leaveMessage = leaveMessage, credentials = credentials?.toDto(), - receivers = receivers?.map { it.toDto() }, + receivers = receivers?.toDto(), playlist = playlist?.toDto(), ) @@ -33,7 +33,12 @@ fun CredentialsInput.toDto() = password = password, ) -fun ReceiverRefInput.toDto() = +private fun ReceiverRefInput.toDto() = AfternoteReceiverRef( receiverId = receiverId, ) + +private fun List?.toDto() = + this?.map { + it.toDto() + } diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/PlaylistInputMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/PlaylistInputMapper.kt index 080339eb..4339c82b 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/PlaylistInputMapper.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/PlaylistInputMapper.kt @@ -10,14 +10,19 @@ fun PlaylistInput.toDto() = profilePhoto = profilePhoto, atmosphere = atmosphere, memorialPhotoUrl = memorialPhotoUrl, - songs = songs.map { it.toDto() }, + songs = songs.toDto(), memorialVideo = memorialVideo?.toDto(), ) -fun SongInput.toDto() = +private fun SongInput.toDto() = AfternoteSong( id = id, title = title, artist = artist, coverUrl = coverUrl, - ) \ No newline at end of file + ) + +private fun List.toDto() = + map { + it.toDto() + } diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/DetailResponseMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/DetailResponseMapper.kt index 7321fa1f..9c36e979 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/DetailResponseMapper.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/DetailResponseMapper.kt @@ -29,7 +29,7 @@ fun AfternoteDetailResponse.toDetailDomain(): Detail = playlist = playlist?.toDomain(), ) -fun List?.toDomain() = +private fun List?.toDomain() = this?.map { a -> a.toDomain() } ?: emptyList() diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt index b3f8674c..942c88f8 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/AfternoteRepositoryImpl.kt @@ -3,10 +3,6 @@ package com.kuit.afternote.feature.afternote.data.repositoryimpl import android.util.Log import com.kuit.afternote.data.dto.response.requireData import com.kuit.afternote.data.dto.response.requireStatus -import com.kuit.afternote.feature.afternote.data.dto.AfternoteReceiverRef -import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreateGalleryRequest -import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreatePlaylistRequest -import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreateSocialRequest import com.kuit.afternote.feature.afternote.data.dto.response.AfternoteIdResponse import com.kuit.afternote.feature.afternote.data.mapper.response.toDetailDomain import com.kuit.afternote.feature.afternote.data.mapper.response.toPagedNotes @@ -19,6 +15,8 @@ import com.kuit.afternote.feature.afternote.domain.model.GetAfternotesInput import com.kuit.afternote.feature.afternote.domain.model.PagedAfternotes import com.kuit.afternote.feature.afternote.domain.model.UpdateRequestInput import com.kuit.afternote.feature.afternote.domain.model.playlist.CreatePlaylistInput +import com.kuit.afternote.feature.afternote.domain.model.playlist.toRequest +import com.kuit.afternote.feature.afternote.domain.model.toRequest import com.kuit.afternote.feature.afternote.domain.repository.AfternoteRepository import javax.inject.Inject @@ -46,16 +44,7 @@ class AfternoteRepositoryImpl override suspend fun createSocial(input: CreateSocialInput): Result = runCatching { - val request = - AfternoteCreateSocialRequest( - category = "SOCIAL", - title = input.title, - processMethod = input.processMethod, - actions = input.actions, - leaveMessage = input.leaveMessage, - credentials = input.credentials?.toDto(), - receivers = input.receiverIds.map { AfternoteReceiverRef(receiverId = it) }, - ) + val request = input.toRequest() val response = api.createAfternoteSocial(request) val data = response.requireData() getAfternoteId(data) @@ -63,15 +52,7 @@ class AfternoteRepositoryImpl override suspend fun createGallery(input: CreateGalleryInput): Result = runCatching { - val request = - AfternoteCreateGalleryRequest( - category = "GALLERY", - title = input.title, - processMethod = input.processMethod, - actions = input.actions, - leaveMessage = input.leaveMessage, - receivers = input.receiverIds.map { AfternoteReceiverRef(receiverId = it) }, - ) + val request = input.toRequest() val response = api.createAfternoteGallery(request) val data = response.requireData() getAfternoteId(data) @@ -92,13 +73,7 @@ class AfternoteRepositoryImpl */ override suspend fun createPlaylist(input: CreatePlaylistInput): Result = runCatching { - val request = - AfternoteCreatePlaylistRequest( - category = "PLAYLIST", - title = input.title, - playlist = input.playlist.toDto(), - receivers = input.receiverIds.map { AfternoteReceiverRef(receiverId = it) }, - ) + val request = input.toRequest() val response = api.createAfternotePlaylist(request) val data = response.requireData() getAfternoteId(data) @@ -110,12 +85,14 @@ class AfternoteRepositoryImpl override suspend fun updateAfternote( afternoteId: Long, input: UpdateRequestInput, - ): Result = - runCatching { - val response = api.updateAfternote(afternoteId = afternoteId, request = input.toDto()) + ): Result { + val request = input.toDto() + return runCatching { + val response = api.updateAfternote(afternoteId = afternoteId, request = request) val data = response.requireData() getAfternoteId(data) }.logFailure() + } /** * DELETE /afternotes/{afternoteId}. diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateGalleryInput.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateGalleryInput.kt index a56b7b6c..2e683c21 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateGalleryInput.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateGalleryInput.kt @@ -1,5 +1,8 @@ package com.kuit.afternote.feature.afternote.domain.model +import com.kuit.afternote.feature.afternote.data.dto.AfternoteReceiverRef +import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreateGalleryRequest + data class CreateGalleryInput( val title: String, val processMethod: String, @@ -7,3 +10,13 @@ data class CreateGalleryInput( val leaveMessage: String? = null, val receiverIds: List = emptyList(), ) + +fun CreateGalleryInput.toRequest() = + AfternoteCreateGalleryRequest( + category = "GALLERY", + title = title, + processMethod = processMethod, + actions = actions, + leaveMessage = leaveMessage, + receivers = receiverIds.map { AfternoteReceiverRef(receiverId = it) }, + ) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateSocialInput.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateSocialInput.kt index 981a2137..8ec12a3b 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateSocialInput.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateSocialInput.kt @@ -1,5 +1,9 @@ package com.kuit.afternote.feature.afternote.domain.model +import com.kuit.afternote.feature.afternote.data.dto.AfternoteReceiverRef +import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreateSocialRequest +import com.kuit.afternote.feature.afternote.data.mapper.toDto + data class CreateSocialInput( val title: String, val processMethod: String, @@ -8,3 +12,14 @@ data class CreateSocialInput( val credentials: CredentialsInput? = null, val receiverIds: List = emptyList(), ) + +fun CreateSocialInput.toRequest() = + AfternoteCreateSocialRequest( + category = "SOCIAL", + title = title, + processMethod = processMethod, + actions = actions, + leaveMessage = leaveMessage, + credentials = credentials?.toDto(), + receivers = receiverIds.map { AfternoteReceiverRef(receiverId = it) }, + ) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/CreatePlaylistInput.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/CreatePlaylistInput.kt index 96bf8965..5415eba7 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/CreatePlaylistInput.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/CreatePlaylistInput.kt @@ -1,7 +1,19 @@ package com.kuit.afternote.feature.afternote.domain.model.playlist +import com.kuit.afternote.feature.afternote.data.dto.AfternoteReceiverRef +import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreatePlaylistRequest +import com.kuit.afternote.feature.afternote.data.mapper.toDto + data class CreatePlaylistInput( val title: String, val playlist: PlaylistInput, val receiverIds: List = emptyList(), ) + +fun CreatePlaylistInput.toRequest() = + AfternoteCreatePlaylistRequest( + category = "PLAYLIST", + title = title, + playlist = playlist.toDto(), + receivers = receiverIds.map { AfternoteReceiverRef(receiverId = it) }, + ) From ef15802157c4fe3077d3020f339b604389beaffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Fri, 20 Mar 2026 22:26:02 +0900 Subject: [PATCH 11/12] =?UTF-8?q?refactor(afternote):=20=EC=9D=8C=EC=95=85?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=20=EC=8B=9C=20=EB=B9=88=20=ED=82=A4?= =?UTF-8?q?=EC=9B=8C=EB=93=9C=20=EC=B2=98=EB=A6=AC=20=EA=B0=9C=EC=84=A0=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A7=A4=ED=8D=BC=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/response/DetailResponseMapper.kt | 20 +++++++++---------- .../MusicSearchRepositoryImpl.kt | 12 ++++++----- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/DetailResponseMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/DetailResponseMapper.kt index 9c36e979..39b16f21 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/DetailResponseMapper.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/response/DetailResponseMapper.kt @@ -53,20 +53,20 @@ private fun AfternoteCredentials.toDomain() = password = password, ) -private fun AfternotePlaylist.toDomain(): PlaylistDetail { - val playlistDetailMemorialMedia = - PlaylistDetailMemorialMedia( - photoUrl = memorialPhotoUrl ?: profilePhoto, - videoUrl = memorialVideo?.videoUrl, - thumbnailUrl = memorialVideo?.thumbnailUrl, - ) - return PlaylistDetail( +private fun AfternotePlaylist.toDomain() = + PlaylistDetail( profilePhoto = profilePhoto, atmosphere = atmosphere, songs = songs.map { it.toDomain() }, - playlistDetailMemorialMedia = playlistDetailMemorialMedia, + playlistDetailMemorialMedia = toMemorialMedia(), + ) + +private fun AfternotePlaylist.toMemorialMedia() = + PlaylistDetailMemorialMedia( + photoUrl = memorialPhotoUrl ?: profilePhoto, + videoUrl = memorialVideo?.videoUrl, + thumbnailUrl = memorialVideo?.thumbnailUrl, ) -} private fun AfternoteDetailReceiver.toDomain() = DetailReceiver( diff --git a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt index 4b5cd95d..6ecd23f0 100644 --- a/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt @@ -15,13 +15,15 @@ class MusicSearchRepositoryImpl constructor( private val api: MusicApiService, ) : MusicSearchRepository { - override suspend fun search(keyword: String): Result> = - runCatching { - val trimmed = keyword.trim() - if (trimmed.isEmpty()) return@runCatching emptyList() + override suspend fun search(keyword: String): Result> { + val trimmed = keyword.trim() + if (trimmed.isEmpty()) return Result.success(emptyList()) + return runCatching { val response = api.search(keyword = trimmed) - response.tracks.mapIndexed { index, dto -> dto.toPlaylistSongDisplay(index) } + val tracks = response.tracks + tracks.mapIndexed { index, dto -> dto.toPlaylistSongDisplay(index) } } + } private fun MusicTrack.toPlaylistSongDisplay(index: Int): SearchedSong { val id = "$artist|$title|$index" From cd47dc5653cd1b980853e00cb1b3f6b609f6130b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Sun, 22 Mar 2026 11:17:06 +0900 Subject: [PATCH 12/12] =?UTF-8?q?refactor(afternote):=20PhotoUploadReposit?= =?UTF-8?q?oryModule=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `PhotoUploadRepositoryModule.kt` 파일을 `com.kuit.afternote.data.di`에서 `com.kuit.afternote.di`로 이동 - 파일 이동에 따른 패키지 경로 선언 수정 --- .../kuit/afternote/{data => }/di/PhotoUploadRepositoryModule.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename app/src/main/java/com/kuit/afternote/{data => }/di/PhotoUploadRepositoryModule.kt (93%) diff --git a/app/src/main/java/com/kuit/afternote/data/di/PhotoUploadRepositoryModule.kt b/app/src/main/java/com/kuit/afternote/di/PhotoUploadRepositoryModule.kt similarity index 93% rename from app/src/main/java/com/kuit/afternote/data/di/PhotoUploadRepositoryModule.kt rename to app/src/main/java/com/kuit/afternote/di/PhotoUploadRepositoryModule.kt index c967e182..9c4a6673 100644 --- a/app/src/main/java/com/kuit/afternote/data/di/PhotoUploadRepositoryModule.kt +++ b/app/src/main/java/com/kuit/afternote/di/PhotoUploadRepositoryModule.kt @@ -1,4 +1,4 @@ -package com.kuit.afternote.data.di +package com.kuit.afternote.di import com.kuit.afternote.data.repositoryimpl.PhotoUploadRepositoryImpl import com.kuit.afternote.domain.repository.PhotoUploadRepository