rpc.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import Ember from 'ember';
  2. import getCsrfToken from 'misago/utils/csrf';
  3. import {startsWith, endsWith} from 'misago/utils/strings';
  4. import ENV from '../config/environment';
  5. export function buildUrl(procedure, config) {
  6. if (typeof config === 'undefined') {
  7. config = ENV.APP;
  8. }
  9. var finalUrl = config.API_HOST;
  10. if (!startsWith(procedure, '/' + config.API_NAMESPACE + '/')) {
  11. finalUrl += '/' + config.API_NAMESPACE + '/';
  12. }
  13. finalUrl += procedure;
  14. if (config.API_ADD_TRAILING_SLASHES && !endsWith(finalUrl, '/')) {
  15. finalUrl += '/';
  16. }
  17. return finalUrl;
  18. }
  19. export function ajax(url, data) {
  20. return new Ember.RSVP.Promise(function(resolve, reject){
  21. function success(json) {
  22. Ember.run(null, resolve, json);
  23. }
  24. function error(jqXHR) {
  25. if (jqXHR.status === 200) {
  26. if (typeof jqXHR.responseJSON === 'undefined') {
  27. Ember.run(null, resolve, {});
  28. } else {
  29. Ember.run(null, resolve, jqXHR.responseJSON);
  30. }
  31. } else {
  32. Ember.run(null, reject, jqXHR.responseJSON);
  33. }
  34. }
  35. Ember.$.ajax(url, {
  36. type: 'POST',
  37. accepts: 'application/json',
  38. contentType: 'application/json;charset=UTF-8',
  39. data: JSON.stringify(data || {}),
  40. dataType: 'json',
  41. headers: {
  42. 'X-CSRFToken': getCsrfToken()
  43. },
  44. error: error,
  45. success: success
  46. });
  47. }, 'RPC: ' + url);
  48. }
  49. export default function(procedure, data, config) {
  50. return ajax(buildUrl(procedure, config), data);
  51. }