rpc.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import Ember from 'ember';
  2. export default Ember.Object.extend({
  3. ajax: function(recordOrProcedure, dataOrProcedure, data) {
  4. // receive args
  5. var record = null;
  6. var procedure = null;
  7. if (arguments.length === 3) {
  8. record = recordOrProcedure;
  9. procedure = dataOrProcedure;
  10. } else {
  11. procedure = recordOrProcedure;
  12. data = dataOrProcedure;
  13. }
  14. // get adapter to be used for RPC
  15. // note: in case of Model being null this cheats adapterFor to return
  16. // 'adapter:application'. we are doing this, because for some reason
  17. // store.defaultAdapter fails to return django adapter
  18. var adapter = this.get('store').adapterFor(record || {typeKey: 'application'});
  19. // build api call URL
  20. var url = null;
  21. if (record) {
  22. url = this.buildRecordProcedureURL(adapter, record, procedure);
  23. } else {
  24. url = this.buildProcedureURL(adapter, procedure);
  25. }
  26. // return RPC promise
  27. return adapter.rpcAjax(url, data || null);
  28. },
  29. buildRecordProcedureURL: function(adapter, record, procedure) {
  30. var url = adapter.buildURL(record.typeKey, record.id, record);
  31. return url + '/' + Ember.String.camelize(procedure);
  32. },
  33. buildProcedureURL: function(adapter, procedure) {
  34. var url = adapter.buildURL(procedure);
  35. return this.unpluralizeUrlProcedure(url, procedure);
  36. },
  37. unpluralizeUrlProcedure: function(url, procedure) {
  38. // decamelize name and reverse path pluralization for type for procedure
  39. var decamelized = Ember.String.decamelize(procedure);
  40. var pluralized = Ember.String.pluralize(decamelized);
  41. return url.replace(pluralized, decamelized);
  42. }
  43. });