@aws-amplify/datastore
Version:
AppSyncLocal support for aws-amplify
47 lines (45 loc) • 1.75 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ModelMerger = void 0;
const types_1 = require("../types");
const utils_1 = require("./utils");
// https://github.com/aws-amplify/amplify-js/blob/datastore-docs/packages/datastore/docs/sync-engine.md#merger
class ModelMerger {
constructor(outbox, ownSymbol) {
this.outbox = outbox;
this.ownSymbol = ownSymbol;
}
/**
*
* @param storage Storage adapter that contains the data.
* @param model The model from an outbox mutation.
* @returns The type of operation (INSERT/UPDATE/DELETE)
*/
async merge(storage, model, modelDefinition) {
let result;
const mutationsForModel = await this.outbox.getForModel(storage, model, modelDefinition);
const isDelete = model._deleted;
if (mutationsForModel.length === 0) {
if (isDelete) {
result = types_1.OpType.DELETE;
await storage.delete(model, undefined, this.ownSymbol);
}
else {
[[, result]] = await storage.save(model, undefined, this.ownSymbol);
}
}
return result;
}
async mergePage(storage, modelConstructor, items, modelDefinition) {
const itemsMap = new Map();
for (const item of items) {
// merge items by model id. Latest record for a given id remains.
const modelId = (0, utils_1.getIdentifierValue)(modelDefinition, item);
itemsMap.set(modelId, item);
}
const page = [...itemsMap.values()];
return storage.batchSave(modelConstructor, page, this.ownSymbol);
}
}
exports.ModelMerger = ModelMerger;
//# sourceMappingURL=merger.js.map