@@ -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(
5557 private val pluginVersion : String = " development" ,
5658) {
5759 private val settings = context.settingsStore.readOnly()
60+ private lateinit var moshi: Moshi
5861 private lateinit var httpClient: OkHttpClient
5962 private lateinit var retroRestClient: CoderV2RestFacade
6063
@@ -66,7 +69,7 @@ open class CoderRestClient(
6669 }
6770
6871 fun setupSession () {
69- val moshi =
72+ moshi =
7073 Moshi .Builder ()
7174 .add(ArchConverter ())
7275 .add(InstantConverter ())
@@ -152,7 +155,7 @@ open class CoderRestClient(
152155 suspend fun me (): User {
153156 val userResponse = retroRestClient.me()
154157 if (! userResponse.isSuccessful) {
155- throw APIResponseException (" authenticate" , url, userResponse)
158+ throw APIResponseException (" authenticate" , url, userResponse.code(), userResponse.parseErrorBody(moshi) )
156159 }
157160
158161 return userResponse.body()!!
@@ -165,7 +168,12 @@ open class CoderRestClient(
165168 suspend fun workspaces (): List <Workspace > {
166169 val workspacesResponse = retroRestClient.workspaces(" owner:me" )
167170 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+ )
169177 }
170178
171179 return workspacesResponse.body()!! .workspaces
@@ -178,7 +186,12 @@ open class CoderRestClient(
178186 suspend fun workspace (workspaceID : UUID ): Workspace {
179187 val workspacesResponse = retroRestClient.workspace(workspaceID)
180188 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+ )
182195 }
183196
184197 return workspacesResponse.body()!!
@@ -209,15 +222,25 @@ open class CoderRestClient(
209222 val resourcesResponse =
210223 retroRestClient.templateVersionResources(workspace.latestBuild.templateVersionID)
211224 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+ )
213231 }
214232 return resourcesResponse.body()!!
215233 }
216234
217235 suspend fun buildInfo (): BuildInfo {
218236 val buildInfoResponse = retroRestClient.buildInfo()
219237 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+ )
221244 }
222245 return buildInfoResponse.body()!!
223246 }
@@ -228,7 +251,12 @@ open class CoderRestClient(
228251 private suspend fun template (templateID : UUID ): Template {
229252 val templateResponse = retroRestClient.template(templateID)
230253 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+ )
232260 }
233261 return templateResponse.body()!!
234262 }
@@ -240,7 +268,12 @@ open class CoderRestClient(
240268 val buildRequest = CreateWorkspaceBuildRequest (null , WorkspaceTransition .START )
241269 val buildResponse = retroRestClient.createWorkspaceBuild(workspace.id, buildRequest)
242270 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+ )
244277 }
245278 return buildResponse.body()!!
246279 }
@@ -251,7 +284,12 @@ open class CoderRestClient(
251284 val buildRequest = CreateWorkspaceBuildRequest (null , WorkspaceTransition .STOP )
252285 val buildResponse = retroRestClient.createWorkspaceBuild(workspace.id, buildRequest)
253286 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+ )
255293 }
256294 return buildResponse.body()!!
257295 }
@@ -263,7 +301,12 @@ open class CoderRestClient(
263301 val buildRequest = CreateWorkspaceBuildRequest (null , WorkspaceTransition .DELETE , false )
264302 val buildResponse = retroRestClient.createWorkspaceBuild(workspace.id, buildRequest)
265303 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+ )
267310 }
268311 }
269312
@@ -283,7 +326,12 @@ open class CoderRestClient(
283326 CreateWorkspaceBuildRequest (template.activeVersionID, WorkspaceTransition .START )
284327 val buildResponse = retroRestClient.createWorkspaceBuild(workspace.id, buildRequest)
285328 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+ )
287335 }
288336 return 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+ }
0 commit comments