Skip to content

Commit ba0e1a4

Browse files
authored
Merge pull request #147 from YAPP-Github/feature/#145-report-submit-api
[Feature/#145] 제보 제출 로직을 구현합니다..
2 parents a80621f + 77d93c5 commit ba0e1a4

29 files changed

Lines changed: 573 additions & 40 deletions

File tree

app/src/main/java/com/threegap/bitnagil/di/core/NetworkModule.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import android.content.Intent
55
import com.threegap.bitnagil.BuildConfig
66
import com.threegap.bitnagil.MainActivity
77
import com.threegap.bitnagil.datastore.auth.storage.AuthTokenDataStore
8+
import com.threegap.bitnagil.network.Auth
9+
import com.threegap.bitnagil.network.Kakao
10+
import com.threegap.bitnagil.network.NoneAuth
811
import com.threegap.bitnagil.network.auth.AuthInterceptor
912
import com.threegap.bitnagil.network.auth.TokenAuthenticator
1013
import com.threegap.bitnagil.network.token.ReissueService

app/src/main/java/com/threegap/bitnagil/di/data/DataSourceModule.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@ import com.threegap.bitnagil.data.auth.datasourceimpl.AuthLocalDataSourceImpl
1010
import com.threegap.bitnagil.data.auth.datasourceimpl.AuthRemoteDataSourceImpl
1111
import com.threegap.bitnagil.data.emotion.datasource.EmotionDataSource
1212
import com.threegap.bitnagil.data.emotion.datasourceImpl.EmotionDataSourceImpl
13+
import com.threegap.bitnagil.data.file.datasource.FileDataSource
14+
import com.threegap.bitnagil.data.file.datasourceImpl.FileDataSourceImpl
1315
import com.threegap.bitnagil.data.onboarding.datasource.OnBoardingDataSource
1416
import com.threegap.bitnagil.data.onboarding.datasourceImpl.OnBoardingDataSourceImpl
1517
import com.threegap.bitnagil.data.recommendroutine.datasource.RecommendRoutineDataSource
1618
import com.threegap.bitnagil.data.recommendroutine.datasourceImpl.RecommendRoutineDataSourceImpl
19+
import com.threegap.bitnagil.data.report.datasource.ReportDataSource
20+
import com.threegap.bitnagil.data.report.datasourceImpl.ReportDataSourceImpl
1721
import com.threegap.bitnagil.data.routine.datasource.RoutineRemoteDataSource
1822
import com.threegap.bitnagil.data.routine.datasourceImpl.RoutineRemoteDataSourceImpl
1923
import com.threegap.bitnagil.data.user.datasource.UserDataSource
@@ -75,4 +79,12 @@ abstract class DataSourceModule {
7579
@Binds
7680
@Singleton
7781
abstract fun bindAddressDataSource(addressDataSourceImpl: AddressDataSourceImpl): AddressDataSource
82+
83+
@Binds
84+
@Singleton
85+
abstract fun bindFileDataSource(impl: FileDataSourceImpl): FileDataSource
86+
87+
@Binds
88+
@Singleton
89+
abstract fun bindReportDataSource(impl: ReportDataSourceImpl): ReportDataSource
7890
}

app/src/main/java/com/threegap/bitnagil/di/data/RepositoryModule.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,21 @@ package com.threegap.bitnagil.di.data
33
import com.threegap.bitnagil.data.address.repositoryImpl.AddressRepositoryImpl
44
import com.threegap.bitnagil.data.auth.repositoryimpl.AuthRepositoryImpl
55
import com.threegap.bitnagil.data.emotion.repositoryImpl.EmotionRepositoryImpl
6+
import com.threegap.bitnagil.data.file.repositoryImpl.FileRepositoryImpl
67
import com.threegap.bitnagil.data.onboarding.repositoryImpl.OnBoardingRepositoryImpl
78
import com.threegap.bitnagil.data.recommendroutine.repositoryImpl.RecommendRoutineRepositoryImpl
9+
import com.threegap.bitnagil.data.report.repositoryImpl.ReportRepositoryImpl
810
import com.threegap.bitnagil.data.routine.repositoryImpl.RoutineRepositoryImpl
911
import com.threegap.bitnagil.data.user.repositoryImpl.UserRepositoryImpl
1012
import com.threegap.bitnagil.data.version.repositoryImpl.VersionRepositoryImpl
1113
import com.threegap.bitnagil.data.writeroutine.repositoryImpl.WriteRoutineRepositoryImpl
1214
import com.threegap.bitnagil.domain.address.repository.AddressRepository
1315
import com.threegap.bitnagil.domain.auth.repository.AuthRepository
1416
import com.threegap.bitnagil.domain.emotion.repository.EmotionRepository
17+
import com.threegap.bitnagil.domain.file.repository.FileRepository
1518
import com.threegap.bitnagil.domain.onboarding.repository.OnBoardingRepository
1619
import com.threegap.bitnagil.domain.recommendroutine.repository.RecommendRoutineRepository
20+
import com.threegap.bitnagil.domain.report.repository.ReportRepository
1721
import com.threegap.bitnagil.domain.routine.repository.RoutineRepository
1822
import com.threegap.bitnagil.domain.user.repository.UserRepository
1923
import com.threegap.bitnagil.domain.version.repository.VersionRepository
@@ -63,4 +67,12 @@ abstract class RepositoryModule {
6367
@Binds
6468
@Singleton
6569
abstract fun bindAddressRepository(addressRepositoryImpl: AddressRepositoryImpl): AddressRepository
70+
71+
@Binds
72+
@Singleton
73+
abstract fun bindFileRepository(impl: FileRepositoryImpl): FileRepository
74+
75+
@Binds
76+
@Singleton
77+
abstract fun bindReportRepository(impl: ReportRepositoryImpl): ReportRepository
6678
}

app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@ package com.threegap.bitnagil.di.data
33
import com.threegap.bitnagil.data.address.service.AddressService
44
import com.threegap.bitnagil.data.auth.service.AuthService
55
import com.threegap.bitnagil.data.emotion.service.EmotionService
6+
import com.threegap.bitnagil.data.file.service.FileService
67
import com.threegap.bitnagil.data.onboarding.service.OnBoardingService
78
import com.threegap.bitnagil.data.recommendroutine.service.RecommendRoutineService
9+
import com.threegap.bitnagil.data.report.service.ReportService
810
import com.threegap.bitnagil.data.routine.service.RoutineService
911
import com.threegap.bitnagil.data.user.service.UserService
1012
import com.threegap.bitnagil.data.version.service.VersionService
1113
import com.threegap.bitnagil.data.writeroutine.service.WriteRoutineService
12-
import com.threegap.bitnagil.di.core.Auth
13-
import com.threegap.bitnagil.di.core.Kakao
14-
import com.threegap.bitnagil.di.core.NoneAuth
14+
import com.threegap.bitnagil.network.Auth
15+
import com.threegap.bitnagil.network.Kakao
16+
import com.threegap.bitnagil.network.NoneAuth
1517
import com.threegap.bitnagil.network.token.ReissueService
1618
import dagger.Module
1719
import dagger.Provides
@@ -73,4 +75,14 @@ object ServiceModule {
7375
@Singleton
7476
fun provideAddressService(@Kakao retrofit: Retrofit): AddressService =
7577
retrofit.create(AddressService::class.java)
78+
79+
@Provides
80+
@Singleton
81+
fun provideFileService(@Auth retrofit: Retrofit): FileService =
82+
retrofit.create(FileService::class.java)
83+
84+
@Provides
85+
@Singleton
86+
fun provideReportService(@Auth retrofit: Retrofit): ReportService =
87+
retrofit.create(ReportService::class.java)
7688
}

core/network/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ dependencies {
1313
implementation(libs.bundles.retrofit)
1414
implementation(platform(libs.okhttp.bom))
1515
implementation(libs.bundles.okhttp)
16+
implementation(libs.javax.inject)
1617
}

app/src/main/java/com/threegap/bitnagil/di/core/Qualifier.kt renamed to core/network/src/main/java/com/threegap/bitnagil/network/Qualifier.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.threegap.bitnagil.di.core
1+
package com.threegap.bitnagil.network
22

33
import javax.inject.Qualifier
44

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.threegap.bitnagil.data.file.datasource
2+
3+
import com.threegap.bitnagil.data.file.model.request.FileInfoRequestDto
4+
5+
interface FileDataSource {
6+
/**
7+
* presigned URL 요청
8+
* @param fileInfos 파일 정보 리스트 (prefix + fileName)
9+
* @return key: S3 경로, value: presigned URL
10+
*/
11+
suspend fun fetchPresignedUrls(fileInfos: List<FileInfoRequestDto>): Result<Map<String, String>>
12+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.threegap.bitnagil.data.file.datasourceImpl
2+
3+
import com.threegap.bitnagil.data.common.safeApiCall
4+
import com.threegap.bitnagil.data.file.datasource.FileDataSource
5+
import com.threegap.bitnagil.data.file.model.request.FileInfoRequestDto
6+
import com.threegap.bitnagil.data.file.service.FileService
7+
import javax.inject.Inject
8+
9+
class FileDataSourceImpl @Inject constructor(
10+
private val fileService: FileService,
11+
) : FileDataSource {
12+
override suspend fun fetchPresignedUrls(fileInfos: List<FileInfoRequestDto>): Result<Map<String, String>> {
13+
return safeApiCall { fileService.fetchPresignedUrls(fileInfos) }
14+
}
15+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.threegap.bitnagil.data.file.model.request
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class FileInfoRequestDto(
8+
@SerialName("prefix")
9+
val prefix: String,
10+
@SerialName("fileName")
11+
val fileName: String,
12+
)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.threegap.bitnagil.data.file.repositoryImpl
2+
3+
import com.threegap.bitnagil.data.file.datasource.FileDataSource
4+
import com.threegap.bitnagil.data.file.model.request.FileInfoRequestDto
5+
import com.threegap.bitnagil.data.file.uploader.ImageUploader
6+
import com.threegap.bitnagil.domain.file.model.ImageFile
7+
import com.threegap.bitnagil.domain.file.repository.FileRepository
8+
import kotlinx.coroutines.async
9+
import kotlinx.coroutines.awaitAll
10+
import kotlinx.coroutines.coroutineScope
11+
import javax.inject.Inject
12+
13+
class FileRepositoryImpl @Inject constructor(
14+
private val fileDataSource: FileDataSource,
15+
private val imageUploader: ImageUploader,
16+
) : FileRepository {
17+
override suspend fun uploadImages(imageFiles: List<ImageFile>): Result<List<String>> {
18+
return runCatching {
19+
val fileInfos = imageFiles.map { imageFile ->
20+
FileInfoRequestDto(prefix = imageFile.prefix, fileName = imageFile.name)
21+
}
22+
23+
val presignedUrlMap: Map<String, String> = fileDataSource
24+
.fetchPresignedUrls(fileInfos)
25+
.getOrThrow()
26+
27+
val presignedUrls = presignedUrlMap.values.toList()
28+
29+
coroutineScope {
30+
imageFiles.zip(presignedUrls).map { (imageFile, presignedUrl) ->
31+
async {
32+
imageUploader
33+
.uploadToPresignedUrl(imageFile, presignedUrl)
34+
.getOrThrow()
35+
}
36+
}.awaitAll()
37+
}
38+
39+
presignedUrls.map { url -> url.substringBefore("?") }
40+
}
41+
}
42+
}

0 commit comments

Comments
 (0)