ThomasBurleson
4/20/2012 - 4:43 PM

AngularJS code snippet for Interview

AngularJS code snippet for Interview

//
// Explain how this works!
//
// e.g.  var Book = parse.forClass("Book");
//       var book = Book.get(123);
//
angular
  .module( "services",[] )
  .factory( 'parse', function($rootScope, $http, $log){

 		function buildRequestURL(className, objectId) {
 			var url = "http://services.mysite.com/classes/"+className;
 			if ( objectId )
 				url = url + "/" + objectId;

 			return url;
 		}

	var    onSuccess = function( callback, logMsg ) {

			return function (response) {
				$log.log( logMsg || "" );
				$rootScope.$apply( function() {
					callback(null, response);
				});
				return response;
			};

		},
		onError = function( callback, defaultErrMsg ) {
			return function (response) {
				$rootScope.$apply( function() {
					callback(response.error || defaultErrMsg );
				});
				return response;
			};
		},


		createFn = function( data, callback) {
			return $http.post(
				buildRequestURL(className),
				data,
				{ headers: parseHeaders }
			)
			.then(
				onSuccess(callback),
				onError(callback,"Cannot submit data!")
			);
		},

		getFn = function(objectId, callback) {
			return $http.get(
				buildRequestURL(className,objectId),
				{ headers: parseHeaders }s
			)
			.then(
				onSuccess(callback),
				onError(callback, "Cannot get object "+className+"/"+objectId+"!" )
			);
		},

		queryFn = function( query, callback) {
			var config = { headers: parseHeaders };
			if (query) config.params = { where: query };

			return $http.get(
				buildRequestURL(className),
				config
			)
			.then(
				onSuccess(callback),
				onError(callback, "Could not query "+className+"!" )
			);
		},

		removeFn = function( objectId, callback) {
			return $http['delete']( //['delete'] to get around using delete js keyword
				buildRequestURL(className,objectId),
				{ headers: parseHeaders }
			)
			.then(
				onSuccess(callback),
				onError(callback, "Cannot delete object "+className+"/"+objectId+"!" )
			);
		};


	return {
		forClass : function( className ) {
			return {
				create 	: createFn,
				get 	: getFn,
				query 	: queryFn,
				remove 	: removeFn
			};
		}
	};

});