You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
5.2 KiB
JavaScript

import _User from './_User.js';
import isArray from './util/isArray.js';
import isUndefined from './util/isUndefined.js';
var _DB = {};
_DB.records = {};
_DB.insertRecord = function(record, type, structure){
if(!isUndefined(type)){ record.type = type; }
var record_copy = _DB.copyAndTransform(record, structure); // make a copy in case the record has references to other objects, possibly circular
// TODO: Figure-out what to do for image, which has long `src_base64` property, so it must be stored in a file, with a mere reference in the DB. Also, upon creation the automatically makes thumbnails and updates the record accordingly, which is not possible to trigger.
return m.request({
method: 'POST',
url: '/cgi/insertrecord',
body: {
session_hash: _User.session_hash,
record: record_copy
}
})
.then(function(res){
if(res.success === true){
record.id = res.id;
_DB.integrate(record);
}
});
};
_DB.getRecord = function(id){
return _DB.records[id];
};
_DB.removeRecord = function(record){
delete _DB.records[record.id];
// TODO: make a call to server too? This is called by _Item.deleteImage, which itself calls the server anyway because deleting an image has special logic
}
_DB.integrate = function(new_record){
// check if record "exists" by id:
if(_DB.records.hasOwnProperty(new_record.id)){
// if it does exist, update its properties
var old_record = _DB.records[new_record.id];
Object.keys(new_record).forEach(function(key){
old_record[key] = new_record[key];
});
}
else{
// if it doesn't exist, make it
_DB.records[new_record.id] = new_record;
}
return _DB.records[new_record.id]; // in case we want the latest version of the record; see _OpenOrders for an example
};
_DB.integrateAll = function(new_records){
new_records.forEach(function(new_record, i){ // TODO: ensure this is best behavior e.g. cart.lineitems; we want the latest lineitem list, with the proper things removed and added, not only added and none removed
new_records[i] = _DB.integrate(new_record);
});
return new_records;
};
_DB.integrateAllReturnIds = function(new_records){
new_records.forEach(function(new_record, i){ // TODO: ensure this is best behavior e.g. cart.lineitems; we want the latest lineitem list, with the proper things removed and added, not only added and none removed
new_records[i] = _DB.integrate(new_record).id;
});
return new_records;
};
// determines whether to replace the whole array, or append to the existsing array, etc.
_DB.integrateArray = function(record_id, property, new_array){
}
/*
schema = {
id: 'copy',
brand: 'copy',
item: 'replace-with-id', // only get the id of the record, don't copy it
item2: {
id: 'copy', // automatically makes separate top-level record for item2, and sets `record.item2 = item2`
brand: 'copy'
},
lineitems: [
'list', // shows that this is a list
{ // this is the substructure of each element in the list
id: 'copy', // if substructure is left-out, then it's a list of scalars
quantity: 'copy' // if substructure == 'replace-with-id', it's a list of records, but only ids are transferred
}
]
}
*/
_DB.getOne = function(id, type, structure){
return m.request({
method: 'POST',
url: '/cgi/getone',
body: {
session_hash: _User.session_hash,
id: id,
type: type,
structure: structure
}
})
.then(function(res){
if(res.success === true){
_DB.integrate(res.record);
}
});
}
/* // exclude: big security problem, since record permissions aren't individualized; an attacker could just send an empty `structure` and get the whole DB
_DB.getAll = function(filter, structure){
return m.request({
method: 'POST',
url: '/cgi/getall',
body: {
session_hash: _User.session_hash,
filter: filter,
structure: structure
}
})
.then(function(res){
if(res.success === true){
if(!isArray(res.records)){ res.records = []; } // the JSON encoder sends an empty array as an object instead of array
res.records.forEach(_DB.integrate);
}
});
}
*/
_DB.setProperty = function(record, key, value){
var old_value = record[key];
record[key] = value;
return m.request({
method: 'POST',
url: '/cgi/setproperty',
body: {
session_hash: _User.session_hash,
record_id: record.id,
record_type: record.type,
key: key,
value: value
}
})
.then(function(res){
if(res.success === true){
return value;
}
else{
record[key] = old_value;
_Message.addError('There was an error updating '+record.type+' #'+record.id+'.');
return old_value;
}
});
};
_DB.copyAndTransform = function(record, structure){
var record_copy = {};
Object.keys(structure).forEach(function(key){
var operation = structure[key];
if(operation === 'copy'){
record_copy[key] = record[key];
}
else if(operation === 'replace-with-id'){
record_copy[key] = record[key].id;
}
});
return record_copy;
};
export default _DB;