c74bab3033
Motivation: 当数据库查询无结果时,Go 的 `var slice []Type` 声明会使 JSON 序列化输出 `null`,而非 `[]`。这在 API 响应中造成不一致,也增加了客户端的空值处理负担。改为 `make([]Type, 0)` 后空结果统一输出为 `[]`,提升 API 规范性。 Changes: * 统一 store 层所有 List 方法使用 `make([]Type, 0)` 初始化切片,覆盖 Sources、Channels、Templates、Rules、MessageLogs 及 RuleChannels 查询 * 新增完整的 cURL 示例文档,覆盖全部 API 端点(通知、Source、Template、Channel、Rule、消息记录) * 新增 Postman Collection JSON 文件,可直接导入 HTTPie 使用,包含环境变量配置
567 lines
18 KiB
JSON
567 lines
18 KiB
JSON
{
|
||
"info": {
|
||
"_postman_id": "aiaa-notification-service",
|
||
"name": "AIAA Notification Service",
|
||
"description": "通知服务 API。HTTPie:Import → Postman → 选择本文件。\n\n变量:\n- baseUrl:服务地址\n- adminKey:config.yaml → server.admin_key\n- sourceApiKey:创建 Source 时返回的 api_key",
|
||
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
|
||
},
|
||
"variable": [
|
||
{ "key": "baseUrl", "value": "http://localhost:8080" },
|
||
{ "key": "adminKey", "value": "admin-sk-change-me" },
|
||
{ "key": "sourceApiKey", "value": "SOURCE_API_KEY" },
|
||
{ "key": "sourceId", "value": "1" },
|
||
{ "key": "templateId", "value": "1" },
|
||
{ "key": "channelId", "value": "1" },
|
||
{ "key": "ruleId", "value": "1" }
|
||
],
|
||
"item": [
|
||
{
|
||
"name": "Health",
|
||
"item": [
|
||
{
|
||
"name": "健康检查",
|
||
"request": {
|
||
"method": "GET",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/health"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "Notify",
|
||
"item": [
|
||
{
|
||
"name": "发送通知(JSON)",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{sourceApiKey}}", "type": "string" }]
|
||
},
|
||
"method": "POST",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "application/json" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "{\n \"event\": \"trade.open\",\n \"data\": {\n \"symbol\": \"BTC\",\n \"price\": 65000\n }\n}"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/notify"
|
||
}
|
||
},
|
||
{
|
||
"name": "发送通知(Regex)",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{sourceApiKey}}", "type": "string" }]
|
||
},
|
||
"method": "POST",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "text/plain" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "trade.open BTC 开仓 价格:65000"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/notify"
|
||
}
|
||
},
|
||
{
|
||
"name": "发送通知(Text)",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{sourceApiKey}}", "type": "string" }]
|
||
},
|
||
"method": "POST",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "text/plain" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "BTC 突破 68000,请注意风险"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/notify",
|
||
"description": "parse_mode=text 时 event 固定为 default"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "Sources",
|
||
"item": [
|
||
{
|
||
"name": "创建 Source(JSON)",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "POST",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "application/json" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "{\n \"name\": \"trading-system\",\n \"parse_mode\": \"json\",\n \"status\": 1\n}"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/sources"
|
||
}
|
||
},
|
||
{
|
||
"name": "创建 Source(Regex)",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "POST",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "application/json" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "{\n \"name\": \"legacy-monitor\",\n \"parse_mode\": \"regex\",\n \"parse_pattern\": \"(?P<event>\\\\w+)\\\\s+(?P<message>.+)\"\n}"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/sources"
|
||
}
|
||
},
|
||
{
|
||
"name": "创建 Source(Text)",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "POST",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "application/json" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "{\n \"name\": \"alert-bot\",\n \"parse_mode\": \"text\"\n}"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/sources"
|
||
}
|
||
},
|
||
{
|
||
"name": "列出 Source",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "GET",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/sources"
|
||
}
|
||
},
|
||
{
|
||
"name": "获取 Source",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "GET",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/sources/{{sourceId}}"
|
||
}
|
||
},
|
||
{
|
||
"name": "更新 Source",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "PUT",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "application/json" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "{\n \"name\": \"trading-system\",\n \"parse_mode\": \"json\",\n \"status\": 1\n}"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/sources/{{sourceId}}"
|
||
}
|
||
},
|
||
{
|
||
"name": "删除 Source",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "DELETE",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/sources/{{sourceId}}"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "Templates",
|
||
"item": [
|
||
{
|
||
"name": "创建 Template",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "POST",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "application/json" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "{\n \"name\": \"trade_open\",\n \"content\": \"### {{.symbol}} 开仓\\n价格: {{.price}}\"\n}"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/templates"
|
||
}
|
||
},
|
||
{
|
||
"name": "列出 Template",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "GET",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/templates"
|
||
}
|
||
},
|
||
{
|
||
"name": "获取 Template",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "GET",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/templates/{{templateId}}"
|
||
}
|
||
},
|
||
{
|
||
"name": "更新 Template",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "PUT",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "application/json" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "{\n \"name\": \"trade_open\",\n \"content\": \"### {{.symbol}} 开仓\\n价格: {{.price}}\"\n}"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/templates/{{templateId}}"
|
||
}
|
||
},
|
||
{
|
||
"name": "删除 Template",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "DELETE",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/templates/{{templateId}}"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "Channels",
|
||
"item": [
|
||
{
|
||
"name": "创建 Channel(Email)",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "POST",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "application/json" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "{\n \"name\": \"email-ops\",\n \"type\": \"email\",\n \"config\": {\n \"to\": [\"148516886@qq.com\"]\n },\n \"status\": 1\n}"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/channels"
|
||
}
|
||
},
|
||
{
|
||
"name": "创建 Channel(钉钉)",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "POST",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "application/json" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "{\n \"name\": \"dingtalk-prod\",\n \"type\": \"dingtalk\",\n \"config\": {\n \"webhook_url\": \"https://oapi.dingtalk.com/robot/send?access_token=xxx\",\n \"secret\": \"SEC...\"\n },\n \"status\": 1\n}"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/channels"
|
||
}
|
||
},
|
||
{
|
||
"name": "创建 Channel(企业微信)",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "POST",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "application/json" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "{\n \"name\": \"wecom-ops\",\n \"type\": \"wecom\",\n \"config\": {\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx\"\n },\n \"status\": 1\n}"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/channels"
|
||
}
|
||
},
|
||
{
|
||
"name": "创建 Channel(Bark)",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "POST",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "application/json" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "{\n \"name\": \"bark-phone\",\n \"type\": \"bark\",\n \"config\": {\n \"url\": \"https://api.day.app/<device_key>\"\n },\n \"status\": 1\n}"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/channels"
|
||
}
|
||
},
|
||
{
|
||
"name": "列出 Channel",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "GET",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/channels"
|
||
}
|
||
},
|
||
{
|
||
"name": "获取 Channel",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "GET",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/channels/{{channelId}}"
|
||
}
|
||
},
|
||
{
|
||
"name": "更新 Channel",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "PUT",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "application/json" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "{\n \"name\": \"email-ops\",\n \"type\": \"email\",\n \"config\": {\n \"to\": [\"148516886@qq.com\"]\n },\n \"status\": 1\n}"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/channels/{{channelId}}"
|
||
}
|
||
},
|
||
{
|
||
"name": "删除 Channel",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "DELETE",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/channels/{{channelId}}"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "Rules",
|
||
"item": [
|
||
{
|
||
"name": "创建 Rule",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "POST",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "application/json" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "{\n \"source_name\": \"trading-system\",\n \"event\": \"trade.open\",\n \"template_name\": \"trade_open\",\n \"channels\": [\"email-ops\"],\n \"conditions\": [\n {\"field\": \"symbol\", \"op\": \"exists\"},\n {\"field\": \"price\", \"op\": \"gt\", \"value\": \"0\"}\n ],\n \"enabled\": 1\n}"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/rules"
|
||
}
|
||
},
|
||
{
|
||
"name": "列出 Rule",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "GET",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/rules"
|
||
}
|
||
},
|
||
{
|
||
"name": "获取 Rule",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "GET",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/rules/{{ruleId}}"
|
||
}
|
||
},
|
||
{
|
||
"name": "更新 Rule",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "PUT",
|
||
"header": [
|
||
{ "key": "Content-Type", "value": "application/json" }
|
||
],
|
||
"body": {
|
||
"mode": "raw",
|
||
"raw": "{\n \"source_name\": \"trading-system\",\n \"event\": \"trade.open\",\n \"template_name\": \"trade_open\",\n \"channels\": [\"email-ops\"],\n \"enabled\": 1\n}"
|
||
},
|
||
"url": "{{baseUrl}}/api/v1/rules/{{ruleId}}"
|
||
}
|
||
},
|
||
{
|
||
"name": "删除 Rule",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "DELETE",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/rules/{{ruleId}}"
|
||
}
|
||
},
|
||
{
|
||
"name": "启用 Rule",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "PATCH",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/rules/{{ruleId}}/enable"
|
||
}
|
||
},
|
||
{
|
||
"name": "禁用 Rule",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "PATCH",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/rules/{{ruleId}}/disable"
|
||
}
|
||
},
|
||
{
|
||
"name": "启用规则下某渠道",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "PATCH",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/rules/{{ruleId}}/channels/{{channelId}}/enable"
|
||
}
|
||
},
|
||
{
|
||
"name": "禁用规则下某渠道",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "PATCH",
|
||
"header": [],
|
||
"url": "{{baseUrl}}/api/v1/rules/{{ruleId}}/channels/{{channelId}}/disable"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "Message Logs",
|
||
"item": [
|
||
{
|
||
"name": "查询消息记录",
|
||
"request": {
|
||
"auth": {
|
||
"type": "bearer",
|
||
"bearer": [{ "key": "token", "value": "{{adminKey}}", "type": "string" }]
|
||
},
|
||
"method": "GET",
|
||
"header": [],
|
||
"url": {
|
||
"raw": "{{baseUrl}}/api/v1/message-logs?source=trading-system&event=trade.open&status=success&page=1&page_size=20",
|
||
"host": ["{{baseUrl}}"],
|
||
"path": ["api", "v1", "message-logs"],
|
||
"query": [
|
||
{ "key": "source", "value": "trading-system" },
|
||
{ "key": "event", "value": "trade.open" },
|
||
{ "key": "status", "value": "success" },
|
||
{ "key": "page", "value": "1" },
|
||
{ "key": "page_size", "value": "20" }
|
||
]
|
||
}
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|