mirror of
https://github.com/status-im/consul.git
synced 2025-01-20 18:50:04 +00:00
03a1a86dfe
* v3.20.2...v3.24.0 * Fix handle undefined outlet in route component * Don't use template helper for optional modal.open Using the optional-helper here will trigger a computation in the same runloop error. This is because we are setting the `modal`-property when the `<Ref>` component gets rendered which will update the `this.modal`-property which will then recompute the `optional`-helper leading to this error. Instead we will create an action that will call the `open`-method on the modal when it is defined. This gets rid of the double computation error as we will not access the modal property twice in the same runloop when `modal` is getting set. * Fix - fn needs to be passed function tab-nav We create functions in the component file instead so that fn-helper stops complaining about the need to pass a function. * Update ember-exam to 6.1 version "Makes it compatible" with ember-qunit v5 * scheduleOnce setMaxHeight paged-collection We need to schedule to get around double-computation error. * Fix - model.data is removed from ember-data This has been private API all along - we need to work around the removal. Reference: https://github.com/emberjs/data/pull/7338/files#diff-9a8746fc5c86fd57e6122f00fef3155f76f0f3003a24b53fb7c4621d95dcd9bfL1310 * Fix `propContains` instead of `deepEqual` policy Recent model.data works differently than iterating attributes. We use `propContains` instead of `deepEqual`. We are only interested in the properties we assert against and match the previous behavior with this change. * Fix `propContains` instead of `deepEqual` token * Better handling single-records repo test-helper `model.data` has been removed we need to handle proxies and model instances differently. * Fix remaining repository tests with propContains We don't want to match entire objects - we don't care about properties we haven't defined in the assertion. * Don't use template helper for optional modal.open Using a template helper will give us a recomputation error - we work around it by creating an explicit action on the component instead. * Await `I $verb the $pageObject object` step * Fix no more customization ember-can No need to customize, the helper handles destruction fine on its own. * Fix - don't pass `optional` functions to fn We will declare the functions on the component instead. This gives us the same behavior but no error from `fn`, which expects a function to be passed. * Fix - handle `undefined` state on validate modifier StateChart can yield out an undefined `state` we need to handle that in the validate modifier * Fix linting errors tests directory * Warn / turn off new ember linting issues We will tackle them one by one and don't want to autofix issues that could be dangerous to auto-fix. * Auto-fix linting issues * More linting configuration * Fix remaining linting issues * Fix linting issues new files after rebase * ui: Remove ember-cli-uglify config now we are using terser (#14574) Co-authored-by: John Cowen <johncowen@users.noreply.github.com>
163 lines
4.7 KiB
JavaScript
163 lines
4.7 KiB
JavaScript
import { inject as service } from '@ember/service';
|
|
import Adapter from '@ember-data/adapter';
|
|
import AdapterError, {
|
|
AbortError,
|
|
TimeoutError,
|
|
ServerError,
|
|
UnauthorizedError,
|
|
ForbiddenError,
|
|
NotFoundError,
|
|
ConflictError,
|
|
InvalidError,
|
|
} from '@ember-data/adapter/error';
|
|
|
|
// TODO These are now exactly the same, apart from the fact that one uses
|
|
// `serialized, unserialized` and the other just `query`
|
|
// they could actually be one function now, but would be nice to think about
|
|
// the naming of things (serialized vs query etc)
|
|
const read = function (adapter, modelName, type, query = {}) {
|
|
return adapter.rpc(
|
|
function (adapter, ...rest) {
|
|
return adapter[`requestFor${type}`](...rest);
|
|
},
|
|
function (serializer, ...rest) {
|
|
return serializer[`respondFor${type}`](...rest);
|
|
},
|
|
query,
|
|
modelName
|
|
);
|
|
};
|
|
const write = function (adapter, modelName, type, snapshot) {
|
|
return adapter.rpc(
|
|
function (adapter, ...rest) {
|
|
return adapter[`requestFor${type}`](...rest);
|
|
},
|
|
function (serializer, ...rest) {
|
|
return serializer[`respondFor${type}`](...rest);
|
|
},
|
|
snapshot,
|
|
modelName
|
|
);
|
|
};
|
|
export default class HttpAdapter extends Adapter {
|
|
@service('client/http') client;
|
|
|
|
rpc(req, resp, obj, modelName) {
|
|
const client = this.client;
|
|
const store = this.store;
|
|
const adapter = this;
|
|
|
|
let unserialized, serialized;
|
|
const serializer = store.serializerFor(modelName);
|
|
const modelClass = store.modelFor(modelName);
|
|
// workable way to decide whether this is a snapshot
|
|
// essentially 'is attributable'.
|
|
// Snapshot is private so we can't do instanceof here
|
|
// and using obj.constructor.name gets changed/minified
|
|
// during compilation so you can't rely on it
|
|
// checking for `attributes` being a function is more
|
|
// reliable as that is the thing we need to call
|
|
if (typeof obj.attributes === 'function') {
|
|
unserialized = obj.attributes();
|
|
serialized = serializer.serialize(obj, {});
|
|
} else {
|
|
unserialized = obj;
|
|
serialized = unserialized;
|
|
}
|
|
|
|
return client
|
|
.request(function (request) {
|
|
return req(adapter, request, serialized, unserialized, modelClass);
|
|
})
|
|
.catch(function (e) {
|
|
return adapter.error(e);
|
|
})
|
|
.then(function (respond) {
|
|
// TODO: When HTTPAdapter:responder changes, this will also need to change
|
|
return resp(serializer, respond, serialized, unserialized, modelClass);
|
|
});
|
|
// TODO: Potentially add specific serializer errors here
|
|
// .catch(function(e) {
|
|
// return Promise.reject(e);
|
|
// });
|
|
}
|
|
|
|
error(err) {
|
|
if (err instanceof TypeError) {
|
|
throw err;
|
|
}
|
|
const errors = [
|
|
{
|
|
status: `${err.statusCode}`,
|
|
title: 'The backend responded with an error',
|
|
detail: err.message,
|
|
},
|
|
];
|
|
let error;
|
|
const detailedMessage = '';
|
|
try {
|
|
switch (err.statusCode) {
|
|
case 0:
|
|
error = new AbortError();
|
|
error.errors[0].status = '0';
|
|
break;
|
|
case 401:
|
|
error = new UnauthorizedError(errors, detailedMessage);
|
|
break;
|
|
case 403:
|
|
error = new ForbiddenError(errors, detailedMessage);
|
|
break;
|
|
case 404:
|
|
error = new NotFoundError(errors, detailedMessage);
|
|
break;
|
|
case 408:
|
|
error = new TimeoutError();
|
|
break;
|
|
case 409:
|
|
error = new ConflictError(errors, detailedMessage);
|
|
break;
|
|
case 422:
|
|
error = new InvalidError(errors); //payload.errors
|
|
break;
|
|
default:
|
|
if (err.statusCode >= 500) {
|
|
error = new ServerError(errors, detailedMessage);
|
|
} else {
|
|
error = new AdapterError(errors, detailedMessage);
|
|
}
|
|
}
|
|
} catch (e) {
|
|
error = e;
|
|
}
|
|
// TODO: This comes originates from ember-data
|
|
// This can be confusing if you need to use this with Promise.reject
|
|
// Consider changing this to return the error and then
|
|
// throw from the call site instead
|
|
throw error;
|
|
}
|
|
|
|
query(store, type, query) {
|
|
return read(this, type.modelName, 'Query', query);
|
|
}
|
|
|
|
queryRecord(store, type, query) {
|
|
return read(this, type.modelName, 'QueryRecord', query);
|
|
}
|
|
|
|
findAll(store, type) {
|
|
return read(this, type.modelName, 'FindAll');
|
|
}
|
|
|
|
createRecord(store, type, snapshot) {
|
|
return write(this, type.modelName, 'CreateRecord', snapshot);
|
|
}
|
|
|
|
updateRecord(store, type, snapshot) {
|
|
return write(this, type.modelName, 'UpdateRecord', snapshot);
|
|
}
|
|
|
|
deleteRecord(store, type, snapshot) {
|
|
return write(this, type.modelName, 'DeleteRecord', snapshot);
|
|
}
|
|
}
|