AngularJS – Model Service

‘use strict’;

/**
* @ngdoc service
* @name interceptcms.modelService
* @description
* # modelService
* Factory in the interceptcms.
*/
angular.module(‘interceptcms’)
.factory(‘modelService’, function($http, alert, RESOURCES) {

// LOAD MODELS ONCE AND SAVE TO cachedModels
var cachedModels = {};

//  GET MODEL FROM API
//  RETURNS OBJECT STRUCTURE AND DATA TYPES
//  ADDS MODEL NAME PROPERTY
//  PASSES TO AUGMENTMODEL
function getModel(modelName, callback) {
  $http.get(RESOURCES.API_URL + modelName + "/model").success(function(obj) {
    var model = {};
    model = augmentModel(obj);
    model._modelName = modelName;
    if (callback) {
      callback("model", model);
    } else {
      return model;
    }
    setModel(modelName, model);
  }).error(function(err){
    alert('warning', "Unable to get " + modelName + ".", err.message);
  });
}

function setModel(modelName, model) {
  cachedModels[modelName] = model;
}

//  AUGMENTMODEL
//  IDENTIFIES RECORD KEEPING DATA AS ARRAY
//  IDENTIFIES RELATED MODELS WITHIN MODEL
//  IDENTIFIES DROPDOWN MODELS WITHIN MODEL
//    ADDS RESULT TO PROPERTY relatedModels

// UPDATE MODEL WITH GENERIC PROPERTIES
// CALLED BY GET MODEL
// ADDS VIEW SPECIFIC INFO
// TO GENERATE VIEW COMPONENTS FROM RELATED DATA SETS
function augmentModel(obj){
  var relatedArray = [];
  var dropdownArray = [];
  for (var prop in obj) {

    // TO DO REFACTOR RELATIONSHIP DESCRIPTION 
    // COLLECTION = ONE TO MANY
    if (obj[prop].collection) {
      // MONGO SPECIFIC
      relatedArray.push(checkRelated(obj, prop, "collection", "collection"));
    }

    // MODEL = ONE TO ONE using VIA AS field REFERENCE
    if (obj[prop].model) {
      // REFACTOR 
      // USE GETDROPDOWNVALUES TO PROPULATE AS OBJECT
      // WITH NAME PROPERTY & VALUE ARRAY
      // MONGO SPECIFIC
      dropdownArray.push(checkRelated(obj, prop, "model"));
    }
  }

  obj._rkData = RESOURCES.RECORD_KEEPING_DATA;
  obj._relatedModels = relatedArray;
  obj._dropdownArray = dropdownArray;
  return obj;
}

// CREATE RELATEDARRAY ELEMENTS
// CREATE dropdownArray ELEMENTS
// FOR VIEW
function checkRelated(obj, prop, type) {
  //if (obj[prop][type]) {
    var tmpObj = {};
    tmpObj[prop] = obj[prop][type];
    return tmpObj;
  //}
}

var requestModel = function(modelName, callback) {
  if (!cachedModels[modelName]) {
    getModel(modelName, callback);
  } else {
    console.log("returning cached model:" + modelName);
    return callback("model", cachedModels[modelName]);
  }
};
var getCachedModel = function(modelName) {
  var model = cachedModels[modelName];
  var array = [];
  for (var prop in model) {
    array.push(prop);
  }
  return array;
};
var getDropDownModel = function(modelName) {

};

return {
  requestModel: requestModel,
  getCachedModel: getCachedModel,
  getModel: getModel
};

});

Leave a Reply

Your email address will not be published. Required fields are marked *