83 lines
2.6 KiB
JavaScript
83 lines
2.6 KiB
JavaScript
|
|
const express = require('express');
|
||
|
|
const router = express.Router();
|
||
|
|
|
||
|
|
// create prisma db client
|
||
|
|
const { PrismaClient } = require("@prisma/client");
|
||
|
|
const prisma = new PrismaClient();
|
||
|
|
|
||
|
|
|
||
|
|
router.get('/hardware-models', async (req, res) => {
|
||
|
|
try {
|
||
|
|
|
||
|
|
// get nodes from db
|
||
|
|
const results = await prisma.node.groupBy({
|
||
|
|
by: ['hardware_model'],
|
||
|
|
orderBy: {
|
||
|
|
_count: {
|
||
|
|
hardware_model: 'desc',
|
||
|
|
},
|
||
|
|
},
|
||
|
|
_count: {
|
||
|
|
hardware_model: true,
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
const hardwareModelStats = results.map((result) => {
|
||
|
|
return {
|
||
|
|
count: result._count.hardware_model,
|
||
|
|
hardware_model: result.hardware_model,
|
||
|
|
hardware_model_name: HardwareModel.valuesById[result.hardware_model] ?? "UNKNOWN",
|
||
|
|
};
|
||
|
|
});
|
||
|
|
|
||
|
|
res.json({
|
||
|
|
hardware_model_stats: hardwareModelStats,
|
||
|
|
});
|
||
|
|
|
||
|
|
} catch(err) {
|
||
|
|
console.error(err);
|
||
|
|
res.status(500).json({
|
||
|
|
message: "Something went wrong, try again later.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
router.get('/messages-per-hour', async (req, res) => {
|
||
|
|
try {
|
||
|
|
const hours = 168;
|
||
|
|
const now = new Date();
|
||
|
|
const startTime = new Date(now.getTime() - hours * 60 * 60 * 1000);
|
||
|
|
|
||
|
|
const messages = await prisma.textMessage.findMany({
|
||
|
|
where: { created_at: { gte: startTime } },
|
||
|
|
select: { packet_id: true, created_at: true },
|
||
|
|
distinct: ['packet_id'], // Ensures only unique packet_id entries are counted
|
||
|
|
orderBy: { created_at: 'asc' }
|
||
|
|
});
|
||
|
|
|
||
|
|
// Pre-fill `uniqueCounts` with zeros for all hours
|
||
|
|
const uniqueCounts = Object.fromEntries(
|
||
|
|
Array.from({ length: hours }, (_, i) => {
|
||
|
|
const hourTime = new Date(now.getTime() - (hours - i) * 60 * 60 * 1000);
|
||
|
|
const hourString = hourTime.toISOString().slice(0, 13); // YYYY-MM-DD HH
|
||
|
|
return [hourString, 0];
|
||
|
|
})
|
||
|
|
);
|
||
|
|
|
||
|
|
// Populate actual message counts
|
||
|
|
messages.forEach(({ created_at }) => {
|
||
|
|
const hourString = created_at.toISOString().slice(0, 13); // YYYY-MM-DD HH
|
||
|
|
uniqueCounts[hourString]++;
|
||
|
|
});
|
||
|
|
|
||
|
|
// Convert to final result format
|
||
|
|
const result = Object.entries(uniqueCounts).map(([hour, count]) => ({ hour, count }));
|
||
|
|
|
||
|
|
res.json(result);
|
||
|
|
} catch (error) {
|
||
|
|
console.error('Error fetching messages:', error);
|
||
|
|
res.status(500).json({ error: 'Internal Server Error' });
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
module.exports = router;
|