mirror of
https://github.com/nasa/openmct.git
synced 2025-06-18 23:28:14 +00:00
[Persistence] Add refresh
Continue adding behavior for persistence failures; add a refresh method to the persistence capability to support this. WTD-1033.
This commit is contained in:
@ -22,6 +22,13 @@ define(
|
|||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function PersistenceCapability(persistenceService, SPACE, domainObject) {
|
function PersistenceCapability(persistenceService, SPACE, domainObject) {
|
||||||
|
// Update a domain object's model upon refresh
|
||||||
|
function updateModel(model) {
|
||||||
|
return domainObject.useCapability("mutation", function () {
|
||||||
|
return model;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
/**
|
/**
|
||||||
* Persist any changes which have been made to this
|
* Persist any changes which have been made to this
|
||||||
@ -37,6 +44,19 @@ define(
|
|||||||
domainObject.getModel()
|
domainObject.getModel()
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* Update this domain object to match the latest from
|
||||||
|
* persistence.
|
||||||
|
* @returns {Promise} a promise which will be resolved
|
||||||
|
* when the update is complete
|
||||||
|
*/
|
||||||
|
refresh: function () {
|
||||||
|
return persistenceService.readObject(
|
||||||
|
SPACE,
|
||||||
|
domainObject.getId(),
|
||||||
|
{ cache: false } // Disallow cached reads
|
||||||
|
).then(updateModel);
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
* Get the space in which this domain object is persisted;
|
* Get the space in which this domain object is persisted;
|
||||||
* this is useful when, for example, decided which space a
|
* this is useful when, for example, decided which space a
|
||||||
|
@ -126,12 +126,14 @@ define(
|
|||||||
* @memberof CachingPersistenceDecorator#
|
* @memberof CachingPersistenceDecorator#
|
||||||
* @param {string} space the space in which to create the object
|
* @param {string} space the space in which to create the object
|
||||||
* @param {string} key the key which identifies the object
|
* @param {string} key the key which identifies the object
|
||||||
|
* @param {*} options optional parameters
|
||||||
* @returns {Promise.<object>} a promise for the object; may
|
* @returns {Promise.<object>} a promise for the object; may
|
||||||
* resolve to undefined (if the object does not exist
|
* resolve to undefined (if the object does not exist
|
||||||
* in this space)
|
* in this space)
|
||||||
*/
|
*/
|
||||||
readObject: function (space, key) {
|
readObject: function (space, key, options) {
|
||||||
return (cache[space] && cache[space][key]) ?
|
var force = (options || {}).cache === false;
|
||||||
|
return (cache[space] && cache[space][key] && !force) ?
|
||||||
fastPromise(cache[space][key].value) :
|
fastPromise(cache[space][key].value) :
|
||||||
persistenceService.readObject(space, key)
|
persistenceService.readObject(space, key)
|
||||||
.then(putCache(space, key));
|
.then(putCache(space, key));
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
/*global define*/
|
||||||
|
|
||||||
|
define({
|
||||||
|
REVISION_ERROR_KEY: "revision",
|
||||||
|
OVERWRITE_KEY: "overwrite"
|
||||||
|
});
|
@ -0,0 +1,54 @@
|
|||||||
|
/*global define*/
|
||||||
|
|
||||||
|
define(
|
||||||
|
['./PersistenceFailureConstants'],
|
||||||
|
function (PersistenceFailureConstants) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var OVERWRITE_CANCEL_OPTIONS = [
|
||||||
|
{
|
||||||
|
name: "Overwrite",
|
||||||
|
key: PersistenceFailureConstants.OVERWRITE_KEY
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Cancel",
|
||||||
|
key: "cancel"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
OK_OPTIONS = [ { name: "OK", key: "ok" } ];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Populates a `dialogModel` to pass to `dialogService.getUserChoise`
|
||||||
|
* in order to choose between Overwrite and Cancel.
|
||||||
|
*/
|
||||||
|
function PersistenceFailureDialog(failures) {
|
||||||
|
var revisionErrors = [],
|
||||||
|
otherErrors = [];
|
||||||
|
|
||||||
|
// Place this failure into an appropriate group
|
||||||
|
function categorizeFailure(failure) {
|
||||||
|
// Check if the error is due to object revision
|
||||||
|
var isRevisionError = ((failure || {}).error || {}).key ===
|
||||||
|
PersistenceFailureConstants.REVISION_ERROR_KEY;
|
||||||
|
// Push the failure into the appropriate group
|
||||||
|
(isRevisionError ? revisionErrors : otherErrors).push(failure);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Separate into revision errors, and other errors
|
||||||
|
failures.forEach(categorizeFailure);
|
||||||
|
|
||||||
|
return {
|
||||||
|
title: "Save Error",
|
||||||
|
template: "persistence-failure-dialog",
|
||||||
|
model: {
|
||||||
|
revised: revisionErrors,
|
||||||
|
unrecoverable: otherErrors
|
||||||
|
},
|
||||||
|
options: revisionErrors.length > 0 ?
|
||||||
|
OVERWRITE_CANCEL_OPTIONS : OK_OPTIONS
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return PersistenceFailureDialog;
|
||||||
|
}
|
||||||
|
);
|
@ -1,15 +1,35 @@
|
|||||||
/*global define*/
|
/*global define*/
|
||||||
|
|
||||||
define(
|
define(
|
||||||
[],
|
['./PersistenceFailureDialog', './PersistenceFailureConstants'],
|
||||||
function () {
|
function (PersistenceFailureDialog, PersistenceFailureConstants) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function PersistenceFailureHandler(dialogService) {
|
function PersistenceFailureHandler($q, dialogService, persistenceService) {
|
||||||
return {
|
function refresh(failure) {
|
||||||
handle: function (failures) {
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function retry(failures) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleFailures(failures) {
|
||||||
|
var dialogModel = new PersistenceFailureDialog(failures),
|
||||||
|
revisionErrors = dialogModel.model.revised;
|
||||||
|
|
||||||
|
function handleChoice(key) {
|
||||||
|
if (key === PersistenceFailureConstants.OVERWRITE_KEY) {
|
||||||
|
return retry(revisionErrors);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return dialogService.getUserChoice(dialogModel)
|
||||||
|
.then(handleChoice);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
handle: handleFailures
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user