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/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/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 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/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/feature/afternote/data/mapper/AfternoteInputMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteInputMapper.kt index c5bd3085..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 @@ -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.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.SongInput - -fun AfternotePlaylistInput.toDto() = - AfternotePlaylist( - profilePhoto = profilePhoto, - atmosphere = atmosphere, - memorialPhotoUrl = memorialPhotoUrl, - songs = songs.map { it.toDto() }, - memorialVideo = memorialVideo?.toDto(), - ) fun MemorialVideoInput.toDto() = AfternoteMemorialVideo( @@ -28,15 +15,7 @@ fun MemorialVideoInput.toDto() = thumbnailUrl = thumbnailUrl, ) -fun SongInput.toDto() = - AfternoteSong( - id = id, - title = title, - artist = artist, - coverUrl = coverUrl, - ) - -fun AfternoteUpdateRequestInput.toDto() = +fun UpdateRequestInput.toDto() = AfternoteUpdateRequest( category = category, title = title, @@ -44,7 +23,7 @@ fun AfternoteUpdateRequestInput.toDto() = actions = actions, leaveMessage = leaveMessage, credentials = credentials?.toDto(), - receivers = receivers?.map { it.toDto() }, + receivers = receivers?.toDto(), playlist = playlist?.toDto(), ) @@ -54,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/AfternoteMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/AfternoteMapper.kt index 342e8229..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 @@ -2,114 +2,37 @@ 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.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.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.PlaylistDetailMemorialMedia +import com.kuit.afternote.feature.afternote.domain.model.Item /** * Maps server DTOs to domain models at the boundary only. */ -object AfternoteMapper { - // -- List mapping -- - fun toDomain(dto: AfternoteListItem): AfternoteItem = - AfternoteItem( - id = dto.afternoteId.toString(), - serviceName = dto.title, - date = formatDateFromServer(dto.createdAt), - type = categoryToServiceType(dto.category), - ) - - fun toDomainList(dtos: List): List = dtos.map { toDomain(it) } - - // -- Detail mapping -- - - fun toDetailDomain(dto: AfternoteDetailResponse): AfternoteDetail = - AfternoteDetail( - id = dto.afternoteId, - category = dto.category, - title = dto.title, - timestamps = - AfternoteDetailTimestamps( - createdAt = formatDateFromServer(dto.createdAt), - updatedAt = formatDateFromServer(dto.createdAt), - ), - type = categoryToServiceType(dto.category), - credentials = - AfternoteDetailCredentials( - id = dto.credentials?.id, - password = dto.credentials?.password, - ), - receivers = - dto.receivers?.map { r -> - AfternoteDetailReceiver( - receiverId = r.receiverId, - name = r.name ?: "", - relation = r.relation ?: "", - phone = r.phone ?: "", - ) - } ?: emptyList(), - processing = - AfternoteDetailProcessing( - method = dto.processMethod, - actions = dto.actions ?: emptyList(), - leaveMessage = dto.leaveMessage, - ), - playlist = - dto.playlist?.let { p -> - AfternotePlaylistDetail( - profilePhoto = p.profilePhoto, - atmosphere = p.atmosphere, - songs = - p.songs.map { s -> - AfternoteDetailSong( - 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 toPagedNotes(data: AfternoteListResponse) = - PagedAfternotes( - items = toDomainList(data.content), - hasNext = data.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 - } -} +fun AfternoteListItem.toDomain() = + Item( + id = afternoteId.toString(), + serviceName = title, + date = formatDateFromServer(createdAt), + type = categoryToServiceType(category), + ) + +fun List.toDomainList() = map { it.toDomain() } + +// -- Internal helpers -- + +internal fun formatDateFromServer(serverDateTime: String): String = + try { + // Server returns "2025-11-26T14:30:00" -> display "2025.11.26" + val datePart = serverDateTime.substringBefore('T') + datePart.replace('-', '.') + } catch (_: Exception) { + serverDateTime + } + +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/mapper/PlaylistInputMapper.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/PlaylistInputMapper.kt new file mode 100644 index 00000000..4339c82b --- /dev/null +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/data/mapper/PlaylistInputMapper.kt @@ -0,0 +1,28 @@ +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.toDto(), + memorialVideo = memorialVideo?.toDto(), + ) + +private fun SongInput.toDto() = + AfternoteSong( + id = id, + title = title, + artist = artist, + coverUrl = coverUrl, + ) + +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 new file mode 100644 index 00000000..39b16f21 --- /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(), + ) + +private 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( + profilePhoto = profilePhoto, + atmosphere = atmosphere, + songs = songs.map { it.toDomain() }, + playlistDetailMemorialMedia = toMemorialMedia(), + ) + +private fun AfternotePlaylist.toMemorialMedia() = + PlaylistDetailMemorialMedia( + photoUrl = memorialPhotoUrl ?: profilePhoto, + videoUrl = memorialVideo?.videoUrl, + thumbnailUrl = memorialVideo?.thumbnailUrl, + ) + +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 62f31aa8..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 @@ -1,21 +1,22 @@ 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 -import com.kuit.afternote.feature.afternote.data.dto.request.AfternoteCreateSocialRequest +import com.kuit.afternote.data.dto.response.requireData +import com.kuit.afternote.data.dto.response.requireStatus 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.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.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.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.playlist.AfternotePlaylistInput +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 @@ -29,59 +30,29 @@ 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) + data.toPagedNotes() }.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) }, - ) + val request = input.toRequest() 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) }, - ) + val request = input.toRequest() val response = api.createAfternoteGallery(request) val data = response.requireData() getAfternoteId(data) @@ -90,29 +61,19 @@ 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() - AfternoteMapper.toDetailDomain(data) + data.toDetailDomain() }.logFailure() /** * POST /afternotes (PLAYLIST category). */ - override suspend fun createPlaylist( - title: String, - playlist: AfternotePlaylistInput, - 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) }, - ) + val request = input.toRequest() val response = api.createAfternotePlaylist(request) val data = response.requireData() getAfternoteId(data) @@ -123,13 +84,15 @@ class AfternoteRepositoryImpl */ override suspend fun updateAfternote( afternoteId: Long, - input: AfternoteUpdateRequestInput, - ): Result = - runCatching { - val response = api.updateAfternote(afternoteId = afternoteId, request = input.toDto()) + input: UpdateRequestInput, + ): 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}. @@ -149,13 +112,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/data/repositoryimpl/MusicSearchRepositoryImpl.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/data/repositoryimpl/MusicSearchRepositoryImpl.kt similarity index 51% 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 d37719e4..6ecd23f0 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.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.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 /** @@ -15,17 +15,19 @@ 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): 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/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/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/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..2e683c21 --- /dev/null +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateGalleryInput.kt @@ -0,0 +1,22 @@ +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, + val actions: List, + 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 new file mode 100644 index 00000000..8ec12a3b --- /dev/null +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/CreateSocialInput.kt @@ -0,0 +1,25 @@ +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, + val actions: List, + val leaveMessage: String? = null, + 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/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/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/AfternoteItem.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/Item.kt similarity index 59% 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 d89b0c00..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 @@ -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,26 +9,25 @@ import com.kuit.afternote.domain.model.AfternoteServiceType * @param serviceName 서비스명 * @param date 날짜 (yyyy.MM.dd 형식) * @param type 서비스 타입 (필터링용) - * @param message 남기실 말씀 */ -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/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/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/CreatePlaylistInput.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/CreatePlaylistInput.kt new file mode 100644 index 00000000..5415eba7 --- /dev/null +++ b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/model/playlist/CreatePlaylistInput.kt @@ -0,0 +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) }, + ) 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/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..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 @@ -1,9 +1,12 @@ 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.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.playlist.AfternotePlaylistInput +import com.kuit.afternote.feature.afternote.domain.model.UpdateRequestInput +import com.kuit.afternote.feature.afternote.domain.model.playlist.CreatePlaylistInput /** * Afternote 도메인 Repository 인터페이스. @@ -16,41 +19,19 @@ import com.kuit.afternote.feature.afternote.domain.model.playlist.AfternotePlayl * - DELETE /afternotes/{afternoteId} (삭제) */ interface AfternoteRepository { - suspend fun getAfternotes( - category: String?, - page: Int, - size: Int, - ): Result - - suspend fun createSocial( - title: String, - processMethod: String, - actions: List, - leaveMessage: String?, - credentialsId: String?, - credentialsPassword: String?, - receiverIds: List = emptyList(), - ): Result + suspend fun getAfternotes(input: GetAfternotesInput): Result - suspend fun createGallery( - title: String, - processMethod: String, - actions: List, - leaveMessage: String?, - receiverIds: List, - ): Result + suspend fun createSocial(input: CreateSocialInput): Result - suspend fun getAfternoteDetail(afternoteId: Long): Result + suspend fun createGallery(input: CreateGalleryInput): Result - suspend fun createPlaylist( - title: String, - playlist: AfternotePlaylistInput, - receiverIds: List = emptyList(), - ): Result + suspend fun getAfternoteDetail(afternoteId: Long): Result + + suspend fun createPlaylist(input: CreatePlaylistInput): 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/domain/repository/MusicSearchRepository.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/repository/MusicSearchRepository.kt similarity index 57% 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 ae47ce33..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,6 +1,6 @@ -package com.kuit.afternote.domain.repository +package com.kuit.afternote.feature.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/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..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.AfternotePlaylistInput +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: AfternotePlaylistInput, - 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/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/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/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/domain/usecase/SearchMusicUseCase.kt b/app/src/main/java/com/kuit/afternote/feature/afternote/domain/usecase/SearchMusicUseCase.kt index 07013309..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.presentation.uimodel.PlaylistSongDisplay -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 /** @@ -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/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/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/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/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 240c680f..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 @@ -3,12 +3,15 @@ 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.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.Detail 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.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 import com.kuit.afternote.feature.afternote.domain.usecase.CreateGalleryAfternoteUseCase import com.kuit.afternote.feature.afternote.domain.usecase.CreatePlaylistAfternoteUseCase @@ -315,15 +318,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 { @@ -370,7 +372,7 @@ class AfternoteEditViewModel } private fun populatePlaylistFromDetail( - detail: AfternoteDetail, + detail: Detail, playlistStateHolder: MemorialPlaylistStateHolder?, ) { if (detail.category.uppercase() != "PLAYLIST" || @@ -391,7 +393,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( @@ -532,16 +534,19 @@ 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, + ), ) } CATEGORY_MEMORIAL -> { - val playlistDto = + val input = buildPlaylistInput( playlistStateHolder = playlistStateHolder, atmosphere = payload.atmosphere, @@ -550,21 +555,29 @@ class AfternoteEditViewModel funeralThumbnailUrl = funeralThumbnailUrl, ) createPlaylistUseCase( - title = payload.serviceName, - playlist = playlistDto, - receiverIds = selectedReceiverIds, + input = + CreatePlaylistInput( + title = payload.serviceName, + playlist = input, + receiverIds = selectedReceiverIds, + ), ) } 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 +623,7 @@ class AfternoteEditViewModel funeralVideoUrl: String? = null, funeralThumbnailUrl: String? = null, memorialPhotoUrl: String? = null, - ) = AfternoteUpdateRequestInput( + ) = UpdateRequestInput( category = "PLAYLIST", title = title, playlist = @@ -627,7 +640,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 +660,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 +754,7 @@ class AfternoteEditViewModel memorialPhotoUrl: String? = null, funeralVideoUrl: String? = null, funeralThumbnailUrl: String? = null, - ): AfternotePlaylistInput { + ): PlaylistInput { val songs = playlistStateHolder?.songs?.map { song -> SongInput( @@ -760,7 +773,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 +784,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 +794,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/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..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,7 +5,8 @@ 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.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 import kotlinx.coroutines.flow.MutableStateFlow @@ -31,7 +32,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 @@ -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 @@ -109,7 +122,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/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, + ) 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/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/dailyrecord/presentation/viewmodel/MindRecordViewModel.kt b/app/src/main/java/com/kuit/afternote/feature/dailyrecord/presentation/viewmodel/MindRecordViewModel.kt index c8270165..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,7 +3,8 @@ 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.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 import com.kuit.afternote.feature.dailyrecord.data.dto.PostMindRecordRequest @@ -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() } @@ -451,7 +458,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/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 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) } 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) 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