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