amatriain/feedbunch

View on GitHub
FeedBunch-app/app/assets/javascripts/ng-services/ng-LoadFoldersSvc.js.coffee.erb

Summary

Maintainability
Test Coverage
########################################################
# AngularJS service to load folders
########################################################

angular.module('feedbunch').service 'loadFoldersSvc',
['$rootScope', 'csrfTokenSvc', 'findSvc', 'cleanupSvc', 'timerFlagSvc',
($rootScope, csrfTokenSvc, findSvc, cleanupSvc, timerFlagSvc)->

  # CSRF token
  token = csrfTokenSvc.get_token()

  # Web worker to load folders
  worker = new Worker '<%= asset_path 'workers/load_folders_worker' %>'
  worker.onmessage = (e) ->
    if e.data.status == 200 || e.data.status == 304
      folders_loaded e.data.response
    else if e.data.status == 401 || e.data.status == 422
      $window.location.href = '/login'
    else
      $rootScope.folders_loaded = true
      timerFlagSvc.start 'error_loading_folders'
    $rootScope.$digest()

  #--------------------------------------------
  # PRIVATE FUNCTION: Operations after folders have been loaded
  #--------------------------------------------
  folders_loaded = (response)->
    # Remove folders no longer existing in the server
    if $rootScope.folders? && $rootScope.folders?.length > 0
      for folder in $rootScope.folders
        existing_folder = findSvc.find_folder folder.id, response
        if !existing_folder?
          cleanupSvc.remove_folder folder.id

    # Add new folders
    if response? && response.length? > 0
      for folder in response
        add_folder folder

    $rootScope.folders_loaded = true

  #---------------------------------------------
  # PRIVATE FUNCTION: Push a folder in the folders array if it isn't already present there.
  #
  # If the folders array has not been created in the root scope, create it.
  #
  # If the folder is already in the folders array, it is ignored
  #---------------------------------------------
  add_folder = (folder)->
    if !$rootScope.folders || $rootScope.folders?.length == 0
      $rootScope.folders = [folder]
    else
      old_folder = findSvc.find_folder folder.id
      $rootScope.folders.push folder if !old_folder?

  service =

    #--------------------------------------------
    # Load folders via AJAX into the root scope.
    #--------------------------------------------
    load_folders: ->
      worker.postMessage {token: token}

    #---------------------------------------------
    # Push a folder in the folders array.
    #---------------------------------------------
    add_folder: add_folder

  return service
]