Skip to content

Commit 75ed9d5

Browse files
committed
[feat] #70: 폴더 삭제 API deletePhotos 쿼리 추가 및 앨범 사진 삭제 옵션별 분기 구현
- DELETE /api/folders에 deletePhotos 쿼리 파라미터 추가 - DELETE /api/folders/{folderId}/photos 폴더에서 사진 제거 API 추가 - AlbumDeleteOption에 따라 사진 포함/미포함 삭제 분기 - PhotoDeleteOption에 따라 앨범에서만 제거/완전 삭제 분기
1 parent 7bdf2b6 commit 75ed9d5

5 files changed

Lines changed: 37 additions & 7 deletions

File tree

core/data-api/src/main/java/com/neki/android/core/dataapi/repository/FolderRepository.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ import com.neki.android.core.model.AlbumPreview
55
interface FolderRepository {
66
suspend fun getFolders(): Result<List<AlbumPreview>>
77
suspend fun createFolder(name: String): Result<Unit>
8-
suspend fun deleteFolder(id: List<Long>): Result<Unit>
8+
suspend fun deleteFolder(id: List<Long>, deletePhotos: Boolean): Result<Unit>
9+
suspend fun removePhotosFromFolder(folderId: Long, photoIds: List<Long>): Result<Unit>
910
}

core/data/src/main/java/com/neki/android/core/data/remote/api/FolderService.kt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@ package com.neki.android.core.data.remote.api
22

33
import com.neki.android.core.data.remote.model.request.CreateFolderRequest
44
import com.neki.android.core.data.remote.model.request.DeleteFolderRequest
5+
import com.neki.android.core.data.remote.model.request.DeletePhotoRequest
56
import com.neki.android.core.data.remote.model.response.BasicNullableResponse
67
import com.neki.android.core.data.remote.model.response.BasicResponse
78
import com.neki.android.core.data.remote.model.response.CreateFolderResponse
89
import com.neki.android.core.data.remote.model.response.FolderResponse
910
import io.ktor.client.HttpClient
1011
import io.ktor.client.call.body
12+
import io.ktor.client.request.delete
1113
import io.ktor.client.request.get
14+
import io.ktor.client.request.parameter
1215
import io.ktor.client.request.post
1316
import io.ktor.client.request.setBody
1417
import javax.inject.Inject
@@ -27,7 +30,17 @@ class FolderService @Inject constructor(
2730
}
2831

2932
// 폴더 삭제
30-
suspend fun deleteFolder(requestBody: DeleteFolderRequest): BasicNullableResponse<Unit> {
31-
return client.post("/api/folders") { setBody(requestBody) }.body()
33+
suspend fun deleteFolder(requestBody: DeleteFolderRequest, deletePhotos: Boolean): BasicNullableResponse<Unit> {
34+
return client.delete("/api/folders") {
35+
setBody(requestBody)
36+
parameter("deletePhotos", deletePhotos)
37+
}.body()
38+
}
39+
40+
// 폴더에서 사진 제거 (사진 자체는 삭제되지 않음)
41+
suspend fun removePhotosFromFolder(folderId: Long, requestBody: DeletePhotoRequest): BasicNullableResponse<Unit> {
42+
return client.delete("/api/folders/$folderId/photos") {
43+
setBody(requestBody)
44+
}.body()
3245
}
3346
}

core/data/src/main/java/com/neki/android/core/data/repository/impl/FolderRepositoryImpl.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.neki.android.core.data.repository.impl
33
import com.neki.android.core.data.remote.api.FolderService
44
import com.neki.android.core.data.remote.model.request.CreateFolderRequest
55
import com.neki.android.core.data.remote.model.request.DeleteFolderRequest
6+
import com.neki.android.core.data.remote.model.request.DeletePhotoRequest
67
import com.neki.android.core.data.util.runSuspendCatching
78
import com.neki.android.core.dataapi.repository.FolderRepository
89
import com.neki.android.core.model.AlbumPreview
@@ -21,9 +22,17 @@ class FolderRepositoryImpl @Inject constructor(
2122
).data
2223
}
2324

24-
override suspend fun deleteFolder(id: List<Long>): Result<Unit> = runSuspendCatching {
25+
override suspend fun deleteFolder(id: List<Long>, deletePhotos: Boolean): Result<Unit> = runSuspendCatching {
2526
folderService.deleteFolder(
2627
requestBody = DeleteFolderRequest(folderIds = id),
28+
deletePhotos = deletePhotos,
29+
).data
30+
}
31+
32+
override suspend fun removePhotosFromFolder(folderId: Long, photoIds: List<Long>): Result<Unit> = runSuspendCatching {
33+
folderService.removePhotosFromFolder(
34+
folderId = folderId,
35+
requestBody = DeletePhotoRequest(photoIds = photoIds),
2736
).data
2837
}
2938
}

feature/archive/impl/src/main/kotlin/com/neki/android/feature/archive/impl/album/AllAlbumViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,11 @@ class AllAlbumViewModel @Inject constructor(
191191
reduce: (AllAlbumState.() -> AllAlbumState) -> Unit,
192192
postSideEffect: (AllAlbumSideEffect) -> Unit,
193193
) {
194-
// TODO: 삭제 타입에 따라 핸들링
195194
viewModelScope.launch {
196195
val selectedAlbumIds = state.selectedAlbums.map { it.id }
196+
val deletePhotos = state.selectedDeleteOption == AlbumDeleteOption.DELETE_WITH_PHOTOS
197197

198-
folderRepository.deleteFolder(selectedAlbumIds)
198+
folderRepository.deleteFolder(selectedAlbumIds, deletePhotos)
199199
.onSuccess {
200200
fetchFolders(reduce)
201201
postSideEffect(AllAlbumSideEffect.ShowToastMessage("앨범을 삭제했어요"))

feature/archive/impl/src/main/kotlin/com/neki/android/feature/archive/impl/album_detail/AlbumDetailViewModel.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.paging.PagingData
66
import androidx.paging.cachedIn
77
import androidx.paging.filter
88
import androidx.paging.map
9+
import com.neki.android.core.dataapi.repository.FolderRepository
910
import com.neki.android.core.dataapi.repository.PhotoRepository
1011
import com.neki.android.core.model.Photo
1112
import com.neki.android.core.ui.MviIntentStore
@@ -30,6 +31,7 @@ class AlbumDetailViewModel @AssistedInject constructor(
3031
@Assisted private val title: String,
3132
@Assisted private val isFavoriteAlbum: Boolean,
3233
private val photoRepository: PhotoRepository,
34+
private val folderRepository: FolderRepository,
3335
) : ViewModel() {
3436

3537
@AssistedFactory
@@ -232,7 +234,12 @@ class AlbumDetailViewModel @AssistedInject constructor(
232234
viewModelScope.launch {
233235
reduce { copy(isLoading = true) }
234236

235-
photoRepository.deletePhoto(photoIds = selectedPhotoIds)
237+
val result = when (state.selectedDeleteOption) {
238+
PhotoDeleteOption.REMOVE_FROM_ALBUM -> folderRepository.removePhotosFromFolder(id, selectedPhotoIds)
239+
PhotoDeleteOption.REMOVE_FROM_ALL -> photoRepository.deletePhoto(photoIds = selectedPhotoIds)
240+
}
241+
242+
result
236243
.onSuccess {
237244
Timber.d("삭제 성공")
238245
deletedPhotoIds.update { it + selectedPhotoIds.toSet() }

0 commit comments

Comments
 (0)