feat: presence on tickets
A ticket's page beats every 10 s (touchPresence / PUT
/issues/{issue}/presence, with whether I am editing) and gets back who
else is there, editing ones first. Entries live in Redis, one hash per
ticket, and fade after 30 s without a beat; leaving the page takes me out
at once. Only for people who can read the ticket; never in the event
store. The ticket shows «Bob está editando · Ana también lo está viendo»
above its title; editing means a ticket or comment form is open or a
comment is being written.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -197,6 +197,15 @@ export interface Issue extends IssueSummary {
|
||||
createdAt: string;
|
||||
}
|
||||
|
||||
/** Someone else on a ticket's page right now. */
|
||||
export interface Presence {
|
||||
user: UserRef;
|
||||
/** Editing the ticket or writing a comment. */
|
||||
editing: boolean;
|
||||
/** Last heartbeat. */
|
||||
at: string;
|
||||
}
|
||||
|
||||
/** A commit, branch or pull request that mentions a ticket. */
|
||||
export interface DevLink {
|
||||
kind: 'COMMIT' | 'BRANCH' | 'PULL_REQUEST';
|
||||
|
||||
@@ -25,6 +25,7 @@ import {
|
||||
Release,
|
||||
ReleaseBurnup,
|
||||
SavedFilter,
|
||||
Presence,
|
||||
MyView,
|
||||
MyViewCriteria,
|
||||
SavedFilterCriteria,
|
||||
@@ -430,3 +431,9 @@ export abstract class TrackerRealtimeGateway {
|
||||
*/
|
||||
abstract reconnects(): Observable<void>;
|
||||
}
|
||||
|
||||
/** Who is on a ticket's page: a heartbeat answers who else is. */
|
||||
export abstract class PresenceGateway {
|
||||
abstract touch(issueId: string, editing: boolean): Observable<Presence[]>;
|
||||
abstract leave(issueId: string): Observable<void>;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user