Skip to content

Commit

Permalink
Merge pull request #9 from hashicorp/feature/normalize-payload
Browse files Browse the repository at this point in the history
Feature/normalize payload
  • Loading branch information
johncowen authored Mar 22, 2018
2 parents b6e1cd8 + 52edc11 commit cba08ab
Show file tree
Hide file tree
Showing 9 changed files with 80 additions and 128 deletions.
11 changes: 7 additions & 4 deletions app/adapters/kv.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ const makeAttrable = function(obj) {
const keyToArray = function(key) {
return (key === '/' ? '' : key).split('/');
};
const PRIMARY_KEY = 'Key';
const DATACENTER_KEY = 'Datacenter';

const stringify = function(obj) {
if (typeOf(obj) === 'string') {
return obj;
Expand Down Expand Up @@ -52,7 +55,7 @@ export default Adapter.extend({
},
urlForDeleteRecord: function(id, modelName, snapshot) {
const query = {
dc: snapshot.attr('Datacenter'),
dc: snapshot.attr(DATACENTER_KEY),
};
if (isFolder(id)) {
query.recurse = null;
Expand All @@ -61,7 +64,7 @@ export default Adapter.extend({
},
urlForCreateRecord: function(modelName, snapshot) {
return this.appendURL('kv', keyToArray(snapshot.attr('Key')), {
dc: snapshot.attr('Datacenter'),
dc: snapshot.attr(DATACENTER_KEY),
});
},
urlForUpdateRecord: function(id, modelName, snapshot) {
Expand All @@ -86,11 +89,11 @@ export default Adapter.extend({
// isBoolean? should error on false
const url = requestData.url.split('?')[0];
const kv = {
Key: url
[PRIMARY_KEY]: url
.split('/')
.splice(3)
.join('/'),
Datacenter: '',
[DATACENTER_KEY]: '',
}; // TODO: separator?
// safest way to check this is a create?
if (this.urlForCreateRecord(null, makeAttrable(kv)).split('?')[0] === url) {
Expand Down
6 changes: 3 additions & 3 deletions app/adapters/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export default Adapter.extend({
delete query.id;
return this.appendURL('internal/ui/node', [id]);
},
handleResponse: function(status, headers, payload, requestData) {
return this._super(status, headers, { nodes: payload }, requestData);
},
// handleResponse: function(status, headers, payload, requestData) {
// return this._super(status, headers, { nodes: payload }, requestData);
// },
});
8 changes: 5 additions & 3 deletions app/adapters/service.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import Adapter from './application';
import { assign } from '@ember/polyfills';
const PRIMARY_KEY = 'Id';
export default Adapter.extend({
urlForQuery: function(query, modelName) {
return this.appendURL('internal/ui/services');
Expand All @@ -21,17 +22,18 @@ export default Adapter.extend({
const parts = requestData.url.split('/');
if (this.isQueryRecord(parts)) {
response = {
Id: parts.pop(),
[PRIMARY_KEY]: parts.pop(),
Nodes: response,
};
} else {
// isQuery
response = response.map(function(item, i, arr) {
return assign({}, item, {
Id: item.Name,
[PRIMARY_KEY]: item.Name,
});
});
}
return this._super(status, headers, { services: response }, requestData);
return this._super(status, headers, response, requestData);
// return this._super(status, headers, {services: response}, requestData);
},
});
52 changes: 8 additions & 44 deletions app/serializers/acl.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,49 +2,13 @@ import Serializer from './application';
import { typeOf } from '@ember/utils';
export default Serializer.extend({
primaryKey: 'ID',
normalizeQueryResponse: function(store, primaryModelClass, payload, id, requestType) {
return this._super(
store,
primaryModelClass,
{
[primaryModelClass.modelName]: payload,
},
id,
requestType
);
},
normalizeQueryRecordResponse: function(store, primaryModelClass, payload, id, requestType) {
return this._super(
store,
primaryModelClass,
{
[primaryModelClass.modelName]: typeOf(payload) === 'array' ? payload[0] : payload,
},
id,
requestType
);
},
normalizeUpdateRecordResponse: function(store, primaryModelClass, payload, id, requestType) {
return this.normalizeQueryResponse(...arguments);
},
normalizeDeleteRecordResponse: function(store, primaryModelClass, payload, id, requestType) {
return this.normalizeQueryResponse(
store,
primaryModelClass,
{ [this.get('primaryKey')]: id },
id,
requestType
);
},
normalizeCreateRecordResponse: function(store, primaryModelClass, payload, id, requestType) {
return this._super(
store,
primaryModelClass,
{
[primaryModelClass.modelName]: payload,
},
id,
requestType
);
normalizePayload: function(payload, id, requestType) {
switch (requestType) {
case 'deleteRecord':
return { [this.get('primaryKey')]: id };
case 'queryRecord':
return typeOf(payload) === 'array' ? payload[0] : payload;
}
return payload;
},
});
21 changes: 20 additions & 1 deletion app/serializers/application.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,22 @@
import Serializer from 'ember-data/serializers/rest';

export default Serializer.extend({});
export default Serializer.extend({
// this could get confusing if you tried to override
// say `normalizeQueryResponse`
// TODO: consider creating a method for each one of the `normalize...Response` family
normalizeResponse: function(store, primaryModelClass, payload, id, requestType) {
return this._super(
store,
primaryModelClass,
{
[primaryModelClass.modelName]: this.normalizePayload(payload, id, requestType),
},
id,
requestType
);
},
// TODO: decide on whether this is a 'hook' or an 'overridable method'
normalizePayload: function(payload, id, requestType) {
return payload;
},
});
18 changes: 7 additions & 11 deletions app/serializers/dc.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
import Serializer from './application';
export default Serializer.extend({
primaryKey: 'Name',
normalizeFindAllResponse: function(store, primaryModelClass, payload, id, requestType) {
return this._super(
store,
primaryModelClass,
{
[primaryModelClass.modelName]: payload.map(item => {
normalizePayload: function(payload, id, requestType) {
switch (requestType) {
case 'findAll':
return payload.map(item => {
return {
[this.get('primaryKey')]: item,
};
}),
},
id,
requestType
);
});
}
return payload;
},
});
49 changes: 9 additions & 40 deletions app/serializers/kv.js
Original file line number Diff line number Diff line change
@@ -1,48 +1,17 @@
import Serializer from './application';

export default Serializer.extend({
primaryKey: 'Key',
normalizeQueryResponse: function(store, primaryModelClass, payload, id, requestType) {
return this._super(
store,
primaryModelClass,
{
[primaryModelClass.modelName]: payload.map(function(item, i, arr) {
normalizePayload: function(payload, id, requestType) {
switch (requestType) {
case 'query':
return payload.map(item => {
return {
Key: item,
};
}),
},
id,
requestType
);
},
normalizeCreateRecordResponse: function(store, primaryModelClass, payload, id, requestType) {
return this._super(
store,
primaryModelClass,
{
[primaryModelClass.modelName]: payload,
},
id,
requestType
);
},
normalizeUpdateRecordResponse: function(store, primaryModelClass, payload, id, requestType) {
return this.normalizeCreateRecordResponse(...arguments);
},
normalizeDeleteRecordResponse: function(store, primaryModelClass, payload, id, requestType) {
return this.normalizeCreateRecordResponse(...arguments);
},
normalizeQueryRecordResponse: function(store, primaryModelClass, payload, id, requestType) {
return this._super(
store,
primaryModelClass,
{
[primaryModelClass.modelName]: payload[0],
},
id,
requestType
);
});
case 'queryRecord':
return payload[0];
}
return payload;
},
});
27 changes: 6 additions & 21 deletions app/serializers/session.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,11 @@ import Serializer from './application';

export default Serializer.extend({
primaryKey: 'ID',
normalizeQueryResponse: function(store, primaryModelClass, payload, id, requestType) {
return this._super(
store,
primaryModelClass,
{
[primaryModelClass.modelName]: payload,
},
id,
requestType
);
},
normalizeQueryRecordResponse: function(store, primaryModelClass, payload, id, requestType) {
return this._super(
store,
primaryModelClass,
{
[primaryModelClass.modelName]: payload[0],
},
id,
requestType
);
normalizePayload: function(payload, id, requestType) {
switch (requestType) {
case 'queryRecord':
return payload[0];
}
return payload;
},
});
16 changes: 15 additions & 1 deletion tests/unit/adapters/kv-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,21 @@ module('Unit | Adapter | kv', function(hooks) {

// Replace this with your real tests.
test('it exists', function(assert) {
let adapter = this.owner.lookup('adapter:kv');
const adapter = this.owner.lookup('adapter:kv');
assert.ok(adapter);
});
test('handleResponse returns a Kv-like object when the request is a createRecord', function(assert) {
const adapter = this.owner.lookup('adapter:kv');
// unflake, this is also going through _super and
// using urlForCreateRecord and makeAttrable so not the unit
const expected = 'key/name';
const actual = adapter.handleResponse(200, {}, true, {
method: 'GET',
url: `/v1/kv/${expected}`,
});
assert.deepEqual(actual, {
Key: expected,
Datacenter: '',
});
});
});

0 comments on commit cba08ab

Please sign in to comment.