store.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /**
  2. * DevExtreme (data/odata/store.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var isDefined = require("../../core/utils/type").isDefined;
  11. var config = require("../../core/config");
  12. var odataUtils = require("./utils");
  13. var proxyUrlFormatter = require("../proxy_url_formatter");
  14. var errors = require("../errors").errors;
  15. var query = require("../query");
  16. var Store = require("../abstract_store");
  17. var mixins = require("./mixins");
  18. var deferredUtils = require("../../core/utils/deferred");
  19. var when = deferredUtils.when;
  20. var Deferred = deferredUtils.Deferred;
  21. require("./query_adapter");
  22. var ANONYMOUS_KEY_NAME = "5d46402c-7899-4ea9-bd81-8b73c47c7683";
  23. function expandKeyType(key, keyType) {
  24. var result = {};
  25. result[key] = keyType;
  26. return result
  27. }
  28. function mergeFieldTypesWithKeyType(fieldTypes, keyType) {
  29. var result = {};
  30. for (var field in fieldTypes) {
  31. result[field] = fieldTypes[field]
  32. }
  33. for (var keyName in keyType) {
  34. if (keyName in result) {
  35. if (result[keyName] !== keyType[keyName]) {
  36. errors.log("W4001", keyName)
  37. }
  38. } else {
  39. result[keyName] = keyType[keyName]
  40. }
  41. }
  42. return result
  43. }
  44. var ODataStore = Store.inherit({
  45. ctor: function(options) {
  46. this.callBase(options);
  47. this._extractServiceOptions(options);
  48. var key = this.key();
  49. var fieldTypes = options.fieldTypes;
  50. var keyType = options.keyType;
  51. if (keyType) {
  52. var keyTypeIsString = "string" === typeof keyType;
  53. if (!key) {
  54. key = keyTypeIsString ? ANONYMOUS_KEY_NAME : Object.keys(keyType);
  55. this._legacyAnonymousKey = key
  56. }
  57. if (keyTypeIsString) {
  58. keyType = expandKeyType(key, keyType)
  59. }
  60. fieldTypes = mergeFieldTypesWithKeyType(fieldTypes, keyType)
  61. }
  62. this._fieldTypes = fieldTypes || {};
  63. if (2 === this.version()) {
  64. this._updateMethod = "MERGE"
  65. } else {
  66. this._updateMethod = "PATCH"
  67. }
  68. },
  69. _customLoadOptions: function() {
  70. return ["expand", "customQueryParams"]
  71. },
  72. _byKeyImpl: function(key, extraOptions) {
  73. var params = {};
  74. if (extraOptions) {
  75. params.$expand = odataUtils.generateExpand(this._version, extraOptions.expand, extraOptions.select) || void 0;
  76. params.$select = odataUtils.generateSelect(this._version, extraOptions.select) || void 0
  77. }
  78. return this._sendRequest(this._byKeyUrl(key), "GET", params)
  79. },
  80. createQuery: function(loadOptions) {
  81. var url;
  82. loadOptions = loadOptions || {};
  83. var queryOptions = {
  84. adapter: "odata",
  85. beforeSend: this._beforeSend,
  86. errorHandler: this._errorHandler,
  87. jsonp: this._jsonp,
  88. version: this._version,
  89. withCredentials: this._withCredentials,
  90. expand: loadOptions.expand,
  91. requireTotalCount: loadOptions.requireTotalCount,
  92. deserializeDates: this._deserializeDates,
  93. fieldTypes: this._fieldTypes
  94. };
  95. if (isDefined(loadOptions.urlOverride)) {
  96. url = loadOptions.urlOverride
  97. } else {
  98. url = this._url
  99. }
  100. if (isDefined(this._filterToLower)) {
  101. queryOptions.filterToLower = this._filterToLower
  102. }
  103. if (loadOptions.customQueryParams) {
  104. var params = mixins.escapeServiceOperationParams(loadOptions.customQueryParams, this.version());
  105. if (4 === this.version()) {
  106. url = mixins.formatFunctionInvocationUrl(url, params)
  107. } else {
  108. queryOptions.params = params
  109. }
  110. }
  111. return query(url, queryOptions)
  112. },
  113. _insertImpl: function(values) {
  114. this._requireKey();
  115. var that = this;
  116. var d = new Deferred;
  117. when(this._sendRequest(this._url, "POST", null, values)).done(function(serverResponse) {
  118. d.resolve(config().useLegacyStoreResult ? values : serverResponse || values, that.keyOf(serverResponse))
  119. }).fail(d.reject);
  120. return d.promise()
  121. },
  122. _updateImpl: function(key, values) {
  123. var d = new Deferred;
  124. when(this._sendRequest(this._byKeyUrl(key), this._updateMethod, null, values)).done(function(serverResponse) {
  125. if (config().useLegacyStoreResult) {
  126. d.resolve(key, values)
  127. } else {
  128. d.resolve(serverResponse || values, key)
  129. }
  130. }).fail(d.reject);
  131. return d.promise()
  132. },
  133. _removeImpl: function(key) {
  134. var d = new Deferred;
  135. when(this._sendRequest(this._byKeyUrl(key), "DELETE")).done(function() {
  136. d.resolve(key)
  137. }).fail(d.reject);
  138. return d.promise()
  139. },
  140. _convertKey: function(value) {
  141. var result = value;
  142. var fieldTypes = this._fieldTypes;
  143. var key = this.key() || this._legacyAnonymousKey;
  144. if (Array.isArray(key)) {
  145. result = {};
  146. for (var i = 0; i < key.length; i++) {
  147. var keyName = key[i];
  148. result[keyName] = odataUtils.convertPrimitiveValue(fieldTypes[keyName], value[keyName])
  149. }
  150. } else {
  151. if (fieldTypes[key]) {
  152. result = odataUtils.convertPrimitiveValue(fieldTypes[key], value)
  153. }
  154. }
  155. return result
  156. },
  157. _byKeyUrl: function(value, useOriginalHost) {
  158. var baseUrl = useOriginalHost ? proxyUrlFormatter.formatLocalUrl(this._url) : this._url;
  159. var convertedKey = this._convertKey(value);
  160. return baseUrl + "(" + encodeURIComponent(odataUtils.serializeKey(convertedKey, this._version)) + ")"
  161. }
  162. }, "odata").include(mixins.SharedMethods);
  163. module.exports = ODataStore;
  164. module.exports.default = module.exports;