Serve the executive channel

FeatureMediaService
Shipped
September 10, 2026 at 6:27 AM UTC
Author
Kamo
Commit
ed35629

A conversation with its own audience rule and no ticket machinery, following SystemBug's shape: its own package, its own controller, its own visibility, and MediaSession/MediaObj reused for everything underneath. Nothing had to be suppressed from the support queue because a chat with no ticket row never enters it. Eligibility (Exec2ExecEligibility) is a plain Member of the top-level org OR the owner of whatever org they are signed into — and "owner" is two facts, not one: the TeamMember flag AND orgs.user_id_owner, because the platform's own org is owned without its owner necessarily carrying the flag. The platform right gates only the KamoCRM side, and canOperate goes through SessionPlatformFacts, never AuthHelper.hasRight, which a bare GD flag bypasses. Each message carries name, org and official job title, resolved live from the author's member id — members is UNIQUE(ORG_ID, USER_ID), so that id already names, permanently, which organization somebody was writing from. Nothing is snapshotted onto the row. A plain Member has no job title at all, which is the normal case for exactly the population this serves, so the line degrades to two fields rather than trailing a separator. One conversation, two addresses (chat id and session guid), because the browser holds the guid — it is the composer's draft key, the unread key and the STOMP topic — while the row is keyed by id. Both resolve to the same row; neither is to be tidied away. Announcing a message fans out all three frames, not just the session topic: a topic only a mounted window subscribes to is how a badge fails to move until a page reload. The welcome's author is deliberately NOT joined to the session — the platform SYSTEM member is a real signing-in person, and joining them put every conversation on the deployment into that one human's unread snapshot. A second membership row for the same user carries their existing read pointer over. The unread rule is per MEMBER and this feature is the one place one USER holds several, so a fresh pointer counted everything they had written from their first organization as unread against themselves. Eligibility is wider than the greeting on purpose: an org owner gets the channel, but the Welcome Message is addressed, as specified, to kamocrm's own plain members. DDL is by hand (ddl-auto: none, InitializerService undeployed) and already applied to the cluster; **************** is the record.

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