sheercms
Version:
Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.
450 lines (395 loc) • 14.5 kB
JavaScript
/*
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);
}
}
}
}
});