diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Resource.js | 163 | ||||
| -rw-r--r-- | src/service/resource.js | 164 | 
2 files changed, 162 insertions, 165 deletions
diff --git a/src/Resource.js b/src/Resource.js deleted file mode 100644 index 64c8c159..00000000 --- a/src/Resource.js +++ /dev/null @@ -1,163 +0,0 @@ -'use strict'; - -function Route(template, defaults) { -  this.template = template = template + '#'; -  this.defaults = defaults || {}; -  var urlParams = this.urlParams = {}; -  forEach(template.split(/\W/), function(param){ -    if (param && template.match(new RegExp("[^\\\\]:" + param + "\\W"))) { -      urlParams[param] = true; -    } -  }); -  this.template = template.replace(/\\:/g, ':'); -} - -Route.prototype = { -  url: function(params) { -    var self = this, -        url = this.template, -        encodedVal; - -    params = params || {}; -    forEach(this.urlParams, function(_, urlParam){ -      encodedVal = encodeUriSegment(params[urlParam] || self.defaults[urlParam] || ""); -      url = url.replace(new RegExp(":" + urlParam + "(\\W)"), encodedVal + "$1"); -    }); -    url = url.replace(/\/?#$/, ''); -    var query = []; -    forEachSorted(params, function(value, key){ -      if (!self.urlParams[key]) { -        query.push(encodeUriQuery(key) + '=' + encodeUriQuery(value)); -      } -    }); -    url = url.replace(/\/*$/, ''); -    return url + (query.length ? '?' + query.join('&') : ''); -  } -}; - -function ResourceFactory($http) { -  this.$http = $http; -} - -ResourceFactory.DEFAULT_ACTIONS = { -  'get':    {method:'GET'}, -  'save':   {method:'POST'}, -  'query':  {method:'GET', isArray:true}, -  'remove': {method:'DELETE'}, -  'delete': {method:'DELETE'} -}; - -ResourceFactory.prototype = { -  route: function(url, paramDefaults, actions){ -    var self = this; -    var route = new Route(url); -    actions = extend({}, ResourceFactory.DEFAULT_ACTIONS, actions); -    function extractParams(data){ -      var ids = {}; -      forEach(paramDefaults || {}, function(value, key){ -        ids[key] = value.charAt && value.charAt(0) == '@' ? getter(data, value.substr(1)) : value; -      }); -      return ids; -    } - -    function Resource(value){ -      copy(value || {}, this); -    } - -    forEach(actions, function(action, name){ -      var isPostOrPut = action.method == 'POST' || action.method == 'PUT'; -      Resource[name] = function(a1, a2, a3, a4) { -        var params = {}; -        var data; -        var success = noop; -        var error = null; -        switch(arguments.length) { -        case 4: -          error = a4; -          success = a3; -          //fallthrough -        case 3: -        case 2: -          if (isFunction(a2)) { -            if (isFunction(a1)) { -              success = a1; -              error = a2; -              break; -            } - -            success = a2; -            error = a3; -            //fallthrough -          } else { -            params = a1; -            data = a2; -            success = a3; -            break; -          } -        case 1: -          if (isFunction(a1)) success = a1; -          else if (isPostOrPut) data = a1; -          else params = a1; -          break; -        case 0: break; -        default: -          throw "Expected between 0-4 arguments [params, data, success, error], got " + -            arguments.length + " arguments."; -        } - -        var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data)); -        self.$http({ -          method: action.method, -          url: route.url(extend({}, extractParams(data), action.params || {}, params)), -          data: data -        }).then(function(response) { -            var data = response.data; - -            if (data) { -              if (action.isArray) { -                value.length = 0; -                forEach(data, function(item) { -                  value.push(new Resource(item)); -                }); -              } else { -                copy(data, value); -              } -            } -            (success||noop)(value, response.headers); -          }, error); - -        return value; -      }; - -      Resource.bind = function(additionalParamDefaults){ -        return self.route(url, extend({}, paramDefaults, additionalParamDefaults), actions); -      }; - -      Resource.prototype['$' + name] = function(a1, a2, a3) { -        var params = extractParams(this), -            success = noop, -            error; - -        switch(arguments.length) { -        case 3: params = a1; success = a2; error = a3; break; -        case 2: -        case 1: -          if (isFunction(a1)) { -            success = a1; -            error = a2; -          } else { -            params = a1; -            success = a2 || noop; -          } -        case 0: break; -        default: -          throw "Expected between 1-3 arguments [params, success, error], got " + -            arguments.length + " arguments."; -        } -        var data = isPostOrPut ? this : undefined; -        Resource[name].call(this, params, data, success, error); -      }; -    }); -    return Resource; -  } -}; diff --git a/src/service/resource.js b/src/service/resource.js index 790d5ed6..3aa48e74 100644 --- a/src/service/resource.js +++ b/src/service/resource.js @@ -202,7 +202,167 @@   */  function $ResourceProvider() {    this.$get = ['$http', function($http) { -    var resource = new ResourceFactory($http); -    return bind(resource, resource.route); +    var DEFAULT_ACTIONS = { +      'get':    {method:'GET'}, +      'save':   {method:'POST'}, +      'query':  {method:'GET', isArray:true}, +      'remove': {method:'DELETE'}, +      'delete': {method:'DELETE'} +    }; + + +    function Route(template, defaults) { +      this.template = template = template + '#'; +      this.defaults = defaults || {}; +      var urlParams = this.urlParams = {}; +      forEach(template.split(/\W/), function(param){ +        if (param && template.match(new RegExp("[^\\\\]:" + param + "\\W"))) { +          urlParams[param] = true; +        } +      }); +      this.template = template.replace(/\\:/g, ':'); +    } + +    Route.prototype = { +      url: function(params) { +        var self = this, +            url = this.template, +            encodedVal; + +        params = params || {}; +        forEach(this.urlParams, function(_, urlParam){ +          encodedVal = encodeUriSegment(params[urlParam] || self.defaults[urlParam] || ""); +          url = url.replace(new RegExp(":" + urlParam + "(\\W)"), encodedVal + "$1"); +        }); +        url = url.replace(/\/?#$/, ''); +        var query = []; +        forEachSorted(params, function(value, key){ +          if (!self.urlParams[key]) { +            query.push(encodeUriQuery(key) + '=' + encodeUriQuery(value)); +          } +        }); +        url = url.replace(/\/*$/, ''); +        return url + (query.length ? '?' + query.join('&') : ''); +      } +    }; + + +    function ResourceFactory(url, paramDefaults, actions) { +      var route = new Route(url); + +      actions = extend({}, DEFAULT_ACTIONS, actions); + +      function extractParams(data){ +        var ids = {}; +        forEach(paramDefaults || {}, function(value, key){ +          ids[key] = value.charAt && value.charAt(0) == '@' ? getter(data, value.substr(1)) : value; +        }); +        return ids; +      } + +      function Resource(value){ +        copy(value || {}, this); +      } + +      forEach(actions, function(action, name) { +        var isPostOrPut = action.method == 'POST' || action.method == 'PUT'; +        Resource[name] = function(a1, a2, a3, a4) { +          var params = {}; +          var data; +          var success = noop; +          var error = null; +          switch(arguments.length) { +          case 4: +            error = a4; +            success = a3; +            //fallthrough +          case 3: +          case 2: +            if (isFunction(a2)) { +              if (isFunction(a1)) { +                success = a1; +                error = a2; +                break; +              } + +              success = a2; +              error = a3; +              //fallthrough +            } else { +              params = a1; +              data = a2; +              success = a3; +              break; +            } +          case 1: +            if (isFunction(a1)) success = a1; +            else if (isPostOrPut) data = a1; +            else params = a1; +            break; +          case 0: break; +          default: +            throw "Expected between 0-4 arguments [params, data, success, error], got " + +              arguments.length + " arguments."; +          } + +          var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data)); +          $http({ +            method: action.method, +            url: route.url(extend({}, extractParams(data), action.params || {}, params)), +            data: data +          }).then(function(response) { +              var data = response.data; + +              if (data) { +                if (action.isArray) { +                  value.length = 0; +                  forEach(data, function(item) { +                    value.push(new Resource(item)); +                  }); +                } else { +                  copy(data, value); +                } +              } +              (success||noop)(value, response.headers); +            }, error); + +          return value; +        }; + + +        Resource.bind = function(additionalParamDefaults){ +          return ResourceFactory(url, extend({}, paramDefaults, additionalParamDefaults), actions); +        }; + + +        Resource.prototype['$' + name] = function(a1, a2, a3) { +          var params = extractParams(this), +              success = noop, +              error; + +          switch(arguments.length) { +          case 3: params = a1; success = a2; error = a3; break; +          case 2: +          case 1: +            if (isFunction(a1)) { +              success = a1; +              error = a2; +            } else { +              params = a1; +              success = a2 || noop; +            } +          case 0: break; +          default: +            throw "Expected between 1-3 arguments [params, success, error], got " + +              arguments.length + " arguments."; +          } +          var data = isPostOrPut ? this : undefined; +          Resource[name].call(this, params, data, success, error); +        }; +      }); +      return Resource; +    } + +    return ResourceFactory;    }];  }  | 
