OptionalattachmentsOptionaleditedWhether the sender has rewritten this since sending it.
Derived, never stored — MessageRepository.findByConversation computes
updated_at > created_at in SQL, off the ON UPDATE CURRENT_TIMESTAMP the column
already carries. Optional because a freshly-sent row has never been edited and the
send path has no reason to say so.
Optionalexternal_Who sent this, when it was not a player (MICA-223): the label a resource gave
SendMessage -- a business name, or the number it registered. Null, and absent from the
wire, for a message a player wrote.
Whether the reader sent this. False for a text from a line, which arrives on their row.
Optionalreply_OptionalreplyThe Participant.id of the member who sent it, in this thread; null for a text from a line
and for a sender who has since left the thread.
Optionalstatus
photo_idon the way in,mediaon the way back.It used to be a bare base64 string, which made every attachment a photo by construction — a voice note or a GIF had nowhere to say what it was.
mediais a projection rather than the whole row for a reason that is not tidiness: a conversation is shared, so embedding the uploader'scitizenidwould hand it to every other participant. Same reasoning aspublicColumnson a public read (§10).