1
1
package com.coder.gateway.sdk
2
2
3
+ import com.coder.gateway.models.UriScheme
4
+ import com.coder.gateway.models.User
5
+ import com.coder.gateway.models.Workspace
3
6
import com.coder.gateway.sdk.ex.AuthenticationException
4
- import com.intellij.openapi.Disposable
7
+ import com.google.gson.Gson
8
+ import com.google.gson.GsonBuilder
5
9
import com.intellij.openapi.components.Service
6
- import com.intellij.openapi.diagnostic.Logger
10
+ import com.jetbrains.gateway.sdk.convertors.InstantConverter
11
+ import okhttp3.OkHttpClient
12
+ import okhttp3.logging.HttpLoggingInterceptor
7
13
import retrofit2.Retrofit
8
14
import retrofit2.converter.gson.GsonConverterFactory
15
+ import java.time.Instant
9
16
10
17
@Service(Service .Level .APP )
11
- class CoderClientService : Disposable {
18
+ class CoderClientService {
12
19
private lateinit var retroRestClient: CoderRestService
13
20
14
21
lateinit var sessionToken: String
22
+ lateinit var me: User
15
23
16
24
/* *
17
25
* This must be called before anything else. It will authenticate with coder and retrieve a session token
18
26
* @throws [AuthenticationException] if authentication failed
19
27
*/
20
- fun initClientSession (host : String , port : Int , email : String , password : String ) {
28
+ fun initClientSession (uriScheme : UriScheme , host : String , port : Int , email : String , password : String ) {
21
29
val hostPath = host.trimEnd(' /' )
22
- val sessionTokenResponse = Retrofit .Builder ()
23
- .baseUrl(" http://$hostPath :$port " )
24
- .addConverterFactory(GsonConverterFactory .create())
30
+
31
+ val gson: Gson = GsonBuilder ()
32
+ .registerTypeAdapter(Instant ::class .java, InstantConverter ())
33
+ .setPrettyPrinting()
34
+ .create()
35
+
36
+ val interceptor = HttpLoggingInterceptor ()
37
+ interceptor.setLevel(HttpLoggingInterceptor .Level .BODY )
38
+
39
+ retroRestClient = Retrofit .Builder ()
40
+ .baseUrl(" ${uriScheme.scheme} ://$hostPath :$port " )
41
+ .client(OkHttpClient .Builder ().addInterceptor(interceptor).build())
42
+ .addConverterFactory(GsonConverterFactory .create(gson))
25
43
.build()
26
- .create(CoderAuthenticatonRestService ::class .java).authenticate(LoginRequest (email, password)).execute()
44
+ .create(CoderRestService ::class .java)
45
+
46
+ val sessionTokenResponse = retroRestClient.authenticate(LoginRequest (email, password)).execute()
27
47
28
48
if (! sessionTokenResponse.isSuccessful) {
29
- throw AuthenticationException (" Authentication failed with code:${sessionTokenResponse.code()} , reason: ${sessionTokenResponse.errorBody().toString ()} " )
49
+ throw AuthenticationException (" Authentication failed with code:${sessionTokenResponse.code()} , reason: ${sessionTokenResponse.message ()} " )
30
50
}
31
51
sessionToken = sessionTokenResponse.body()!! .sessionToken
32
- retroRestClient = Retrofit .Builder ()
33
- .baseUrl(" https://$hostPath :$port " )
34
- .addConverterFactory(GsonConverterFactory .create())
35
- .build()
36
- .create(CoderRestService ::class .java)
52
+
53
+ val userResponse = retroRestClient.me(sessionToken).execute()
54
+
55
+ if (! userResponse.isSuccessful) {
56
+ throw IllegalStateException (" Could not retrieve information about logged use:${userResponse.code()} , reason: ${userResponse.message()} " )
57
+ }
58
+
59
+ me = userResponse.body()!!
37
60
}
38
61
39
- override fun dispose () {
62
+ fun workspaces (): List <Workspace > {
63
+ val workspacesResponse = retroRestClient.workspaces(sessionToken, me.id).execute()
64
+ if (! workspacesResponse.isSuccessful) {
65
+ throw IllegalStateException (" Could not retrieve Coder Workspaces:${workspacesResponse.code()} , reason: ${workspacesResponse.message()} " )
66
+ }
67
+
68
+ return workspacesResponse.body()!!
40
69
41
70
}
42
71
}
0 commit comments