ajax.js 2.4 KB

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