Skip to the content.

本地站内通知设计

使用方式和参数见组件 README。该后端以本地文件保存通知及已读时间,适用于由宿主管理私有目录的应用,不提供跨文件事务。

用户隔离与不可变写入

owner 目录名为其精确 UTF-8 标识的 SHA-256,不执行大小写、空白或 Unicode 合并。目录散列和随机通知 Id 只承担定位作用,权限仍由宿主从已验证身份检查。正文按纯文本保存,组件不渲染 HTML 或执行 ActionPath。

通知 JSON 为不可变文件,已读状态保存为另一份仅创建一次的 UTC 时间回执。两者复用 Core LocalFileStorage.WriteNewAsync 的完整写入与不覆盖发布。同一通知并发标已读保留第一个成功发布的回执,不改写通知正文或创建时间。写入期间的随机点前缀暂存文件不参与查询。目录须可信且稳定,由应用管理;不支持恶意本机进程替换文件,也不提供跨用户业务事务。

查询与资源预算

查询扫描 owner 下所有已发布的 JSON 通知,读取独立回执后按 CreatedAtUtc 和 Id 倒序分页,计算本次总数与未读数。它不维护第二份索引,因此查询成本随历史条目增长。并发发布或标已读不构成数据库快照,offset 翻页可能重复或跳过。目录未创建时返回空页,不创建目录。

发布在写入前校验单份编码大小;查询同时检查条目数、每份文件大小和累计实际读取字节,回执也计入累计预算。读取器按剩余额度读取,最多额外探测一个字节;超限报错,不返回截断后的计数。预算默认值见 README。组件不自动删除历史通知,保留期与离线清理由宿主安排。

失败与取消

方法读取调用方取消并沿用 Core 的原子写入规则。取消在发布之后发生不撤销已保存内容,调用方不得据取消盲目重复发布。读取缺失通知或为另一个 owner 标已读会失败;损坏数据会报告错误,不静默当作未读或空通知。SMTP 接口继续由原有实现提供,本组件通过项目引用复用 Core 文件写入,不引入新的服务项目。

测试覆盖重新创建实例后恢复通知与已读时间、同一 Id 的并发回执、多个 owner、分页排序、实际字节预算、损坏数据、取消以及临时文件排除。