summaryrefslogtreecommitdiff
path: root/jsonapi.js
diff options
context:
space:
mode:
authorschneefux <schneefux+commit@schneefux.xyz>2017-04-24 13:58:21 +0200
committerschneefux <schneefux+commit@schneefux.xyz>2017-04-24 13:58:21 +0200
commit0a4bfd45517cd285cce0b5e12bd5854f03c00fa9 (patch)
treedb181bbd113059587daa9e92ed784c42909788bc /jsonapi.js
parentc808c5ccdb092f88b5e1bc90d27c3c6d51f8a19b (diff)
downloadorm-0a4bfd45517cd285cce0b5e12bd5854f03c00fa9.tar.gz
orm-0a4bfd45517cd285cce0b5e12bd5854f03c00fa9.zip
move jsonapi tool to orm
Diffstat (limited to 'jsonapi.js')
-rw-r--r--jsonapi.js64
1 files changed, 64 insertions, 0 deletions
diff --git a/jsonapi.js b/jsonapi.js
new file mode 100644
index 0000000..fa3b6ef
--- /dev/null
+++ b/jsonapi.js
@@ -0,0 +1,64 @@
+#!/usr/bin/node
+/* https://github.com/alex94puchades/superagent-jsonapify/blob/master/common.js */
+
+"use strict";
+
+var _isUndefined = require('lodash/isUndefined');
+var _isArray = require('lodash/isArray');
+var _map = require('lodash/map');
+var _partial = require('lodash/partial');
+var _each = require('lodash/each');
+var _camelCase = require('lodash/camelCase');
+var _memoize = require('lodash/memoize');
+var _chain = require('lodash/chain');
+var _find = require('lodash/find');
+var _clone = require('lodash/clone');
+var _compact = require('lodash/compact');
+
+exports.parse = (obj) => {
+ let response = obj,
+ data = obj.data;
+ if (!data) {
+ return data;
+ } else if (_isArray(data)) {
+ return _map(data, _partial(parseResourceDataObject, response));
+ } else {
+ return parseResourceDataObject(response, data);
+ }
+}
+
+function parseResourceDataObject(response, data) {
+ var result = _clone(data);
+ _each(data.attributes, function(value, name) {
+ Object.defineProperty(result, _camelCase(name), { value: value, enumerable: true });
+ });
+ _each(data.relationships, function(value, name) {
+ if (_isArray(value.data)) {
+ Object.defineProperty(result, _camelCase(name), {
+ get: _memoize(function() {
+ const related = _map(value.data, function(related) {
+ var resdata = _find(response.included, function(included) {
+ return included.id === related.id && included.type === related.type;
+ });
+ if(resdata)
+ return parseResourceDataObject(response, resdata);
+ });
+ return _compact(related);
+ }),
+ enumerable: true
+ });
+ } else if (value.data) {
+ Object.defineProperty(result, _camelCase(name), {
+ get: _memoize(function() {
+ var resdata = _find(response.included, function(included) {
+ return included.id === value.data.id && included.type === value.data.type;
+ });
+ return resdata ? parseResourceDataObject(response, resdata)
+ : null;
+ }),
+ enumerable: true
+ });
+ }
+ });
+ return result;
+}