rpc.js 1.8 KB

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