UNPKG

sheercms

Version:

Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.

450 lines (395 loc) 14.5 kB
/* Angular Service: Content */ app.service('ContentService', function($q, $http, $upload, $modal, DSCacheFactory) { var self = this; var contentCache = DSCacheFactory('contentCache', { maxAge: 1800000, // Items added to this cache expire after 30 minutes. cacheFlushInterval: 3600000, // This cache will clear itself every hour. deleteOnExpire: 'aggressive', // Items will be deleted from this cache right when they expire. storageMode: 'localStorage' // This cache will sync itself with `localStorage`. }); self.getItems = function(groupId, page, size, useCache) { var options = { groupId: groupId, page: page, size: size, useCache: useCache }; return self.getContentItems(options); }; self.getContentItems = function(options) { var d = $q.defer(); var groupId = options.groupId || ''; var page = options.page || 1; var size = options.size || 20; var category = options.category || ''; var useCache = options.useCache || true; var url = '/cms/content/items?groupId=' + groupId + '&category=' + category + '&page=' + page + '&size=' + size; var data = null; if (useCache) data = contentCache.get(url); if (data) { d.resolve(data); } else { $http({ url: url, method: 'get', params: {} }).success(function (data) { if (data && data.items && data.items.length > 0) contentCache.put(url, data); d.resolve(data); }).error(function (data, status) { d.reject(data); }); } return d.promise; }; self.getRecentItems = function(groupId, count) { var d = $q.defer(); var url = '/cms/content/recent?groupId=' + (groupId ? groupId : '') + '&count=' + count; var data = contentCache.get(url); if (data) { d.resolve(data); } else { $http({ url: url, method: 'get', params: {} }).success(function (data) { if (data && data.items && data.items.length > 0) contentCache.put(url, data); d.resolve(data); }).error(function (data, status) { d.reject(data); }); } return d.promise; }; self.getItemList = function(itemIds, useCache) { var d = $q.defer(); if (itemIds && itemIds.length > 0) { var url = '/cms/content/itemlist?ids=' + itemIds.join(); var data = null; if (useCache) data = contentCache.get(url); if (data) { d.resolve(data); } else { $http({ url: url, method: 'get', params: {} }).success(function (data) { contentCache.put(url, data); d.resolve(data); }).error(function (data, status) { d.reject(data); }); } } else { d.resolve(null); } return d.promise; }; self.getItemsByDate = function(groupId, start, end, useCache) { var d = $q.defer(); var url = '/cms/content/items?groupId=' + (groupId ? groupId : '') + '&start=' + start + '&end=' + end; var data = null; if (useCache) data = contentCache.get(url); if (data) { d.resolve(data); } else { $http({ url: url, method: 'get', params: {} }).success(function (data) { //format the results var obj = { events: [], message: "", success: true }; if (data) { obj.success = data.success; if (data.success) { for (var i = 0; i < data.items.length; i++) { var item = data.items[i]; var start = item.startDate || item.created; var end = item.endDate || item.created; var startDate = new moment(start); var endDate = new moment(end); var allDay = false; //determine if this is an all day event if (startDate.hour() === 0 && startDate.minute() === 0 && startDate.second() === 0 && endDate.hour() === 0 && endDate.minute() === 0 && endDate.second() === 0) { allDay = true; } else if (startDate.isSame(endDate)) endDate = endDate.add('m', 30); //add 30 minutes obj.events.push(new Event(item.contentId, item.name, allDay, startDate, endDate, item.statusClass, item.status, item.statusText)); } contentCache.put(url, obj); } else obj.message = data.message; } else { obj.message = "Error loading events from server."; obj.success = false; } d.resolve(obj); }).error(function (data, status) { d.resolve({ events: [], message: data, success: false }); }); } return d.promise; }; self.getTags = function() { var d = $q.defer(); $http({ url:"/cms/content/tags", method: 'get'}).success(function(data) { d.resolve(data); }).error(function(data, status) { d.reject(data); }); return d.promise; }; self.create = function(name, groupId, typeId, templateId, startDate, endDate) { var d = $q.defer(); $http.post("/cms/content/create", {name: name, groupId: groupId, typeId: typeId, templateId: templateId, start: startDate, end: endDate}).success(function(data) { //clear the content cache for this parent list clearCache(groupId); d.resolve(data); }).error(function(data, status) { d.reject(data); }); return d.promise; }; self.changeItemDates = function(contentId, startDate, endDate, groupId) { var d = $q.defer(); //convert the dates to fix time zone issue var start = self.getDateNoZone(moment.utc(startDate)); var end = self.getDateNoZone(moment.utc(endDate)); $http.post("/cms/content/change-dates", {contentId: contentId, start: start, end: end}).success(function(data) { clearCache(groupId); d.resolve(data); }).error(function(data, status) { d.reject(data); }); return d.promise; }; self.getDateNoZone = function(mDate) { var dt = mDate.toDate(); var _userOffset = dt.getTimezoneOffset() * 60000; return new Date(dt.getTime() + _userOffset); }; self.runCommand = function(cmd, options, item) { var d = $q.defer(); if (item.templateId === "") item.templateId = null; var data = { command: cmd, options: options, item: item, batch: false }; var json = JSON.stringify(data); $http.post("/cms/content/command", {command: cmd, data:json}).success(function(data) { clearCache(item.groupId); d.resolve(data); }).error(function(data, status) { d.reject(data); }); return d.promise; }; self.runBatchCommand = function(cmd, options, itemIds, groupId) { var d = $q.defer(); var data = { command: cmd, options: options, ids: itemIds, batch: true }; var json = JSON.stringify(data); $http.post("/cms/content/command", {command: cmd, data:json}).success(function(result) { clearCache(groupId); d.resolve(result); }).error(function(result, status) { d.reject(result); }); return d.promise; }; self.getContent = function(contentId, includeEditData) { var d = $q.defer(); $http({ url:"/cms/content/get", method: 'get', params: { contentId: contentId, editData: includeEditData }}).success(function(data) { d.resolve(data); }).error(function(data, status) { d.reject(data); }); return d.promise; }; self.upload = function(groupId, files, publish, onProgress, onError) { var d = $q.defer(); //now initialize each api group var index = -1; async.eachSeries(files, function (file, done) { index++; console.log("Uploading file: " + file.name); $upload.upload({ url: '/cms/content/upload', method: 'POST', data: { groupId: groupId, publish: publish }, file: file, // or list of files: $files for html5 only }).progress(function(evt) { if (onProgress) onProgress(file.name, index, evt.loaded, evt.total); }).success(function(data, status, headers, config) { if (data && data.success == false && onError) { onError(file.name, index, data.message); } done(); }).error(function(error) { done(error); }); }, function (err) { if (err) { console.log(err); d.reject(err); } else { // files uploaded successfully //clear the client side cache for this groupId clearCache(groupId); d.resolve(true); } }); return d.promise; }; self.changeMedia = function(groupId, contentId, file, onProgress, onError) { var d = $q.defer(); console.log("Uploading file: " + file.name); $upload.upload({ url: '/cms/content/upload', method: 'POST', data: { groupId: groupId, publish: false, contentId: contentId }, file: file }).progress(function(evt) { if (onProgress) onProgress(file.name, 0, evt.loaded, evt.total); }).success(function(data, status, headers, config) { if (data && data.success !== true && onError) { onError(file.name, 0, data.message); d.resolve({success: false, message: data.message}); } else { d.resolve({success: true, message: data.message, item: data.item}); } }).error(function(error) { d.reject(error); }); return d.promise; }; self.canDesign = function(item) { return (item.branch === 'content' && item.status !== 'D' && item.url !== null && item.url.length > 0 && item.templateId != null); }; self.setItemsStatusCss = function(items) { for (var i = 0; i < items.length; i++) items[i].statusCss = self.getItemStatusCss(items[i].status); } self.getItemStatusCss = function(status) { if (status == 'N') return 'label-default'; else if (status == 'S') return 'label-info'; else if (status == 'P') return 'label-success'; else if (status == 'M') return 'label-warning'; else if (status == 'D') return 'label-danger'; else return 'label-default'; }; self.getBranchData = function(path) { if (path) { if (path.indexOf('/content') > -1) { return { name: 'content', text: 'Content', views: ['list', 'calendar'] }; } else if (path.indexOf('/media') > -1) { return { name: 'media', text: 'Media', views: ['list', 'gallery'] }; } else if (path.indexOf('/system') > -1) { return { name: 'system', text: 'System', views: ['list'] }; } } else return null; }; self.filterContentTypes = function(group, allTypes) { var types = []; if (group && group.contentTypes && allTypes) { //put all group templates into a hash var hash = {}; for (var i = 0; i < group.contentTypes.length; i++) hash[group.contentTypes[i]] = true; for (var i = 0; i < allTypes.length; i++) { var t = allTypes[i]; if (t.abstract !== true && hash[t._id] === true) types.push(t); } } return types; }; self.clearAllCache = function() { contentCache.removeAll(); }; self.clearCacheByGroup = function(groupId) { clearCache(groupId); }; function Event(id, title, allDay, start, end, className, status, statusText) { var self = this; self.id = id; self.title = title; self.allDay = allDay; self.start = start; self.end = end; self.className = className; self.status = status; self.statusText = statusText; } function clearCache(groupId) { if (groupId) { var keys = contentCache.keys(); for (var i = 0; i < keys.length; i++) { var key = keys[i]; if (key.indexOf(groupId) > -1) { contentCache.remove(key); } } } } });