RooTicket.vala
[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 RooOption : Object 
21 {
22         
23         public string id; // not really important that they are numbers..
24         public string name;     
25         public string display_name;
26  
27         public RooOption (string id, string name, string display_name)
28         {
29                 this.id = id;
30                 this.display_name = name;
31         }
32
33 }
34
35
36 public class RooProject  : Object 
37 {
38         public string  id; // not really important that they are numbers..
39         public string code;
40         public string name;
41         public string type;
42  
43 }
44
45
46 static RooTicket  _RooTicket;
47
48
49
50 public class RooTicket : Object
51 {
52         public enum NotMe {
53                 TRUE,
54                 FALSE
55         }
56         public enum Closed {
57                 TRUE,
58                 FALSE
59         }
60         
61    //const string baseurl = "https://roojs.com/admin.php/Ro/mtrack_ticket"; 
62         const string roourl = "https://roojs.com/admin.php/Roo";        
63         public static RooTicket singleton()
64     {
65         if (_RooTicket == null) {
66             _RooTicket = new RooTicket();
67             _RooTicket.tickets = new Gee.ArrayList<RooTicket>();
68             _RooTicket.projects = new Gee.ArrayList<RooProject>();
69             _RooTicket.repos = new Gee.ArrayList<RooRepo>();
70             _RooTicket.loadRepos(); // initalize it..        
71         }
72         return _RooTicket;
73     }
74         public Gee.ArrayList<RooTicket> tickets; // only available for singletonn.
75         public Gee.ArrayList<RooProject> projects; // only available for singletonn.    
76         public Gee.ArrayList<RooRepo> repos; // only available for singletonn.          
77         
78         public Gee.ArrayList<RooOption> milestones;
79         public Gee.ArrayList<RooOption> priorities;
80         public Gee.ArrayList<RooOption> serverities;
81         public Gee.ArrayList<RooOption> classifications;
82         public Gee.ArrayList<RooOption> developers;
83                  
84         
85         public string username = ""; // only available for singletonn.
86         public string password = ""; // only available for singletonn.
87
88
89         public string  id; // not really important that they are numbers..
90         public string summary;
91         public string description;
92         public string project_id_name;
93
94
95         public string summaryToBranchName()
96         {
97                 // first 5 words of summary..
98                 var  regex = new Regex ("[^A-Za-z0-9 ]+");
99                 var str = regex.replace(this.summary, this.summary.length,0, "");
100                 string[] words = Regex.split_simple ("[ \t]+", str);
101                 var ret = "";
102                 for (var i =0; i< (words.length > 5 ? 5 : words.length); i++) {
103                         ret += ret.length > 0 ? "_" : "";
104                         ret += words[i];
105                 }
106                 return ret;
107         }
108         public string usernameLocal()
109         {
110                 // git username is an email addres... - so this reutrns the local part..
111                 //?? assumes that all members are under the same domain... normally the case......
112                 return RooTicket.singleton().username.split("@")[0];
113         
114         }
115
116         public Gee.ArrayList<RooOption> readJsonArray(Json.Array a)
117         {
118                 var ret = new Gee.ArrayList<RooOption>();
119                 for(var i = 0; i < a.get_length(); i++) {
120                         var t = a.get_object_element(i);
121                         ret.add(new RooOption(
122                                 t.get_string_member("id"),
123                                 t.get_string_member("display_name")
124                         ));
125                 }
126                 return ret;
127                          
128         }
129
130         public RooTicket addTicket(Json.Object t)
131         {
132                 var add = new RooTicket();
133                 add.id = t.get_string_member("id");
134                 add.summary = t.get_string_member("summary");
135                 add.description = t.get_string_member("description");
136                 add.project_id_name = t.get_string_member("project_id_name");                                           
137                 this.tickets.add(add);
138                 GLib.debug("ADD ticket  %s : %s : %s", add.id, add.summary, add.project_id_name);
139                 return add;
140         }
141         public RooProject addProject(Json.Object t)
142         {
143                 var add = new RooProject();
144                 add.id = t.get_string_member("id");
145                 add.name = t.get_string_member("name");
146                 add.type = t.get_string_member("type");
147                 add.code = t.get_string_member("code");                                         
148                 this.projects.add(add);
149                 GLib.debug("ADD project  %s : %s : %s", add.id, add.code, add.name);
150                 return add;
151         }
152         
153         public RooRepo addRepo(Json.Object t)
154         {
155                 var add = new RooRepo();
156                 add.id = t.get_string_member("id");
157                 add.shortname = t.get_string_member("shortname");
158                 add.description = t.get_string_member("description");           
159                 add.project_id = t.get_string_member("project_id");                                             
160                 this.repos.add(add);
161                 GLib.debug("ADD project  %s : %s : %s", add.id, add.shortname, add.project_id);
162                 return add;
163         }
164         
165         public RooProject? getProjectByRepo(GitRepo repo)
166         {
167                 var rt = RooTicket.singleton();
168                 
169                 if (rt.repos.size < 1) {
170                         rt.loadRepos();
171                 }
172                 if (rt.projects.size < 1) {
173                         rt.loadProjects();
174                 }
175                 
176                 var pid = "";
177                 foreach(var roo_repo in rt.repos) {
178                         if (roo_repo.shortname == repo.name) {
179                                 pid = roo_repo.project_id;
180                                 break;
181                         }
182                 }
183                 if (pid == "") {
184                         GLib.debug("getProjectByRepo: repo has no project");            
185                         return null;
186                 }
187                 // get project by id...
188                 foreach(var roo_project in rt.projects) {
189                         if (roo_project.id == pid) {
190                                 GLib.debug("getProjectByRepo: project_id = %s", pid);
191                                 return roo_project;
192                         }
193                 }
194                 GLib.debug("getProjectByRepo: can not find project");                           
195                 return null;
196         
197         }
198         
199         
200         public static RooTicket fakeTicket()
201         {
202                 var t = new RooTicket();
203                 t.id = "-1";
204                 t.summary = "";
205                 t.description = "";
206                 t.project_id_name = "";
207                 RooTicket.singleton().tickets.add(t);
208                 return t;
209         }
210         
211  
212         public RooTicket? getById(string id)
213         {
214                 foreach(var t in this.tickets) {
215                         if (t.id == id) {
216                                 return t;
217                         }
218                 }
219                 if (id == "-1") {
220                         return RooTicket.fakeTicket();
221                 }
222                 
223         return this.loadTicket(id);
224
225  
226         }
227
228
229         public RooTicket? loadTicket(string id)
230         {
231
232                    var table = new GLib.HashTable<string, string>(str_hash, str_equal);
233                    table.insert("_id",id);         
234                    
235                    var params = Soup.Form.encode_hash(table);              
236                    var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
237                    GLib.debug("request %s", url);
238                    
239                    var session = new Soup.Session ();
240                    session.timeout = 0;
241                    var message = new Soup.Message ("GET", url);
242                    RooTicket.setAuth(message);
243                    session.send_message (message);
244                    
245                    
246                    var data = (string) message.response_body.flatten().data;
247                    GLib.debug("got %s", data);
248                    try {
249                            var parser = new Json.Parser ();
250                            parser.load_from_data (data, -1);
251
252                            var response = parser.get_root().get_object();
253                            var status = response.get_boolean_member("success");
254                    
255                            if(!status){
256                                    GLib.error(response.get_string_member("errorMsg"));
257                                    return null;
258                            }
259                            var rd = response.get_object_member ("data");
260                            
261                            return this.addTicket(rd);
262                            
263                             
264                    
265                    } catch (Error e) {
266                            GLib.error(e.message);
267                            return null;
268                    }
269         }
270
271         public void loadTickets(string project_id, NotMe not_me, Closed closed)
272         {
273                 RooTicket.singleton().tickets = new Gee.ArrayList<RooTicket>();
274          
275                 
276                 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
277                 if (not_me  == NotMe.FALSE) {
278                         table.insert("query[viewtype]","me");
279                 } else {
280                 
281                 }               
282                 if (closed  == Closed.TRUE) {
283                         table.insert("query[viewtype]","me");
284                 } else {
285                 
286                 }
287
288                 table.insert("limit","999");
289                 table.insert("sort","summary");
290                 table.insert("dir","ASC");
291                 
292                 if (project_id != "") {
293                         table.insert("project_id",project_id);
294                 }
295
296
297                 var params = Soup.Form.encode_hash(table);
298                 
299                 var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
300                 
301                 GLib.debug("request %s", url);
302                 
303                 var session = new Soup.Session ();
304                 session.timeout = 0;
305                 var message = new Soup.Message ("GET", url);
306                 
307                 
308                 RooTicket.setAuth(message);
309                 
310                 session.send_message (message);
311                 
312                 var data = (string) message.response_body.flatten().data;
313                 //GLib.debug("got %s", data);
314                 try {
315                         var parser = new Json.Parser ();
316                         parser.load_from_data (data, -1);
317
318                         var response = parser.get_root().get_object();
319                         var status = response.get_boolean_member("success");
320                 
321                         if(!status){
322                                 GLib.error(response.get_string_member("errorMsg"));
323                                 return;
324                         }
325                         var rd = response.get_array_member ("data");
326                         
327                         // got a valid result...
328                         var _this = RooTicket.singleton();
329                         for(var i = 0; i < rd.get_length(); i++) {
330                                 _this.addTicket(rd.get_object_element(i));
331                         }
332                          
333                 
334                 } catch (Error e) {
335                         GLib.error(e.message);
336                         return;
337                 }
338                 
339         }
340         
341         
342         public void loadProjects()
343         {
344                 RooTicket.singleton().projects = new Gee.ArrayList<RooProject>();
345          
346                 
347                 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
348          
349                 table.insert("query[project_filter]","P,N,U");
350                 table.insert("limit","999");
351                 table.insert("sort","name");
352                 table.insert("dir","ASC");
353
354                 var params = Soup.Form.encode_hash(table);
355                 
356                 var url = "%s/%s?%s" . printf(roourl, "core_project", 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.addProject(rd.get_object_element(i));
388                         }
389                          
390                 
391                 } catch (Error e) {
392                         GLib.error(e.message);
393                         return;
394                 }
395                 
396         }
397         public void loadRepos()
398         {
399                 RooTicket.singleton().repos = new Gee.ArrayList<RooRepo>();
400          
401                 
402                 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
403          
404
405                 table.insert("limit","999");
406                 table.insert("sort","shortname");
407                 table.insert("dir","ASC");
408
409                 var params = Soup.Form.encode_hash(table);
410                 
411                 var url = "%s/%s?%s" . printf(roourl, "mtrack_repos", params);
412                 
413                 GLib.debug("request %s", url);
414                 
415                 var session = new Soup.Session ();
416                 session.timeout = 0;
417                 var message = new Soup.Message ("GET", url);
418                 
419                 
420                 RooTicket.setAuth(message);
421                 
422                 session.send_message (message);
423                 
424                 var data = (string) message.response_body.flatten().data;
425                 //GLib.debug("got %s", data);
426                 try {
427                         var parser = new Json.Parser ();
428                         parser.load_from_data (data, -1);
429
430                         var response = parser.get_root().get_object();
431                         var status = response.get_boolean_member("success");
432                 
433                         if(!status){
434                                 GLib.error(response.get_string_member("errorMsg"));
435                                 return;
436                         }
437                         var rd = response.get_array_member ("data");
438                         
439                         // got a valid result...
440                         var _this = RooTicket.singleton();
441                         for(var i = 0; i < rd.get_length(); i++) {
442                                 _this.addRepo(rd.get_object_element(i));
443                         }
444                          
445                 
446                 } catch (Error e) {
447                         GLib.error(e.message);
448                         return;
449                 }
450                 
451         }
452         public void loadProjectOptions(string pid)
453         {
454
455                 var rt = RooTicket.singleton();
456
457                 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
458          
459                 table.insert("_options_for",pid);
460
461                 var params = Soup.Form.encode_hash(table);
462                 
463                 var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
464                 
465                 GLib.debug("request %s", url);
466                 
467                 var session = new Soup.Session ();
468                 session.timeout = 0;
469                 var message = new Soup.Message ("GET", url);
470                 
471                 
472                 RooTicket.setAuth(message);
473                 
474                 session.send_message (message);
475                 
476                 var data = (string) message.response_body.flatten().data;
477                 //GLib.debug("got %s", data);
478                 try {
479                         var parser = new Json.Parser ();
480                         parser.load_from_data (data, -1);
481
482                         var response = parser.get_root().get_object();
483                         var status = response.get_boolean_member("success");
484                 
485                         if(!status){
486                                 GLib.error(response.get_string_member("errorMsg"));
487                                 return;
488                         }
489                         var rd = response.get_object_member ("data");
490                         
491                         rt.milestones = this.readJsonArray( rd.get_array_member("milestone"));
492                         rt.priorities = this.readJsonArray( rd.get_array_member("priority"));
493                         rt.serverities = this.readJsonArray( rd.get_array_member("severity"));
494                         rt.classifications  = this.readJsonArray( rd.get_array_member("classification"));
495                         rt.developers = this.readJsonArray( rd.get_array_member("developer"));
496  
497                         
498                         
499                         
500                         // got a valid result...
501                          
502                 
503                 } catch (Error e) {
504                         GLib.error(e.message);
505                         return;
506                 }
507                 
508         }
509         
510         public  static void setAuth(Soup.Message message) 
511         {
512                 var rs =  RooTicket.singleton();                
513                 if (rs.username.length < 1) {
514                         string str;
515                         GLib.FileUtils.get_contents(GLib.Environment.get_home_dir() + "/.netrc", out str);
516                         var lines = str.split("\n");
517                         for(var i=0; i< lines.length; i++) {
518                         // assumes one line per entry.. if not we are buggered...
519                                         GLib.debug("got %s" , lines[i]);
520                         
521                                 var bits =  Regex.split_simple ("[ \t]+", lines[i].strip());
522                                 if (bits.length < 6 || bits[0] != "machine" || bits[1] != "git.roojs.com") {
523                                         continue;
524                                 }
525                                         GLib.debug("found password?");
526                                 // we are gussing.... 
527
528                                 RooTicket.singleton().username  = bits[3];
529                                 RooTicket.singleton().password  = bits[5];              
530                         }
531                 }
532
533
534                 var authCode = Base64.encode ("%s:%s".printf(rs.username, rs.password).data);
535                 message.request_headers.append("Authorization", "Basic %s".printf(authCode));
536         
537         
538         }
539
540
541         public void close(string commits)
542     {
543                 if (this.id == "-1") {
544                         return;
545                 }
546                 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
547                 table.insert("id",id);
548                 table.insert("status_name","resolved");
549                 table.insert("reason","fixed by Commits: %s".printf(commits));  
550                 var params = Soup.Form.encode_hash(table);              
551
552                 GLib.debug("request POST %s / %s", roourl, id);
553
554                 var session = new Soup.Session ();
555                 session.timeout = 0;
556                 var message = new Soup.Message ("POST", roourl + "/mtrack_ticket");
557                 RooTicket.setAuth(message);
558
559                 message.set_request ("application/x-www-form-urlencoded", Soup.MemoryUse.STATIC, params.data);
560                 session.send_message (message);
561
562
563                 var data = (string) message.response_body.flatten().data;
564                 GLib.debug("got %s", data);
565                 try {
566                            var parser = new Json.Parser ();
567                            parser.load_from_data (data, -1);
568
569                            var response = parser.get_root().get_object();
570                            var status = response.get_boolean_member("success");
571
572                            if(!status){
573                                            GLib.error(response.get_string_member("errorMsg"));
574                                            return ;
575                            }
576                                 
577                            
578                                 
579
580                 } catch (Error e) {
581                            GLib.error(e.message);
582                            return ;
583                 }
584
585    }
586
587         
588 }
589