Files
old-spike/client/models/energy_datum.js
2016-03-11 17:38:03 -06:00

93 lines
2.7 KiB
JavaScript

import extend from 'extend';
import moment from 'moment-timezone';
import DateRange from './../../shared/utils/date_range';
import EnergyDataApi from 'api/energy_data';
const NAME = 'EnergyDatum';
const COLLECTION_DEFAULTS = {
indices: ['day']
};
class EnergyDatum {
constructor(data, house){
var energy_datum = this;
energy_datum.house = house;
energy_datum.data = data;
}
get scoped_id(){
return `energy-datum-${this.data.id}`;
}
// returns a datestamp that has the client timezone, but actually is house local time.
get day_to_date(){
var energy_datum = this,
house = energy_datum.house;
return house.toDate(energy_datum.data.day);
}
get day_to_s(){
var energy_datum = this;
return moment.tz(energy_datum.data.day * 1000, energy_datum.house.data.timezone).format('YYYY-MM-DD');
}
get irradiance(){
var energy_datum = this;
return Math.round(energy_datum.data.irradiance);
}
get consumption(){
var energy_datum = this;
return Math.round(energy_datum.data.consumption);
}
get production(){
var energy_datum = this;
return Math.round(energy_datum.data.production);
}
// This method will ensure the energy data for the passed houses while:
// 1. Making only 1 API.
// 2. Only opening 1 house LokiJs DB at a time.
static ensureEnergyDataForHouses(houses, date_range){
var new_ranges = {}, params = [];
houses.forEach((house)=>{
var query_ranges = DateRange.addRange(date_range, house.data.energy_datum_ranges || []);
if (query_ranges.gaps_filled.length > 0) {
params.push({dates: query_ranges.gaps_filled, house_id: house.data.id});
new_ranges[house.data.id] = query_ranges.new_ranges;
}
});
// already have all the data we need.
if (params.length === 0) return Promise.resolve();
// get all data needed for all houses in one call.
return new Promise((fnResolve, fnReject)=>{
EnergyDataApi.index({houses: params})
.then((energy_data)=>{
energy_data = energy_data.reduce((grouped, energy_datum)=>{
grouped[energy_datum.house_id] = grouped[energy_datum.house_id] || [];
grouped[energy_datum.house_id].push(energy_datum);
return grouped;
}, {});
houses.reduce((promise, house)=>{
return promise.then(()=>{
if (!energy_data[house.data.id]) return Promise.resolve();
return house.saveEnergyData(energy_data[house.data.id], new_ranges[house.data.id])
}).then(()=>{
house.closeDb();
});
}, Promise.resolve()).then(fnResolve);
});
})
}
}
EnergyDatum.NAME = NAME;
EnergyDatum.COLLECTION_DEFAULTS = COLLECTION_DEFAULTS;
export default EnergyDatum;