58 lines
2.2 KiB
TypeScript
58 lines
2.2 KiB
TypeScript
import { FastifyInstance } from "fastify";
|
|
import { eq } from "drizzle-orm";
|
|
import { db } from "../../../db"; // <--- PFAD ZUR DB INSTANZ ANPASSEN
|
|
import { devices } from "../../../db/schema";
|
|
|
|
// Definition, was wir vom ESP32 erwarten
|
|
interface HealthBody {
|
|
terminal_id: string;
|
|
ip_address?: string;
|
|
wifi_rssi?: number;
|
|
uptime_seconds?: number;
|
|
heap_free?: number;
|
|
[key: string]: any; // Erlaubt weitere Felder
|
|
}
|
|
|
|
export default async function devicesManagementRoutes(server: FastifyInstance) {
|
|
server.post<{ Body: HealthBody }>(
|
|
"/health",
|
|
async (req, reply) => {
|
|
try {
|
|
const data = req.body;
|
|
|
|
// 1. Validierung: Haben wir eine ID?
|
|
if (!data.terminal_id) {
|
|
console.warn("Health Check ohne terminal_id empfangen:", data);
|
|
return reply.code(400).send({ error: "terminal_id missing" });
|
|
}
|
|
|
|
console.log(`Health Ping von Device ${data.terminal_id}`, data);
|
|
|
|
// 2. Datenbank Update
|
|
// Wir suchen das Gerät mit der passenden externalId
|
|
const result = await server.db
|
|
.update(devices)
|
|
.set({
|
|
lastSeen: new Date(), // Setzt Zeit auf JETZT
|
|
lastDebugInfo: data // Speichert das ganze JSON
|
|
})
|
|
.where(eq(devices.externalId, data.terminal_id))
|
|
.returning({ id: devices.id }); // Gibt ID zurück, falls gefunden
|
|
|
|
// 3. Checken ob Gerät gefunden wurde
|
|
if (result.length === 0) {
|
|
console.warn(`Unbekanntes Terminal versucht Health Check: ${data.terminal_id}`);
|
|
// Optional: 404 senden oder ignorieren (Sicherheit)
|
|
return reply.code(404).send({ error: "Device not found" });
|
|
}
|
|
|
|
// Alles OK
|
|
return reply.code(200).send({ status: "ok" });
|
|
|
|
} catch (err: any) {
|
|
console.error("Health Check Error:", err);
|
|
return reply.code(500).send({ error: err.message });
|
|
}
|
|
}
|
|
);
|
|
} |