diff --git a/docs/swagger.json b/docs/swagger.json index d0300e60..41154569 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -970,6 +970,149 @@ } } }, + "/api/v1/monitor/notifications": { + "get": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "根据提供的过滤条件,分页获取通知列表", + "produces": [ + "application/json" + ], + "tags": [ + "数据监控" + ], + "summary": "批量查询通知", + "parameters": [ + { + "type": "string", + "name": "end_time", + "in": "query" + }, + { + "enum": [ + 7, + -1, + 0, + 1, + 2, + 3, + 4, + 5, + -1, + 5, + 6 + ], + "type": "integer", + "format": "int32", + "x-enum-varnames": [ + "_numLevels", + "DebugLevel", + "InfoLevel", + "WarnLevel", + "ErrorLevel", + "DPanicLevel", + "PanicLevel", + "FatalLevel", + "_minLevel", + "_maxLevel", + "InvalidLevel" + ], + "name": "level", + "in": "query" + }, + { + "enum": [ + "邮件", + "企业微信", + "飞书", + "日志" + ], + "type": "string", + "x-enum-varnames": [ + "NotifierTypeSMTP", + "NotifierTypeWeChat", + "NotifierTypeLark", + "NotifierTypeLog" + ], + "name": "notifier_type", + "in": "query" + }, + { + "type": "string", + "name": "order_by", + "in": "query" + }, + { + "type": "integer", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "name": "pageSize", + "in": "query" + }, + { + "type": "string", + "name": "start_time", + "in": "query" + }, + { + "enum": [ + "发送成功", + "发送失败", + "已跳过" + ], + "type": "string", + "x-enum-comments": { + "NotificationStatusFailed": "通知发送失败", + "NotificationStatusSkipped": "通知因某些原因被跳过(例如:用户未配置联系方式)", + "NotificationStatusSuccess": "通知已成功发送" + }, + "x-enum-descriptions": [ + "通知已成功发送", + "通知发送失败", + "通知因某些原因被跳过(例如:用户未配置联系方式)" + ], + "x-enum-varnames": [ + "NotificationStatusSuccess", + "NotificationStatusFailed", + "NotificationStatusSkipped" + ], + "name": "status", + "in": "query" + }, + { + "type": "integer", + "name": "user_id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/controller.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/dto.ListNotificationResponse" + } + } + } + ] + } + } + } + } + }, "/api/v1/monitor/pending-collections": { "get": { "security": [ @@ -3918,6 +4061,64 @@ } } } + }, + "/api/v1/users/{id}/notifications/test": { + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "为指定用户发送一条特定渠道的测试消息,以验证其配置是否正确。", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "用户管理" + ], + "summary": "发送测试通知", + "parameters": [ + { + "type": "integer", + "description": "用户ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "请求体", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SendTestNotificationRequest" + } + } + ], + "responses": { + "200": { + "description": "成功响应", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/controller.Response" + }, + { + "type": "object", + "properties": { + "data": { + "type": "string" + } + } + } + ] + } + } + } + } } }, "definitions": { @@ -4426,6 +4627,20 @@ } } }, + "dto.ListNotificationResponse": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.NotificationDTO" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationDTO" + } + } + }, "dto.ListPendingCollectionResponse": { "type": "object", "properties": { @@ -4734,6 +4949,47 @@ } } }, + "dto.NotificationDTO": { + "type": "object", + "properties": { + "alarm_timestamp": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "error_message": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "level": { + "$ref": "#/definitions/zapcore.Level" + }, + "message": { + "type": "string" + }, + "notifier_type": { + "$ref": "#/definitions/notify.NotifierType" + }, + "status": { + "$ref": "#/definitions/models.NotificationStatus" + }, + "title": { + "type": "string" + }, + "to_address": { + "type": "string" + }, + "updated_at": { + "type": "string" + }, + "user_id": { + "type": "integer" + } + } + }, "dto.PaginationDTO": { "type": "object", "properties": { @@ -5586,6 +5842,22 @@ } } }, + "dto.SendTestNotificationRequest": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "description": "Type 指定要测试的通知渠道", + "allOf": [ + { + "$ref": "#/definitions/notify.NotifierType" + } + ] + } + } + }, "dto.SensorDataDTO": { "type": "object", "properties": { @@ -6196,6 +6468,29 @@ "ReasonTypeHealthCare" ] }, + "models.NotificationStatus": { + "type": "string", + "enum": [ + "发送成功", + "发送失败", + "已跳过" + ], + "x-enum-comments": { + "NotificationStatusFailed": "通知发送失败", + "NotificationStatusSkipped": "通知因某些原因被跳过(例如:用户未配置联系方式)", + "NotificationStatusSuccess": "通知已成功发送" + }, + "x-enum-descriptions": [ + "通知已成功发送", + "通知发送失败", + "通知因某些原因被跳过(例如:用户未配置联系方式)" + ], + "x-enum-varnames": [ + "NotificationStatusSuccess", + "NotificationStatusFailed", + "NotificationStatusSkipped" + ] + }, "models.PenStatus": { "type": "string", "enum": [ @@ -6525,6 +6820,51 @@ "$ref": "#/definitions/models.SensorType" } } + }, + "notify.NotifierType": { + "type": "string", + "enum": [ + "邮件", + "企业微信", + "飞书", + "日志" + ], + "x-enum-varnames": [ + "NotifierTypeSMTP", + "NotifierTypeWeChat", + "NotifierTypeLark", + "NotifierTypeLog" + ] + }, + "zapcore.Level": { + "type": "integer", + "format": "int32", + "enum": [ + 7, + -1, + 0, + 1, + 2, + 3, + 4, + 5, + -1, + 5, + 6 + ], + "x-enum-varnames": [ + "_numLevels", + "DebugLevel", + "InfoLevel", + "WarnLevel", + "ErrorLevel", + "DPanicLevel", + "PanicLevel", + "FatalLevel", + "_minLevel", + "_maxLevel", + "InvalidLevel" + ] } }, "securityDefinitions": { diff --git a/src/api/monitor.js b/src/api/monitor.js index ba0072fa..e1533679 100644 --- a/src/api/monitor.js +++ b/src/api/monitor.js @@ -121,6 +121,49 @@ import http from '../utils/http'; * @property {number} [operator_id] */ +/** + * @typedef {('邮件'|'企业微信'|'飞书'|'日志')} NotifierType + */ + +/** + * @typedef {('发送成功'|'发送失败'|'已跳过')} NotificationStatus + */ + +/** + * @typedef {object} NotificationDTO + * @property {number} id + * @property {number} user_id + * @property {NotifierType} notifier_type + * @property {string} to_address + * @property {string} title + * @property {string} message + * @property {number} level - 日志级别, 见 ZapcoreLevel 枚举 + * @property {string} alarm_timestamp + * @property {NotificationStatus} status + * @property {string} error_message + * @property {string} created_at + * @property {string} updated_at + */ + +/** + * @typedef {object} ListNotificationResponse + * @property {Array} list + * @property {PaginationDTO} pagination + */ + +/** + * @typedef {object} NotificationsParams + * @property {number} [page] + * @property {number} [pageSize] + * @property {string} [order_by] + * @property {string} [start_time] + * @property {string} [end_time] + * @property {number} [level] - 日志级别, 见 ZapcoreLevel 枚举 + * @property {NotifierType} [notifier_type] + * @property {NotificationStatus} [status] + * @property {number} [user_id] + */ + /** * @typedef {('等待中'|'已完成'|'已超时')} PendingCollectionStatus */ @@ -606,6 +649,22 @@ import http from '../utils/http'; * @property {number} [operator_id] */ +// --- Enums --- + +/** + * 日志级别, 对应后端的 zapcore.Level + * @enum {number} + */ +export const ZapcoreLevel = { + Debug: -1, + Info: 0, + Warn: 1, + Error: 2, + DPanic: 3, + Panic: 4, + Fatal: 5, + Invalid: 6, +}; // --- Functions --- @@ -647,6 +706,16 @@ export const getMedicationLogs = async (params) => { return processResponse(responseData); }; +/** + * 批量查询通知 + * @param {NotificationsParams} params - 查询参数 + * @returns {Promise<{list: Array, total: number}>} + */ +export const getNotifications = async (params) => { + const responseData = await http.get('/api/v1/monitor/notifications', { params }); + return processResponse(responseData); +}; + /** * 获取待采集请求列表 * @param {PendingCollectionsParams} params - 查询参数 diff --git a/src/api/user.js b/src/api/user.js index 3d0d96cd..a2eadbff 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -71,6 +71,15 @@ import http from '../utils/http'; * @property {string} [username] */ +/** + * @typedef {('邮件'|'企业微信'|'飞书'|'日志')} NotifierType + */ + +/** + * @typedef {object} SendTestNotificationRequest + * @property {NotifierType} type - Type 指定要测试的通知渠道 + */ + /** * 创建一个新用户 * @param {CreateUserRequest} userData - 用户信息 @@ -99,8 +108,19 @@ const getUserHistory = (id, params) => { return http.get(`/api/v1/users/${id}/history`, { params }); }; +/** + * 发送测试通知 + * @param {number} id - 用户ID + * @param {SendTestNotificationRequest} data - 请求体 + * @returns {Promise} + */ +const sendTestNotification = (id, data) => { + return http.post(`/api/v1/users/${id}/notifications/test`, data); +}; + export const UserApi = { createUser, login, getUserHistory, + sendTestNotification, };