Search code examples
javascriptrestangularjsangular-resource

AngularJs ngResource for nested api resurces with different endpoints


I have this endpoints

/clients/:id
/bills/:id
/clients/:id/bills

I'm trying to create some resources with angular-resource to represent my API.

Clients and Bills Resources

I created a resource for the clients,

.factory('Clients', function($resource){
   return $resource('/clients/:id')
})
.factory('Bills', function($resource){
   return $resource('/bills/:id')
});

Those worked fine.

The Problem

My problem is when I wanted to define a resource to represent the bills of a client calling the endpoint /client/:id/bills

I thought that this should be a Bills resource with a method getFromClient() or something like that, as it will return an array of Bills from the client. But I have already use the Bills name. And the endpoint is different to the one already defined.

Any idea how to structure this?


Solution

  • I think what I was loooking for is now in Anguar 1.1

    .factory('Bills', function($resource){
      return $resource('/bills/:id',{}, {
        get: {
          method: 'GET',
          params:{
            clientId: '@clientId'
          }
        },
        'getFromClient': {
          method:'GET',
          params: {
            clientId: '@clientId'
          },
          url: host + "/clients/:clientId/bills",
          isArray: true
         }
       })
    });
    

    Now you can add a url property to the method declaration to override the main url.

    If you want to go with a library that enable you to solve this problema and many others, you could try https://github.com/platanus/angular-restmod

    Here is an example:

    .factory('Client', function(restmod){
        return restmod.model('clients', {
            bills: { hasMany: 'Bill' }
        });
    }
    
    .factory('Bill', function(restmod){
        return restmod.model('bills');
    }
    
    .controller('myController', function(Client){
        $scope.client = Client.$find(1);
        $scope.client.bills.$search();
    });