How to instantiate angular service with multiple resources?

121 Views Asked by At

I have an angular service based on meanjs for rents. Originally it looked like this:

(function () {
  'use strict';

  angular
    .module('rents.services')
    .factory('RentsService', RentsService);

  RentsService.$inject = ['$resource', '$log'];

  function RentsService($resource, $log) {

    var Rent = $resource(
      '/api/rents/:rentId',
      {
        rentId: '@_id'
      },
      {
        update: {
          method: 'PUT'
        },
        getByCarId:
        {
          method: 'POST',
          params: {
            rentId: 'bycar'
          },
          isArray: true,
          hasBody: true,
          requestType: 'json',
          responseType: 'json'
        }
      }
    );

    angular.extend(Rent.prototype, {
      createOrUpdate: function () {
        var rent = this;
        return createOrUpdate(rent);
      }
    });

    return Rent;

    // and all other function that are the same as down below
}());

Then I added a second resource

(function () {
  'use strict';

  angular
    .module('rents.services')
    .factory('RentsService', RentsService);

  RentsService.$inject = ['$resource', '$log'];

  function RentsService($resource, $log) {

    var Rent =
      {
        basic: $resource(
          '/api/rents/:rentId',
          {
            rentId: '@_id'
          },
          {
            update: {
              method: 'PUT'
            },
            getByCarId:
            {
              method: 'POST',
              params: {
                rentId: 'bycar'
              },
              isArray: true,
              hasBody: true,
              requestType: 'json',
              responseType: 'json'
            }
          }
        ),
        carUsageStats: $resource(
          '/api/rents/car_usage'
        )
      };

    angular.extend(Rent.basic.prototype, {
      createOrUpdate: function () {
        var rent = this;
        return createOrUpdate(rent);
      }
    });

    return Rent;

    function createOrUpdate(rent) {
      if (rent._id) {
        return rent.$update(onSuccess, onError);
      } else {
        return rent.$save(onSuccess, onError);
      }

      // Handle successful response
      function onSuccess(rent) {
        // Any required internal processing from inside the service, goes here.
      }

      // Handle error response
      function onError(errorResponse) {
        var error = errorResponse.data;
        // Handle error internally
        handleError(error);
      }
    }

    function handleError(error) {
      // Log error
      $log.error(error);
    }
  }
}());

Until I added second resource, this resolve function for creating new rent worked fine

  newRent.$inject = ['RentsService'];

  function newRent(RentsService) {
    return new RentsService();
  }

But when I added second resource (and had to address the one I want by using property name - cant use Rent.query() but Rent.basic.query()) instantiating new Rent no longer works. I added console log outputs around and code stops executing at line var rent = new RentsService(). Querying works fine. What is the correct way of making new object using service with multiple resources?

0

There are 0 best solutions below