feat(#16): Implement WebSocket real-time updates #106

Merged
jason.woltje merged 2 commits from feature/16-websocket into develop 2026-01-30 01:43:33 +00:00
3 changed files with 108 additions and 0 deletions
Showing only changes of commit 10ed2cdb4f - Show all commits

View File

@@ -135,6 +135,15 @@ export class WebSocketGateway implements OnGatewayConnection, OnGatewayDisconnec
this.logger.debug(`Emitted event:deleted to ${room}`);
}
/**
* Emit project:created event to workspace room
*/
emitProjectCreated(workspaceId: string, project: Project): void {
const room = this.getWorkspaceRoom(workspaceId);
this.server.to(room).emit('project:created', project);
this.logger.debug(`Emitted project:created to ${room}`);
}
/**
* Emit project:updated event to workspace room
*/
@@ -144,6 +153,15 @@ export class WebSocketGateway implements OnGatewayConnection, OnGatewayDisconnec
this.logger.debug(`Emitted project:updated to ${room}`);
}
/**
* Emit project:deleted event to workspace room
*/
emitProjectDeleted(workspaceId: string, projectId: string): void {
const room = this.getWorkspaceRoom(workspaceId);
this.server.to(room).emit('project:deleted', { id: projectId });
this.logger.debug(`Emitted project:deleted to ${room}`);
}
/**
* Get workspace room name
*/

View File

@@ -131,3 +131,6 @@ export * from "./auth.types";
// Export widget types
export * from "./widget.types";
// Export WebSocket types
export * from "./websocket.types";

View File

@@ -0,0 +1,87 @@
/**
* WebSocket event types for real-time updates
*/
/**
* All supported WebSocket event names
*/
export enum WebSocketEvent {
// Task events
TASK_CREATED = 'task:created',
TASK_UPDATED = 'task:updated',
TASK_DELETED = 'task:deleted',
// Event events
EVENT_CREATED = 'event:created',
EVENT_UPDATED = 'event:updated',
EVENT_DELETED = 'event:deleted',
// Project events
PROJECT_CREATED = 'project:created',
PROJECT_UPDATED = 'project:updated',
PROJECT_DELETED = 'project:deleted',
}
/**
* Base payload interface for all WebSocket events
*/
export interface BaseEventPayload {
id: string;
workspaceId: string;
}
/**
* Task payload for WebSocket events
*/
export interface TaskEventPayload extends BaseEventPayload {
title?: string;
status?: string;
priority?: string;
assigneeId?: string | null;
projectId?: string | null;
dueDate?: string | null;
[key: string]: unknown;
}
/**
* Event (calendar) payload for WebSocket events
*/
export interface CalendarEventPayload extends BaseEventPayload {
title?: string;
startTime?: string;
endTime?: string;
allDay?: boolean;
[key: string]: unknown;
}
/**
* Project payload for WebSocket events
*/
export interface ProjectEventPayload extends BaseEventPayload {
name?: string;
status?: string;
color?: string;
[key: string]: unknown;
}
/**
* Delete payload - only includes the entity ID
*/
export interface DeleteEventPayload {
id: string;
}
/**
* WebSocket event handler callbacks
*/
export interface WebSocketCallbacks {
onTaskCreated?: (task: TaskEventPayload) => void;
onTaskUpdated?: (task: TaskEventPayload) => void;
onTaskDeleted?: (payload: DeleteEventPayload) => void;
onEventCreated?: (event: CalendarEventPayload) => void;
onEventUpdated?: (event: CalendarEventPayload) => void;
onEventDeleted?: (payload: DeleteEventPayload) => void;
onProjectCreated?: (project: ProjectEventPayload) => void;
onProjectUpdated?: (project: ProjectEventPayload) => void;
onProjectDeleted?: (payload: DeleteEventPayload) => void;
}