118 lines
3.5 KiB
JavaScript
118 lines
3.5 KiB
JavaScript
import Adapter from 'ember-data/adapter';
|
|
import {
|
|
AbortError,
|
|
TimeoutError,
|
|
ServerError,
|
|
UnauthorizedError,
|
|
ForbiddenError,
|
|
NotFoundError,
|
|
ConflictError,
|
|
InvalidError,
|
|
AdapterError,
|
|
} from 'ember-data/adapters/errors';
|
|
|
|
// TODO: This is a little skeleton cb function
|
|
// is to be replaced soon with something slightly more involved
|
|
const responder = function(response) {
|
|
return response;
|
|
};
|
|
const read = function(adapter, serializer, client, type, query) {
|
|
return client
|
|
.request(function(request) {
|
|
return adapter[`requestFor${type}`](request, query);
|
|
})
|
|
.catch(function(e) {
|
|
return adapter.error(e);
|
|
})
|
|
.then(function(response) {
|
|
return serializer[`respondFor${type}`](responder(response), query);
|
|
});
|
|
// TODO: Potentially add specific serializer errors here
|
|
// .catch(function(e) {
|
|
// return Promise.reject(e);
|
|
// });
|
|
};
|
|
const write = function(adapter, serializer, client, type, snapshot) {
|
|
const unserialized = snapshot.attributes();
|
|
const serialized = serializer.serialize(snapshot, {});
|
|
return client
|
|
.request(function(request) {
|
|
return adapter[`requestFor${type}`](request, serialized, unserialized);
|
|
})
|
|
.catch(function(e) {
|
|
return adapter.error(e);
|
|
})
|
|
.then(function(response) {
|
|
return serializer[`respondFor${type}`](responder(response), serialized, unserialized);
|
|
});
|
|
// TODO: Potentially add specific serializer errors here
|
|
// .catch(function(e) {
|
|
// return Promise.reject(e);
|
|
// });
|
|
};
|
|
export default Adapter.extend({
|
|
error: function(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();
|
|
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;
|
|
}
|
|
throw error;
|
|
},
|
|
query: function(store, type, query) {
|
|
return read(this, store.serializerFor(type.modelName), this.client, 'Query', query);
|
|
},
|
|
queryRecord: function(store, type, query) {
|
|
return read(this, store.serializerFor(type.modelName), this.client, 'QueryRecord', query);
|
|
},
|
|
findAll: function(store, type) {
|
|
return read(this, store.serializerFor(type.modelName), this.client, 'FindAll');
|
|
},
|
|
createRecord: function(store, type, snapshot) {
|
|
return write(this, store.serializerFor(type.modelName), this.client, 'CreateRecord', snapshot);
|
|
},
|
|
updateRecord: function(store, type, snapshot) {
|
|
return write(this, store.serializerFor(type.modelName), this.client, 'UpdateRecord', snapshot);
|
|
},
|
|
deleteRecord: function(store, type, snapshot) {
|
|
return write(this, store.serializerFor(type.modelName), this.client, 'DeleteRecord', snapshot);
|
|
},
|
|
});
|