Skip to content

Instantly share code, notes, and snippets.

@renso3x
Created May 6, 2019 10:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save renso3x/d65913f99fd40bf5f565dd28387bcdac to your computer and use it in GitHub Desktop.
Save renso3x/d65913f99fd40bf5f565dd28387bcdac to your computer and use it in GitHub Desktop.
lambda.js
'use strict';
import middleware from 'lambda-utilities/lib/middleware';
import { filterWarmUpEvent } from 'lambda-utilities/lib/middleware/filterWarmUpEvent';
import { ErrorUnauthorized } from 'lambda-utilities/lib/error';
import {
jsonResponse,
getMidNight,
getBeforeMidNight,
getNextDay,
flattenArray,
computedArray
} from '../utils/util';
import errorResponse from '../utils/errorResponse';
import auth from '../../config/auth';
import { driver, session } from '../utils/db';
async function getWeeklyReport(systemNumber) {
let dayReports = [];
let counter = 0;
const numDays = 5;
const capacity = await session.run(
`MATCH (pv_sys:pv_system{system_number:"${systemNumber}"})-[:belong_to]-(p:pv_panel) RETURN pv_sys.installed_capacity as installed_capacity`
);
const installedCapacity = capacity.records[0]._fields[0];
while (counter <= numDays) {
const date = getMidNight()
.subtract(counter, 'd')
.format('ddd');
const startTime = getMidNight()
.subtract(counter, 'd')
.format('x'); // midnight
const endTime = getBeforeMidNight()
.subtract(counter, 'd')
.minute(45)
.format('x'); // 11:45:59:999
const summaryReport = await session.run(
`MATCH (pv_sys:pv_system{system_number:"${systemNumber}"})-[:belong_to]-(pv_inv:pv_inverter)-[:read_from]-(rdng:readings)-[:read_at]-(inv_time:time) WHERE inv_time.timestamp>=${startTime} AND inv_time.timestamp<=${endTime} RETURN sum(rdng.value_kwh)`
);
const power =
typeof summaryReport.records[0]._fields[0] === 'number'
? summaryReport.records[0]._fields[0]
: 0;
dayReports = [
...dayReports,
{
power,
date
}
];
counter++;
}
const next2Days = await getNextDay(installedCapacity);
dayReports = {
record: [...dayReports.reverse(), ...next2Days.reverse()]
};
return dayReports;
}
const handler = async (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
try {
const { Authorization } = event.headers;
if (Authorization !== auth.apiKey) {
throw new ErrorUnauthorized();
}
const pvSystemNumber = decodeURIComponent(event.pathParameters.locationId);
const sysNumberList = pvSystemNumber.split(',');
let dayReports = [];
const reportList = [];
const start = async () => {
for (let i = 0; i < sysNumberList.length; i++) {
const reports = await getWeeklyReport(sysNumberList[i]);
reportList.push(reports);
}
const flattendArray = flattenArray(reportList);
const computedRecordValues = computedArray(flattendArray);
dayReports = {
rootData: computedRecordValues
};
driver.close();
session.close();
return callback(null, jsonResponse(dayReports));
};
start();
} catch (e) {
return callback(null, errorResponse(e));
}
};
export default middleware(filterWarmUpEvent())(handler);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment