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