Files
old-spike/client/models/house.js

152 lines
4.6 KiB
JavaScript
Raw Normal View History

2016-02-10 16:11:56 -06:00
import extend from 'extend';
2016-02-18 12:29:16 -06:00
import Loki from 'loki';
2016-02-09 19:17:05 -06:00
2016-02-10 16:11:56 -06:00
import PowerDatum from './power_datum';
import EnergyDatum from './energy_datum';
import PowerDataApi from './../api/power_data';
import EnergyDataApi from './../api/energy_data';
import HousesApi from './../api/houses';
2016-02-19 15:42:10 -06:00
import ArrayUtil from './../../shared/utils/array';
import MathUtil from './../../shared/utils/math';
import DateRange from './../../shared/utils/date_range';
import Databasable from './../lib/databasable';
2016-02-09 19:17:05 -06:00
2016-02-10 16:11:56 -06:00
class House {
2016-02-19 10:49:07 -06:00
// must be initiated with a dataset already in Loki database (not directly JSON).
2016-02-10 16:11:56 -06:00
constructor(data){
var house = this;
2016-02-09 19:17:05 -06:00
house.data = data;
2016-02-19 10:49:07 -06:00
Object.assign(house, Databasable);
2016-02-10 16:11:56 -06:00
}
2016-02-19 10:49:07 -06:00
get scoped_id(){
2016-02-10 16:11:56 -06:00
return `house-${this.data.id}`;
2016-02-09 19:17:05 -06:00
}
2016-02-19 10:49:07 -06:00
save(){
var house = this;
return House.collection()
.then((house_collection)=>{
return house_collection.update(house.data);
2016-02-19 15:42:10 -06:00
});
}
setPowerData(opts){
var house = this;
return house.ensurePowerData(opts)
.then(()=>{
return house.collection(PowerDatum.NAME, PowerDatum.COLLECTION_OPTIONS)
.then((power_collection)=>{
var params = house.rangeToLokiParams('time', [opts.start_date, opts.end_date]);
house.power_data = power_collection.find(params).map((data)=>{ return new PowerDatum(data); })
});
2016-02-19 10:49:07 -06:00
})
}
2016-02-10 16:11:56 -06:00
ensurePowerData(opts){
opts = extend({
start_date: undefined,
end_date: undefined
}, opts || {});
2016-02-19 10:49:07 -06:00
var house = this,
2016-02-19 15:42:10 -06:00
query_ranges = DateRange.addRange([opts.start_date, opts.end_date], house.data.power_datum_ranges);
2016-02-19 10:49:07 -06:00
2016-02-19 15:42:10 -06:00
if (query_ranges.gaps_filled.length > 0){
house.getPowerData({dates: query_ranges.gaps_filled})
.then(()=>{
house.data.power_datum_ranges = query_ranges.new_ranges;
return house.save();
});
} else { return Promise.resolve(); }
2016-02-09 19:17:05 -06:00
}
getPowerData(params){
var house = this;
params.house_id = house.data.id;
2016-02-19 15:42:10 -06:00
return PowerDataApi.index(params)
.then((power_data)=>{
return house.collection(PowerDatum.NAME, PowerDatum.COLLECTION_OPTIONS);
.then((power_collection)=>{
power_collection.insert(power_data);
return house.db.save();
});
})
}
setEnergyData(opts){
var house = this;
return house.ensureEnergyData(opts)
.then(()=>{
return house.collection(EnergyDatum.NAME, EnergyDatum.COLLECTION_OPTIONS)
.then((energy_collection)=>{
var params = house.rangeToLokiParams('day', [opts.start_date, opts.end_date]);
house.energy_data = energy_collection.find(params).map((data)=>{ return new EnergyDatum(data); })
});
})
2016-02-09 19:17:05 -06:00
}
2016-02-10 16:11:56 -06:00
ensureEnergyData(opts){
opts = extend({
start_date: undefined,
end_date: undefined
}, opts || {});
2016-02-09 19:17:05 -06:00
var house = this,
2016-02-19 15:42:10 -06:00
query_ranges = DateRange.addRange([opts.start_date, opts.end_date], house.data.energy_datum_ranges);
2016-02-09 19:17:05 -06:00
2016-02-19 15:42:10 -06:00
if (query_ranges.gaps_filled.length > 0){
house.getEnergyData({dates: query_ranges.gaps_filled})
.then(()=>{
house.data.energy_datum_ranges = query_ranges.new_ranges;
return house.save();
});
} else { return Promise.resolve(); }
2016-02-09 19:17:05 -06:00
}
getEnergyData(params){
var house = this;
params.house_id = house.data.id;
2016-02-19 15:42:10 -06:00
return EnergyDataApi.index(params)
.then((energy_data)=>{
return house.collection(EnergyDatum.NAME, EnergyDatum.COLLECTION_OPTIONS);
.then((energy_collection)=>{
energy_collection.insert(energy_data);
return house.db.save();
});
})
2016-02-18 12:29:16 -06:00
}
static ensureHouses(ids){
House.collection()
.then((house_collection)=>{
houses = house_collection.find({id: {$in: ids}});
if (houses.length !== ids.length){
required_ids = ArrayUtil.diff(ids, houses.map((house)=>{ return house.id; }));
return House.getHouses(required_ids)
.then((required_houses){
return houses.concat(required_houses);
});
} else { return houses; }
}).then((house_data)=>{
return houses_data.map((house_data)=>{ return new House(house_data); })
});
2016-02-09 19:17:05 -06:00
}
static getHouses(ids){
2016-02-18 12:29:16 -06:00
return HousesApi.index({id: ids})
.then((houses_data)=>{
return House.collection()
.then((house_collection)=>{
houses_data.forEach((house_data)=>{
house_collection.insert(house_data);
});
return houses_data;
});
2016-02-09 19:17:05 -06:00
});
}
}
2016-02-19 15:42:10 -06:00
Object.assign(House, Databasable);
2016-02-09 19:17:05 -06:00
export default House;