Quantcast
Viewing all articles
Browse latest Browse all 4826

If Match Header in Ember app

@angula_wk wrote:

Hi guys,
I'm quite new in Ember and I occured the problem i can't handle. When I try to save my model, the following error occures:
PATCH http://localhost:3000/api/v2/profile/properties/5f0b4492-a54a-4976-a81b-44c5a6755959/travel-agent-profiles/968d81c9-6cdb-4083-a861-d80054684a39 412 (Precondition Failed). I know it's happening because I'm using 3 paths for backend, so my adapter looks like:

import ApplicationAdapter from "./application";
import Ember from "ember";

export default ApplicationAdapter.extend({
session: Ember.inject.service(),

urlForFindRecord(id) {
const host = this.get("host");
const namespace = this.get("namespace");
const propertyId = this.get("session.selectedProperty.id");
return ${host}/${namespace}/profile/properties/${propertyId}/travel-agent-profiles/${id};
},

urlForCreateRecord() {
const propertyId = this.get("session.selectedProperty.id");
const host = this.get("host");
const namespace = this.get("namespace");
return ${host}/${namespace}/profile/properties/${propertyId}/travel-agent-profiles;
},

urlForUpdateRecord(id) {
const propertyId = this.get("session.selectedProperty.id");
const host = this.get("host");
return ${host}/api/v2/profile/properties/${propertyId}/travel-agent-profiles/${id};
},

buildURL(modelName, id, snapshot, requestType, query) {
if(requestType === "POST") {
return this.urlForFindRecord(id).replace("v1", "v2");
} else {
return this._super(modelName, id, snapshot, requestType, query);
}
},

methodForRequest(params) {
let { requestType } = params;

switch (requestType) {
case "createRecord": return "POST";
case "updateRecord": return "PATCH";
case "deleteRecord": return "DELETE";
}

return "GET";

}
});

And my serializer:

import ApplicationSerializer from "./application";
import DS from "ember-data";

export default ApplicationSerializer.extend(DS.EmbeddedRecordsMixin, {
attrs: {
communicationDetails: { embedded: "always" }
},

normalizeFindRecordResponse: function(store, primaryModelClass, payload, id, requestType) {
const response = {
id: payload.id,
fullName: payload.details.fullName,
isInactive: payload.isInactive,
titleId: payload.details.titleId,
abbreviation: payload.details.abbreviation,
preferredLanguageCode: payload.details.preferedLanguageCode,
iataCode: payload.details.iata,
alternateFullName: payload.details.alternateFullName,
addresses: payload.addresses.collection,
communicationDetails: payload.communicationDetails.collection,
aggregateVersion: payload.profileVersion,
etag: payload["etag"]
};

return this._super(store, primaryModelClass, response, id, requestType);

},

serialize: function(snapshot) {
const attributes = snapshot.attributes();

return {
  profile: {
    fullName: attributes.fullName,
    abbreviation: attributes.abbreviation,
    alternateFullName: attributes.alternateFullName,
    iata: attributes.iataCode,
    preferedLanguageCode: attributes.preferredLanguageCode
  },
  aggregateVersion: attributes.aggregateVersion
};

}
});

And model:

import DS from "ember-data";
import ApplicationModel from "./application-model";
import HasCommunicationDetails from "./shared/has-communication-details";
import Ember from "ember";
import TravelAgentValidations from "above-cloud/validations/travel-agent-validations";
import { modelAction } from "ember-custom-actions";

export default ApplicationModel.extend(HasCommunicationDetails, TravelAgentValidations, {
fullName: DS.attr(),
abbreviation: DS.attr(),
isInactive: DS.attr(),
alternateFullName: DS.attr(),
iataCode: DS.attr(),
primaryContacts: DS.attr(),
addresses: DS.attr(),
preferredLanguageCode: DS.attr(),
aggregateVersion: DS.attr(),
etag: DS.attr(),

activate: modelAction("activate", {type: "POST"}),
deactivate: modelAction("deactivate", {type: "POST"}),

primaryAddress: function() {
const addresses = this.get("addresses");
return addresses.find(x => x.isPrimary);
}.property("addresses"),

formattedAddress: function() {
const address = this.get("primaryAddress");
return [
address.address,
address.city,
address.state,
address.postCode,
address.country
].filter(Ember.isPresent).join(", ");
}.property("primaryAddress")
});

The thing is that in backend it's required to pass if match header whan I save the model. But in backend in api/v1 GET /api/v{apiVersion}/profile/properties/{propertyId}/travel-agent-profiles/{profileId} sends profileVersion, in api/v2 GET /api/v{apiVersion}/profile/properties/{propertyId}/travel-agent-profiles/{profileId} etag and in PATCH
{
"profile": {
"fullName": "string",
"abbreviation": "string",
"iata": 0,
"preferedLanguageCode": "string",
"alternateFullName": "string"
}
}
does not send also etag as profileVersion. I know I have to pass if match header somehow. Any ideas what to do?
Thank you!!

Posts: 1

Participants: 1

Read full topic


Viewing all articles
Browse latest Browse all 4826

Trending Articles