modelParseRelations.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. const { isObject } = require('../utils/objectUtils');
  2. function parseRelationsIntoModelInstances(model, json, options = {}) {
  3. const relations = model.constructor.getRelationArray();
  4. if (!options.cache) {
  5. options = Object.assign({}, options, {
  6. cache: new Map()
  7. });
  8. }
  9. options.cache.set(json, model);
  10. for (let i = 0, l = relations.length; i < l; ++i) {
  11. const relation = relations[i];
  12. const relationJson = json[relation.name];
  13. if (relationJson !== undefined) {
  14. const relationModel = parseRelation(relationJson, relation, options);
  15. if (relationModel !== relationJson) {
  16. model[relation.name] = relationModel;
  17. }
  18. }
  19. }
  20. return model;
  21. }
  22. function parseRelation(json, relation, options) {
  23. if (Array.isArray(json)) {
  24. return parseRelationArray(json, relation, options);
  25. } else if (json) {
  26. return parseRelationObject(json, relation, options);
  27. } else {
  28. return null;
  29. }
  30. }
  31. function parseRelationArray(json, relation, options) {
  32. let models = new Array(json.length);
  33. let didChange = false;
  34. for (let i = 0, l = json.length; i < l; ++i) {
  35. const model = parseRelationObject(json[i], relation, options);
  36. if (model !== json[i]) {
  37. didChange = true;
  38. }
  39. models[i] = model;
  40. }
  41. if (didChange) {
  42. return models;
  43. } else {
  44. return json;
  45. }
  46. }
  47. function parseRelationObject(json, relation, options) {
  48. if (isObject(json)) {
  49. let modelClass = relation.relatedModelClass;
  50. let model = options.cache.get(json);
  51. if (model === undefined) {
  52. if (json instanceof modelClass) {
  53. model = parseRelationsIntoModelInstances(json, json, options);
  54. } else {
  55. model = modelClass.fromJson(json, options);
  56. }
  57. }
  58. return model;
  59. } else {
  60. return json;
  61. }
  62. }
  63. module.exports = {
  64. parseRelationsIntoModelInstances
  65. };