Ticket.bjs
[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("name"),                            
124                                 t.get_string_member("display_name")
125                         ));
126                 }
127                 return ret;
128                          
129         }
130
131         public RooTicket addTicket(Json.Object t)
132         {
133                 var add = new RooTicket();
134                 add.id = t.get_string_member("id");
135                 add.summary = t.get_string_member("summary");
136                 add.description = t.get_string_member("description");
137                 add.project_id_name = t.get_string_member("project_id_name");                                           
138                 this.tickets.add(add);
139                 GLib.debug("ADD ticket  %s : %s : %s", add.id, add.summary, add.project_id_name);
140                 return add;
141         }
142         public RooProject addProject(Json.Object t)
143         {
144                 var add = new RooProject();
145                 add.id = t.get_string_member("id");
146                 add.name = t.get_string_member("name");
147                 add.type = t.get_string_member("type");
148                 add.code = t.get_string_member("code");                                         
149                 this.projects.add(add);
150                 GLib.debug("ADD project  %s : %s : %s", add.id, add.code, add.name);
151                 return add;
152         }
153         
154         public RooRepo addRepo(Json.Object t)
155         {
156                 var add = new RooRepo();
157                 add.id = t.get_string_member("id");
158                 add.shortname = t.get_string_member("shortname");
159                 add.description = t.get_string_member("description");           
160                 add.project_id = t.get_string_member("project_id");                                             
161                 this.repos.add(add);
162                 GLib.debug("ADD project  %s : %s : %s", add.id, add.shortname, add.project_id);
163                 return add;
164         }
165         
166         public RooProject? getProjectByRepo(GitRepo repo)
167         {
168                 var rt = RooTicket.singleton();
169                 
170                 if (rt.repos.size < 1) {
171                         rt.loadRepos();
172                 }
173                 if (rt.projects.size < 1) {
174                         rt.loadProjects();
175                 }
176                 
177                 var pid = "";
178                 foreach(var roo_repo in rt.repos) {
179                         if (roo_repo.shortname == repo.name) {
180                                 pid = roo_repo.project_id;
181                                 break;
182                         }
183                 }
184                 if (pid == "") {
185                         GLib.debug("getProjectByRepo: repo has no project");            
186                         return null;
187                 }
188                 // get project by id...
189                 foreach(var roo_project in rt.projects) {
190                         if (roo_project.id == pid) {
191                                 GLib.debug("getProjectByRepo: project_id = %s", pid);
192                                 return roo_project;
193                         }
194                 }
195                 GLib.debug("getProjectByRepo: can not find project");                           
196                 return null;
197         
198         }
199         
200         
201         public static RooTicket fakeTicket()
202         {
203                 var t = new RooTicket();
204                 t.id = "-1";
205                 t.summary = "";
206                 t.description = "";
207                 t.project_id_name = "";
208                 RooTicket.singleton().tickets.add(t);
209                 return t;
210         }
211         
212  
213         public RooTicket? getById(string id)
214         {
215                 foreach(var t in this.tickets) {
216                         if (t.id == id) {
217                                 return t;
218                         }
219                 }
220                 if (id == "-1") {
221                         return RooTicket.fakeTicket();
222                 }
223                 
224         return this.loadTicket(id);
225
226  
227         }
228
229
230         public RooTicket? loadTicket(string id)
231         {
232
233                    var table = new GLib.HashTable<string, string>(str_hash, str_equal);
234                    table.insert("_id",id);         
235                    
236                    var params = Soup.Form.encode_hash(table);              
237                    var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
238                    GLib.debug("request %s", url);
239                    
240                    var session = new Soup.Session ();
241                    session.timeout = 0;
242                    var message = new Soup.Message ("GET", url);
243                    RooTicket.setAuth(message);
244                    session.send_message (message);
245                    
246                    
247                    var data = (string) message.response_body.flatten().data;
248                    GLib.debug("got %s", data);
249                    try {
250                            var parser = new Json.Parser ();
251                            parser.load_from_data (data, -1);
252
253                            var response = parser.get_root().get_object();
254                            var status = response.get_boolean_member("success");
255                    
256                            if(!status){
257                                    GLib.error(response.get_string_member("errorMsg"));
258                                    return null;
259                            }
260                            var rd = response.get_object_member ("data");
261                            
262                            return this.addTicket(rd);
263                            
264                             
265                    
266                    } catch (Error e) {
267                            GLib.error(e.message);
268                            return null;
269                    }
270         }
271
272         public void loadTickets(string project_id, NotMe not_me, Closed closed)
273         {
274                 RooTicket.singleton().tickets = new Gee.ArrayList<RooTicket>();
275          
276                 
277                 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
278                 if (not_me  == NotMe.FALSE) {
279                         table.insert("query[viewtype]","me");
280                 } else {
281                 
282                 }               
283                 if (closed  == Closed.TRUE) {
284                         table.insert("query[viewtype]","me");
285                 } else {
286                 
287                 }
288
289                 table.insert("limit","999");
290                 table.insert("sort","summary");
291                 table.insert("dir","ASC");
292                 
293                 if (project_id != "") {
294                         table.insert("project_id",project_id);
295                 }
296
297
298                 var params = Soup.Form.encode_hash(table);
299                 
300                 var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
301                 
302                 GLib.debug("request %s", url);
303                 
304                 var session = new Soup.Session ();
305                 session.timeout = 0;
306                 var message = new Soup.Message ("GET", url);
307                 
308                 
309                 RooTicket.setAuth(message);
310                 
311                 session.send_message (message);
312                 
313                 var data = (string) message.response_body.flatten().data;
314                 //GLib.debug("got %s", data);
315                 try {
316                         var parser = new Json.Parser ();
317                         parser.load_from_data (data, -1);
318
319                         var response = parser.get_root().get_object();
320                         var status = response.get_boolean_member("success");
321                 
322                         if(!status){
323                                 GLib.error(response.get_string_member("errorMsg"));
324                                 return;
325                         }
326                         var rd = response.get_array_member ("data");
327                         
328                         // got a valid result...
329                         var _this = RooTicket.singleton();
330                         for(var i = 0; i < rd.get_length(); i++) {
331                                 _this.addTicket(rd.get_object_element(i));
332                         }
333                          
334                 
335                 } catch (Error e) {
336                         GLib.error(e.message);
337                         return;
338                 }
339                 
340         }
341         
342         
343         public void loadProjects()
344         {
345                 RooTicket.singleton().projects = new Gee.ArrayList<RooProject>();
346          
347                 
348                 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
349          
350                 table.insert("query[project_filter]","P,N,U");
351                 table.insert("limit","999");
352                 table.insert("sort","name");
353                 table.insert("dir","ASC");
354
355                 var params = Soup.Form.encode_hash(table);
356                 
357                 var url = "%s/%s?%s" . printf(roourl, "core_project", params);
358                 
359                 GLib.debug("request %s", url);
360                 
361                 var session = new Soup.Session ();
362                 session.timeout = 0;
363                 var message = new Soup.Message ("GET", url);
364                 
365                 
366                 RooTicket.setAuth(message);
367                 
368                 session.send_message (message);
369                 
370                 var data = (string) message.response_body.flatten().data;
371                 //GLib.debug("got %s", data);
372                 try {
373                         var parser = new Json.Parser ();
374                         parser.load_from_data (data, -1);
375
376                         var response = parser.get_root().get_object();
377                         var status = response.get_boolean_member("success");
378                 
379                         if(!status){
380                                 GLib.error(response.get_string_member("errorMsg"));
381                                 return;
382                         }
383                         var rd = response.get_array_member ("data");
384                         
385                         // got a valid result...
386                         var _this = RooTicket.singleton();
387                         for(var i = 0; i < rd.get_length(); i++) {
388                                 _this.addProject(rd.get_object_element(i));
389                         }
390                          
391                 
392                 } catch (Error e) {
393                         GLib.error(e.message);
394                         return;
395                 }
396                 
397         }
398         public void loadRepos()
399         {
400                 RooTicket.singleton().repos = new Gee.ArrayList<RooRepo>();
401          
402                 
403                 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
404          
405
406                 table.insert("limit","999");
407                 table.insert("sort","shortname");
408                 table.insert("dir","ASC");
409
410                 var params = Soup.Form.encode_hash(table);
411                 
412                 var url = "%s/%s?%s" . printf(roourl, "mtrack_repos", params);
413                 
414                 GLib.debug("request %s", url);
415                 
416                 var session = new Soup.Session ();
417                 session.timeout = 0;
418                 var message = new Soup.Message ("GET", url);
419                 
420                 
421                 RooTicket.setAuth(message);
422                 
423                 session.send_message (message);
424                 
425                 var data = (string) message.response_body.flatten().data;
426                 //GLib.debug("got %s", data);
427                 try {
428                         var parser = new Json.Parser ();
429                         parser.load_from_data (data, -1);
430
431                         var response = parser.get_root().get_object();
432                         var status = response.get_boolean_member("success");
433                 
434                         if(!status){
435                                 GLib.error(response.get_string_member("errorMsg"));
436                                 return;
437                         }
438                         var rd = response.get_array_member ("data");
439                         
440                         // got a valid result...
441                         var _this = RooTicket.singleton();
442                         for(var i = 0; i < rd.get_length(); i++) {
443                                 _this.addRepo(rd.get_object_element(i));
444                         }
445                          
446                 
447                 } catch (Error e) {
448                         GLib.error(e.message);
449                         return;
450                 }
451                 
452         }
453         public void loadProjectOptions(string pid)
454         {
455
456                 var rt = RooTicket.singleton();
457
458                 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
459          
460                 table.insert("_options_for",pid);
461
462                 var params = Soup.Form.encode_hash(table);
463                 
464                 var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
465                 
466                 GLib.debug("request %s", url);
467                 
468                 var session = new Soup.Session ();
469                 session.timeout = 0;
470                 var message = new Soup.Message ("GET", url);
471                 
472                 
473                 RooTicket.setAuth(message);
474                 
475                 session.send_message (message);
476                 
477                 var data = (string) message.response_body.flatten().data;
478                 //GLib.debug("got %s", data);
479                 try {
480                         var parser = new Json.Parser ();
481                         parser.load_from_data (data, -1);
482
483                         var response = parser.get_root().get_object();
484                         var status = response.get_boolean_member("success");
485                 
486                         if(!status){
487                                 GLib.error(response.get_string_member("errorMsg"));
488                                 return;
489                         }
490                         var rd = response.get_object_member ("data");
491                         
492                         rt.milestones = this.readJsonArray( rd.get_array_member("milestone"));
493                         rt.priorities = this.readJsonArray( rd.get_array_member("priority"));
494                         rt.serverities = this.readJsonArray( rd.get_array_member("severity"));
495                         rt.classifications  = this.readJsonArray( rd.get_array_member("classification"));
496                         rt.developers = this.readJsonArray( rd.get_array_member("developer"));
497  
498                         
499                         
500                         
501                         // got a valid result...
502                          
503                 
504                 } catch (Error e) {
505                         GLib.error(e.message);
506                         return;
507                 }
508                 
509         }
510         
511         public  static void setAuth(Soup.Message message) 
512         {
513                 var rs =  RooTicket.singleton();                
514                 if (rs.username.length < 1) {
515                         string str;
516                         GLib.FileUtils.get_contents(GLib.Environment.get_home_dir() + "/.netrc", out str);
517                         var lines = str.split("\n");
518                         for(var i=0; i< lines.length; i++) {
519                         // assumes one line per entry.. if not we are buggered...
520                                         GLib.debug("got %s" , lines[i]);
521                         
522                                 var bits =  Regex.split_simple ("[ \t]+", lines[i].strip());
523                                 if (bits.length < 6 || bits[0] != "machine" || bits[1] != "git.roojs.com") {
524                                         continue;
525                                 }
526                                         GLib.debug("found password?");
527                                 // we are gussing.... 
528
529                                 RooTicket.singleton().username  = bits[3];
530                                 RooTicket.singleton().password  = bits[5];              
531                         }
532                 }
533
534
535                 var authCode = Base64.encode ("%s:%s".printf(rs.username, rs.password).data);
536                 message.request_headers.append("Authorization", "Basic %s".printf(authCode));
537         
538         
539         }
540
541
542         public void close(string commits)
543     {
544                 if (this.id == "-1") {
545                         return;
546                 }
547                 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
548                 table.insert("id",id);
549                 table.insert("status_name","resolved");
550                 table.insert("reason","fixed by Commits: %s".printf(commits));  
551                 var params = Soup.Form.encode_hash(table);              
552
553                 GLib.debug("request POST %s / %s", roourl, id);
554
555                 var session = new Soup.Session ();
556                 session.timeout = 0;
557                 var message = new Soup.Message ("POST", roourl + "/mtrack_ticket");
558                 RooTicket.setAuth(message);
559
560                 message.set_request ("application/x-www-form-urlencoded", Soup.MemoryUse.STATIC, params.data);
561                 session.send_message (message);
562
563
564                 var data = (string) message.response_body.flatten().data;
565                 GLib.debug("got %s", data);
566                 try {
567                            var parser = new Json.Parser ();
568                            parser.load_from_data (data, -1);
569
570                            var response = parser.get_root().get_object();
571                            var status = response.get_boolean_member("success");
572
573                            if(!status){
574                                            GLib.error(response.get_string_member("errorMsg"));
575                                            return ;
576                            }
577                                 
578                            
579                                 
580
581                 } catch (Error e) {
582                            GLib.error(e.message);
583                            return ;
584                 }
585
586    }
587
588         
589 }
590