@@ -7,6 +7,7 @@ import com.coder.toolbox.sdk.convertors.OSConverter
77import com.coder.toolbox.sdk.convertors.UUIDConverter
88import com.coder.toolbox.sdk.ex.APIResponseException
99import com.coder.toolbox.sdk.v2.CoderV2RestFacade
10+ import com.coder.toolbox.sdk.v2.models.ApiErrorResponse
1011import com.coder.toolbox.sdk.v2.models.BuildInfo
1112import com.coder.toolbox.sdk.v2.models.CreateWorkspaceBuildRequest
1213import com.coder.toolbox.sdk.v2.models.Template
@@ -24,6 +25,7 @@ import com.coder.toolbox.util.getOS
2425import com.squareup.moshi.Moshi
2526import okhttp3.Credentials
2627import okhttp3.OkHttpClient
28+ import retrofit2.Response
2729import retrofit2.Retrofit
2830import retrofit2.converter.moshi.MoshiConverterFactory
2931import java.net.HttpURLConnection
@@ -55,6 +57,7 @@ open class CoderRestClient(
5557private val pluginVersion : String =" development" ,
5658) {
5759private val settings= context.settingsStore.readOnly()
60+ private lateinit var moshi: Moshi
5861private lateinit var httpClient: OkHttpClient
5962private lateinit var retroRestClient: CoderV2RestFacade
6063
@@ -66,7 +69,7 @@ open class CoderRestClient(
6669 }
6770
6871fun setupSession () {
69- val moshi=
72+ moshi=
7073Moshi .Builder ()
7174 .add(ArchConverter ())
7275 .add(InstantConverter ())
@@ -152,7 +155,7 @@ open class CoderRestClient(
152155suspend fun me ():User {
153156val userResponse= retroRestClient.me()
154157if (! userResponse.isSuccessful) {
155- throw APIResponseException (" authenticate" , url, userResponse)
158+ throw APIResponseException (" authenticate" , url, userResponse.code(), userResponse.parseErrorBody(moshi) )
156159 }
157160
158161return userResponse.body()!!
@@ -165,7 +168,12 @@ open class CoderRestClient(
165168suspend fun workspaces ():List <Workspace > {
166169val workspacesResponse= retroRestClient.workspaces(" owner:me" )
167170if (! 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+ )
169177 }
170178
171179return workspacesResponse.body()!! .workspaces
@@ -178,7 +186,12 @@ open class CoderRestClient(
178186suspend fun workspace (workspaceID : UUID ):Workspace {
179187val workspacesResponse= retroRestClient.workspace(workspaceID)
180188if (! 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+ )
182195 }
183196
184197return workspacesResponse.body()!!
@@ -209,15 +222,25 @@ open class CoderRestClient(
209222val resourcesResponse=
210223 retroRestClient.templateVersionResources(workspace.latestBuild.templateVersionID)
211224if (! 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+ )
213231 }
214232return resourcesResponse.body()!!
215233 }
216234
217235suspend fun buildInfo ():BuildInfo {
218236val buildInfoResponse= retroRestClient.buildInfo()
219237if (! 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+ )
221244 }
222245return buildInfoResponse.body()!!
223246 }
@@ -228,7 +251,12 @@ open class CoderRestClient(
228251private suspend fun template (templateID : UUID ):Template {
229252val templateResponse= retroRestClient.template(templateID)
230253if (! 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+ )
232260 }
233261return templateResponse.body()!!
234262 }
@@ -240,7 +268,12 @@ open class CoderRestClient(
240268val buildRequest= CreateWorkspaceBuildRequest (null ,WorkspaceTransition .START )
241269val buildResponse= retroRestClient.createWorkspaceBuild(workspace.id, buildRequest)
242270if (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+ )
244277 }
245278return buildResponse.body()!!
246279 }
@@ -251,7 +284,12 @@ open class CoderRestClient(
251284val buildRequest= CreateWorkspaceBuildRequest (null ,WorkspaceTransition .STOP )
252285val buildResponse= retroRestClient.createWorkspaceBuild(workspace.id, buildRequest)
253286if (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+ )
255293 }
256294return buildResponse.body()!!
257295 }
@@ -263,7 +301,12 @@ open class CoderRestClient(
263301val buildRequest= CreateWorkspaceBuildRequest (null ,WorkspaceTransition .DELETE ,false )
264302val buildResponse= retroRestClient.createWorkspaceBuild(workspace.id, buildRequest)
265303if (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+ )
267310 }
268311 }
269312
@@ -283,7 +326,12 @@ open class CoderRestClient(
283326CreateWorkspaceBuildRequest (template.activeVersionID,WorkspaceTransition .START )
284327val buildResponse= retroRestClient.createWorkspaceBuild(workspace.id, buildRequest)
285328if (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+ )
287335 }
288336return buildResponse.body()!!
289337 }
@@ -296,3 +344,13 @@ open class CoderRestClient(
296344 }
297345 }
298346}
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+ }