{"id":246,"date":"2015-04-20T22:42:42","date_gmt":"2015-04-20T22:42:42","guid":{"rendered":"https:\/\/www.tech.shinynewthings.com\/?p=246"},"modified":"2015-04-20T22:42:42","modified_gmt":"2015-04-20T22:42:42","slug":"angularjs-data-service","status":"publish","type":"post","link":"https:\/\/www.tech.shinynewthings.com\/?p=246","title":{"rendered":"AngularJS &#8211; Data Service"},"content":{"rendered":"<p>&#8216;use strict&#8217;;<\/p>\n<p>\/**<br \/>\n * @ngdoc service<br \/>\n * @name interceptcms.dataService<br \/>\n * @description<br \/>\n * # dataService<br \/>\n * Service in the interceptcms.<br \/>\n *\/<\/p>\n<p>angular.module(&#8216;interceptcms&#8217;)<br \/>\n    .factory(&#8216;dataService&#8217;, function($http, $state, $log, alert, stateService, authToken, utils, socketService, sailsValidation, RESOURCES) {<\/p>\n<pre><code>    \/\/ USE SOCKET IO TO SEND OUT NOTIFICATION OF RECORD UPDATE\n    function sendNotification (user, room, msg, link) {\n        socketService.emit('message', user, { room: room, msg: msg + \": \" + link});\n    }\n\n    \/\/ CREATE NOTIFICATION RECORD IN THE DB\n    \/\/ SEND NOTIFICATION TO USER\n    function postNotificationToDB(APP_URL, model, room, action, title, id, updatedValues, user) {\n        var notification = {\n            model: model,\n            action: action,\n            title: title,\n            updatedValues: updatedValues.join(','),\n            link: \"&lt;a href='\" + APP_URL + \"#\/\" + model + id + \"'&gt;Link&lt;\/a&gt;\",\n            user: user\n        };\n\n        \/\/ TO DO GET LIST OF USERS WATCHING ACTIONS IN DB\n        \/\/ SEND AS AN ARRAY IN THE QUERY STRING TO POST NOTIFICATIONS TO DB\n        var user = authToken.getUsername();\n\n        \/\/ SEND NOTIFICATION TO USERS\n        \/\/$http.post(RESOURCES.API_URL + 'notification\/?user=' + user, notification).success(function(data) {\n        $http.post(RESOURCES.API_URL + 'notification\/', notification).success(function(data) {\n            var notificationRoom = room + \": \" + model;\n            var notificationMsg = model + \" \" + action + \" '\" + title + \"' \";\n            getUsersToNotify(\"admin\", notificationRoom, notificationMsg, notification.link, data.id);\n        });\n    }\n\n    function getUsersToNotify(type, room, msg, link, id) {\n        $http.get(RESOURCES.API_URL + 'user\/?userType=' + type).success(function(data) {\n            for (var i = data.length - 1; i &gt;= 0; i--) {\n                var tmpObj = {notification: id, user: data[i].name};\n                $http.post(RESOURCES.API_URL + 'usernotification\/', tmpObj);\n            }\n            for (var i = data.length - 1; i &gt;= 0; i--) {\n                sendNotification(data[i].name, room, msg, link);\n            };\n        });\n    }\n    \/\/ RETURNED OBJECT\n    var dataService = {};\n    \/\/ SET NOTIFICATION TYPE\n    var room = 'notifications';\n\n    \/\/ GET DATA FROM API\n    dataService.getData = function (url, model, callback) {\n        $http.get(url).success(function(obj) {\n            \/\/ ADD NEW STATE TO HISTORY\n            stateService.stateLoaded();\n            return callback(obj, model);\n        }).error(function(err){\n            alert('warning', \"Unable to get \" + model + \".\", err.message);\n        });\n    };\n\n    dataService.confirmDelete = function(model, id, user) {\n       var answer = window.prompt(\"Are you sure you want to delete this record? \\r Type 'y' to delete.\");\n\n        if (answer === 'y') {\n            dataService.deleteRecord(model, id, user);\n        }\n    };\n\n    dataService.deleteRecord = function(model, id, user) {\n        \/\/ SET MSG VARIABLES\n        var title = \"\";\n        var updatedValues = [];\n\n        \/\/ RECORD DB NOTIFICATION TO USER\n        \/\/ SEND NOTIFICATION TO USER\n        postNotificationToDB(RESOURCES.APP_URL, model, room, \"Deleted\", title, id, updatedValues, user);\n        $http.get(RESOURCES.API_URL + model + \"\/destroy\/\" + id);\n        stateService.listView(model);\n    };\n    \/\/ EXTERNAL MODELS ARE QUERIED FOR MODEL PRIMARY FIELD AND ID \n    \/\/ THIS DATA IS USED WHEN CREATING DROPDOWNS IN THE UI\n    dataService.getRelatedData = function(val, model, callback) {\n        $http.get(RESOURCES.API_URL + model + \"\/get\").success(function(obj) {\n            val = \"dd_\" + val;\n            return callback(val, obj);\n        }).error(function(err){\n            alert('warning', \"Unable to get \" + model.trim() + \".\", err.message);\n        });\n    };\n\n    \/\/ STRIP OUT UNEDITED PROPERTIES BEFORE SUBMITTING \n    \/\/ ALLOWS US TO TRACK MODIFICATIONS\n    \/\/ IF THE OBJECT IS MODIFIED SUBMIT \/ ELSE SEND ALERT TO USER\n    dataService.processBeforeSubmitting = function(originalObj, editedObj) {\n        var obj = utils.compareObjectsKeepChanges(originalObj, editedObj);\n        if (obj) {\n            submit(obj);\n        } else {\n            alert('warning', \"No changes were found.\");             \n        }\n    };\n\n    \/\/  SUBMIT DATA TO API\n    function submit(obj) {\n        var user = authToken.getUsername();\n        \/\/ SET UP \n        var model = ($state.params.model) ? $state.params.model : $state.current.name.split('\/')[0];\n        var url = RESOURCES.API_URL + model;\n        var id = ($state.params.id) ? '\/' + $state.params.id : \"\";\n        var submittedMsg = (id) ? \"Updated\" : \"Created\";\n        var createEdit  = true;\n\n        \/\/ REMOVE RECORD KEEPING ELEMENTS FROM OBJECT\n        obj = utils.stripObj(obj, RESOURCES.RECORD_KEEPING_DATA);\n\n        \/\/ SET NOTIFICATION TO SPECIFY UPDATED PROPERTIES\n        var updatedValues = [];\n        if (id) {\n            for (var k in obj) {\n                updatedValues.push(k);\n            }\n        }\n\n        \/\/ UPDATE EXISTING OBJECT\n        \/\/ TO INCLUDE UPDATED OR CREATED BY\n        if (id) {\n            url += id;\n            obj.updatedBy = user;\n        } else {\n            obj.createdBy = user;\n        }\n\n        \/\/ POST DATA TO API\n        $http.post(RESOURCES.API_URL + model + id, obj).success(function(data) {\n            \/\/ SET MSG VARIABLES\n            var title = (obj[model] !== undefined) ? obj[model] : obj.title;\n\n            \/\/ IF RECORD WAS CREATED\n            \/\/ GET AND SET NEW RECORDS ID\n            if (!id) {\n                id = \"\/\" + data.id;\n            }\n            \/\/ SEND ALERT TO USER\n            alert(\"success\", model + submittedMsg, \"Thank you.\");\n            \/\/ RECORD DB NOTIFICATION TO USER\n            \/\/ SEND NOTIFICATION TO USER\n            postNotificationToDB(RESOURCES.APP_URL, model, room, submittedMsg, title, id, updatedValues, user);\n            stateService.loadRecordView(model, id);\n        }).error(function (data) {\n            var err = {};\n            err.model = model;\n            if (data.raw) {\n                if (data.raw.code === 11000) {\n                    err.msg = data.raw.err;\n                }\n            }\n            sailsValidation(err);\n        });\n    }\n\n    return dataService;\n\n});\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>&#8216;use strict&#8217;; \/** * @ngdoc service * @name interceptcms.dataService * @description * # dataService * Service in the interceptcms. *\/ angular.module(&#8216;interceptcms&#8217;) .factory(&#8216;dataService&#8217;, function($http, $state, $log, alert, stateService, authToken, utils, socketService, sailsValidation, RESOURCES) { \/\/ USE SOCKET IO TO SEND OUT NOTIFICATION OF RECORD UPDATE function sendNotification (user, room, msg, link) { socketService.emit(&#8216;message&#8217;, user, { room: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-246","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.tech.shinynewthings.com\/index.php?rest_route=\/wp\/v2\/posts\/246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tech.shinynewthings.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tech.shinynewthings.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tech.shinynewthings.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tech.shinynewthings.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=246"}],"version-history":[{"count":1,"href":"https:\/\/www.tech.shinynewthings.com\/index.php?rest_route=\/wp\/v2\/posts\/246\/revisions"}],"predecessor-version":[{"id":247,"href":"https:\/\/www.tech.shinynewthings.com\/index.php?rest_route=\/wp\/v2\/posts\/246\/revisions\/247"}],"wp:attachment":[{"href":"https:\/\/www.tech.shinynewthings.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tech.shinynewthings.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=246"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tech.shinynewthings.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}