Created
May 6, 2019 10:41
-
-
Save renso3x/d65913f99fd40bf5f565dd28387bcdac to your computer and use it in GitHub Desktop.
lambda.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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