0a47a95588
* ui: Add data-source component and related services (#6486) * ui: Add data-source component and related services: 1. DataSource component 2. Repository manager for retrieving repositories based on URIs 3. Blocking data service for injection to the data-source component to support blocking query types of data sources 4. 'Once' promise based data service for injection for potential fallback to old style promise based data (would need to be injected via an initial runtime variable) 5. Several utility functions taken from elsewhere - maybeCall - a replication of code from elsewhere for condition calling a function based on the result of a promise - restartWhenAvailable - used for restarting blocking queries when a tab is brought to the front - ifNotBlocking - to check if blocking is NOT enabled * Move to a different organization based on protocols * Don't call open twice when eager * Workaround new ember error for reading and writing at the same time * Add first draft of a README.mdx file
76 lines
2.4 KiB
JavaScript
76 lines
2.4 KiB
JavaScript
import Service, { inject as service } from '@ember/service';
|
|
import { assert } from '@ember/debug';
|
|
import { typeOf } from '@ember/utils';
|
|
export default Service.extend({
|
|
getModelName: function() {
|
|
assert('RepositoryService.getModelName should be overridden', false);
|
|
},
|
|
getPrimaryKey: function() {
|
|
assert('RepositoryService.getPrimaryKey should be overridden', false);
|
|
},
|
|
getSlugKey: function() {
|
|
assert('RepositoryService.getSlugKey should be overridden', false);
|
|
},
|
|
//
|
|
store: service('store'),
|
|
reconcile: function(meta = {}) {
|
|
// unload anything older than our current sync date/time
|
|
// FIXME: This needs fixing once again to take nspaces into account
|
|
if (typeof meta.date !== 'undefined') {
|
|
this.store.peekAll(this.getModelName()).forEach(item => {
|
|
const date = item.SyncTime;
|
|
if (typeof date !== 'undefined' && date != meta.date) {
|
|
this.store.unloadRecord(item);
|
|
}
|
|
});
|
|
}
|
|
},
|
|
findAllByDatacenter: function(dc, nspace, configuration = {}) {
|
|
const query = {
|
|
dc: dc,
|
|
ns: nspace,
|
|
};
|
|
if (typeof configuration.cursor !== 'undefined') {
|
|
query.index = configuration.cursor;
|
|
}
|
|
return this.store.query(this.getModelName(), query);
|
|
},
|
|
findBySlug: function(slug, dc, nspace, configuration = {}) {
|
|
const query = {
|
|
dc: dc,
|
|
ns: nspace,
|
|
id: slug,
|
|
};
|
|
if (typeof configuration.cursor !== 'undefined') {
|
|
query.index = configuration.cursor;
|
|
}
|
|
return this.store.queryRecord(this.getModelName(), query);
|
|
},
|
|
create: function(obj) {
|
|
// TODO: This should probably return a Promise
|
|
return this.store.createRecord(this.getModelName(), obj);
|
|
},
|
|
persist: function(item) {
|
|
return item.save();
|
|
},
|
|
remove: function(obj) {
|
|
let item = obj;
|
|
if (typeof obj.destroyRecord === 'undefined') {
|
|
item = obj.get('data');
|
|
}
|
|
// TODO: Change this to use vanilla JS
|
|
// I think this was originally looking for a plain object
|
|
// as opposed to an ember one
|
|
if (typeOf(item) === 'object') {
|
|
item = this.store.peekRecord(this.getModelName(), item[this.getPrimaryKey()]);
|
|
}
|
|
return item.destroyRecord().then(item => {
|
|
return this.store.unloadRecord(item);
|
|
});
|
|
},
|
|
invalidate: function() {
|
|
// TODO: This should probably return a Promise
|
|
this.store.unloadAll(this.getModelName());
|
|
},
|
|
});
|