- Shipped
- August 30, 2026 at 1:49 AM UTC
- Author
- Kamo
- Commit
- aed30b1
Three routes, and each refusal is a rule somebody has to be able to tell apart from an outage — so each carries its own code rather than a shared 4xx. DELETE **************** Members only, groups only, never yourself. The middle rule is the one worth stating: a two-person chat with one person removed is not a smaller chat, it is a conversation one side can no longer see and the other can still write into. The last one is not a restriction but an admission — leaving a chat needs its own confirmation and its own wording in the transcript, so this refuses rather than half-implementing it. Anyone in the room may remove anyone else, which is the symmetry of the add route: every participant could already have brought that person in, and a conversation whose only manager is its creator becomes unmanageable the moment that person leaves the company. Removal publishes MEMBER_REMOVED (so the removed member's own client can close the window) and the leave transit (so it does not read, to everyone still there, like somebody who simply went quiet). PATCH /sessions/{guid}/title. Group chats only: a direct conversation is named after the person you are talking to, and a name laid over the top hides the one fact the row exists to tell you. Shared, not private — everyone sees it, and SESSION_RENAMED carries the new name so open windows change without asking. The response is built into a LinkedHashMap rather than Map.of because a cleared name is null, and Map.of would have thrown on the way out of a call that had already succeeded. PUT /sessions/{guid}/favorite. The viewer's own opinion, so the only gate is having a membership row — and the 404 when there is none is a real case, not padding: a social conversation has no member rows at all. Refusing beats reporting a success the member finds gone on their next reload. The chat list carries isFavorite and title, and `favorites=true` answers every A favourites section that had to be paged into view would put a starred conversation straight back behind the scroll it was starred to escape. Requires kamo-shared-library at 2352064a and the two columns it documents.