Skip to content
This repository has been archived by the owner on Apr 27, 2023. It is now read-only.

[feature/detail-screen] 미션 상세 화면 연결 및 서버통신 #41

Merged
merged 10 commits into from
Jan 17, 2023
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ interface StampService {
suspend fun modifyStamp(
@Path("missionId") missionId: Int,
@Part stampContent: RequestBody,
@Part imageUrl: MultipartBody.Part? = null,
@Part imageUrl: List<MultipartBody.Part>? = null,
): ModifyStampResponse

@Multipart
@POST("stamp/{missionId}")
suspend fun registerStamp(
@Path("missionId") missionId: Int,
@Part stampContent: RequestBody,
@Part imageUrl: MultipartBody.Part? = null,
@Part imageUrl: List<MultipartBody.Part>? = null,
): StampResponse
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,25 @@
package org.sopt.stamp.data.remote.model.response

import kotlinx.datetime.Instant
import kotlinx.serialization.Serializable
import org.sopt.stamp.domain.model.Archive

@Serializable
data class StampResponse(
val createdAt: Instant? = null,
val updatedAt: Instant? = null,
val id: Long,
val createdAt: String? = null,
val updatedAt: String? = null,
val id: Int,
val contents: String,
val images: List<String>,
val userId: Long,
val images: List<String>? = null,
val userId: Int,
val missionId: Int,
)
) {
fun toDomain() = Archive(
createdAt = createdAt,
updatedAt = updatedAt,
id = id,
contents = contents,
images = images ?: emptyList(),
userId = userId,
missionId = missionId,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package org.sopt.stamp.data.repository

import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.toRequestBody
import org.sopt.stamp.data.remote.api.StampService
import org.sopt.stamp.domain.model.Archive
import org.sopt.stamp.domain.repository.StampRepository
import org.sopt.stamp.feature.mission.model.ImageModel
import org.sopt.stamp.util.ContentUriRequestBody
import javax.inject.Inject

class StampRepositoryImpl @Inject constructor(
@ApplicationContext private val context: Context,
private val service: StampService,
private val json: Json
) : StampRepository {
@Serializable
private data class Content(
val content: String
)

override suspend fun completeMission(
missionId: Int,
imageUri: ImageModel,
content: String
): Result<Unit> {
val contentJson = json.encodeToString(Content(content))
val contentRequestBody = contentJson.toRequestBody("application/json".toMediaType())
val imageRequestBody = when (imageUri) {
is ImageModel.Empty -> null
is ImageModel.Local -> {
imageUri.uri.map {
ContentUriRequestBody(context, it)
}.map {
it.toFormData()
}
}

is ImageModel.Remote -> null
}
return runCatching {
service.registerStamp(
missionId,
contentRequestBody,
imageRequestBody
)
}
}

override suspend fun getMissionContent(missionId: Int): Result<Archive> {
return runCatching {
service.retrieveStamp(missionId).toDomain()
}
}

override suspend fun modifyMission(
missionId: Int,
imageUri: ImageModel,
content: String
): Result<Unit> {
val contentJson = json.encodeToString(Content(content))
val contentRequestBody = contentJson.toRequestBody("application/json".toMediaType())
val imageRequestBody = when (imageUri) {
is ImageModel.Empty -> null
is ImageModel.Local -> {
imageUri.uri.map {
ContentUriRequestBody(context, it)
}.map {
it.toFormData()
}
}

is ImageModel.Remote -> null
}
return runCatching {
service.modifyStamp(
missionId,
contentRequestBody,
imageRequestBody
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.sopt.stamp.designsystem.component.mission.model.MissionUiModel
import org.sopt.stamp.feature.mission.model.MissionUiModel
import org.sopt.stamp.designsystem.component.util.noRippleClickable
import org.sopt.stamp.designsystem.style.SoptTheme
import org.sopt.stamp.domain.MissionLevel
Expand Down
12 changes: 11 additions & 1 deletion app/src/main/java/org/sopt/stamp/di/DataModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import org.sopt.stamp.data.repository.RemoteMissionsRepository
import org.sopt.stamp.data.repository.StampRepositoryImpl
import org.sopt.stamp.domain.repository.MissionsRepository
import org.sopt.stamp.domain.repository.StampRepository
import javax.inject.Singleton

@Module
Expand All @@ -14,5 +16,13 @@ internal abstract class DataModule {

@Binds
@Singleton
abstract fun bindMissionsRepository(repository: RemoteMissionsRepository): MissionsRepository
abstract fun bindMissionsRepository(
repository: RemoteMissionsRepository
): MissionsRepository

@Binds
@Singleton
abstract fun bindStampRepository(
repository: StampRepositoryImpl
): StampRepository
}
11 changes: 11 additions & 0 deletions app/src/main/java/org/sopt/stamp/domain/model/Archive.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.sopt.stamp.domain.model

data class Archive(
val createdAt: String? = null,
val updatedAt: String? = null,
val id: Int,
val contents: String,
val images: List<String>,
val userId: Int,
val missionId: Int,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.sopt.stamp.domain.repository

import org.sopt.stamp.domain.model.Archive
import org.sopt.stamp.feature.mission.model.ImageModel

interface StampRepository {
suspend fun completeMission(
missionId: Int,
imageUri: ImageModel,
content: String
): Result<Unit>

suspend fun getMissionContent(
missionId: Int
): Result<Archive>

suspend fun modifyMission(
missionId: Int,
imageUri: ImageModel,
content: String
): Result<Unit>
}
Loading