Search code examples
angularjsangular-resourceangular-http

Common transformResponse in factory $resource


We are using a factory to interact with a series of custom APIs around common entities. However, part of what I need to do is evaluate the custom responses sent back in the headers and it seems like they way to do this is to use transformResponse. What I have seems to be working, but I'm literally repeating the same thing over and over in each definition. I tried creating a function to make it reusable, but the reference seems to fail. What am I doing wrong?

(function()
{
    'use strict';

    angular.module('aumBills', ['ngResource'])
    .factory('Bills', ['$resource',  
    function($resource)
    {
        return $resource(
        '/ua_aumcore/bills/api/v1/bills/:billableEventI',
        {
            billableEventI:'@billableEventI'
        },
        {
            getList:
            {
                method: 'GET',
                isArray: false,
                transformResponse: function(data, header, status, config, statusText)
                {
                    var response = {};
                    if (isJson(data))
                    {
                        data = angular.fromJson(data);
                        response.data = data;
                    }
                    response.status = status;
                    response.config = config;
                    response.statusText = statusText;
                    return response;
                },
                url: '/ua_aumcore/bills/api/v1/bills/query/'
            },
            getParties:
            {
                method: 'GET',
                isArray: false,
                transformResponse: function(data, header, status, config, statusText)
                {
                    var response = {};
                    if (isJson(data))
                    {
                        data = angular.fromJson(data);
                        response.data = data;
                    }
                    response.status = status;
                    response.config = config;
                    response.statusText = statusText;
                    return response;
                },
                url: '/ua_aumcore/bills/api/v1/customer/billParties/?partySites=:partySiteIDs', 
                params: {partySiteIDs: '@partySiteIDs'}
            }
            //plus about 12 more after this         
        });
    }]);

    function isJson(str)
    {
        try
        {
            JSON.parse(str);
        }
        catch (e)
        {
            return false;
        }
        return true;
    }
})();

The code that broke looked identical to above, only I put:

transformResponse: transResp(data, header, status, config, statusText),

in each definition, and then this is the function that follows immediately after isJSON:

function transResp(data, header, status, config, statusText)
    {
        var response = {};
        if (isJson(data))
        {
            data = angular.fromJson(data);
            response.data = data;
        }
        response.status = status;
        response.config = config;
        response.statusText = statusText;
        return response;
    }

Solution

  • It looks like defining the transformResponse function I want to use as a variable, and plugging the variable into the definition works:

    (function()
    {
        'use strict';
    
        angular.module('aumBills', ['ngResource'])
        .factory('Bills', ['$resource',
        function($resource)
        {
            var transResp = function(data, header, status, config, statusText)
            {
                var response = {};
                if (isJson(data))
                {
                    data = angular.fromJson(data);
                    response.data = data;
                }
                response.status = status;
                response.config = config;
                response.statusText = statusText;
                return response;
            };
    
            return $resource(
            '/ua_aumcore/bills/api/v1/bills/:billableEventI',
            {
                billableEventI:'@billableEventI'
            },
            {
                get:
                {
                    method: 'GET',
                    isArray: false,
                    transformResponse: transResp,
                    url: '/ua_aumcore/bills/api/v1/bills/:billableEventI'
                },
                getList:
                {
                    method: 'GET',
                    isArray: false,
                    transformResponse: transResp,
                    url: '/ua_aumcore/bills/api/v1/bills/query/'
                }
                //and so on and so forth
            });
        }]);
    
        function isJson(str)
        {
            try
            {
                JSON.parse(str);
            }
            catch (e)
            {
                return false;
            }
            return true;
        }
    })();