缺口
sys_inbox_message 行上没有任何 actor 列,因此任何客户端消费者都无法回答「这条消息是不是我自己的动作引起的」。
证据(读自 main 工作副本)
| 断言 |
读数 |
| 对象声明无 actor 列 |
packages/services/service-messaging/src/objects/inbox-message.object.ts — fields 为 id / user_id / notification_id / delivery_id / topic / title / body_md / severity / action_url / created_at |
| 写入侧也不带 |
packages/services/service-messaging/src/inbox-channel.ts 的 const row = {...}(约 198 行)逐字段构造,无 actor |
| REST 视图也不带 |
MessagingService.listInbox 映射出的 InboxNotificationView 只有 id/type/title/body/read/actionUrl/createdAt |
| actor 确实存在,但在上一层 |
sys_notification.actor_id(packages/platform-objects/src/audit/sys-notification.object.ts),由 notify 节点的 actorId 写入(packages/services/service-automation/src/builtin/notify-node.ts) |
| 那一层普通用户读不到 |
plugin-security 的默认权限集只授予 sys_inbox_message 与 sys_notification_receipt 的 allowRead,sys_notification 不在其中 |
⇒ actor 与收件箱行之间隔着一个 FK 跳,而跳到的对象对普通用户不可读。
影响 —— 一个已发卡的设计约束因此无法落地
objectui#7011(站内信到达提醒)明确要求:「自己触发的回执类消息不弹」,失败形态是「我刚提交,系统就通知我我提交了」。呈现层已实现并合入,但这一条做不了:行上没有可比对的 actor,凭空补一个消费端代理属于投机。
objectui 那边还有一条相反方向的既有裁定,值得一并知晓:objectui#5203 退休了 InboxNotification.actor_name,理由正是「sys_inbox_message 声明无 actor 列可供映射」,并留了两个 pin(一个类型 pin,一个产出行 key-set pin)禁止在没有列的情况下重新声明。⇒ 消费端不能先行,必须生产者先有列。
建议
在 L5 物化时把事件的 actor 抄到收件箱行上:
inbox-message.object.ts 增加 actor_id(与 sys_notification.actor_id 同语义,lookup sys_user);
inbox-channel.ts 的 row 构造带上它(通知事件已在手边,n.notificationId 就是从那条事件来的);
- 默认权限集里该列随
sys_inbox_message 的 allowRead 一起可读(它就是收件人自己的行)。
这样消费端只需一次纯本地比较 row.actor_id === currentUserId,不新增任何读。
被这条挡住的消费端跟进:objectui#7011 的后续单(见回链)。
关联:objectui#7011 · objectui#5203 · ADR-0030 L5
缺口
sys_inbox_message行上没有任何 actor 列,因此任何客户端消费者都无法回答「这条消息是不是我自己的动作引起的」。证据(读自
main工作副本)packages/services/service-messaging/src/objects/inbox-message.object.ts— fields 为id/user_id/notification_id/delivery_id/topic/title/body_md/severity/action_url/created_atpackages/services/service-messaging/src/inbox-channel.ts的const row = {...}(约 198 行)逐字段构造,无 actorMessagingService.listInbox映射出的InboxNotificationView只有id/type/title/body/read/actionUrl/createdAtsys_notification.actor_id(packages/platform-objects/src/audit/sys-notification.object.ts),由 notify 节点的actorId写入(packages/services/service-automation/src/builtin/notify-node.ts)plugin-security的默认权限集只授予sys_inbox_message与sys_notification_receipt的 allowRead,sys_notification不在其中⇒ actor 与收件箱行之间隔着一个 FK 跳,而跳到的对象对普通用户不可读。
影响 —— 一个已发卡的设计约束因此无法落地
objectui#7011(站内信到达提醒)明确要求:「自己触发的回执类消息不弹」,失败形态是「我刚提交,系统就通知我我提交了」。呈现层已实现并合入,但这一条做不了:行上没有可比对的 actor,凭空补一个消费端代理属于投机。
objectui 那边还有一条相反方向的既有裁定,值得一并知晓:objectui#5203 退休了
InboxNotification.actor_name,理由正是「sys_inbox_message声明无 actor 列可供映射」,并留了两个 pin(一个类型 pin,一个产出行 key-set pin)禁止在没有列的情况下重新声明。⇒ 消费端不能先行,必须生产者先有列。建议
在 L5 物化时把事件的 actor 抄到收件箱行上:
inbox-message.object.ts增加actor_id(与sys_notification.actor_id同语义,lookupsys_user);inbox-channel.ts的 row 构造带上它(通知事件已在手边,n.notificationId就是从那条事件来的);sys_inbox_message的 allowRead 一起可读(它就是收件人自己的行)。这样消费端只需一次纯本地比较
row.actor_id === currentUserId,不新增任何读。被这条挡住的消费端跟进:objectui#7011 的后续单(见回链)。
关联:objectui#7011 · objectui#5203 · ADR-0030 L5