javiercejudo/javiercejudo.com

View on GitHub
js/controllers/CvCtrl.js

Summary

Maintainability
A
0 mins
Test Coverage
/*global angular:true, Firebase:true, browser:true */

(function (angular) {
  'use strict';

  angular.module('JcApp').controller(
    'CvCtrl',
    ['$rootScope', '$scope', '$routeParams', '$location', '$http', '$filter', '$timeout', '$firebaseObject', '$localStorage', 'JcFirebaseURL',
      function ($rootScope, $scope, $routeParams, $location, $http, $filter, $timeout, $firebaseObject, $localStorage, JcFirebaseURL) {
        $scope.cv = {
          loading: null,
          params: $routeParams,
          languages: [],
          data: null,
          dataRemote: null
        };

        $scope.storage = $localStorage;

        $scope.firebase = {
          ref: null
        };

        $scope.$watch('cv.data', function (data) {
          if (!data) {
            return;
          }

          $scope.cv.loading = false;
          $scope.setAvailableLanguages();
          $scope.setLanguage();
          $scope.saveToLocalStorage();
        }, true);

        $scope.initCv = function () {
          var
            cv = $scope.cv,
            firebase = $scope.firebase,
            localStorageContent;

          localStorageContent = $scope.retrieveFromLocalStorage();

          if (!localStorageContent) {
            $scope.setCvData();
          } else {
            cv.data = localStorageContent;
            cv.loading = false;
          }

          if (!$rootScope.online) {
            return;
          }

          firebase.ref = new Firebase(JcFirebaseURL + '/cv');
          cv.dataRemote = $firebaseObject(firebase.ref);

          cv.dataRemote.$bindTo($scope, "cv.data");
        };

        $scope.setCvData = function () {
          var cv = $scope.cv;

          cv.loading = true;

          $http.get(JcFirebaseURL + '/cv.json', {cache: true})
            .success(function (response) {
              cv.loading = false;
              $scope.successCallback(response);
            })
            .error(function () {
              $scope.setCvDataFromBackup(500);
            });
        };

        $scope.setCvDataFromBackup = function (fakeDelay) {
          var
            cv = $scope.cv,
            requestOptions = {
              cache: true
            };

          fakeDelay = fakeDelay || 0;

          cv.loading = true;

          $timeout(function () {
            $http.get($scope.firebaseBackupUrl, requestOptions)
              .success(function (response) {
                cv.loading = false;
                $scope.successCallback(response.cv);
              })
              .error(function () {
                cv.loading = false;
              });
          }, fakeDelay);
        };

        $scope.successCallback = function (response) {
          var cv = $scope.cv;

          cv.data = response;
        };

        $scope.retrieveFromLocalStorage = function () {
          return $scope.storage['cv-data'];
        };

        $scope.saveToLocalStorage = function () {
          $scope.storage['cv-data'] = $scope.cv.data;
        };

        $scope.setAvailableLanguages = function () {
          var
            cv = $scope.cv,
            languages = [];

          angular.forEach(cv.data, function (language, urlKey) {
            if (language !== null && language.hasOwnProperty('pos')) {
              languages.push({
                url: urlKey,
                pos: language.pos
              });
            }
          });

          cv.languages = $filter('orderBy')(languages, 'pos');
        };

        $scope.setLanguage = function () {
          var
            cv = $scope.cv,
            params = cv.params;

          $rootScope.pageTitle = 'CV: ' + $filter('jcCapitalise')(params.language);
          $scope.cvLocal = cv.data[params.language];

          if (!$scope.cvLocal) {
            $location.path('/cv/english');
            $location.replace();
          }
        };
      }]
  );

}(angular));