One conversation, many hands — join on open, name every message, re-open on a reply

FeatureMediaService
Shipped
August 12, 2026 at 10:17 PM UTC
Author
Kamo
Commit
a112e12

A support ticket is worked by whoever is helping, not only by whoever it is currently stamped with. Assignment decides who the work is offered to and whose list it shows up in; it was never meant to be a lock on the conversation. Opening a ticket now joins its media session. Before, an agent who opened a ticket from the queue that was not assigned to them could type into it — nothing rejected the message — but they were not a member of the session, so the conversation never appeared in their Chats -> Support, no reply ever reached them, and the requestor's "is my agent here" did not count them. They were talking into a room they were not in. Who may join is the same population that can already see the ticket in the queue: the people already in the conversation, plus ACCEPT_SUPPORT_TICKETS or MANAGE_SUPPORT in the assigned org. Everyone else is now refused — this endpoint previously served any ticket in the platform to any authenticated member who could guess a UUID, across organizations, and the join gate would have widened that from reading a stranger's conversation to being written into it. Every message now carries a name. senderName was read straight off Member.usernameAlias, an optional nickname that is unset on almost every member, so it serialized as null and the chat rendered messages with no attribution at all. That is worst in a support ticket, where more than one agent may be answering and the customer has no other way to tell who is talking to them. MemberDisplayNames — already used elsewhere in this controller — falls back to the real name. The same raw read was blanking assigned-agent names, ticket history actors, system-event actors, the agent-availability notice and the reporting table. A closed window no longer means a lost reply. The incoming-message notification carries the ticket id, so the client can raise the conversation it is telling you about, and /sessions/support/auto-open is the durable half for a reply that arrived while you were signed out — the message-side counterpart of assigned-unopened, which only ever covered work changing hands and so never fired for the person who asked for help. Tests: ChatListNativeAliasCaseTest pins the quoting of the feed queries' column aliases, which nothing else can catch — the failure mode is a silent null, not a type error or an exception. SupportAutoOpenHqlTest parses the new query against the real entity model, since Spring Data only validates a @Query at boot and this one lives in the shared library, where a typo takes down every service.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing