ryan
7651c57536
feat(规则管理): 规则查询接口返回关联通知渠道
...
Motivation:
前端在展示规则详情与规则列表时,需要同时看到每条规则绑定了哪些通知渠道以及各渠道的启用状态。此前规则接口只返回规则本身,渠道绑定信息需要额外请求才能获取,增加了交互成本。本次让规则读取接口一次性携带关联渠道信息。
Changes:
* 规则模型新增 Channels 字段及渠道条目结构,包含渠道标识、名称、类型和按规则维度的启用开关
* 创建、查询单条、列表查询规则接口在返回结果时填充绑定的渠道信息,无绑定时返回空列表
* 新增批量查询规则与渠道绑定关系的数据访问能力,按规则聚合返回,避免列表场景下逐条查询
* 单个渠道数据读取失败时跳过该条目,不阻断整体结果返回
2026-08-18 14:09:02 +08:00
ryan
5eebddc680
feat(消息订阅): 新增消息接收原始报文日志
...
Motivation:
消息在分发处理前缺少接收环节的观测信息,排查消息丢失、重复消费或报文异常等问题时难以还原现场,需要在消息入口处记录完整的原始信息以支撑问题定位与链路追踪。
Changes:
* 在消息处理入口记录原始报文的接收日志
* 日志包含订阅者名称、队列、来源及投递标签等上下文信息
* 完整输出消息体内容,便于还原消息接收现场
2026-08-18 11:43:20 +08:00
ryan
155a54f536
fix(crypto策略): 订阅路由键改为通配符以覆盖来源维度的信号
...
Motivation:
去重键已加入来源维度,信号会以 strategy.signal.origin 路由键发布,原精确匹配策略将漏收该类消息,需扩展订阅范围。
Changes:
* 将 routing_key 由 strategy.signal 改为 strategy.signal.# 通配符
* 新增注释说明通配符覆盖 strategy.signal 与 strategy.signal.origin
2026-08-17 17:01:37 +08:00
ryan
f7ea2e7cf9
feat(crypto策略): 支持巴菲特策略纯 rawMessage 信号推送
...
Motivation:
新增巴菲特激进/稳健策略(PUTEJJ/PUTEWJ)的跟单推送能力。该类信号仅有 rawMessage、无 action 字段,需按原文直接推送,并过滤启动文案、本地化时间字段。
Changes:
* 支持无 action 的纯 rawMessage 信号,映射为 trade.message 事件
* 新增 not_contains 条件操作符,用于过滤启动文案
* 新增 replace 模板函数,将 Time: 替换为推送时间:
* 补充巴菲特策略模板、规则与渠道配置文档
2026-08-17 16:38:09 +08:00
ryan
33b2a96bcf
fix(消息去重): 去重键加入来源维度,避免跨来源信号被误去重
...
Motivation:
不同来源(如 crypto-strategy 与 trade-signal)可能产生策略、币种、周期、方向、价格完全一致的信号,旧去重键仅按这五维计算,导致后到的不同来源信号被误判为重复而漏推,无法支撑跟单策略等新增来源并行推送。
Changes:
* 信号去重键新增来源(source)维度,不同来源的相同信号不再互相去重
* 信号哈希计算时透传来源名称,同一来源内的重复消息仍正常去重
* 补充跟单策略文案模板的渲染测试与接口创建文档
2026-08-17 15:39:20 +08:00
ryan
a2c0590353
feat(crypto策略): 新增 AG 趋势、异动与波段跟踪信号支持
...
Motivation:
crypto-strategy 源新增 AG 趋势(AGTS)、异动(AMA)、波段跟踪(BTS) 三类量化策略信号,需与既有 trade.* 事件区分以避免和 AI crypto signals 精确匹配冲突,并为缺省方向提供兜底推导。
Changes:
* 事件名映射按 strategyCode 使用独立前缀(AGTS./AMA./BTS.,HLSS 保持不变)
* direction/side 缺失时依据 isSale 兜底推导为 LONG/SHORT
* 补充三类策略的模板、规则示例文档与渲染/转换测试
2026-08-17 11:07:34 +08:00
ryan
a93078dc00
fix(时区): 推送时间统一使用 UTC+8 而非服务器本地时区
...
Motivation:
推送时间原先依赖 time.Local,部署在不同时区的服务器会产生不一致的展示结果。统一为 UTC+8,确保所有订阅者看到的时间固定为北京时间。
Changes:
* 新增 internal/tz 时区工具,集中定义 UTC+8 与格式化逻辑
* 通知、crypto 策略、交易信号的时间渲染统一改用 UTC+8
* 补充测试断言 pushedAt 为 UTC+8 当前时间
* 更新 README 中关于注入时间的说明
Breaking Changes:
所有推送时间字段将按 UTC+8 展示,若服务部署在非 UTC+8 时区且依赖原本地时间行为,输出会发生变化。
2026-08-17 01:29:13 +08:00
ryan
d2e8476398
feat(规则): 支持同一事件多规则按条件区分并全部发送
...
Motivation:
止盈、止损等不同策略信号会映射到同一事件(如 trade.close),但原有唯一约束要求每个事件只能有一条规则,无法按策略区分处理。放开该约束后,同一事件可配置多条规则,通过规则条件与精确/通配优先级区分,命中条件的规则全部发送;同时将去重键从消息原文改为信号维度,避免同一信号因时间戳等无关字段差异被误判为重复。
Changes:
* 移除规则 source_id+event 的唯一约束,改为普通索引
* 事件匹配改为返回命中优先级内所有启用规则,并按 ID 逐条派发
* 通知服务遍历多条规则,按条件过滤后聚合发送渠道
* 去重键由消息 body 哈希改为策略/币种/周期/方向/价格信号维度哈希
2026-08-17 01:20:49 +08:00
ryan
f5f64f7653
feat(crypto策略): 支持 AI 信号止盈止损事件与多字段渲染
...
Motivation:
区分止盈与止损事件,并为 AI crypto signals 策略提供更丰富的推送内容渲染能力(杠杆、止盈档位、收益、持仓周期等)。
Changes:
* 开仓(多/空,含原 isSale 空单)统一映射为 trade.open,不再发 trade.sell
* 新增 trade.gain 事件用于止盈,止损仍映射为 trade.close;HLSS 策略保持原有事件映射
* 新增 leverageText、tp1~tp5、closeAction、revenueDisplay、holdPeriod 等渲染字段
* 新增收益符号、止盈档位、持仓周期等格式化逻辑
* 补充 AI crypto signals 的模板与规则文档及单元测试
2026-08-17 00:54:01 +08:00
ryan
0f9f154969
feat(规则): 支持名称代号,便于区分和管理
...
创建与更新规则时必填全局唯一 name,已有规则迁移回填为 rule-{id}。
2026-08-17 00:01:34 +08:00
ryan
b3c42af53b
feat(订阅): 支持 HLSS 策略止盈与介入区间格式化
...
Motivation:
HLSS 策略信号携带的止盈价位列表与介入价位含冗余小数位,直接推送可读性差,需转换为紧凑区间并补齐推送时间,提升通知的信息密度与可读性。
Changes:
* 新增止盈目标区间,将止盈价位列表去零后连接为区间
* 新增介入区间,由开仓价与介入价组合生成
* 压缩价格数值多余小数位,保留原始精度
* 注入推送时间,便于模板渲染提醒时间
2026-08-16 23:21:59 +08:00
ryan
14504af950
feat(通知): SafeW 只发正文并注入推送时间
...
去掉渠道标题前缀,模板可用 pushedAt 显示本地推送时间。
2026-08-16 01:18:27 +08:00
ryan
a9b6234208
feat(通知模板): 支持 case 取值映射与事件名匹配渲染
...
Motivation:
让通知模板能够将 action、event 等原始枚举值映射为可读中文文案,并支持按事件名后缀匹配;同时简化 SafeW 消息发送格式,避免 Markdown 转义引入的显示问题。
Changes:
* 新增 `case` 模板函数,按值匹配 key/文案并支持末尾奇数参数作为默认值
* `case` 匹配兼容事件名后缀(如 trade.close 匹配 .close)
* `line` 前缀自动去除末尾冒号,避免重复冒号
* 模板渲染前自动注入 event 字段,便于模板按事件名取值
* SafeW 消息改为纯文本发送,移除 MarkdownV2 转义
2026-08-16 00:45:27 +08:00
ryan
ae25409e56
feat(通知模板): 支持缺字段按空值渲染与空行省略
...
Motivation:
统一 crypto-strategy 与 trade-signal 两类交易信号的模板字段,使同一套通知模板可复用;字段缺失或为空时不再导致渲染报错或输出空行,通知内容更整洁。
Changes:
* 渲染器缺失字段改为按空值处理,新增 line 函数实现空值整行省略
* crypto-strategy 信号补充止盈价、止损价、平均价、收益额等模板字段
* trade-signal 信号保留原始报文中的额外字段以适配统一模板
* 修复结构化日志将 error 作为值直接输出导致的格式问题
2026-08-16 00:19:50 +08:00
ryan
de7a52e81f
feat(规则匹配): 事件名支持通配符匹配
...
Motivation:
通知规则的事件名此前仅支持精确匹配,无法用一条规则覆盖多类事件(如 trade.* 下的全部交易事件),规则配置维护成本高。本次引入通配符匹配,让规则可按模式批量命中事件,同时保证精确规则优先。
Changes:
* 事件名支持 * 和 ? 通配符匹配
* 匹配优先级:精确匹配 > 更具体的通配 > 泛匹配,同分时取更小 ID
* 精确命中未命中时回退为列出源下启用规则并按优先级挑选
* 抽取缓存预热逻辑为独立方法
* 更新文档说明事件名通配规则
2026-08-15 23:39:00 +08:00
ryan
dc313fda13
feat(订阅): 新增 crypto-strategy 信号格式化器
...
Motivation:
crypto-strategy 交易信号采用 envelope 外壳与字符串化/嵌套的 payload,原有 trade_signal 格式化器无法解析,需要独立的转换逻辑以生成通知文本和事件数据。
Changes:
* 新增 crypto_strategy 消息转换器,解析 envelope 及嵌套、字符串化、扁平三种 payload 形态
* 根据平仓/止盈/卖出等标志推断交易动作,生成对应事件类型与中文通知文本
* 提取订单号、策略代码、价格、杠杆等字段用于通知数据
* 将消息转换器抽象为接口,订阅器按 formatter 配置选择对应实现
* 更新配置校验以支持 crypto_strategy 格式化器,并补充单元测试
2026-08-15 23:04:39 +08:00
ryan
d6c416a543
feat(订阅): 新增 crypto-strategy 交易信号通知订阅
...
Motivation:
支持加密货币策略的交易信号通过独立队列推送通知,避免与 executor 队列的 consumer.strategy 争抢消息。
Changes:
* 新增 crypto-strategy 订阅配置,使用独立的信号通知队列和死信队列
* 配置独立 topic 交换机与 strategy.signal 路由键
* 复用 trade_signal 格式化器处理信号内容
Breaking Changes:
无
2026-08-15 21:40:48 +08:00
ryan
0210b70bda
perf(日志): 空轮询时不输出 Info 日志以减少噪音
...
Motivation:
轮询安全网关更新时,绝大多数周期没有新消息,持续输出 Info 日志会产生大量噪音并带来不必要的开销。仅在确有更新时才记录日志,便于聚焦真实事件。
Changes:
* 仅在存在更新时输出 getUpdates 日志
* 仅在拉取到群聊数据时输出 poll 日志
2026-08-15 18:19:41 +08:00
ryan
6bdd3eb786
feat(订阅配置): 支持环境变量展开并校验订阅连接地址
...
Motivation:
订阅连接地址中的敏感凭据不应硬编码到配置文件,改为通过环境变量注入,并自动跳过未配置或非 AMQP 协议的订阅,避免无效连接导致启动失败。
Changes:
* 订阅 URL 加载时展开环境变量并去除首尾空白
* 新增 AMQP 协议校验,仅 amqp/amqps 地址视为有效连接
* 非 AMQP 协议的订阅(如未配置的占位符)不再参与激活
* docker-compose 环境变量改用映射格式并加引号,规避特殊字符解析问题
* 补充环境变量展开与占位符跳过相关的单元测试
2026-08-15 17:57:09 +08:00
ryan
4fe9f83b89
chore(订阅): 重连错误日志补充 Broker 地址
...
Motivation:
多 Broker 部署场景下,订阅者重连失败时仅记录错误名称,难以快速定位是哪一台 Broker 连接异常。补充 Broker 地址并规范化错误字段,提升故障排查效率。
Changes:
* 重连失败日志新增 broker host 字段
* 新增 brokerHost 函数,从连接 URL 解析并输出主机地址
* 错误字段改为记录错误信息字符串,避免直接序列化 error 对象
2026-08-15 17:49:31 +08:00
ryan
7a7e69c69a
chore(部署): 为通知服务配置 RabbitMQ 连接地址
...
Motivation:
补齐 RabbitMQ 订阅功能的运行依赖,使服务在部署环境中能够连接云端消息队列并接收交易信号。
Changes:
* 在 docker-compose 中新增 RABBITMQ_URL 环境变量
* 指定 AMQPS 加密连接及云端实例认证信息
2026-08-15 17:45:45 +08:00
ryan
ab295d6d28
feat: log raw MQ body after dedup
...
Keep the original payload on post-dedup handling logs so accepted, filtered, and error paths can be traced.
2026-08-15 17:37:14 +08:00
ryan
6f846a0a3c
feat: subscribe to RabbitMQ trade signals and notify by rules
...
Consume configurable queues, format signals (including period), share NotifyService with HTTP, and drop duplicate bodies within 1h.
2026-08-15 17:34:49 +08:00
ryan
1f4fe2fb75
docs: add RabbitMQ subscriber design spec
...
Lock the notify-service MQ module: configurable subscriptions, trade-signal formatting, and shared NotifyService.
2026-08-15 16:42:30 +08:00
ryan
a07963e150
feat: enhance Safew chat handling and testing
...
- Updated `GroupsFromUpdates` function to return the number of updates processed, improving the polling mechanism.
- Added a new test `TestGroupsFromUpdatesCallbackAndJoinRequest` to validate handling of callback queries and join requests.
- Introduced `safewAllowedUpdates` to specify allowed update types in the polling request, enhancing chat management.
- Implemented `ensureWebhookCleared` method to manage webhook state before polling, improving reliability.
2026-08-15 01:56:12 +08:00
ryan
2000908bac
feat: enhance Safew watcher initialization and token management
...
- Added functionality to list and start Safew tokens in the main server function, ensuring proper initialization of the Safew watcher.
- Introduced `ensureSafewWatcher` method in the ChannelHandler to manage Safew tokens during channel creation and updates.
- Implemented `StartTokens` method in the Watcher to handle multiple tokens efficiently.
- Enhanced error handling and logging for Safew watcher operations to improve observability.
2026-08-15 01:28:51 +08:00
ryan
5e783adf7a
feat: implement chat merging and logging in Safew
...
- Introduced a new function `mergeAndLog` in the Watcher to handle merging Safew chats and logging newly discovered chats.
- Added a test `TestNewSafewChatsSkipsKnownIDs` to ensure that known chat IDs are skipped during the merging process.
- Enhanced the polling mechanism to improve chat management and reduce duplicates.
2026-08-15 01:10:35 +08:00
ryan
e369f398d8
feat: enhance Safew error handling and polling mechanism
...
- Added error_msg field to safewAPIResponse for better error descriptions.
- Updated safewErrorDescription function to include error_msg in the output.
- Introduced a new test to verify that error messages are included in Safew error descriptions.
- Improved the polling mechanism in the Watcher to handle conflicts and ensure no overlapping polls occur.
2026-08-15 01:07:01 +08:00
ryan
bd8a9ff96d
feat: 增加 SafeW 已监控群列表接口
...
通过 getUpdates 将群写入 Redis,供创建/编辑渠道时选择 chat_id,避免前端重复传递 token。
2026-08-15 00:40:40 +08:00
ryan
0d0cd0c510
feat: 新增 SafeW 出站通知渠道
...
通过 Bot API sendMessage 投递渲染后的通知,MarkdownV2 自动转义标题与正文。
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-14 00:58:44 +08:00
ryan
39f3774940
feat: 配置列表分页与钉钉机器人分钟级排队限流
...
统一 sources/templates/channels/rules 列表为分页响应,避免配置增多时全量返回;按钉钉 access_token 限制每分钟发送并在超限时等待下一分钟,降低触发官方封禁风险。
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-10 00:34:26 +08:00
ryan
009694fee7
build(Docker构建): 限制构建阶段内存与并行度,防止低配环境 OOM
...
Motivation:
在 1Panel 等资源受限的部署环境中,Go 编译器并发编译和运行时内存增长可能导致构建阶段 OOM 而被 kill,通过限制并行度和设置内存上限来规避该问题。
Changes:
* 构建阶段新增 GOMEMLIMIT=512MiB 环境变量,控制 Go 运行时内存上限
* 编译命令新增 -p 1 参数,限制并行编译单元数量以减少峰值内存占用
* 构建命令参数按职责拆分为多行,提升可读性
2026-07-31 23:28:02 +08:00
ryan
c74bab3033
fix(数据存储): 确保列表查询返回空数组而非 null,并补充 HTTPie/Postman API 文档
...
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 使用,包含环境变量配置
2026-07-31 22:09:39 +08:00
ryan
34fb0f62b9
build
2026-07-31 18:01:15 +08:00
ryan
af9731f831
build
2026-07-31 17:52:26 +08:00
ryan
cecf8e72f5
fix(邮件发送): 适配 MailerSend SMTP 并迁移基础设施至 1Panel
...
Motivation:
将通知服务部署到 1Panel 生产环境,集成 MailerSend 邮件服务,修复 SMTP 协议中 MAIL FROM 命令因携带显示名而导致的发送失败问题。
Changes:
* 修复 SMTP MAIL FROM 命令传入带显示名的完整地址导致发送失败的问题,新增 extractEmailAddr 提取裸地址
* 更新 SMTP 配置为 MailerSend 真实凭证,From 地址适配其域名验证要求
* 移除 docker-compose 中内置的 MySQL/Redis 服务,改为依赖外部 1Panel 基础设施
* 更新环境变量为生产环境实际凭据
2026-07-31 17:28:35 +08:00
ryan
6e69f6cdc3
build: 配置信息
2026-07-31 15:44:06 +08:00
ryan
befb099b91
feat: add comprehensive README documentation for AIAA Notification Service, detailing core concepts, setup instructions, API endpoints, and configuration options
2026-07-31 00:54:03 +08:00
ryan
a0d26fa3a3
refactor: rename database tables for notification entities to improve clarity and consistency
2026-07-02 16:04:18 +08:00
ryan
c5225d8c97
feat: add Logbull remote logging via slog handler, tee to stdout
2026-06-27 15:17:59 +08:00
ryan
835b92ec00
fix: wire retry into router, fix Docker config path, fix condition error handling, remove dead code
2026-06-27 13:32:33 +08:00
ryan
062014773c
fix: remove compiled binary, update gitignore
2026-06-27 13:29:33 +08:00
ryan
fa7f7490f5
feat: main assembly — wire all components, gin router, graceful shutdown
2026-06-27 13:28:27 +08:00
ryan
2271a54139
feat: retry mechanism with exponential backoff
2026-06-27 13:26:13 +08:00
ryan
8e0c95edd9
feat: rule CRUD with enable/disable and message log query
2026-06-27 13:23:37 +08:00
ryan
682ca3df81
feat: management handlers — source, template, channel CRUD
2026-06-27 13:23:10 +08:00
ryan
2cf6601be0
feat: notify handler — parse, match, evaluate, render, route
2026-06-27 13:22:14 +08:00
ryan
127cf12656
feat: auth and rate limit middleware
2026-06-27 13:20:56 +08:00
ryan
83c4166f0c
feat: engine — template renderer, rule matcher, channel router
2026-06-27 13:19:15 +08:00
ryan
49b2384cf7
feat: email adapter with SMTP TLS support
2026-06-27 13:17:32 +08:00