mock-api.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. (function(window) {
  2. var Api = function(dataset) {
  3. var _db = [];
  4. Object.defineProperties(this, {
  5. db: {
  6. get: function() {
  7. return _db.slice();
  8. },
  9. set: function(value) {
  10. if (!Array.isArray(value)) {
  11. throw new TypeError('[mock-api] Dataset must be an array');
  12. }
  13. if (!value.length) {
  14. throw new TypeError('[mock-api] Dataset must contain one or more elements');
  15. }
  16. _db = value;
  17. }
  18. }
  19. });
  20. this.init(dataset);
  21. };
  22. Api.prototype = {
  23. constructor: Api,
  24. init: function(dataset) {
  25. this.db = dataset;
  26. },
  27. get: function(query) {
  28. var self = this;
  29. return Promise.resolve()
  30. .then(function() {
  31. var output;
  32. query = Object.assign(new Api.Query(), query);
  33. Object.freeze(query);
  34. output = self.filter(self.db, query);
  35. output = self.sort(output, query);
  36. return output;
  37. });
  38. },
  39. filter: function(input, query) {
  40. return input.filter(function(item) {
  41. var key;
  42. var value;
  43. for (key in query) {
  44. if (key.match(/^\$/g)) continue;
  45. value = query[key];
  46. if (value === 'all') return true;
  47. if (item[key] !== value) return false;
  48. }
  49. return true;
  50. });
  51. },
  52. sort: function(input, query) {
  53. return input.sort(function(a, b) {
  54. var valueA = a[query.$sort_by];
  55. var valueB = b[query.$sort_by];
  56. if (valueA > valueB) {
  57. return query.$order === 'asc' ? 1 : -1;
  58. } else if (valueA < valueB) {
  59. return query.$order === 'asc' ? -1 : 1;
  60. } else {
  61. return 0;
  62. }
  63. });
  64. }
  65. };
  66. Api.Query = function() {
  67. this.$sort_by = 'id';
  68. this.$order = 'asc';
  69. };
  70. window.Api = Api;
  71. })(window);