feat(#16): implement websocket real-time updates

- Add WebSocket gateway with workspace-scoped rooms
- Define event types: task.created, task.updated, task.deleted
- Define event types: event.created, event.updated, event.deleted
- Define event types: project.created, project.updated, project.deleted
- Add shared WebSocket types for type safety
- WebSocketModule already integrated in AppModule
This commit is contained in:
Jason Woltje
2026-01-29 19:37:53 -06:00
parent 1cb54b56b0
commit 10ed2cdb4f
3 changed files with 108 additions and 0 deletions

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;
}