UNPKG

zettapi_client

Version:

Client side CRUD operations in angular to use with zettapi_server rest api to get started quickly in any CMS project

188 lines (157 loc) 5.88 kB
app.service('$entity', function($http, $q, blockUI, $auth, zapi) { var svc = this; this.get = function(entity, id) { if (id) return $http.get('./api/' + entity + '/list/' + id); return $http.get('./api/' + entity + '/list'); }; this.getByKey = function(collection, keyValuePair, callback, transform) { var url = './api/' + collection + '/fetch'; var httpOptions = { params: keyValuePair }; if (typeof transform === 'function') httpOptions.transformResponse = transform; if (typeof callback !== 'function') return $http.get(url, httpOptions); $http.get(url, httpOptions).then(function(response) { callback(null, response); }).catch(function(response) { callback(response); }); }; this.setFormFiles = function(fd, item, parent) { //ignore if current object has nothing or is a string if (!item || typeof item === 'string') return; //array if (item.length) { for (var i = 0; i < item.length; i++) { svc.setFormFiles(fd, item[i], parent + '[' + i + ']'); } } //not array else { //for each nested object for (var property in item) { if (typeof item[property] !== 'object') continue; //file object if (property === 'newFile') { for (var file in item[property]) { var filePath = parent ? parent + '.' + file : file; fd.append(filePath, item[property][file]); } } //non file object else { svc.setFormFiles(fd, item[property], parent ? parent + '.' + property : property); } } } }; this.add = function(entity, item) { var url = './api/' + entity + '/add/'; if (item._id) url += item._id; var fd = new FormData(); if (entity !== 'message') { svc.setFormFiles(fd, item); } fd.append('item', angular.toJson(item)); return $http.post(url, fd, { transformRequest: angular.identity, headers: { 'Content-Type': undefined } }); }; this.update = function(entity, id, fieldsToSet) { return $http.post("./api/" + entity + "/update/" + id, fieldsToSet); }; this.getLookups = function(entity, callback) { if (!zapi.entityMap[entity].lookup) return callback(); if (zapi.entityMap[entity].lookup.length === 0) return callback(); var lookups = []; for (var i = 0; i < zapi.entityMap[entity].lookup.length; i++) { var lookup = zapi.entityMap[entity].lookup[i]; lookups.push(svc.get(lookup)); } $q.all(lookups).then(function(response) { var data = {}; for (var i = 0; i < response.length; i++) { data[zapi.entityMap[entity].lookup[i]] = response[i].data; } callback(null, data); }, function(response) { callback(response); }); }; this.getMany = function(entities, callback) { var lookups = entities, promises = []; lookups.forEach(function(lookup) { promises.push(svc.get(lookup)); }); var response = {}; $q.all(promises).then(function(results) { var data = {}; results.forEach(function(result, i) { response[lookups[i]] = result.data; }); callback(null, response); }, function(err) { callback(err); }); }; this.validate = function(entity, object, dataset) { if (typeof zapi.entityMap[entity].service.validate !== 'function') return false; return zapi.entityMap[entity].service.validate(object, dataset); }; this.remove = function(entity, item) { var url = './api/' + entity + '/remove/' + item._id; return $http.get(url); }; this.blank = function(entity) { if (typeof zapi.entityMap[entity].service.blank !== 'function') return {}; return zapi.entityMap[entity].service.blank(); }; this.flattenArray = function(items, json) { var table = [], keys = [], key, data = []; items.forEach(function(item) { var row = flatten(item); for (key in row) { if (keys.indexOf(key) !== -1) continue; keys.push(key); } table.push(row); }); if (!json) data.push(keys); table.forEach(function(row) { var datum; if (json) { datum = row; } else { datum = []; keys.forEach(function(key) { if (typeof row[key] === 'undefined') datum.push(""); else datum.push(row[key]); }); } data.push(datum); }); return data; }; function flatten(data) { var result = {}; function recurse(cur, prop) { if (Object(cur) !== cur) { result[prop] = cur; } else if (Array.isArray(cur)) { for (var i = 0, l = cur.length; i < l; i++) recurse(cur[i], prop + "[" + i + "]"); if (l === 0) result[prop] = []; } else { var isEmpty = true; for (var p in cur) { isEmpty = false; recurse(cur[p], prop ? prop + "." + p : p); } if (isEmpty && prop) result[prop] = {}; } } recurse(data, ""); return result; } });