Uncommited changes synced
[gitlive] / RooTicket.vala
1 /**
2
3 code to fetch ticket info...
4
5 */
6
7 public class RooRepo : Object 
8 {
9  
10  
11
12         public string  id; // not really important that they are numbers..
13         public string project_id;
14         public string description;
15         public string shortname;
16
17
18 }
19
20 public class RooProject  : Object 
21 {
22         public string  id; // not really important that they are numbers..
23         public string code;
24         public string name;
25         public string type;
26  
27 }
28
29
30 static RooTicket  _RooTicket;
31
32
33
34 public class RooTicket : Object
35 {
36         
37    //const string baseurl = "https://roojs.com/admin.php/Ro/mtrack_ticket"; 
38         const string roourl = "https://roojs.com/admin.php/Roo";        
39         public static RooTicket singleton()
40     {
41         if (_RooTicket == null) {
42             _RooTicket = new RooTicket();
43             _RooTicket.tickets = new Gee.ArrayList<RooTicket>();
44             _RooTicket.projects = new Gee.ArrayList<RooProject>();
45             _RooTicket.repos = new Gee.ArrayList<RooRepo>();
46             _RooTicket.loadRepos(); // initalize it..        
47         }
48         return _RooTicket;
49     }
50         public Gee.ArrayList<RooTicket> tickets; // only available for singletonn.
51         public Gee.ArrayList<RooProject> projects; // only available for singletonn.    
52         public Gee.ArrayList<RooRepo> repos; // only available for singletonn.          
53         public string username = ""; // only available for singletonn.
54         public string password = ""; // only available for singletonn.
55
56
57         public string  id; // not really important that they are numbers..
58         public string summary;
59         public string description;
60         public string project_id_name;
61
62
63         public string summaryToBranchName()
64         {
65                 // first 5 words of summary..
66                 var  regex = new Regex ("[^A-Za-z0-9 ]+");
67                 var str = regex.replace(this.summary, this.summary.length,0, "");
68                 string[] words = Regex.split_simple ("[ \t]+", str);
69                 var ret = "";
70                 for (var i =0; i< (words.length > 5 ? 5 : words.length); i++) {
71                         ret += ret.length > 0 ? "_" : "";
72                         ret += words[i];
73                 }
74                 return ret;
75         }
76         public string usernameLocal()
77         {
78                 // git username is an email addres... - so this reutrns the local part..
79                 //?? assumes that all members are under the same domain... normally the case......
80                 return RooTicket.singleton().username.split("@")[0];
81         
82         }
83
84
85         public RooTicket addTicket(Json.Object t)
86         {
87                 var add = new RooTicket();
88                 add.id = t.get_string_member("id");
89                 add.summary = t.get_string_member("summary");
90                 add.description = t.get_string_member("description");
91                 add.project_id_name = t.get_string_member("project_id_name");                                           
92                 this.tickets.add(add);
93                 GLib.debug("ADD ticket  %s : %s : %s", add.id, add.summary, add.project_id_name);
94                 return add;
95         }
96         public RooProject addProject(Json.Object t)
97         {
98                 var add = new RooProject();
99                 add.id = t.get_string_member("id");
100                 add.name = t.get_string_member("name");
101                 add.type = t.get_string_member("type");
102                 add.code = t.get_string_member("code");                                         
103                 this.projects.add(add);
104                 GLib.debug("ADD project  %s : %s : %s", add.id, add.code, add.name);
105                 return add;
106         }
107         
108         public RooRepo addRepo(Json.Object t)
109         {
110                 var add = new RooRepo();
111                 add.id = t.get_string_member("id");
112                 add.shortname = t.get_string_member("shortname");
113                 add.description = t.get_string_member("description");           
114                 add.project_id = t.get_string_member("project_id");                                             
115                 this.repos.add(add);
116                 GLib.debug("ADD project  %s : %s : %s", add.id, add.shortname, add.project_id);
117                 return add;
118         }
119         
120         public RooProject? getProjectByRepo(GitRepo repo)
121         {
122                 var rt = RooTicket.singleton();
123                 
124                 if (rt.repos.size < 1) {
125                         rt.loadRepos();
126                 }
127                 if (rt.projects.size < 1) {
128                         rt.loadProjects();
129                 }
130                 
131                 var pid = "";
132                 foreach(var roo_repo in rt.repos) {
133                         if (roo_repo.shortname == repo.name) {
134                                 pid = roo_repo.project_id;
135                                 break;
136                         }
137                 }
138                 if (pid == "") {
139                         GLib.debug("getProjectByRepo: repo has no project");            
140                         return null;
141                 }
142                 // get project by id...
143                 foreach(var roo_project in rt.projects) {
144                         if (roo_project.id == pid) {
145                                 GLib.debug("getProjectByRepo: project_id = %s", pid);
146                                 return roo_project;
147                         }
148                 }
149                 GLib.debug("getProjectByRepo: can not find project");                           
150                 return null;
151         
152         }
153         
154         
155         public static RooTicket fakeTicket()
156         {
157                 var t = new RooTicket();
158                 t.id = "-1";
159                 t.summary = "";
160                 t.description = "";
161                 t.project_id_name = "";
162                 RooTicket.singleton().tickets.add(t);
163                 return t;
164         }
165         
166  
167         public RooTicket? getById(string id)
168         {
169                 foreach(var t in this.tickets) {
170                         if (t.id == id) {
171                                 return t;
172                         }
173                 }
174                 if (id == "-1") {
175                         return RooTicket.fakeTicket();
176                 }
177                 
178         return this.loadTicket(id);
179
180  
181         }
182
183
184         public RooTicket? loadTicket(string id)
185         {
186
187                    var table = new GLib.HashTable<string, string>(str_hash, str_equal);
188                    table.insert("_id",id);         
189                    
190                    var params = Soup.Form.encode_hash(table);              
191                    var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
192                    GLib.debug("request %s", url);
193                    
194                    var session = new Soup.Session ();
195                    session.timeout = 0;
196                    var message = new Soup.Message ("GET", url);
197                    RooTicket.setAuth(message);
198                    session.send_message (message);
199                    
200                    
201                    var data = (string) message.response_body.flatten().data;
202                    GLib.debug("got %s", data);
203                    try {
204                            var parser = new Json.Parser ();
205                            parser.load_from_data (data, -1);
206
207                            var response = parser.get_root().get_object();
208                            var status = response.get_boolean_member("success");
209                    
210                            if(!status){
211                                    GLib.error(response.get_string_member("errorMsg"));
212                                    return null;
213                            }
214                            var rd = response.get_object_member ("data");
215                            
216                            return this.addTicket(rd);
217                            
218                             
219                    
220                    } catch (Error e) {
221                            GLib.error(e.message);
222                            return null;
223                    }
224         }
225
226         public void loadTickets(string project_id)
227         {
228                 RooTicket.singleton().tickets = new Gee.ArrayList<RooTicket>();
229          
230                 
231                 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
232          
233                 table.insert("query[viewtype]","me");
234                 table.insert("limit","999");
235                 table.insert("sort","summary");
236                 table.insert("dir","ASC");
237                 if (project_id != "") {
238                         table.insert("project_id",project_id);
239                 }
240
241
242                 var params = Soup.Form.encode_hash(table);
243                 
244                 var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
245                 
246                 GLib.debug("request %s", url);
247                 
248                 var session = new Soup.Session ();
249                 session.timeout = 0;
250                 var message = new Soup.Message ("GET", url);
251                 
252                 
253                 RooTicket.setAuth(message);
254                 
255                 session.send_message (message);
256                 
257                 var data = (string) message.response_body.flatten().data;
258                 //GLib.debug("got %s", data);
259                 try {
260                         var parser = new Json.Parser ();
261                         parser.load_from_data (data, -1);
262
263                         var response = parser.get_root().get_object();
264                         var status = response.get_boolean_member("success");
265                 
266                         if(!status){
267                                 GLib.error(response.get_string_member("errorMsg"));
268                                 return;
269                         }
270                         var rd = response.get_array_member ("data");
271                         
272                         // got a valid result...
273                         var _this = RooTicket.singleton();
274                         for(var i = 0; i < rd.get_length(); i++) {
275                                 _this.addTicket(rd.get_object_element(i));
276                         }
277                          
278                 
279                 } catch (Error e) {
280                         GLib.error(e.message);
281                         return;
282                 }
283                 
284         }
285         
286         
287         public void loadProjects()
288         {
289                 RooTicket.singleton().projects = new Gee.ArrayList<RooProject>();
290          
291                 
292                 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
293          
294                 table.insert("query[project_filter]","P,N,U");
295                 table.insert("limit","999");
296                 table.insert("sort","name");
297                 table.insert("dir","ASC");
298
299                 var params = Soup.Form.encode_hash(table);
300                 
301                 var url = "%s/%s?%s" . printf(roourl, "core_project", params);
302                 
303                 GLib.debug("request %s", url);
304                 
305                 var session = new Soup.Session ();
306                 session.timeout = 0;
307                 var message = new Soup.Message ("GET", url);
308                 
309                 
310                 RooTicket.setAuth(message);
311                 
312                 session.send_message (message);
313                 
314                 var data = (string) message.response_body.flatten().data;
315                 //GLib.debug("got %s", data);
316                 try {
317                         var parser = new Json.Parser ();
318                         parser.load_from_data (data, -1);
319
320                         var response = parser.get_root().get_object();
321                         var status = response.get_boolean_member("success");
322                 
323                         if(!status){
324                                 GLib.error(response.get_string_member("errorMsg"));
325                                 return;
326                         }
327                         var rd = response.get_array_member ("data");
328                         
329                         // got a valid result...
330                         var _this = RooTicket.singleton();
331                         for(var i = 0; i < rd.get_length(); i++) {
332                                 _this.addProject(rd.get_object_element(i));
333                         }
334                          
335                 
336                 } catch (Error e) {
337                         GLib.error(e.message);
338                         return;
339                 }
340                 
341         }
342         public void loadRepos()
343         {
344                 RooTicket.singleton().repos = new Gee.ArrayList<RooRepo>();
345          
346                 
347                 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
348          
349
350                 table.insert("limit","999");
351                 table.insert("sort","shortname");
352                 table.insert("dir","ASC");
353
354                 var params = Soup.Form.encode_hash(table);
355                 
356                 var url = "%s/%s?%s" . printf(roourl, "mtrack_repos", params);
357                 
358                 GLib.debug("request %s", url);
359                 
360                 var session = new Soup.Session ();
361                 session.timeout = 0;
362                 var message = new Soup.Message ("GET", url);
363                 
364                 
365                 RooTicket.setAuth(message);
366                 
367                 session.send_message (message);
368                 
369                 var data = (string) message.response_body.flatten().data;
370                 //GLib.debug("got %s", data);
371                 try {
372                         var parser = new Json.Parser ();
373                         parser.load_from_data (data, -1);
374
375                         var response = parser.get_root().get_object();
376                         var status = response.get_boolean_member("success");
377                 
378                         if(!status){
379                                 GLib.error(response.get_string_member("errorMsg"));
380                                 return;
381                         }
382                         var rd = response.get_array_member ("data");
383                         
384                         // got a valid result...
385                         var _this = RooTicket.singleton();
386                         for(var i = 0; i < rd.get_length(); i++) {
387                                 _this.addRepo(rd.get_object_element(i));
388                         }
389                          
390                 
391                 } catch (Error e) {
392                         GLib.error(e.message);
393                         return;
394                 }
395                 
396         }
397         
398         
399         public  static void setAuth(Soup.Message message) 
400         {
401                 var rs =  RooTicket.singleton();                
402                 if (rs.username.length < 1) {
403                         string str;
404                         GLib.FileUtils.get_contents(GLib.Environment.get_home_dir() + "/.netrc", out str);
405                         var lines = str.split("\n");
406                         for(var i=0; i< lines.length; i++) {
407                         // assumes one line per entry.. if not we are buggered...
408                                         GLib.debug("got %s" , lines[i]);
409                         
410                                 var bits =  Regex.split_simple ("[ \t]+", lines[i].strip());
411                                 if (bits.length < 6 || bits[0] != "machine" || bits[1] != "git.roojs.com") {
412                                         continue;
413                                 }
414                                         GLib.debug("found password?");
415                                 // we are gussing.... 
416
417                                 RooTicket.singleton().username  = bits[3];
418                                 RooTicket.singleton().password  = bits[5];              
419                         }
420                 }
421
422
423                 var authCode = Base64.encode ("%s:%s".printf(rs.username, rs.password).data);
424                 message.request_headers.append("Authorization", "Basic %s".printf(authCode));
425         
426         
427         }
428
429
430         public void close(string commits)
431     {
432                 if (this.id == "-1") {
433                         return;
434                 }
435                 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
436                 table.insert("id",id);
437                 table.insert("status_name","resolved");
438                 table.insert("reason","fixed by Commits: %s".printf(commits));  
439                 var params = Soup.Form.encode_hash(table);              
440
441                 GLib.debug("request POST %s / %s", roourl, id);
442
443                 var session = new Soup.Session ();
444                 session.timeout = 0;
445                 var message = new Soup.Message ("POST", roourl + "/mtrack_ticket");
446                 RooTicket.setAuth(message);
447
448                 message.set_request ("application/x-www-form-urlencoded", Soup.MemoryUse.STATIC, params.data);
449                 session.send_message (message);
450
451
452                 var data = (string) message.response_body.flatten().data;
453                 GLib.debug("got %s", data);
454                 try {
455                            var parser = new Json.Parser ();
456                            parser.load_from_data (data, -1);
457
458                            var response = parser.get_root().get_object();
459                            var status = response.get_boolean_member("success");
460
461                            if(!status){
462                                            GLib.error(response.get_string_member("errorMsg"));
463                                            return ;
464                            }
465                                 
466                            
467                                 
468
469                 } catch (Error e) {
470                            GLib.error(e.message);
471                            return ;
472                 }
473
474    }
475
476         
477 }
478