interceptor.js 2.88 KB
angular.module('focaConfiguracion')
    .factory("interceptorRequest", [ '$injector',
        function($injector) {

            function reintentarRequest(httpConfig) {

                var $timeout = $injector.get('$timeout');

                return $timeout(function() {

                    var $http = $injector.get('$http');
                    return $http(httpConfig.config);
                }, 10000);
            }

            function updateDataSqlite(request) {

                var sqliteService = $injector.get('focaSqliteService');

                sqliteService.updateQuery(
                    request.config.url,
                    JSON.stringify(request.config.data),
                    request.config.method,
                    JSON.stringify(request.data));
            }

            function getDataSqlite(request) {

                return new Promise(function(resolve) {

                    var sqliteService = $injector.get('focaSqliteService');

                    sqliteService.getQuery(
                        request.config.url,
                        JSON.stringify(request.config.data),
                        request.config.method,
                        respuesta);

                    function respuesta(config) {

                        if (config) {

                            var request = {
                                data: JSON.parse(config.response),
                                status: 200
                            };

                            resolve(request);
                        } else {
                            resolve(false);
                        }
                    }
                });
            }

            function broadCastRed(status) {

                var $rootScope = $injector.get('$rootScope');

                $rootScope.$broadcast('estadoRed', status);
            }

            var request = {
                responseError: async function(config) {

                    if (config.status === -1) {

                        broadCastRed(false);

                        var data = await getDataSqlite(config);
                        if (!data) {
                            return reintentarRequest(config);
                        } else {
                            config.data = data.data;
                            return config;
                        }

                    } else {
                        return config;
                    }
                },
                response: function(response) {

                    if (typeof response.data !== 'string') {
                        broadCastRed(true);
                        updateDataSqlite(response);
                    }
                    return response;
                }
            }

            return request;
        }
    ]).config(['$httpProvider', function($httpProvider) {
        $httpProvider.interceptors.push('interceptorRequest');
    }]);