const express = require('express'); const WebhookService = require('../webhook/webhookService'); const logger = require('../logger'); const router = express.Router(); // Webhook 路由 router.post('/webhook', (req, res) => { const eventData = req.body; const eventType = eventData.event; logger.info(`收到 Webhook 事件: ${eventType}`); logger.debug('事件数据:', JSON.stringify(eventData, null, 2)); // 根据事件类型处理不同的事件 switch (eventType) { case 'client.connected': case 'client.disconnected': logger.info(`处理设备${eventType}事件`); WebhookService.handleDeviceEvent(eventData); break; case 'switch_status_update': logger.info(`处理开关状态更新: 设备=${eventData.clientid}`); WebhookService.handleSwitchEvent(eventData); break; case 'client.check_authn_complete': logger.info(`处理认证检查完成事件: 客户端=${eventData.clientid}`); logger.debug('认证结果:', eventData.result); break; case 'session.subscribed': logger.info(`处理会话订阅事件: 客户端=${eventData.clientid}, 主题=${eventData.topic}`); break; case 'message.delivered': logger.info(`处理消息投递事件: 客户端=${eventData.clientid}, 主题=${eventData.topic}`); WebhookService.handleMessageDeliveredEvent(eventData); break; case 'message.publish': logger.info(`处理消息发布事件: 主题=${eventData.topic}`); // 处理不同类型的消息主题 if (eventData.topic.includes('/temperature')) { logger.info('处理温度数据事件'); WebhookService.handleTemperatureEvent(eventData); } // 如果主题以 device/ 开头并以 /relay/state 结尾,处理继电器状态事件 else if (eventData.topic.startsWith('device/') && eventData.topic.endsWith('/relay/state')) { logger.info('处理继电器状态事件'); WebhookService.handleRelayStateEvent(eventData); } // 如果主题包含 GPIO,处理 GPIO 状态事件 else if (eventData.topic.startsWith('device/') && eventData.topic.includes('/gpio')) { logger.info('处理GPIO状态事件'); WebhookService.handleGpioStateEvent(eventData); } else { logger.warn(`未处理的消息主题: ${eventData.topic}`); } break; case 'client.check_authz_complete': logger.info(`处理授权检查完成事件: 客户端=${eventData.clientid}`); WebhookService.handleAuthzCheckEvent(eventData); break; case 'client.connack': logger.info(`处理连接确认事件: 客户端=${eventData.clientid}`); logger.debug('连接详情:', { clean_start: eventData.clean_start, keepalive: eventData.keepalive, proto_ver: eventData.proto_ver }); break; case 'message.dropped': logger.warn('消息丢弃事件:', { client_id: eventData.clientid || eventData.client_id || 'unknown', topic: eventData.topic, payload: eventData.payload, reason: eventData.reason, timestamp: WebhookService.convertToBeijingTime(eventData.timestamp) }); break; default: logger.warn(`未处理的事件类型: ${eventType}`); } // 返回成功响应 logger.debug('Webhook 处理完成'); res.status(200).json({ status: 'success' }); }); module.exports = router;