avito-android
90 строк · 3.2 Кб
1package com.avito.plugin
2
3import com.avito.android.Result
4import com.avito.http.RetryInterceptor
5import com.avito.logger.LoggerFactory
6import com.avito.logger.create
7import com.google.gson.GsonBuilder
8import okhttp3.MultipartBody
9import okhttp3.OkHttpClient
10import okhttp3.RequestBody.Companion.asRequestBody
11import retrofit2.Call
12import retrofit2.Retrofit
13import retrofit2.converter.gson.GsonConverterFactory
14import retrofit2.create
15import java.io.File
16import java.util.concurrent.TimeUnit
17
18internal class QAppsUploadAction(
19private val apk: File,
20private val comment: String,
21private val host: String,
22private val branch: String,
23private val versionName: String,
24private val versionCode: String,
25private val packageName: String,
26private val releaseChain: Boolean,
27private val httpClientBuilder: OkHttpClient.Builder,
28loggerFactory: LoggerFactory
29) {
30
31private val logger = loggerFactory.create<QAppsUploadAction>()
32
33private val apiClient by lazy {
34Retrofit.Builder()
35.baseUrl(host)
36.addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))
37.client(
38httpClientBuilder
39.connectTimeout(TIMEOUT_SEC, TimeUnit.SECONDS)
40.writeTimeout(TIMEOUT_SEC, TimeUnit.SECONDS)
41.readTimeout(TIMEOUT_SEC, TimeUnit.SECONDS)
42.addInterceptor(
43RetryInterceptor(
44retries = 3,
45allowedMethods = listOf("GET", "POST")
46)
47)
48.build()
49)
50.validateEagerly(true)
51.build()
52.create<QAppsUploadApi>()
53}
54
55fun upload(): Result<Unit> = Result.tryCatch {
56val response = uploadRequest().execute()
57if (!response.isSuccessful) {
58val error = response.errorBody()?.string() ?: "unknown error"
59error("Can't upload apk to qapps: $error")
60}
61}
62
63private fun uploadRequest(): Call<Void> {
64logger.info(
65"qapps upload: " +
66"apk=${apk.path}, " +
67"branch=$branch, " +
68"version_name=$versionName, " +
69"version_code=$versionCode, " +
70"package_name=$packageName, " +
71"release_chain=$releaseChain, " +
72"comment=$comment"
73)
74return apiClient.upload(
75comment = MultipartBody.Part.createFormData("comment", comment),
76branch = MultipartBody.Part.createFormData("branch", branch),
77version_name = MultipartBody.Part.createFormData("version_name", versionName),
78version_code = MultipartBody.Part.createFormData("version_code", versionCode),
79package_name = MultipartBody.Part.createFormData("package_name", packageName),
80release_chain = MultipartBody.Part.createFormData("release_chain", releaseChain.toString()),
81apk = MultipartBody.Part.createFormData(
82"app",
83apk.name,
84apk.asRequestBody(null)
85)
86)
87}
88}
89
90private const val TIMEOUT_SEC = 60L
91