Search code examples
angularjsangular-resourceapi-design

Angular $resource: Is it better to have a data service for each resource or a flexible data service to make multiple calls?


Trying to figure out whether it's better to create a generic $resource driven data service or multiple services for different calls.

For example:

I have api/user/:userId/events/:eventId and say, api/user/:userId/beers/:beerId

Variant (A):

function UserDataService( $resource, API_URL ) {
    return function (whichResource){
        return $resource( API_URL + whichResource, {userId: '@_userId'} );
    }
}

UserMainController( UserDataService, RESOURCE ) {
    var UserMainCtrl = this;
    UserMainCtrl.events = UserDataService( RESOURCE.USERS.EVENT.LIST ).get({userId:1});
    UserMainCtrl.beers = UserDataService( RESOURCE.USERS.BEER.LIST ).get({userId:1});

}

Variant (B):

function UserEventService( $resource, API_URL, RESOURCE ) {
   return $resource( API_URL + RESOURCE.USERS.EVENT.LIST, {userId: '@_userId'} );

}

function UserBeerService( $resource, API_URL, RESOURCE ) {
   return $resource( API_URL + RESOURCE.USERS.EVENT.LIST, {userId: '@_userId'} );
}  

UserMainController( UserService, UserBeerService) {
    var UserMainCtrl = this;
    UserMainCtrl.events = UserEventService.get({userId:1});
    UserMainCtrl.beers = UserBeerService.get({userId:1});
}

Which is better, and why? Or something altogether different?

The examples I've seen have only been one-dimensional, for example Movies, but not Users plus Movies plus Music.

Thanks!


Solution

  • You should use approach B for sure. Even better separate your files for each $resource. For example you could have something like this folder structure for each module that ties to a resource and router.

    Js/
       components/
                  beers/
                      beers-resource.js
                      beers-controller.js
                      beers-router.js
                  wines/
                      wines-resource.js
                      wines-controller.js
                      wines-router.js
    

    This is the best way if you ask me since youir code will be easier to read and maintain in the long run.