- Shipped
- August 27, 2026 at 1:37 AM UTC
- Author
- kamo
- Commit
- f19ffbd
Two things a member asked for on the individual chat: an emoji anyone in the conversation can put on a single message, and the ability to fix a message you have already sent. MEDIA_OBJ_REACTIONS is one row per (message, member, emoji), not a count per emoji. Every question the product asks of a reaction is about WHO: the chip is a toggle, so it has to know whether the viewer is already in it, and its tooltip names who reacted. The unique constraint is what makes the toggle safe under a racing double-click. Editing keeps MediaObjMsg.message as the current body, stamps DATE_EDITED, and files the body it replaced in MEDIA_OBJ_MSG_EDITS. That table is the answer to why editing is NOT gated on "has anybody seen it" the way unsend is. Unsend makes read words vanish, so refusing it after the fact is what stops a conversation being rewritten behind a reader's back; a typo, on the other hand, is almost always noticed after somebody has read it, and the same gate would refuse corrections exactly when they are wanted. Disclosure pays for it instead — every reader is told the message was edited, and what it used to say is kept rather than overwritten. ChatMessageDto gains the fields both events ride on. That DTO is not documentation: the NATS to STOMP relay in MediaService deserializes into it and re-emits a fixed field list, so a field it does not declare never reaches a browser.