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