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

203 lines (172 loc) 5.51 kB
app.service('$entity', function ($http, $q, blockUI, $auth, inform, 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.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) { 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); }); table.forEach(function (row) { var datum = {}; for (var i = 0; i < keys.length; i++) { key = keys[i]; if (typeof row[key] === 'undefined') { row[key] = ""; } datum[key] = row[key]; } data.push(datum); }); return data; }; this.unflattenArray = function (items) { var data = []; items.forEach(function (item) { data.push(unflatten(item)); }); 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; } function unflatten(data) { if (Object(data) !== data || Array.isArray(data)) { return data; } var regex = /\.?([^.\[\]]+)|\[(\d+)\]/g, resultholder = {}; for (var p in data) { var cur = resultholder, prop = "", m; while ((m = regex.exec(p))) { cur = cur[prop] || (cur[prop] = (m[2] ? [] : {})); prop = m[2] || m[1]; } cur[prop] = data[p]; } return resultholder[""] || resultholder; } });