blob: d4bba90d0db087860f2bdd83c4bea7f7807d8de4 [file] [log] [blame]
Matteo Scandolo86f3f282016-08-11 11:21:33 -07001(function () {
2 'use strict';
3 angular.module('xos.UITutorial')
4 .service('ExploreCmd', function($injector, ResponseHandler, ErrorHandler){
5
6 this.setup = (shell) => {
7 shell.setCommandHandler('resource', {
8 exec: (cmd, args, done) => {
9 switch(args[0]){
10 case 'list':
11 return listAvailableResources(done);
12 break;
13 default:
14 // use the resource
15 const resourceName = args.shift();
16 const method = args.shift();
17 return consumeResource(resourceName, method, args, done);
18 }
19 },
20 completion: function(cmd, arg, line, callback) {
21 const args = ['list'].concat(getAvailableResources());
22 if(line.text.match(/resource\s[A-Z][a-z]+\s/)){
23 // if arg is a resource, then return available methods
24 if(args.indexOf(arg) !== -1){
25 arg = '';
26 }
27 const methods = ['query', 'get', 'save', '$save', 'delete'];
28 return callback(shell.bestMatch(arg, methods));
29 }
30 return callback(shell.bestMatch(arg, args));
31 }
32 });
33 };
34
35 const getAvailableResources = () => {
36 return angular.module('xos.helpers')._invokeQueue
37 .filter((d) => {
38 if(d[1] !== 'service'){
39 return false;
40 }
41 const serviceDeps = d[2][1];
42 return serviceDeps.indexOf('$resource') !== -1;
43 })
44 .reduce((list, i) => list.concat([i[2][0]]), []);
45 }
46
47 const listAvailableResources = (done) => {
48 const resources = getAvailableResources()
49 .reduce((html, i) => `${html}${i}<br/>`, '');
50 done(resources);
51 }
52
53 const consumeResource = (resourceName, method, args, done) => {
54
55 // TODO if not resourceName/method print cmd instructions
56
57 if(getAvailableResources().indexOf(resourceName) === -1){
58 return ErrorHandler.print(`Resource "${resourceName}" does not exists`, done);
59 }
60
61 if(['query', 'get', 'save', '$save', 'delete'].indexOf(method) === -1){
62 return ErrorHandler.print(`Method "${method}" not allowed`, done);
63 }
64
65 let Resource;
66 try{
67 Resource = $injector.get(resourceName);
68
69 // TODO @Teo if get/delete check for arguments
70 let params = {};
71
72 // if the method require arguments checks for them
73 if(['get', '$save', 'delete'].indexOf(method) !== -1){
74 if(args.length === 0){
75 return ErrorHandler.print(`Method "${method}" require parameters`, done);
76 }
77 }
78
79 // if there are arguments parse them
80 if(args.length > 0){
81 params = eval(`(${args[0]})`);
82 }
83
84 // if it is a query is not possible to use id as parameter
85 if(method === 'query' && angular.isDefined(params.id)){
86 return ErrorHandler.print(`Is not possible to use "id" as filter in method "${method}", use "get" instead!`, done);
87 }
88
89 Resource[method](params).$promise
90 .then(res => {
91 return ResponseHandler.parse(res, done);
92 });
93 }
94 catch(e){
95 return ErrorHandler.print(`Failed to inject resource "${resourceName}"`, done);
96 }
97 };
98
99 });
100})();