blob: 84535f0c207281c76d62f305824a11f6cd4d3046 [file] [log] [blame]
'use strict';
class DataModelObject {
_id;
constructor(id)
{
this._id = id;
this.ensureNamedStaticMap('id')[id] = this;
}
id() { return this._id; }
static ensureSingleton(id, object)
{
const singleton = this.findById(id);
if (singleton) {
singleton.updateSingleton(object)
return singleton;
}
return new (this)(id, object);
}
updateSingleton(object) { }
static clearStaticMap() { this[DataModelObject.StaticMapSymbol] = null; }
static namedStaticMap(name)
{
const staticMap = this[DataModelObject.StaticMapSymbol];
return staticMap ? staticMap.get(name) : null;
}
static ensureNamedStaticMap(name)
{
if (!this[DataModelObject.StaticMapSymbol])
this[DataModelObject.StaticMapSymbol] = new Map;
const staticMap = this[DataModelObject.StaticMapSymbol];
let namedMap = staticMap.get(name);
if (!namedMap) {
namedMap = { }; // Use a regular object to implicitly convert each key to a string.
staticMap.set(name, namedMap);
}
return namedMap;
}
namedStaticMap(name) { return this.__proto__.constructor.namedStaticMap(name); }
ensureNamedStaticMap(name) { return this.__proto__.constructor.ensureNamedStaticMap(name); }
static findById(id)
{
const idMap = this.namedStaticMap('id');
return idMap ? idMap[id] : null;
}
static listForStaticMap(name)
{
const list = [];
const idMap = this.namedStaticMap(name);
if (idMap) {
for (const id in idMap)
list.push(idMap[id]);
}
return list;
}
static all() { return this.listForStaticMap('id'); }
static async cachedFetch(path, params = { }, noCache = false)
{
const query = [];
if (params) {
for (let key in params)
query.push(key + '=' + escape(params[key]));
}
if (query.length)
path += '?' + query.join('&');
if (noCache)
return RemoteAPI.getJSONWithStatus(path);
const cacheMap = this.ensureNamedStaticMap(DataModelObject.CacheMapSymbol);
let promise = cacheMap[path];
if (!promise) {
promise = RemoteAPI.getJSONWithStatus(path);
cacheMap[path] = promise;
}
const content = await cacheMap[path];
return JSON.parse(JSON.stringify(content));
}
}
DataModelObject.StaticMapSymbol = Symbol();
DataModelObject.CacheMapSymbol = Symbol();
class LabeledObject extends DataModelObject {
_name;
constructor(id, object)
{
super(id);
this._name = object.name;
}
updateSingleton(object) { this._name = object.name; }
static sortByName(list)
{
return list.sort((a, b) => {
if (a.name() < b.name())
return -1;
else if (a.name() > b.name())
return 1;
return 0;
});
}
sortByName(list) { return LabeledObject.sortByName(list); }
name() { return this._name; }
label() { return this.name(); }
}
if (typeof module != 'undefined') {
module.exports.DataModelObject = DataModelObject;
module.exports.LabeledObject = LabeledObject;
}