Skip to content

Commit d28c983

Browse files
lsakeeSangwook123
authored andcommitted
[feat] #62 separate s3 video upload with architecture
1 parent 2330b7a commit d28c983

File tree

6 files changed

+45
-34
lines changed

6 files changed

+45
-34
lines changed

data/video/src/main/java/com/record/video/repository/UploadRepositoryImpl.kt

+12-23
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,8 @@ import com.record.upload.repository.UploadRepository
77
import com.record.video.model.remote.request.toData
88
import com.record.video.model.remote.response.toCore
99
import com.record.video.source.remote.RemoteUploadDataSource
10-
import okhttp3.MediaType.Companion.toMediaTypeOrNull
11-
import okhttp3.MultipartBody
12-
import okhttp3.OkHttpClient
13-
import okhttp3.Request
14-
import okhttp3.RequestBody
15-
import okhttp3.RequestBody.Companion.asRequestBody
1610
import retrofit2.HttpException
1711
import java.io.File
18-
import java.io.IOException
1912
import javax.inject.Inject
2013

2114
class UploadRepositoryImpl @Inject constructor(
@@ -44,28 +37,24 @@ class UploadRepositoryImpl @Inject constructor(
4437
is HttpException -> {
4538
throw ApiError(exception.message())
4639
}
40+
4741
else -> {
4842
throw exception
4943
}
5044
}
5145
}
5246

53-
override suspend fun uploadVideoToS3Bucket(url: String, file: File): Result<String> = runCatching {
54-
val client = OkHttpClient()
55-
val mediaType = "application/octet-stream".toMediaTypeOrNull()
56-
val requestBody = RequestBody.create(mediaType, file)
57-
58-
val request = Request.Builder()
59-
.url(url)
60-
.put(requestBody)
61-
.build()
62-
63-
client.newCall(request).execute().use { response ->
64-
if (response.isSuccessful) {
65-
response.request.url.toString()
66-
} else {
67-
throw IOException("Upload failed: ${response.message}")
47+
override suspend fun uploadVideoToS3Bucket(url: String, file: File): Result<String> =
48+
runCatching {
49+
remoteUploadDataSource.uploadVideoToS3Bucket(url, file)
50+
}.recoverCatching { exception ->
51+
when (exception) {
52+
is HttpException -> {
53+
throw ApiError(exception.message())
54+
}
55+
else -> {
56+
throw exception
57+
}
6858
}
6959
}
70-
}
7160
}

data/video/src/main/java/com/record/video/source/remote/RemoteUploadDataSource.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ package com.record.video.source.remote
33
import com.record.video.model.remote.request.RequestPostVideoDto
44
import com.record.video.model.remote.response.ResponseGetPresignedUrlDto
55
import okhttp3.MultipartBody
6+
import java.io.File
67

78
interface RemoteUploadDataSource {
89
suspend fun getUploadUrl(): ResponseGetPresignedUrlDto
910
suspend fun uploadRecord(requestPostVideoDto: RequestPostVideoDto)
10-
suspend fun uploadVideoToS3Bucket(url: String, multipart: MultipartBody.Part)
11+
suspend fun uploadVideoToS3Bucket(url: String, file: File):String
1112
}

feature/upload/src/main/java/com/record/upload/UploadViewModel.kt

+6-2
Original file line numberDiff line numberDiff line change
@@ -42,23 +42,27 @@ class UploadViewModel @Inject constructor(
4242
}
4343

4444
fun uploadVideoToS3Bucket(context: Context, file: File) =
45-
viewModelScope.launch(Dispatchers.IO) {
45+
viewModelScope.launch {
46+
Log.d("testUploadStart", "$")
4647
var a = ""
4748
var b = ""
4849
uploadRepository.uploadVideoToS3Bucket(
4950
uiState.value.bucketUrl,
5051
file,
5152
).onSuccess {
5253
a = removeQueryParameters(it)
54+
Log.d("testUpload", "$a")
5355
uploadFileToS3ThumbnailPresignedUrl(
5456
context,
5557
uiState.value.thumbnailUrl,
5658
file,
5759
) { success, message ->
58-
println(message)
5960
b = removeQueryParameters(message)
61+
Log.d("testUploadthumbnailUrl", "$b")
6062
uploadRecord(a, b)
6163
}
64+
}.onFailure {
65+
Log.d("testUploadFail", "$b")
6266
}
6367
}
6468

feature/upload/src/main/java/com/record/upload/extension/UploadExtension.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ fun formatDuration(durationMillis: Long): String {
178178
//
179179
// val request = Request.Builder()
180180
// .url(presignedUrl)
181-
// .put(requestBody)
181+
// .put(requ estBody)
182182
// .build()
183183
// client.newCall(request).enqueue(
184184
// object : okhttp3.Callback {
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
package com.record.video.api
22

33
import okhttp3.MultipartBody
4+
import okhttp3.RequestBody
5+
import okhttp3.ResponseBody
6+
import retrofit2.Response
7+
import retrofit2.http.Body
48
import retrofit2.http.Header
59
import retrofit2.http.Multipart
610
import retrofit2.http.PUT
711
import retrofit2.http.Part
812
import retrofit2.http.Url
913

1014
interface BucketApi {
11-
@Multipart
1215
@PUT
13-
suspend fun uploadVideoWithS3Bucket(
16+
suspend fun uploadVideoWithS3Video(
1417
@Url url: String,
15-
@Part video: MultipartBody.Part,
16-
@Header("Content-Type") contentType: String,
17-
): Unit
18+
@Body requestBody: RequestBody,
19+
@Header("Content-Type") contentType: String = "application/octet-stream"
20+
): Response<ResponseBody>
1821
}

remote/video/src/main/java/com/record/video/datasource/RemoteUploadDataSourceImpl.kt

+16-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
package com.record.video.datasource
22

3+
import android.content.Context
4+
import android.util.Log
35
import com.record.video.api.BucketApi
46
import com.record.video.api.UploadApi
57
import com.record.video.model.remote.request.RequestPostVideoDto
68
import com.record.video.model.remote.response.ResponseGetPresignedUrlDto
79
import com.record.video.source.remote.RemoteUploadDataSource
10+
import okhttp3.MediaType.Companion.toMediaTypeOrNull
811
import okhttp3.MultipartBody
12+
import okhttp3.RequestBody
13+
import okhttp3.RequestBody.Companion.toRequestBody
14+
import okhttp3.ResponseBody.Companion.toResponseBody
15+
import java.io.File
16+
import java.net.URL
917
import javax.inject.Inject
1018

1119
class RemoteUploadDataSourceImpl @Inject constructor(
@@ -19,6 +27,12 @@ class RemoteUploadDataSourceImpl @Inject constructor(
1927
requestPostVideoDto: RequestPostVideoDto,
2028
) = uploadApi.postRecord(requestPostVideoDto)
2129

22-
override suspend fun uploadVideoToS3Bucket(url: String, multipart: MultipartBody.Part) =
23-
bucketApi.uploadVideoWithS3Bucket(url = url, multipart, "video/mp4")
30+
override suspend fun uploadVideoToS3Bucket(url: String, file: File): String {
31+
val videoPath = file.absolutePath
32+
val mediaType = "application/octet-stream".toMediaTypeOrNull()
33+
val requestBody = RequestBody.create(mediaType, videoPath)
34+
val url = URL(bucketApi.uploadVideoWithS3Video(url, requestBody).raw().request.url.toString())
35+
Log.d("testUrl","$url")
36+
return URL(url.protocol, url.host, url.port, url.path).toString()
37+
}
2438
}

0 commit comments

Comments
 (0)