1
1
using System ;
2
2
using System . Collections . Generic ;
3
3
using System . Linq ;
4
- using System . Threading . Tasks ;
5
4
using GitHub . Logging ;
6
5
using System . Runtime . Serialization ;
7
6
using System . Text ;
@@ -33,127 +32,25 @@ public ApiClient(UriString hostUrl, IKeychain keychain, IProcessManager processM
33
32
this . taskManager = taskManager ;
34
33
this . nodeJsExecutablePath = nodeJsExecutablePath ;
35
34
this . octorunScriptPath = octorunScriptPath ;
36
- loginManager = new LoginManager ( keychain ,
37
- processManager : processManager ,
38
- taskManager : taskManager ,
39
- nodeJsExecutablePath : nodeJsExecutablePath ,
40
- octorunScript : octorunScriptPath ) ;
35
+ loginManager = new LoginManager ( keychain , processManager , taskManager , nodeJsExecutablePath , octorunScriptPath ) ;
41
36
}
42
37
43
38
public ITask Logout ( UriString host )
44
39
{
45
40
return loginManager . Logout ( host ) ;
46
41
}
47
42
48
- public async Task CreateRepository ( string name , string description , bool isPrivate , Action < GitHubRepository , Exception > callback , string organization = null )
43
+ public void CreateRepository ( string name , string description , bool isPrivate , Action < GitHubRepository , Exception > callback , string organization = null )
49
44
{
50
45
Guard . ArgumentNotNull ( callback , "callback" ) ;
51
- try
52
- {
53
- var repository = await CreateRepositoryInternal ( name , organization , description , isPrivate ) ;
54
- callback ( repository , null ) ;
55
- }
56
- catch ( Exception e )
57
- {
58
- callback ( null , e ) ;
59
- }
60
- }
61
-
62
- public async Task GetOrganizations ( Action < Organization [ ] > onSuccess , Action < Exception > onError = null )
63
- {
64
- Guard . ArgumentNotNull ( onSuccess , nameof ( onSuccess ) ) ;
65
- await GetOrganizationInternal ( onSuccess , onError ) ;
66
- }
67
46
68
- public async Task GetCurrentUser ( Action < GitHubUser > onSuccess , Action < Exception > onError = null )
69
- {
70
- Guard . ArgumentNotNull ( onSuccess , nameof ( onSuccess ) ) ;
71
- try
72
- {
73
- var user = await GetCurrentUser ( ) ;
74
- onSuccess ( user ) ;
75
- }
76
- catch ( Exception e )
47
+ new FuncTask < GitHubRepository > ( taskManager . Token , ( ) =>
77
48
{
78
- onError ? . Invoke ( e ) ;
79
- }
80
- }
81
-
82
- public async Task Login ( string username , string password , Action < LoginResult > need2faCode , Action < bool , string > result )
83
- {
84
- Guard . ArgumentNotNull ( need2faCode , "need2faCode" ) ;
85
- Guard . ArgumentNotNull ( result , "result" ) ;
86
-
87
- LoginResultData res = null ;
88
- try
89
- {
90
- res = await loginManager . Login ( OriginalUrl , username , password ) ;
91
- }
92
- catch ( Exception ex )
93
- {
94
- logger . Warning ( ex ) ;
95
- result ( false , ex . Message ) ;
96
- return ;
97
- }
98
-
99
- if ( res . Code == LoginResultCodes . CodeRequired )
100
- {
101
- var resultCache = new LoginResult ( res , result , need2faCode ) ;
102
- need2faCode ( resultCache ) ;
103
- }
104
- else
105
- {
106
- result ( res . Code == LoginResultCodes . Success , res . Message ) ;
107
- }
108
- }
109
-
110
- public async Task ContinueLogin ( LoginResult loginResult , string code )
111
- {
112
- LoginResultData result = null ;
113
- try
114
- {
115
- result = await loginManager . ContinueLogin ( loginResult . Data , code ) ;
116
- }
117
- catch ( Exception ex )
118
- {
119
- loginResult . Callback ( false , ex . Message ) ;
120
- return ;
121
- }
122
- if ( result . Code == LoginResultCodes . CodeFailed )
123
- {
124
- loginResult . TwoFACallback ( new LoginResult ( result , loginResult . Callback , loginResult . TwoFACallback ) ) ;
125
- }
126
- loginResult . Callback ( result . Code == LoginResultCodes . Success , result . Message ) ;
127
- }
128
-
129
- private async Task < GitHubUser > GetCurrentUser ( )
130
- {
131
- //TODO: ONE_USER_LOGIN This assumes we only support one login
132
- var keychainConnection = keychain . Connections . FirstOrDefault ( ) ;
133
- if ( keychainConnection == null )
134
- throw new KeychainEmptyException ( ) ;
135
-
136
- var keychainAdapter = await GetValidatedKeychainAdapter ( keychainConnection ) ;
137
-
138
- // we can't trust that the system keychain has the username filled out correctly.
139
- // if it doesn't, we need to grab the username from the server and check it
140
- // unfortunately this means that things will be slower when the keychain doesn't have all the info
141
- if ( keychainConnection . User == null || keychainAdapter . Credential . Username != keychainConnection . Username )
142
- {
143
- keychainConnection . User = await GetValidatedGitHubUser ( keychainConnection , keychainAdapter ) ;
144
- }
145
- return keychainConnection . User ;
146
- }
147
-
148
- private async Task < GitHubRepository > CreateRepositoryInternal ( string repositoryName , string organization , string description , bool isPrivate )
149
- {
150
- try
151
- {
152
- var user = await GetCurrentUser ( ) ;
49
+ var user = GetCurrentUser ( ) ;
153
50
var keychainAdapter = keychain . Connect ( OriginalUrl ) ;
154
51
155
52
var command = new StringBuilder ( "publish -r \" " ) ;
156
- command . Append ( repositoryName ) ;
53
+ command . Append ( name ) ;
157
54
command . Append ( "\" " ) ;
158
55
159
56
if ( ! string . IsNullOrEmpty ( description ) )
@@ -176,10 +73,10 @@ private async Task<GitHubRepository> CreateRepositoryInternal(string repositoryN
176
73
}
177
74
178
75
var octorunTask = new OctorunTask ( taskManager . Token , nodeJsExecutablePath , octorunScriptPath , command . ToString ( ) ,
179
- user : user . Login , userToken : keychainAdapter . Credential . Token )
76
+ user : user . Login , userToken : keychainAdapter . Credential . Token )
180
77
. Configure ( processManager ) ;
181
78
182
- var ret = await octorunTask . StartAwait ( ) ;
79
+ var ret = octorunTask . RunSynchronously ( ) ;
183
80
if ( ret . IsSuccess && ret . Output . Length == 2 )
184
81
{
185
82
return new GitHubRepository
@@ -190,26 +87,33 @@ private async Task<GitHubRepository> CreateRepositoryInternal(string repositoryN
190
87
}
191
88
192
89
throw new ApiClientException ( ret . GetApiErrorMessage ( ) ?? "Publish failed" ) ;
193
- }
194
- catch ( Exception ex )
90
+ } )
91
+ . FinallyInUI ( ( success , ex , repository ) =>
195
92
{
196
- logger . Error ( ex , "Error Creating Repository" ) ;
197
- throw ;
198
- }
93
+ if ( success )
94
+ callback ( repository , null ) ;
95
+ else
96
+ {
97
+ logger . Error ( ex , "Error creating repository" ) ;
98
+ callback ( null , ex ) ;
99
+ }
100
+ } )
101
+ . Start ( ) ;
199
102
}
200
103
201
- private async Task GetOrganizationInternal ( Action < Organization [ ] > onSuccess , Action < Exception > onError = null )
104
+ public void GetOrganizations ( Action < Organization [ ] > onSuccess , Action < Exception > onError = null )
202
105
{
203
- try
106
+ Guard . ArgumentNotNull ( onSuccess , nameof ( onSuccess ) ) ;
107
+ new FuncTask < Organization [ ] > ( taskManager . Token , ( ) =>
204
108
{
205
- var user = await GetCurrentUser ( ) ;
109
+ var user = GetCurrentUser ( ) ;
206
110
var keychainAdapter = keychain . Connect ( OriginalUrl ) ;
207
111
208
112
var octorunTask = new OctorunTask ( taskManager . Token , nodeJsExecutablePath , octorunScriptPath , "organizations" ,
209
113
user : user . Login , userToken : keychainAdapter . Credential . Token )
210
114
. Configure ( processManager ) ;
211
115
212
- var ret = await octorunTask . StartAsAsync ( ) ;
116
+ var ret = octorunTask . RunSynchronously ( ) ;
213
117
if ( ret . IsSuccess )
214
118
{
215
119
var organizations = new List < Organization > ( ) ;
@@ -221,23 +125,109 @@ private async Task GetOrganizationInternal(Action<Organization[]> onSuccess, Act
221
125
Login = ret . Output [ i + 1 ]
222
126
} ) ;
223
127
}
224
-
225
- onSuccess ( organizations . ToArray ( ) ) ;
226
- return ;
128
+ return organizations . ToArray ( ) ;
227
129
}
228
130
229
131
throw new ApiClientException ( ret . GetApiErrorMessage ( ) ?? "Error getting organizations" ) ;
230
- }
231
- catch ( Exception ex )
132
+ } )
133
+ . FinallyInUI ( ( success , ex , orgs ) =>
134
+ {
135
+ if ( success )
136
+ onSuccess ( orgs ) ;
137
+ else
138
+ {
139
+ logger . Error ( ex , "Error Getting Organizations" ) ;
140
+ onError ? . Invoke ( ex ) ;
141
+ }
142
+ } )
143
+ . Start ( ) ;
144
+ }
145
+
146
+ public void GetCurrentUser ( Action < GitHubUser > onSuccess , Action < Exception > onError = null )
147
+ {
148
+ Guard . ArgumentNotNull ( onSuccess , nameof ( onSuccess ) ) ;
149
+ new FuncTask < GitHubUser > ( taskManager . Token , GetCurrentUser )
150
+ . FinallyInUI ( ( success , ex , user ) =>
151
+ {
152
+ if ( success )
153
+ onSuccess ( user ) ;
154
+ else
155
+ onError ? . Invoke ( ex ) ;
156
+ } )
157
+ . Start ( ) ;
158
+ }
159
+
160
+ public void Login ( string username , string password , Action < LoginResult > need2faCode , Action < bool , string > result )
161
+ {
162
+ Guard . ArgumentNotNull ( need2faCode , "need2faCode" ) ;
163
+ Guard . ArgumentNotNull ( result , "result" ) ;
164
+
165
+ new FuncTask < LoginResultData > ( taskManager . Token ,
166
+ ( ) => loginManager . Login ( OriginalUrl , username , password ) )
167
+ . FinallyInUI ( ( success , ex , res ) =>
168
+ {
169
+ if ( ! success )
170
+ {
171
+ logger . Warning ( ex ) ;
172
+ result ( false , ex . Message ) ;
173
+ return ;
174
+ }
175
+
176
+ if ( res . Code == LoginResultCodes . CodeRequired )
177
+ {
178
+ var resultCache = new LoginResult ( res , result , need2faCode ) ;
179
+ need2faCode ( resultCache ) ;
180
+ }
181
+ else
182
+ {
183
+ result ( res . Code == LoginResultCodes . Success , res . Message ) ;
184
+ }
185
+ } )
186
+ . Start ( ) ;
187
+ }
188
+
189
+ public void ContinueLogin ( LoginResult loginResult , string code )
190
+ {
191
+ new FuncTask < LoginResultData > ( taskManager . Token ,
192
+ ( ) => loginManager . ContinueLogin ( loginResult . Data , code ) )
193
+ . FinallyInUI ( ( success , ex , result ) =>
194
+ {
195
+ if ( ! success )
196
+ {
197
+ loginResult . Callback ( false , ex . Message ) ;
198
+ return ;
199
+ }
200
+ if ( result . Code == LoginResultCodes . CodeFailed )
201
+ {
202
+ loginResult . TwoFACallback ( new LoginResult ( result , loginResult . Callback , loginResult . TwoFACallback ) ) ;
203
+ }
204
+ loginResult . Callback ( result . Code == LoginResultCodes . Success , result . Message ) ;
205
+ } )
206
+ . Start ( ) ;
207
+ }
208
+
209
+ private GitHubUser GetCurrentUser ( )
210
+ {
211
+ //TODO: ONE_USER_LOGIN This assumes we only support one login
212
+ var keychainConnection = keychain . Connections . FirstOrDefault ( ) ;
213
+ if ( keychainConnection == null )
214
+ throw new KeychainEmptyException ( ) ;
215
+
216
+ var keychainAdapter = GetValidatedKeychainAdapter ( keychainConnection ) ;
217
+
218
+ // we can't trust that the system keychain has the username filled out correctly.
219
+ // if it doesn't, we need to grab the username from the server and check it
220
+ // unfortunately this means that things will be slower when the keychain doesn't have all the info
221
+ if ( keychainConnection . User == null || keychainAdapter . Credential . Username != keychainConnection . Username )
232
222
{
233
- logger . Error ( ex , "Error Getting Organizations" ) ;
234
- onError ? . Invoke ( ex ) ;
223
+ keychainConnection . User = GetValidatedGitHubUser ( keychainConnection , keychainAdapter ) ;
235
224
}
225
+ return keychainConnection . User ;
236
226
}
237
227
238
- private async Task < IKeychainAdapter > GetValidatedKeychainAdapter ( Connection keychainConnection )
228
+ private IKeychainAdapter GetValidatedKeychainAdapter ( Connection keychainConnection )
239
229
{
240
- var keychainAdapter = await keychain . Load ( keychainConnection . Host ) ;
230
+ var keychainAdapter = keychain . Load ( keychainConnection . Host ) ;
241
231
if ( keychainAdapter == null )
242
232
throw new KeychainEmptyException ( ) ;
243
233
@@ -255,15 +245,15 @@ private async Task<IKeychainAdapter> GetValidatedKeychainAdapter(Connection keyc
255
245
return keychainAdapter ;
256
246
}
257
247
258
- private async Task < GitHubUser > GetValidatedGitHubUser ( Connection keychainConnection , IKeychainAdapter keychainAdapter )
248
+ private GitHubUser GetValidatedGitHubUser ( Connection keychainConnection , IKeychainAdapter keychainAdapter )
259
249
{
260
250
try
261
251
{
262
252
var octorunTask = new OctorunTask ( taskManager . Token , nodeJsExecutablePath , octorunScriptPath , "validate" ,
263
253
user : keychainConnection . Username , userToken : keychainAdapter . Credential . Token )
264
254
. Configure ( processManager ) ;
265
255
266
- var ret = await octorunTask . StartAsAsync ( ) ;
256
+ var ret = octorunTask . RunSynchronously ( ) ;
267
257
if ( ret . IsSuccess )
268
258
{
269
259
var login = ret . Output [ 1 ] ;
0 commit comments