Initial commit
This commit is contained in:
101
routes/push.js
Normal file
101
routes/push.js
Normal file
@@ -0,0 +1,101 @@
|
||||
// routes/push.js
|
||||
const express = require('express');
|
||||
const { body, validationResult } = require('express-validator');
|
||||
const verifyToken = require('../middleware/verifyToken');
|
||||
const db = require('../db');
|
||||
const { sendPushToUser } = require('../utils/pushService');
|
||||
|
||||
const router = express.Router();
|
||||
router.use(verifyToken);
|
||||
|
||||
function handleValidation(req, res, next) {
|
||||
const errors = validationResult(req);
|
||||
if (!errors.isEmpty()) {
|
||||
return res.status(400).json({ success: false, errors: errors.array() });
|
||||
}
|
||||
next();
|
||||
}
|
||||
|
||||
// GET /api/push/vapid-public-key
|
||||
router.get('/vapid-public-key', (req, res) => {
|
||||
if (!process.env.VAPID_PUBLIC_KEY) {
|
||||
return res
|
||||
.status(503)
|
||||
.json({ success: false, message: 'Push indisponível' });
|
||||
}
|
||||
res.json({ success: true, data: { key: process.env.VAPID_PUBLIC_KEY } });
|
||||
});
|
||||
|
||||
// POST /api/push/subscribe
|
||||
router.post(
|
||||
'/subscribe',
|
||||
[
|
||||
body('endpoint').isString(),
|
||||
body('keys.p256dh').isString(),
|
||||
body('keys.auth').isString(),
|
||||
],
|
||||
handleValidation,
|
||||
async (req, res) => {
|
||||
const userId = req.user.id;
|
||||
const { endpoint, keys } = req.body;
|
||||
const ua = req.headers['user-agent'] || null;
|
||||
|
||||
// evita duplicados
|
||||
const existing = await db('push_subscriptions')
|
||||
.where({ endpoint, user_id: userId })
|
||||
.first();
|
||||
|
||||
if (existing) {
|
||||
return res.json({ success: true, data: existing });
|
||||
}
|
||||
|
||||
const [inserted] = await db('push_subscriptions')
|
||||
.insert({
|
||||
user_id: userId,
|
||||
endpoint,
|
||||
p256dh: keys.p256dh,
|
||||
auth: keys.auth,
|
||||
user_agent: ua,
|
||||
created_at: new Date().toISOString(),
|
||||
})
|
||||
.returning('*');
|
||||
|
||||
res.status(201).json({ success: true, data: inserted });
|
||||
}
|
||||
);
|
||||
|
||||
// POST /api/push/unsubscribe
|
||||
router.post(
|
||||
'/unsubscribe',
|
||||
[body('endpoint').optional().isString()],
|
||||
handleValidation,
|
||||
async (req, res) => {
|
||||
const userId = req.user.id;
|
||||
const { endpoint } = req.body || {};
|
||||
|
||||
// se não houver sub no navegador, responde ok
|
||||
if (!endpoint) {
|
||||
return res.json({ success: true, message: 'No subscription' });
|
||||
}
|
||||
|
||||
await db('push_subscriptions')
|
||||
.where({ endpoint, user_id: userId })
|
||||
.del();
|
||||
|
||||
res.json({ success: true, message: 'Unsubscribed' });
|
||||
}
|
||||
);
|
||||
|
||||
// POST /api/push/test
|
||||
router.post('/test', async (req, res) => {
|
||||
const userId = req.user.id;
|
||||
await sendPushToUser(userId, {
|
||||
title: '📬 Teste EV Station',
|
||||
body: 'Push notifications estão a funcionar!',
|
||||
url: '/',
|
||||
});
|
||||
|
||||
res.json({ success: true, message: 'Push enviado' });
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user