Skip to content

Commit 6ce6dcd

Browse files
authored
Merge pull request #58 from YAPP-Github/feat/#55,#56-photo-api
[feat] #55 #56 사진 즐겨찾기, 사진 API 수정사항 반영
2 parents f975884 + 62b596e commit 6ce6dcd

32 files changed

Lines changed: 518 additions & 214 deletions

File tree

core/common/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
plugins {
22
alias(libs.plugins.neki.android.library)
33
alias(libs.plugins.neki.android.library.compose)
4+
alias(libs.plugins.neki.hilt)
45
}
56

67
android {
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.neki.android.core.common.coroutine.di
2+
3+
import dagger.Module
4+
import dagger.Provides
5+
import dagger.hilt.InstallIn
6+
import dagger.hilt.components.SingletonComponent
7+
import kotlinx.coroutines.CoroutineScope
8+
import kotlinx.coroutines.Dispatchers
9+
import kotlinx.coroutines.SupervisorJob
10+
import javax.inject.Qualifier
11+
import javax.inject.Singleton
12+
13+
@Qualifier
14+
@Retention(AnnotationRetention.RUNTIME)
15+
annotation class ApplicationScope
16+
17+
@Module
18+
@InstallIn(SingletonComponent::class)
19+
object CoroutineScopeModule {
20+
21+
@Provides
22+
@Singleton
23+
@ApplicationScope
24+
fun provideApplicationScope(): CoroutineScope =
25+
CoroutineScope(SupervisorJob() + Dispatchers.Default)
26+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import com.neki.android.core.model.MediaUploadTicket
55

66
interface MediaUploadRepository {
77
suspend fun getUploadTicket(
8+
uploadCount: Int = 1,
89
fileName: String,
910
contentType: String,
1011
mediaType: String,
11-
): Result<MediaUploadTicket>
12+
): Result<List<MediaUploadTicket>>
1213

1314
suspend fun uploadImage(
1415
uploadUrl: String,
Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.neki.android.core.dataapi.repository
22

3+
import com.neki.android.core.model.AlbumPreview
34
import com.neki.android.core.model.Photo
5+
import com.neki.android.core.model.SortOrder
46

57
interface PhotoRepository {
68
suspend fun getPhotos(
@@ -10,9 +12,20 @@ interface PhotoRepository {
1012
): Result<List<Photo>>
1113

1214
suspend fun registerPhoto(
13-
mediaId: Long,
15+
mediaIds: List<Long>,
1416
folderId: Long? = null,
15-
): Result<Long>
17+
): Result<Unit>
1618

1719
suspend fun deletePhoto(photoId: Long): Result<Unit>
20+
suspend fun deletePhoto(photoIds: List<Long>): Result<Unit>
21+
22+
suspend fun updateFavorite(photoId: Long, favorite: Boolean): Result<Unit>
23+
24+
suspend fun getFavoritePhotos(
25+
page: Int = 0,
26+
size: Int = 20,
27+
sortOrder: SortOrder = SortOrder.DESC,
28+
): Result<List<Photo>>
29+
30+
suspend fun getFavoriteSummary(): Result<AlbumPreview>
1831
}

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

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
package com.neki.android.core.data.remote.api
22

3+
import com.neki.android.core.data.remote.model.request.DeletePhotoRequest
34
import com.neki.android.core.data.remote.model.request.RegisterPhotoRequest
4-
import com.neki.android.core.data.remote.model.response.BasicResponse
5+
import com.neki.android.core.data.remote.model.request.UpdateFavoriteRequest
56
import com.neki.android.core.data.remote.model.response.BasicNullableResponse
7+
import com.neki.android.core.data.remote.model.response.BasicResponse
8+
import com.neki.android.core.data.remote.model.response.FavoritePhotoResponse
9+
import com.neki.android.core.data.remote.model.response.FavoriteSummaryResponse
610
import com.neki.android.core.data.remote.model.response.PhotoResponse
711
import com.neki.android.core.data.remote.model.response.RegisterPhotoResponse
812
import io.ktor.client.HttpClient
913
import io.ktor.client.call.body
1014
import io.ktor.client.request.delete
1115
import io.ktor.client.request.get
1216
import io.ktor.client.request.parameter
17+
import io.ktor.client.request.patch
1318
import io.ktor.client.request.post
1419
import io.ktor.client.request.setBody
1520
import javax.inject.Inject
@@ -31,12 +36,37 @@ class PhotoService @Inject constructor(
3136
}
3237

3338
// 사진 등록
34-
suspend fun registerPhoto(requestBody: RegisterPhotoRequest): BasicResponse<RegisterPhotoResponse> {
39+
suspend fun registerPhoto(requestBody: RegisterPhotoRequest): BasicNullableResponse<RegisterPhotoResponse> {
3540
return client.post("/api/photos") { setBody(requestBody) }.body()
3641
}
3742

3843
// 사진 삭제
39-
suspend fun deletePhoto(photoId: Long): BasicNullableResponse<Unit> {
40-
return client.delete("/api/photos/$photoId").body()
44+
suspend fun deletePhoto(requestBody: DeletePhotoRequest): BasicNullableResponse<Unit> {
45+
return client.delete("/api/photos") { setBody(requestBody) }.body()
46+
}
47+
48+
// 즐겨찾기 업데이트
49+
suspend fun updateFavorite(photoId: Long, favorite: Boolean): BasicNullableResponse<Unit> {
50+
return client.patch("/api/photos/$photoId/favorite") {
51+
setBody(UpdateFavoriteRequest(favorite))
52+
}.body()
53+
}
54+
55+
// 즐겨찾기 사진 조회
56+
suspend fun getFavoritePhotos(
57+
page: Int = 0,
58+
size: Int = 20,
59+
sortOrder: String,
60+
): BasicResponse<FavoritePhotoResponse> {
61+
return client.get("/api/photos/favorite") {
62+
parameter("page", page)
63+
parameter("size", size)
64+
parameter("sortOrder", sortOrder)
65+
}.body()
66+
}
67+
68+
// 즐겨찾기 요약 조회
69+
suspend fun getFavoriteSummary(): BasicResponse<FavoriteSummaryResponse> {
70+
return client.get("/api/photos/favorite/summary").body()
4171
}
4272
}

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

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

33
import com.neki.android.core.data.remote.model.request.MediaUploadTicketRequest
44
import com.neki.android.core.data.remote.model.response.BasicResponse
5-
import com.neki.android.core.data.remote.model.response.MediaUploadTicketResponse
5+
import com.neki.android.core.data.remote.model.response.MediaUploadTicketDataResponse
66
import com.neki.android.core.data.remote.qualifier.UploadHttpClient
77
import io.ktor.client.HttpClient
88
import io.ktor.client.call.body
@@ -18,7 +18,7 @@ class UploadService @Inject constructor(
1818
@UploadHttpClient private val uploadClient: HttpClient,
1919
) {
2020
// Media Upload Ticket 받기
21-
suspend fun getUploadTicket(requestBody: MediaUploadTicketRequest): BasicResponse<MediaUploadTicketResponse> {
21+
suspend fun getUploadTicket(requestBody: MediaUploadTicketRequest): BasicResponse<MediaUploadTicketDataResponse> {
2222
return client.post("/api/media/upload") { setBody(requestBody) }.body()
2323
}
2424

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.neki.android.core.data.remote.model.request
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class DeletePhotoRequest(
8+
@SerialName("photoIds") val photoIds: List<Long>,
9+
)

core/data/src/main/java/com/neki/android/core/data/remote/model/request/MediaUploadTicketRequest.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ import kotlinx.serialization.Serializable
55

66
@Serializable
77
data class MediaUploadTicketRequest(
8-
@SerialName("contentType") val contentType: String,
9-
@SerialName("filename") val filename: String = "",
10-
@SerialName("mediaType") val mediaType: String,
11-
)
8+
@SerialName("items") val items: List<Item>,
9+
) {
10+
@Serializable
11+
data class Item(
12+
@SerialName("contentType") val contentType: String,
13+
@SerialName("filename") val filename: String = "",
14+
@SerialName("mediaType") val mediaType: String,
15+
)
16+
}

core/data/src/main/java/com/neki/android/core/data/remote/model/request/RegisterPhotoRequest.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ import kotlinx.serialization.Serializable
55

66
@Serializable
77
data class RegisterPhotoRequest(
8-
@SerialName("folderId") val folderId: Long?,
9-
@SerialName("mediaId") val mediaId: Long,
10-
@SerialName("memo") val memo: String = "",
11-
)
8+
@SerialName("folderId") val folderId: Long? = null,
9+
@SerialName("uploads") val uploads: List<Upload>,
10+
) {
11+
@Serializable
12+
data class Upload(
13+
@SerialName("mediaId") val mediaId: Long,
14+
@SerialName("memo") val memo: String? = null,
15+
)
16+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.neki.android.core.data.remote.model.request
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class UpdateFavoriteRequest(
8+
@SerialName("favorite") val favorite: Boolean,
9+
)

0 commit comments

Comments
 (0)