m3l7
2/9/2015 - 10:30 AM

angular $resource wrapper

angular $resource wrapper

var Sjuga = Sjuga || {};
Sjuga.site.factory('sitePage', ['$resource', 'siteGlobal', '$q',
    function($resource, siteGlobal, $q) {

        // $resource wrapper that elaborates data after querying server

        return {
            query: query,
            get: get
        }

        function query(filter,cb_success,cb_fail){ return _callResource('query',filter,cb_success,cb_fail);}
        function get(filter,cb_success,cb_fail){ return _callResource('get',filter,cb_success,cb_fail);}

        function _callResource(method,filter,cb_success,cb_fail){

            var deferred = $q.defer();

            //keep trace if data has been processed yet
            var processed = false;

            var res = $resource(siteGlobal.api + 'page/:idPage/:what/:id/', {
                what: '@what',
                id: '@id',
                idPage: '@idPage'
            })
            [method](filter,function(data){

                //success callback
                if (!processed) data = processData(data);
                if (typeof(cb_success)=='function') cb_success(data);

            },cb_fail);

            res.$promise
            .then(
            	function(data){

                    //success promise callback
                    if (!processed) data = processData(data);
                    deferred.resolve(data);

                },
            	function(err){deferred.reject(err);}
            );

            function processData(data){
                //elaborate data
                processed = true;
                
                //break lines
                if (siteGlobal.filters.lineBreak){
                    if (data.length) data.forEach(function(item){
                        if (!!item.message) item.message = item.message.replace(/\n+/g,"<br>");
                    })
                    if (!!data.description) data.description = data.description.replace(/\n+/g,"<br>")
                    if (!!data.about) data.about = data.about.replace(/\n+/g,"<br>")
                    if (!!data.mission) data.mission = data.mission.replace(/\n+/g,"<br>")
                    if ((!!data.milestones) && (data.milestones.length)) data.milestones.forEach(function(item){
                        if (!!item.description) item.description = item.description.replace(/\n+/g,"<br>");
                    })
                }

                //linkify strings
                if (siteGlobal.filters.linkify){
                    if (data.length) data.forEach(function(item){
                        if (!!item.message) item.message = linkify(item.message);
                    });
                    if (!!data.description) data.description = linkify(data.description);
                    if (!!data.about) data.about = linkify(data.about);
                    if (!!data.mission) data.mission = linkify(data.mission);
                    if ((!!data.milestones) && (data.milestones.length)) data.milestones.forEach(function(item){
                        if (!!item.description) item.description = linkify(item.description);
                    })
                }

                //inject data into the returned promise
                angular.extend(deferred.promise,data);

                return data;
            }

            //inject our wrapped promise into $resource return object
            res.$promise = deferred.promise;
            return res;
        }

    }
]);