- Ya
- 27 Agosti 2026, 01:40 UTC
- Mwandishi
- kamo
- Ahadi ya
- 615367f
POST **************** sets or clears the caller's emoji and answers with the message's whole reaction set, so a client that raced itself converges on the server's state instead of on its own guess. Reacting is treated as speaking: same session-membership check and same organization chat policy as sending, because a member who may not reply here may not answer with a 👍 either. The emoji itself is validated, not trusted. It is rendered verbatim under somebody else's message in everyone's conversation, so the gate is whitelist-shaped and structural: split on the zero-width joiner, no segment may hold more than one pictograph. That takes a family or a skin-toned profession and refuses 👍👍, which is two reactions typed as one, along with text, lone joiners and half a flag. PATCH /api/media/messages/{id} corrects a message. Deliberately NOT gated on whether anybody has read it, which is the one rule unsend does have — see the shared-library commit for why the two differ. It refuses a blank body on a message with no files (blanking a message is unsending it, which has its own rule), refuses a message already delivered to an external social platform (nothing here can reach that copy), drops the message's cached translations, and files what it used to say. Also: MESSAGE_DELETED and ATTACHMENT_REVOKED now carry `id` as well as `messageId`. The relay projects every frame through ChatMessageDto, which has no messageId field, so both events reached the browser with id: null and every subscriber discarded them — an unsent message stayed on the other side's screen until they reloaded. The relay's javadoc now says out loud that it is an allowlist, since that is what made a silent drop possible.