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