feat: Implementação completa do NoIdle - Cliente, Backend e Scripts
- Cliente Windows com modo silencioso e auto-start robusto - Backend Node.js + API REST - Frontend Next.js + Dashboard - Scripts PowerShell de configuração e diagnóstico - Documentação completa - Build scripts para Windows e Linux - Solução de auto-start após reinicialização Resolução do problema: Cliente não voltava ativo após reboot Solução: Registro do Windows + Task Scheduler + Modo silencioso
This commit is contained in:
78
backend/routes/activities.js
Normal file
78
backend/routes/activities.js
Normal file
@@ -0,0 +1,78 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const { query } = require('../config/database');
|
||||
const { authenticateToken } = require('../middleware/auth');
|
||||
|
||||
// REGISTRAR ATIVIDADE (sem auth - usado pelo client)
|
||||
router.post('/', async (req, res) => {
|
||||
try {
|
||||
const { device_id, window_title, application_name, idle_time_seconds, urls } = req.body;
|
||||
|
||||
if (!device_id) {
|
||||
return res.status(400).json({ error: 'device_id é obrigatório' });
|
||||
}
|
||||
|
||||
const deviceCheck = await query(
|
||||
'SELECT id, company_id FROM devices WHERE device_id = $1',
|
||||
[device_id]
|
||||
);
|
||||
|
||||
if (deviceCheck.rows.length === 0) {
|
||||
return res.status(404).json({ error: 'Dispositivo não encontrado' });
|
||||
}
|
||||
|
||||
const device = deviceCheck.rows[0];
|
||||
|
||||
const result = await query(
|
||||
`INSERT INTO activities (device_id, company_id, window_title, application_name, idle_time_seconds, timestamp)
|
||||
VALUES ($1, $2, $3, $4, $5, NOW()) RETURNING *`,
|
||||
[device.id, device.company_id, window_title, application_name, idle_time_seconds || 0]
|
||||
);
|
||||
|
||||
// Se tem URLs, salvar também
|
||||
if (urls && Array.isArray(urls) && urls.length > 0) {
|
||||
for (const urlData of urls) {
|
||||
await query(
|
||||
`INSERT INTO browsing_history (device_id, url, title, browser, visited_at)
|
||||
VALUES ($1, $2, $3, $4, NOW())`,
|
||||
[device_id, urlData.url, urlData.title, urlData.browser]
|
||||
);
|
||||
}
|
||||
console.log(`📊 ${urls.length} URLs registradas para ${device_id}`);
|
||||
}
|
||||
|
||||
res.status(201).json({ success: true, activity: result.rows[0] });
|
||||
} catch (error) {
|
||||
console.error('Erro ao registrar atividade:', error);
|
||||
res.status(500).json({ error: 'Erro ao registrar atividade' });
|
||||
}
|
||||
});
|
||||
|
||||
// LISTAR ATIVIDADES
|
||||
router.get('/', authenticateToken, async (req, res) => {
|
||||
try {
|
||||
const company_id = req.user.company_id;
|
||||
const { device_id, limit = 100 } = req.query;
|
||||
|
||||
let queryText = `SELECT a.*, d.device_name FROM activities a
|
||||
JOIN devices d ON a.device_id = d.id
|
||||
WHERE a.company_id = $1`;
|
||||
const params = [company_id];
|
||||
|
||||
if (device_id) {
|
||||
params.push(device_id);
|
||||
queryText += ` AND a.device_id = $${params.length}`;
|
||||
}
|
||||
|
||||
queryText += ` ORDER BY a.timestamp DESC LIMIT $${params.length + 1}`;
|
||||
params.push(limit);
|
||||
|
||||
const result = await query(queryText, params);
|
||||
res.json({ success: true, activities: result.rows });
|
||||
} catch (error) {
|
||||
console.error('Erro ao listar atividades:', error);
|
||||
res.status(500).json({ error: 'Erro ao listar atividades' });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user