feat: reworked ttn webhook endpoint logic

This commit is contained in:
2025-01-03 02:01:55 +01:00
parent ffdb644700
commit 62847f569d
17 changed files with 273 additions and 356 deletions

View File

@ -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);