Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,17 @@ import androidx.paging.PagingData
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.afternote.afternote_fe.test.FailureArtifactRule
import com.afternote.afternote_fe.test.FakeErrorReporter
import com.afternote.afternote_fe.test.FakeUserRepository
import com.afternote.core.ui.theme.AfternoteTheme
import com.afternote.feature.afternote.domain.AfternoteType
import com.afternote.feature.afternote.domain.model.author.AfternoteUpdatePayload
import com.afternote.feature.afternote.domain.model.author.AuthorReceiverEntry
import com.afternote.feature.afternote.domain.model.author.CreateAccountPayload
import com.afternote.feature.afternote.domain.model.author.CreateGalleryPayload
import com.afternote.feature.afternote.domain.model.author.CreateMemorialPayload
import com.afternote.feature.afternote.domain.model.author.Detail
import com.afternote.feature.afternote.domain.model.author.ListItem
import com.afternote.feature.afternote.domain.model.author.ProcessingMethod
import com.afternote.feature.afternote.domain.repository.author.AfternoteRepository
import com.afternote.feature.afternote.domain.repository.author.AuthorReceiverRepository
import com.afternote.feature.afternote.domain.repository.author.MediaInput
import com.afternote.feature.afternote.domain.repository.author.MediaKind
import com.afternote.feature.afternote.domain.repository.author.MemorialMediaUploadRepository
Expand All @@ -39,7 +38,6 @@ import com.afternote.feature.afternote.presentation.author.editor.model.EditorCa
import com.afternote.feature.afternote.presentation.author.editor.model.RegisterAfternotePayload
import com.afternote.feature.afternote.presentation.author.editor.state.AfternoteValidationError
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flowOf
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
Expand Down Expand Up @@ -171,7 +169,7 @@ class AfternoteAuthorAndroidTest {
): AfternoteEditorViewModel =
AfternoteEditorViewModel(
savedStateHandle = savedStateHandle,
authorReceiverRepository = FakeAuthorReceiverRepository(),
userRepository = FakeUserRepository(),
afternoteRepository = repository,
memorialThumbnailUploadRepository = MemorialThumbnailUploadRepository { Result.success("https://cdn.test/thumb.jpg") },
resolveMemorialMediaForSave =
Expand Down Expand Up @@ -202,22 +200,6 @@ class AfternoteAuthorAndroidTest {
)
}

private class FakeAuthorReceiverRepository : AuthorReceiverRepository {
private val receivers = MutableStateFlow(listOf(AuthorReceiverEntry(7L, "김수신", "가족")))

override fun currentAuthorUserId(): Long = 1L

override fun observeReceivers(): Flow<List<AuthorReceiverEntry>> = receivers

override fun currentReceivers(): List<AuthorReceiverEntry> = receivers.value

override suspend fun refreshReceivers(): Result<Unit> = Result.success(Unit)

override suspend fun clearReceivers() {
receivers.value = emptyList()
}
}

private class FakeAfternoteRepository : AfternoteRepository {
val createSocialPayloads = mutableListOf<CreateAccountPayload>()
val createSocialResults = ArrayDeque<Result<Long>>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ import com.afternote.core.ui.theme.AfternoteTheme
import com.afternote.feature.afternote.domain.AfternoteType
import com.afternote.feature.afternote.domain.model.LeaveMessageBlock
import com.afternote.feature.afternote.domain.model.author.AfternoteUpdatePayload
import com.afternote.feature.afternote.domain.model.author.AuthorReceiverEntry
import com.afternote.feature.afternote.domain.model.author.CreateAccountPayload
import com.afternote.feature.afternote.domain.model.author.CreateGalleryPayload
import com.afternote.feature.afternote.domain.model.author.CreateMemorialPayload
Expand All @@ -58,7 +57,6 @@ import com.afternote.feature.afternote.domain.model.author.ListItem
import com.afternote.feature.afternote.domain.model.author.ProcessingMethod
import com.afternote.feature.afternote.domain.model.author.ReceiverRefPayload
import com.afternote.feature.afternote.domain.repository.author.AfternoteRepository
import com.afternote.feature.afternote.domain.repository.author.AuthorReceiverRepository
import com.afternote.feature.afternote.domain.repository.author.MediaInput
import com.afternote.feature.afternote.domain.repository.author.MediaKind
import com.afternote.feature.afternote.domain.repository.author.MemorialMediaUploadRepository
Expand All @@ -81,7 +79,6 @@ import com.afternote.feature.afternote.presentation.author.home.AfternoteHomeEnt
import com.afternote.feature.afternote.presentation.author.home.AfternoteHomeViewModel
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.launch
import org.junit.Assert.assertEquals
Expand Down Expand Up @@ -517,22 +514,6 @@ private class AdvancedAfternoteRepository(
}
}

private class ExtendedAuthorReceiverRepository : AuthorReceiverRepository {
private val receivers = MutableStateFlow(listOf(AuthorReceiverEntry(7L, "김수신", "가족")))

override fun currentAuthorUserId(): Long = 1L

override fun observeReceivers(): Flow<List<AuthorReceiverEntry>> = receivers

override fun currentReceivers(): List<AuthorReceiverEntry> = receivers.value

override suspend fun refreshReceivers(): Result<Unit> = Result.success(Unit)

override suspend fun clearReceivers() {
receivers.value = emptyList()
}
}

private fun detailViewModel(
repository: AdvancedAfternoteRepository,
itemId: Long,
Expand All @@ -550,7 +531,7 @@ private fun editorViewModel(
): AfternoteEditorViewModel =
AfternoteEditorViewModel(
savedStateHandle = SavedStateHandle(mapOf("itemId" to itemId)),
authorReceiverRepository = ExtendedAuthorReceiverRepository(),
userRepository = FakeUserRepository(),
afternoteRepository = repository,
memorialThumbnailUploadRepository =
MemorialThumbnailUploadRepository {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ import androidx.paging.PagingData
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.afternote.afternote_fe.test.FailureArtifactRule
import com.afternote.afternote_fe.test.FakeErrorReporter
import com.afternote.afternote_fe.test.FakeUserRepository
import com.afternote.core.ui.theme.AfternoteTheme
import com.afternote.feature.afternote.domain.AfternoteType
import com.afternote.feature.afternote.domain.model.LeaveMessageBlock
import com.afternote.feature.afternote.domain.model.author.AfternoteAccountCredentials
import com.afternote.feature.afternote.domain.model.author.AfternoteUpdatePayload
import com.afternote.feature.afternote.domain.model.author.AuthorReceiverEntry
import com.afternote.feature.afternote.domain.model.author.CreateAccountPayload
import com.afternote.feature.afternote.domain.model.author.CreateGalleryPayload
import com.afternote.feature.afternote.domain.model.author.CreateMemorialPayload
Expand All @@ -28,7 +28,6 @@ import com.afternote.feature.afternote.domain.model.author.MemorialVideoPayload
import com.afternote.feature.afternote.domain.model.author.MemorialWritePayload
import com.afternote.feature.afternote.domain.model.author.ProcessingMethod
import com.afternote.feature.afternote.domain.repository.author.AfternoteRepository
import com.afternote.feature.afternote.domain.repository.author.AuthorReceiverRepository
import com.afternote.feature.afternote.domain.repository.author.MediaInput
import com.afternote.feature.afternote.domain.repository.author.MediaKind
import com.afternote.feature.afternote.domain.repository.author.MemorialMediaUploadRepository
Expand All @@ -41,7 +40,6 @@ import com.afternote.feature.afternote.presentation.author.editor.message.Editor
import com.afternote.feature.afternote.presentation.author.editor.model.EditorCategory
import com.afternote.feature.afternote.presentation.author.editor.model.RegisterAfternotePayload
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flowOf
import org.junit.Assert.assertEquals
import org.junit.Rule
Expand Down Expand Up @@ -310,22 +308,6 @@ private class ImplementedCoverageAfternoteRepository : AfternoteRepository {
override suspend fun delete(id: Long): Result<Unit> = error("unexpected delete")
}

private class ImplementedCoverageAuthorReceiverRepository : AuthorReceiverRepository {
private val receivers = MutableStateFlow(listOf(AuthorReceiverEntry(7L, "김수신", "가족")))

override fun currentAuthorUserId(): Long = 1L

override fun observeReceivers(): Flow<List<AuthorReceiverEntry>> = receivers

override fun currentReceivers(): List<AuthorReceiverEntry> = receivers.value

override suspend fun refreshReceivers(): Result<Unit> = Result.success(Unit)

override suspend fun clearReceivers() {
receivers.value = emptyList()
}
}

private fun implementedCoverageViewModel(
repository: ImplementedCoverageAfternoteRepository,
savedStateHandle: SavedStateHandle = SavedStateHandle(),
Expand All @@ -334,7 +316,7 @@ private fun implementedCoverageViewModel(
): AfternoteEditorViewModel =
AfternoteEditorViewModel(
savedStateHandle = savedStateHandle,
authorReceiverRepository = ImplementedCoverageAuthorReceiverRepository(),
userRepository = FakeUserRepository(),
afternoteRepository = repository,
memorialThumbnailUploadRepository =
MemorialThumbnailUploadRepository {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package com.afternote.feature.afternote.data.di

import com.afternote.feature.afternote.data.repositoryimpl.author.AfternoteRepositoryImpl
import com.afternote.feature.afternote.data.repositoryimpl.author.AuthorReceiverRepositoryImpl
import com.afternote.feature.afternote.data.repositoryimpl.author.MemorialMediaUploadRepositoryImpl
import com.afternote.feature.afternote.data.repositoryimpl.author.MemorialThumbnailUploadRepositoryImpl
import com.afternote.feature.afternote.data.repositoryimpl.author.MusicSearchRepositoryImpl
import com.afternote.feature.afternote.domain.repository.author.AfternoteRepository
import com.afternote.feature.afternote.domain.repository.author.AuthorReceiverRepository
import com.afternote.feature.afternote.domain.repository.author.MemorialMediaUploadRepository
import com.afternote.feature.afternote.domain.repository.author.MemorialThumbnailUploadRepository
import com.afternote.feature.afternote.domain.repository.author.MusicSearchRepository
Expand All @@ -24,11 +22,6 @@ interface AfternoteAuthorRepositoryModule {
@Singleton
fun bindAfternoteRepository(impl: AfternoteRepositoryImpl): AfternoteRepository

@Suppress("unused")
@Binds
@Singleton
fun bindAuthorReceiverRepository(impl: AuthorReceiverRepositoryImpl): AuthorReceiverRepository

@Suppress("unused")
@Binds
@Singleton
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.navigation.toRoute
import com.afternote.core.common.reporting.ErrorReporter
import com.afternote.core.common.result.runCatchingCancellable
import com.afternote.core.domain.repository.UserRepository
import com.afternote.feature.afternote.domain.error.AfternoteAuthoringValidationException
import com.afternote.feature.afternote.domain.error.AfternoteAuthoringValidationKind
import com.afternote.feature.afternote.domain.model.author.AuthorReceiverEntry
import com.afternote.feature.afternote.domain.model.author.CreateAfternoteInput
import com.afternote.feature.afternote.domain.model.author.SaveAfternoteCommand
import com.afternote.feature.afternote.domain.repository.author.AfternoteRepository
import com.afternote.feature.afternote.domain.repository.author.AuthorReceiverRepository
import com.afternote.feature.afternote.domain.repository.author.MediaInput
import com.afternote.feature.afternote.domain.repository.author.MemorialThumbnailUploadRepository
import com.afternote.feature.afternote.domain.usecase.editor.ResolveMemorialMediaForSaveUseCase
Expand Down Expand Up @@ -194,7 +194,7 @@ class AfternoteEditorViewModel
@Inject
constructor(
private val savedStateHandle: SavedStateHandle,
private val authorReceiverRepository: AuthorReceiverRepository,
private val userRepository: UserRepository,
private val afternoteRepository: AfternoteRepository,
private val memorialThumbnailUploadRepository: MemorialThumbnailUploadRepository,
private val resolveMemorialMediaForSave: ResolveMemorialMediaForSaveUseCase,
Expand Down Expand Up @@ -272,14 +272,6 @@ class AfternoteEditorViewModel
) = mutateForm { it.withProcessingMethodEdited(itemId = itemId, newText = newText) }

init {
viewModelScope.launch {
authorReceiverRepository
.observeReceivers()
.map { it.toAfternoteEditorReceivers() }
.collect { mapped ->
internalState.update { it.copy(authorReceivers = mapped) }
}
}
val editItemId = readEditItemId()
if (editItemId == null) {
savedStateHandle.remove<String>(EDITOR_ORIGINAL_CATEGORY_FOR_API_KEY)
Expand Down Expand Up @@ -307,9 +299,21 @@ class AfternoteEditorViewModel
}
}

/**
* 작성자가 등록한 수신자 전체를 받아 [InternalState.authorReceivers] 에 채운다.
*
* 신규 작성 진입 시 1회 호출된다. 폼이 비어 있으면 화면이 이 목록으로 수신자를 채우고
* (`AfternoteNavGraphEditor` 의 `replaceReceiversIfEmpty`), 사용자는 불필요한 수신자를 지운다.
* 수정 진입은 상세 응답 prefill 이 지정 수신자를 채우므로 이 목록을 쓰지 않는다.
*/
fun refreshAuthorReceivers() {
viewModelScope.launch {
authorReceiverRepository.refreshReceivers()
runCatchingCancellable { userRepository.getReceivers() }
.onSuccess { receivers ->
internalState.update { it.copy(authorReceivers = receivers.toAfternoteEditorReceivers()) }
}.onFailure { e ->
errorReporter.recordAfternoteFailure(AfternoteFailureStage.AUTHOR_RECEIVER_LOAD, e)
}
}
}

Expand Down Expand Up @@ -555,7 +559,8 @@ class AfternoteEditorViewModel
}
}

fun getReceiverById(id: Long): AuthorReceiverEntry? = authorReceiverRepository.currentReceivers().find { it.receiverId == id }
/** 수신자 선택 결과(id)를 폼에 넣기 위해 [refreshAuthorReceivers] 로 받아 둔 목록에서 이름·관계를 찾는다. */
fun getReceiverById(id: Long): AfternoteEditorReceiver? = internalState.value.authorReceivers.find { it.id == id.toString() }

private fun readOriginalCategoryForApiFromSavedState(): EditorCategory? =
savedStateHandle
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.afternote.feature.afternote.presentation.author.editor.mapper

import com.afternote.core.model.user.Receiver
import com.afternote.feature.afternote.presentation.author.editor.receiver.model.AfternoteEditorReceiver

internal fun Receiver.toAfternoteEditorReceiver(): AfternoteEditorReceiver =
AfternoteEditorReceiver(
id = receiverId.toString(),
name = name,
label = relation,
)

/** 사용자가 등록한 수신자([Receiver]) 목록을 에디터 표시 모델로 변환합니다. */
internal fun List<Receiver>.toAfternoteEditorReceivers(): List<AfternoteEditorReceiver> = map { it.toAfternoteEditorReceiver() }
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ internal fun tryApplyReceiverSelectionFromSavedState(
val id = backStackEntry.savedStateHandle[SELECTED_RECEIVER_ID_KEY] as? Long ?: return
backStackEntry.savedStateHandle.remove<Long>(SELECTED_RECEIVER_ID_KEY)
val receiver = viewModel.getReceiverById(id) ?: return
state.addReceiverById(receiver.receiverId, receiver.name, receiver.relation)
state.addReceiverById(id, receiver.name, receiver.label)
}

internal fun buildOnRegisterClick(
Expand Down
Loading
Loading