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