feat: reworked ttn webhook endpoint logic
This commit is contained in:
@ -1,12 +1,8 @@
|
||||
import express, { Request, Response } from "express";
|
||||
import { container } from "tsyringe";
|
||||
import { domainEventEmitter } from "../config/eventEmitter";
|
||||
import {
|
||||
TtnMessageReceivedEvent,
|
||||
TtnMessageReceivedEventName,
|
||||
} from "../event/ttnMessageReceivedEvent";
|
||||
import { validateData } from "../middleware/validationMiddleware";
|
||||
import { TtnMessage } from "../models/ttnMessage";
|
||||
import { LocationService } from "../services/locationService";
|
||||
import { LpTtnEndDeviceUplinksService } from "../services/lpTtnEndDeviceUplinksService";
|
||||
import { TtnGatewayReceptionService } from "../services/ttnGatewayReceptionService";
|
||||
import { WifiScanService } from "../services/wifiScanService";
|
||||
@ -20,6 +16,8 @@ const ttnGatewayReceptionService = container.resolve(
|
||||
);
|
||||
const wifiScanService = container.resolve(WifiScanService);
|
||||
|
||||
const locationService = container.resolve(LocationService);
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
router.post(
|
||||
@ -28,8 +26,8 @@ router.post(
|
||||
async (req: Request, res: Response) => {
|
||||
try {
|
||||
const message = req.body as TtnMessage;
|
||||
// Create uplink record
|
||||
const { lp_ttn_end_device_uplinks_id, latitude, longitude } =
|
||||
|
||||
const { lp_ttn_end_device_uplinks_id } =
|
||||
await lpTtnEndDeviceUplinksService.createUplink({
|
||||
device_id: message.end_device_ids.device_id,
|
||||
application_ids:
|
||||
@ -41,14 +39,17 @@ router.post(
|
||||
battery: message.uplink_message.decoded_payload?.messages[0].find(
|
||||
(e) => e.type === "Battery"
|
||||
)?.measurementValue,
|
||||
latitude: message.uplink_message.decoded_payload?.messages[0].find(
|
||||
(e) => e.type === "Latitude"
|
||||
)?.measurementValue,
|
||||
longitude: message.uplink_message.decoded_payload?.messages[0].find(
|
||||
(e) => e.type === "Longitude"
|
||||
)?.measurementValue,
|
||||
});
|
||||
|
||||
const gnnsLocation = {
|
||||
latitude: message.uplink_message.decoded_payload?.messages[0].find(
|
||||
(e) => e.type === "Latitude"
|
||||
)?.measurementValue,
|
||||
longitude: message.uplink_message.decoded_payload?.messages[0].find(
|
||||
(e) => e.type === "Longitude"
|
||||
)?.measurementValue,
|
||||
};
|
||||
|
||||
const wifiScans =
|
||||
message.uplink_message.decoded_payload?.messages[0]
|
||||
.find((e) => e.type === "Wi-Fi Scan")
|
||||
@ -58,39 +59,50 @@ router.post(
|
||||
rssi: w.rssi,
|
||||
})) ?? [];
|
||||
|
||||
console.log(wifiScans);
|
||||
|
||||
const ttnGatewayReceptions = message.uplink_message.rx_metadata.map(
|
||||
(g) => ({
|
||||
lp_ttn_end_device_uplinks_id,
|
||||
gateway_id: g.gateway_ids.gateway_id,
|
||||
eui: g.gateway_ids.eui,
|
||||
rssi: g.rssi,
|
||||
latitude: g.location.latitude,
|
||||
longitude: g.location.longitude,
|
||||
altitude: g.location.altitude,
|
||||
latitude: g.location?.latitude,
|
||||
longitude: g.location?.longitude,
|
||||
altitude: g.location?.altitude,
|
||||
})
|
||||
);
|
||||
|
||||
const event: TtnMessageReceivedEvent = {
|
||||
lp_ttn_end_device_uplinks_id,
|
||||
wifis: wifiScans.map((w) => ({ mac: w.mac, rssi: w.rssi })),
|
||||
ttnGateways: ttnGatewayReceptions.map((g) => ({
|
||||
rssi: g.rssi,
|
||||
altitude: g.altitude,
|
||||
latitude: g.latitude,
|
||||
longitude: g.longitude,
|
||||
})),
|
||||
gnssLocation: { latitude, longitude }
|
||||
const createDatabaseEntries = async () => {
|
||||
const [wifiResults, gatewayResults] = await Promise.all([
|
||||
wifiScanService.createWifiScans(wifiScans),
|
||||
ttnGatewayReceptionService.filterAndInsertGatewayReception(
|
||||
ttnGatewayReceptions
|
||||
),
|
||||
]);
|
||||
|
||||
locationService.createLocationFromTriangulation({
|
||||
lp_ttn_end_device_uplinks_id,
|
||||
wifi: wifiResults.map(({ latitude, longitude, rssi }) => ({
|
||||
latitude,
|
||||
longitude,
|
||||
rssi,
|
||||
})),
|
||||
ttn_gw: gatewayResults.map(({ latitude, longitude, rssi }) => ({
|
||||
latitude,
|
||||
longitude,
|
||||
rssi,
|
||||
})),
|
||||
gnss:
|
||||
gnnsLocation.latitude && gnnsLocation.longitude
|
||||
? {
|
||||
latitude: gnnsLocation.latitude,
|
||||
longitude: gnnsLocation.longitude,
|
||||
}
|
||||
: undefined,
|
||||
});
|
||||
};
|
||||
|
||||
domainEventEmitter.emit(TtnMessageReceivedEventName, event);
|
||||
|
||||
await Promise.all([
|
||||
wifiScanService.createWifiScans(wifiScans),
|
||||
ttnGatewayReceptionService.createGatewayReceptions(
|
||||
ttnGatewayReceptions
|
||||
),
|
||||
]);
|
||||
|
||||
createDatabaseEntries().then();
|
||||
res.status(200);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
|
||||
Reference in New Issue
Block a user