QutBioacousticsResearchGroup/bioacoustic-workbench

View on GitHub
lib/assets/javascripts/angular-http-auth.js

Summary

Maintainability
A
0 mins
Test Coverage
/**
 * @license HTTP Auth Interceptor Module for AngularJS
 * (c) 2012 Witold Szczerba
 * License: MIT
 * https://github.com/witoldsz/angular-http-auth/tree/gh-pages
 */
angular.module('http-auth-interceptor', [])

    .provider('authService', function () {
        /**
         * Holds all the requests which failed due to 401 response,
         * so they can be re-requested in future, once login is completed.
         */
        var buffer = [];

        /**
         * Required by HTTP interceptor.
         * Function is attached to provider to be invisible for regular users of this service.
         */
        this.pushToBuffer = function (config, deferred) {
            buffer.push({
                config: config,
                deferred: deferred
            });
        };

        this.$get = ['$rootScope', '$injector', function ($rootScope, $injector) {
            var $http; // initialized later because of circular dependency problem
            function retry(config, deferred) {
                $http = $http || $injector.get('$http');
                $http(config).then(function (response) {
                    deferred.resolve(response);
                });
            }

            function retryAll() {
                for (var i = 0; i < buffer.length; ++i) {
                    retry(buffer[i].config, buffer[i].deferred);
                }
                buffer = [];
            }

            return {
                loginConfirmed: function () {
                    console.info("authService::event:auth-loginConfirmed");
                    $rootScope.$broadcast('event:auth-loginConfirmed');

                    retryAll();
                }
            }
        }]
    })

/**
 * $http interceptor.
 * On 401 response - it stores the request and broadcasts 'event:angular-auth-loginRequired'.
 */
    .config(['$httpProvider', 'authServiceProvider', function ($httpProvider, authServiceProvider) {

        var interceptor = ['$rootScope', '$q', function ($rootScope, $q) {
            function success(response) {
                return response;
            }

            function error(response) {
                if (response.status === 401) {
                    var deferred = $q.defer();
                    authServiceProvider.pushToBuffer(response.config, deferred);

                    console.info("authService::event:auth-loginRequired");
                    $rootScope.$broadcast('event:auth-loginRequired');
                    return deferred.promise;
                }
                // otherwise
                return $q.reject(response);
            }

            return function (promise) {
                return promise.then(success, error);
            }

        }];
        $httpProvider.responseInterceptors.push(interceptor);

        // add rails' CSRF token to Post requests
        // https://gist.github.com/prognostikos/3698589
        var meta_tag = document.getElementsByTagName('meta');
        for (var meta_tag_index in meta_tag) {
            if (meta_tag[meta_tag_index].name == 'csrf-token') {
                $httpProvider.defaults.headers.common['X-CSRF-Token'] = meta_tag[meta_tag_index].content;
                break;
            }
        }

    }]);