Skip to content
This repository has been archived by the owner on Jan 30, 2023. It is now read-only.

Commit

Permalink
Merge c0beb8a into 3ebfef0
Browse files Browse the repository at this point in the history
  • Loading branch information
jherdman committed Oct 25, 2016
2 parents 3ebfef0 + c0beb8a commit 5da8e92
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 38 deletions.
40 changes: 18 additions & 22 deletions addon/errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,13 @@ const { Error: EmberError } = Ember;

/**
* @class AjaxError
* @private
* @public
* @extends Ember.Error
*/
export function AjaxError(errors, message = 'Ajax operation failed') {
export function AjaxError(payload, message = 'Ajax operation failed') {
EmberError.call(this, message);

this.errors = errors || [
{
title: 'Ajax Error',
detail: message
}
];
this.payload = payload;
}

AjaxError.prototype = Object.create(EmberError.prototype);
Expand All @@ -24,8 +20,8 @@ AjaxError.prototype = Object.create(EmberError.prototype);
* @public
* @extends AjaxError
*/
export function InvalidError(errors) {
AjaxError.call(this, errors, 'Request was rejected because it was invalid');
export function InvalidError(payload) {
AjaxError.call(this, payload, 'Request was rejected because it was invalid');
}

InvalidError.prototype = Object.create(AjaxError.prototype);
Expand All @@ -35,8 +31,8 @@ InvalidError.prototype = Object.create(AjaxError.prototype);
* @public
* @extends AjaxError
*/
export function UnauthorizedError(errors) {
AjaxError.call(this, errors, 'Ajax authorization failed');
export function UnauthorizedError(payload) {
AjaxError.call(this, payload, 'Ajax authorization failed');
}

UnauthorizedError.prototype = Object.create(AjaxError.prototype);
Expand All @@ -46,8 +42,8 @@ UnauthorizedError.prototype = Object.create(AjaxError.prototype);
* @public
* @extends AjaxError
*/
export function ForbiddenError(errors) {
AjaxError.call(this, errors,
export function ForbiddenError(payload) {
AjaxError.call(this, payload,
'Request was rejected because user is not permitted to perform this operation.');
}

Expand All @@ -58,8 +54,8 @@ ForbiddenError.prototype = Object.create(AjaxError.prototype);
* @public
* @extends AjaxError
*/
export function BadRequestError(errors) {
AjaxError.call(this, errors, 'Request was formatted incorrectly.');
export function BadRequestError(payload) {
AjaxError.call(this, payload, 'Request was formatted incorrectly.');
}

BadRequestError.prototype = Object.create(AjaxError.prototype);
Expand All @@ -69,8 +65,8 @@ BadRequestError.prototype = Object.create(AjaxError.prototype);
* @public
* @extends AjaxError
*/
export function NotFoundError(errors) {
AjaxError.call(this, errors, 'Resource was not found.');
export function NotFoundError(payload) {
AjaxError.call(this, payload, 'Resource was not found.');
}

NotFoundError.prototype = Object.create(AjaxError.prototype);
Expand Down Expand Up @@ -102,8 +98,8 @@ AbortError.prototype = Object.create(AjaxError.prototype);
* @public
* @extends AjaxError
*/
export function ConflictError(errors) {
AjaxError.call(this, errors, 'The ajax operation failed due to a conflict');
export function ConflictError(payload) {
AjaxError.call(this, payload, 'The ajax operation failed due to a conflict');
}

ConflictError.prototype = Object.create(AjaxError.prototype);
Expand All @@ -113,8 +109,8 @@ ConflictError.prototype = Object.create(AjaxError.prototype);
* @public
* @extends AjaxError
*/
export function ServerError(errors) {
AjaxError.call(this, errors, 'Request was rejected due to server error');
export function ServerError(payload) {
AjaxError.call(this, payload, 'Request was rejected due to server error');
}

ServerError.prototype = Object.create(AjaxError.prototype);
Expand Down
68 changes: 52 additions & 16 deletions addon/mixins/ajax-request.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ const {
Mixin,
RSVP: { Promise },
Test,
deprecate,
get,
isArray,
isEmpty,
Expand All @@ -45,6 +46,29 @@ const {
} = Ember;
const JSONAPIContentType = 'application/vnd.api+json';

function defineDeprecatedErrorsProperty(error, errors) {
Object.defineProperty(error, 'errors', {
get() {
deprecate(
'This property will be removed in ember-ajax 3.0.0. Please use `payload` going forward. Note the attached URL for details.',
false,
{
url: 'https://github.com/ember-cli/ember-ajax/issues/175',
until: '3.0.0',
id: 'ember-ajax.errors.normalize-errors'
}
);

let defaultError = {
title: 'Ajax Error',
detail: this.message
};

return errors || [defaultError];
}
});
}

function isJSONAPIContentType(header) {
if (isNone(header)) {
return false;
Expand Down Expand Up @@ -276,8 +300,12 @@ export default Mixin.create({
response = errorThrown;
} else if (textStatus === 'timeout') {
response = new TimeoutError();

defineDeprecatedErrorsProperty(response);
} else if (textStatus === 'abort') {
response = new AbortError();

defineDeprecatedErrorsProperty(response);
} else {
response = this.handleResponse(
jqXHR.status,
Expand Down Expand Up @@ -512,35 +540,43 @@ export default Mixin.create({
*/
handleResponse(status, headers, payload, requestData) {
payload = (payload === null || payload === undefined) ? {} : payload;
const errors = this.normalizeErrorResponse(status, headers, payload);

let error;

if (this.isSuccess(status, headers, payload)) {
return payload;
} else if (this.isUnauthorizedError(status, headers, payload)) {
return new UnauthorizedError(errors);
error = new UnauthorizedError(payload);
} else if (this.isForbiddenError(status, headers, payload)) {
return new ForbiddenError(errors);
error = new ForbiddenError(payload);
} else if (this.isInvalidError(status, headers, payload)) {
return new InvalidError(errors);
error = new InvalidError(payload);
} else if (this.isBadRequestError(status, headers, payload)) {
return new BadRequestError(errors);
error = new BadRequestError(payload);
} else if (this.isNotFoundError(status, headers, payload)) {
return new NotFoundError(errors);
error = new NotFoundError(payload);
} else if (this.isAbortError(status, headers, payload)) {
return new AbortError(errors);
error = new AbortError(payload);
} else if (this.isConflictError(status, headers, payload)) {
return new ConflictError(errors);
error = new ConflictError(payload);
} else if (this.isServerError(status, headers, payload)) {
return new ServerError(errors);
error = new ServerError(payload);
} else {
let detailedMessage = this.generateDetailedMessage(
status,
headers,
payload,
requestData
);

error = new AjaxError(payload, detailedMessage);
}

const detailedMessage = this.generateDetailedMessage(
status,
headers,
payload,
requestData
);
return new AjaxError(errors, detailedMessage);
let errors = this.normalizeErrorResponse(status, headers, payload);

defineDeprecatedErrorsProperty(error, errors);

return error;
},

/**
Expand Down
26 changes: 26 additions & 0 deletions tests/unit/mixins/ajax-request-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -881,6 +881,32 @@ describe('Unit | Mixin | ajax request', function() {
});
});

describe('[ISSUE 175] error property deprecation', function() {
beforeEach(function() {
// eslint-disable-next-line
Ember.ENV.RAISE_ON_DEPRECATION = true;
});

afterEach(function() {
// eslint-disable-next-line
Ember.ENV.RAISE_ON_DEPRECATION = false;
});

it('notifies', function() {
this.server.get('/posts', jsonFactory(404, { errors: [{ id: 1, message: 'error description' }] }));
const service = new AjaxRequest();
return service.request('/posts')
.then(function() {
throw new Error('success handler should not be called');
})
.catch(function(reason) {
expect(function() {
reason.errors;
}).to.throws('This property will be removed in ember-ajax 3.0.0. Please use `payload` going forward. Note the attached URL for details.');
});
});
});

describe('error handlers', function() {
it('handles a TimeoutError correctly', function() {
this.server.get('/posts', jsonFactory(200), 2);
Expand Down

0 comments on commit 5da8e92

Please sign in to comment.