我们的小星球:配对、媒体与公开范围
两个人各自的一本手帐,配对后合并;媒体走鉴权代理,公开范围需要双方确认,解除配对保留 30 天快照。
我们的小星球是双人手帐,不是公开社交产品。两个人各自有一本上锁的本子,配对成功后合成一本;照片、语音、信和 milestone 都挂在同一个 space 下。哪一页公开,要两个人确认。
空间与配对
space 是权限和数据的边界:entries、media、milestones、eggs、screenings 都带 space_id,成员关系用 member_ids 表示。配对使用一次性码;解除配对不立即删除数据,而是写入 space_snapshots,保留 30 天。
重新配对时,member_ids 排序后完全一致才恢复快照。恢复会搬 entries、media、milestones、eggs、screenings、coin 表,合并标签和设置,删除墓碑;spaces 行本身不恢复。
媒体
Live Photo 拆成 HEIC + MOV,按 basename 配对;普通文件上限 5GB,HEIC 64MB。HEIC → JPEG 使用质量 0.92,sharp 限制在 2560×2560、JPEG 85;缩略图宽度 320/480/800/1280,WebP 75;视频封面用 ffmpeg 首帧,480 宽。
媒体对象存在 Garage S3,读取统一走 /api/media/[id] 鉴权代理,不暴露公网直链。SVG、HTML 等主动内容拒收;Range 请求由代理处理。
公开范围
spaces.public_enabled_at 是总开关,七个栏目范围放在 settings 的 guestHome…guestScreenings。发起人提交 proposal,另一个人调用 acceptPublicProposal() 确认;函数里 SELECT ... FOR UPDATE,禁止自己确认自己,一次写入七个范围标记。disablePublic() 是单方面的,任何一方都能立即关闭;改范围要重新走确认。
未公开时 /s/<门牌号> 只显示一页合着的本子。访客记录只保留 IP、设备、页面和时间。
边界
公开、撤回、冻结、清理是四条路径;公开只改变可见性,不自动删除数据。解除配对的快照保留 30 天,恢复要求成员集合完全一致。备份每天 04:00,KEEP_COUNT=1,要求至少 5GB,停应用后 mysqldump 加打包 Garage data/meta,恢复依赖季度人工演练。