@@ -7,6 +7,7 @@ import com.coder.toolbox.sdk.convertors.OSConverter
7
7
import com.coder.toolbox.sdk.convertors.UUIDConverter
8
8
import com.coder.toolbox.sdk.ex.APIResponseException
9
9
import com.coder.toolbox.sdk.v2.CoderV2RestFacade
10
+ import com.coder.toolbox.sdk.v2.models.ApiErrorResponse
10
11
import com.coder.toolbox.sdk.v2.models.BuildInfo
11
12
import com.coder.toolbox.sdk.v2.models.CreateWorkspaceBuildRequest
12
13
import com.coder.toolbox.sdk.v2.models.Template
@@ -24,6 +25,7 @@ import com.coder.toolbox.util.getOS
24
25
import com.squareup.moshi.Moshi
25
26
import okhttp3.Credentials
26
27
import okhttp3.OkHttpClient
28
+ import retrofit2.Response
27
29
import retrofit2.Retrofit
28
30
import retrofit2.converter.moshi.MoshiConverterFactory
29
31
import java.net.HttpURLConnection
@@ -55,6 +57,7 @@ open class CoderRestClient(
55
57
private val pluginVersion : String = " development" ,
56
58
) {
57
59
private val settings = context.settingsStore.readOnly()
60
+ private lateinit var moshi: Moshi
58
61
private lateinit var httpClient: OkHttpClient
59
62
private lateinit var retroRestClient: CoderV2RestFacade
60
63
@@ -66,7 +69,7 @@ open class CoderRestClient(
66
69
}
67
70
68
71
fun setupSession () {
69
- val moshi =
72
+ moshi =
70
73
Moshi .Builder ()
71
74
.add(ArchConverter ())
72
75
.add(InstantConverter ())
@@ -152,7 +155,7 @@ open class CoderRestClient(
152
155
suspend fun me (): User {
153
156
val userResponse = retroRestClient.me()
154
157
if (! userResponse.isSuccessful) {
155
- throw APIResponseException (" authenticate" , url, userResponse)
158
+ throw APIResponseException (" authenticate" , url, userResponse.code(), userResponse.parseErrorBody(moshi) )
156
159
}
157
160
158
161
return userResponse.body()!!
@@ -165,7 +168,12 @@ open class CoderRestClient(
165
168
suspend fun workspaces (): List <Workspace > {
166
169
val workspacesResponse = retroRestClient.workspaces(" owner:me" )
167
170
if (! workspacesResponse.isSuccessful) {
168
- throw APIResponseException (" retrieve workspaces" , url, workspacesResponse)
171
+ throw APIResponseException (
172
+ " retrieve workspaces" ,
173
+ url,
174
+ workspacesResponse.code(),
175
+ workspacesResponse.parseErrorBody(moshi)
176
+ )
169
177
}
170
178
171
179
return workspacesResponse.body()!! .workspaces
@@ -178,7 +186,12 @@ open class CoderRestClient(
178
186
suspend fun workspace (workspaceID : UUID ): Workspace {
179
187
val workspacesResponse = retroRestClient.workspace(workspaceID)
180
188
if (! workspacesResponse.isSuccessful) {
181
- throw APIResponseException (" retrieve workspace" , url, workspacesResponse)
189
+ throw APIResponseException (
190
+ " retrieve workspace" ,
191
+ url,
192
+ workspacesResponse.code(),
193
+ workspacesResponse.parseErrorBody(moshi)
194
+ )
182
195
}
183
196
184
197
return workspacesResponse.body()!!
@@ -209,15 +222,25 @@ open class CoderRestClient(
209
222
val resourcesResponse =
210
223
retroRestClient.templateVersionResources(workspace.latestBuild.templateVersionID)
211
224
if (! resourcesResponse.isSuccessful) {
212
- throw APIResponseException (" retrieve resources for ${workspace.name} " , url, resourcesResponse)
225
+ throw APIResponseException (
226
+ " retrieve resources for ${workspace.name} " ,
227
+ url,
228
+ resourcesResponse.code(),
229
+ resourcesResponse.parseErrorBody(moshi)
230
+ )
213
231
}
214
232
return resourcesResponse.body()!!
215
233
}
216
234
217
235
suspend fun buildInfo (): BuildInfo {
218
236
val buildInfoResponse = retroRestClient.buildInfo()
219
237
if (! buildInfoResponse.isSuccessful) {
220
- throw APIResponseException (" retrieve build information" , url, buildInfoResponse)
238
+ throw APIResponseException (
239
+ " retrieve build information" ,
240
+ url,
241
+ buildInfoResponse.code(),
242
+ buildInfoResponse.parseErrorBody(moshi)
243
+ )
221
244
}
222
245
return buildInfoResponse.body()!!
223
246
}
@@ -228,7 +251,12 @@ open class CoderRestClient(
228
251
private suspend fun template (templateID : UUID ): Template {
229
252
val templateResponse = retroRestClient.template(templateID)
230
253
if (! templateResponse.isSuccessful) {
231
- throw APIResponseException (" retrieve template with ID $templateID " , url, templateResponse)
254
+ throw APIResponseException (
255
+ " retrieve template with ID $templateID " ,
256
+ url,
257
+ templateResponse.code(),
258
+ templateResponse.parseErrorBody(moshi)
259
+ )
232
260
}
233
261
return templateResponse.body()!!
234
262
}
@@ -240,7 +268,12 @@ open class CoderRestClient(
240
268
val buildRequest = CreateWorkspaceBuildRequest (null , WorkspaceTransition .START )
241
269
val buildResponse = retroRestClient.createWorkspaceBuild(workspace.id, buildRequest)
242
270
if (buildResponse.code() != HttpURLConnection .HTTP_CREATED ) {
243
- throw APIResponseException (" start workspace ${workspace.name} " , url, buildResponse)
271
+ throw APIResponseException (
272
+ " start workspace ${workspace.name} " ,
273
+ url,
274
+ buildResponse.code(),
275
+ buildResponse.parseErrorBody(moshi)
276
+ )
244
277
}
245
278
return buildResponse.body()!!
246
279
}
@@ -251,7 +284,12 @@ open class CoderRestClient(
251
284
val buildRequest = CreateWorkspaceBuildRequest (null , WorkspaceTransition .STOP )
252
285
val buildResponse = retroRestClient.createWorkspaceBuild(workspace.id, buildRequest)
253
286
if (buildResponse.code() != HttpURLConnection .HTTP_CREATED ) {
254
- throw APIResponseException (" stop workspace ${workspace.name} " , url, buildResponse)
287
+ throw APIResponseException (
288
+ " stop workspace ${workspace.name} " ,
289
+ url,
290
+ buildResponse.code(),
291
+ buildResponse.parseErrorBody(moshi)
292
+ )
255
293
}
256
294
return buildResponse.body()!!
257
295
}
@@ -263,7 +301,12 @@ open class CoderRestClient(
263
301
val buildRequest = CreateWorkspaceBuildRequest (null , WorkspaceTransition .DELETE , false )
264
302
val buildResponse = retroRestClient.createWorkspaceBuild(workspace.id, buildRequest)
265
303
if (buildResponse.code() != HttpURLConnection .HTTP_CREATED ) {
266
- throw APIResponseException (" delete workspace ${workspace.name} " , url, buildResponse)
304
+ throw APIResponseException (
305
+ " delete workspace ${workspace.name} " ,
306
+ url,
307
+ buildResponse.code(),
308
+ buildResponse.parseErrorBody(moshi)
309
+ )
267
310
}
268
311
}
269
312
@@ -283,7 +326,12 @@ open class CoderRestClient(
283
326
CreateWorkspaceBuildRequest (template.activeVersionID, WorkspaceTransition .START )
284
327
val buildResponse = retroRestClient.createWorkspaceBuild(workspace.id, buildRequest)
285
328
if (buildResponse.code() != HttpURLConnection .HTTP_CREATED ) {
286
- throw APIResponseException (" update workspace ${workspace.name} " , url, buildResponse)
329
+ throw APIResponseException (
330
+ " update workspace ${workspace.name} " ,
331
+ url,
332
+ buildResponse.code(),
333
+ buildResponse.parseErrorBody(moshi)
334
+ )
287
335
}
288
336
return buildResponse.body()!!
289
337
}
@@ -296,3 +344,13 @@ open class CoderRestClient(
296
344
}
297
345
}
298
346
}
347
+
348
+ private fun Response <* >.parseErrorBody (moshi : Moshi ): ApiErrorResponse ? {
349
+ val errorBody = this .errorBody() ? : return null
350
+ return try {
351
+ val adapter = moshi.adapter(ApiErrorResponse ::class .java)
352
+ adapter.fromJson(errorBody.string())
353
+ } catch (e: Exception ) {
354
+ null
355
+ }
356
+ }
0 commit comments