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
JavaScript
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;
}
});