InsertAndFetchOperation.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. const InsertOperation = require('./InsertOperation');
  2. const DelegateOperation = require('./DelegateOperation');
  3. const { keyByProps } = require('../../model/modelUtils');
  4. const { asArray } = require('../../utils/objectUtils');
  5. const { after } = require('../../utils/promiseUtils');
  6. class InsertAndFetchOperation extends DelegateOperation {
  7. constructor(name, opt) {
  8. super(name, opt);
  9. if (!this.delegate.is(InsertOperation)) {
  10. throw new Error('Invalid delegate');
  11. }
  12. }
  13. onAfter2(builder, inserted) {
  14. const modelClass = builder.modelClass();
  15. const maybePromise = super.onAfter2(builder, inserted);
  16. return after(maybePromise, insertedModels => {
  17. const insertedModelArray = asArray(insertedModels);
  18. const idProps = modelClass.getIdPropertyArray();
  19. const idCols = builder.fullIdColumnFor(modelClass);
  20. const ids = insertedModelArray.map(model => model.$id());
  21. return modelClass
  22. .query()
  23. .childQueryOf(builder)
  24. .whereInComposite(idCols, ids)
  25. .castTo(builder.resultModelClass())
  26. .then(fetchedModels => {
  27. const modelsById = keyByProps(fetchedModels, idProps);
  28. // Instead of returning the freshly fetched models, update the input
  29. // models with the fresh values.
  30. insertedModelArray.forEach(insertedModel => {
  31. insertedModel.$set(modelsById.get(insertedModel.$propKey(idProps)));
  32. });
  33. return insertedModels;
  34. });
  35. });
  36. }
  37. }
  38. module.exports = InsertAndFetchOperation;