Skip to content

messaging: sys_inbox_message 不带 actor,消费端无法识别「自己触发的回执」 #16974

Description

@os-justin

缺口

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.tsconst 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_messagesys_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 抄到收件箱行上:

  1. inbox-message.object.ts 增加 actor_id(与 sys_notification.actor_id 同语义,lookup sys_user);
  2. inbox-channel.ts 的 row 构造带上它(通知事件已在手边,n.notificationId 就是从那条事件来的);
  3. 默认权限集里该列随 sys_inbox_message 的 allowRead 一起可读(它就是收件人自己的行)。

这样消费端只需一次纯本地比较 row.actor_id === currentUserId,不新增任何读。

被这条挡住的消费端跟进:objectui#7011 的后续单(见回链)。

关联:objectui#7011 · objectui#5203 · ADR-0030 L5

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions