/* ------------------------------------------------------------------ */ /* CQRS type definitions for the MetoYou electron main process. */ /* Commands mutate state; queries read state. */ /* ------------------------------------------------------------------ */ // --------------- Command types --------------- export const CommandType = { SaveMessage: 'save-message', DeleteMessage: 'delete-message', UpdateMessage: 'update-message', ClearRoomMessages: 'clear-room-messages', SaveReaction: 'save-reaction', RemoveReaction: 'remove-reaction', SaveUser: 'save-user', SetCurrentUserId: 'set-current-user-id', UpdateUser: 'update-user', SaveRoom: 'save-room', DeleteRoom: 'delete-room', UpdateRoom: 'update-room', SaveBan: 'save-ban', RemoveBan: 'remove-ban', SaveAttachment: 'save-attachment', DeleteAttachmentsForMessage: 'delete-attachments-for-message', ClearAllData: 'clear-all-data' } as const; export type CommandTypeKey = typeof CommandType[keyof typeof CommandType]; // --------------- Query types --------------- export const QueryType = { GetMessages: 'get-messages', GetMessageById: 'get-message-by-id', GetReactionsForMessage: 'get-reactions-for-message', GetUser: 'get-user', GetCurrentUser: 'get-current-user', GetUsersByRoom: 'get-users-by-room', GetRoom: 'get-room', GetAllRooms: 'get-all-rooms', GetBansForRoom: 'get-bans-for-room', IsUserBanned: 'is-user-banned', GetAttachmentsForMessage: 'get-attachments-for-message', GetAllAttachments: 'get-all-attachments' } as const; export type QueryTypeKey = typeof QueryType[keyof typeof QueryType]; // --------------- Payload interfaces --------------- export interface MessagePayload { id: string; roomId: string; channelId?: string; senderId: string; senderName: string; content: string; timestamp: number; editedAt?: number; reactions?: ReactionPayload[]; isDeleted?: boolean; replyToId?: string; } export interface ReactionPayload { id: string; messageId: string; oderId: string; userId: string; emoji: string; timestamp: number; } export interface UserPayload { id: string; oderId?: string; username?: string; displayName?: string; avatarUrl?: string; status?: string; role?: string; joinedAt?: number; peerId?: string; isOnline?: boolean; isAdmin?: boolean; isRoomOwner?: boolean; voiceState?: unknown; screenShareState?: unknown; } export interface RoomPayload { id: string; name: string; description?: string; topic?: string; hostId: string; password?: string; isPrivate?: boolean; createdAt: number; userCount?: number; maxUsers?: number; icon?: string; iconUpdatedAt?: number; permissions?: unknown; channels?: unknown[]; } export interface BanPayload { oderId: string; roomId: string; userId?: string; bannedBy: string; displayName?: string; reason?: string; expiresAt?: number; timestamp: number; } export interface AttachmentPayload { id: string; messageId: string; filename: string; size: number; mime: string; isImage?: boolean; uploaderPeerId?: string; filePath?: string; savedPath?: string; } // --------------- Command interfaces --------------- export interface SaveMessageCommand { type: typeof CommandType.SaveMessage; payload: { message: MessagePayload } } export interface DeleteMessageCommand { type: typeof CommandType.DeleteMessage; payload: { messageId: string } } export interface UpdateMessageCommand { type: typeof CommandType.UpdateMessage; payload: { messageId: string; updates: Partial } } export interface ClearRoomMessagesCommand { type: typeof CommandType.ClearRoomMessages; payload: { roomId: string } } export interface SaveReactionCommand { type: typeof CommandType.SaveReaction; payload: { reaction: ReactionPayload } } export interface RemoveReactionCommand { type: typeof CommandType.RemoveReaction; payload: { messageId: string; userId: string; emoji: string } } export interface SaveUserCommand { type: typeof CommandType.SaveUser; payload: { user: UserPayload } } export interface SetCurrentUserIdCommand { type: typeof CommandType.SetCurrentUserId; payload: { userId: string } } export interface UpdateUserCommand { type: typeof CommandType.UpdateUser; payload: { userId: string; updates: Partial } } export interface SaveRoomCommand { type: typeof CommandType.SaveRoom; payload: { room: RoomPayload } } export interface DeleteRoomCommand { type: typeof CommandType.DeleteRoom; payload: { roomId: string } } export interface UpdateRoomCommand { type: typeof CommandType.UpdateRoom; payload: { roomId: string; updates: Partial } } export interface SaveBanCommand { type: typeof CommandType.SaveBan; payload: { ban: BanPayload } } export interface RemoveBanCommand { type: typeof CommandType.RemoveBan; payload: { oderId: string } } export interface SaveAttachmentCommand { type: typeof CommandType.SaveAttachment; payload: { attachment: AttachmentPayload } } export interface DeleteAttachmentsForMessageCommand { type: typeof CommandType.DeleteAttachmentsForMessage; payload: { messageId: string } } export interface ClearAllDataCommand { type: typeof CommandType.ClearAllData; payload: Record } export type Command = | SaveMessageCommand | DeleteMessageCommand | UpdateMessageCommand | ClearRoomMessagesCommand | SaveReactionCommand | RemoveReactionCommand | SaveUserCommand | SetCurrentUserIdCommand | UpdateUserCommand | SaveRoomCommand | DeleteRoomCommand | UpdateRoomCommand | SaveBanCommand | RemoveBanCommand | SaveAttachmentCommand | DeleteAttachmentsForMessageCommand | ClearAllDataCommand; // --------------- Query interfaces --------------- export interface GetMessagesQuery { type: typeof QueryType.GetMessages; payload: { roomId: string; limit?: number; offset?: number } } export interface GetMessageByIdQuery { type: typeof QueryType.GetMessageById; payload: { messageId: string } } export interface GetReactionsForMessageQuery { type: typeof QueryType.GetReactionsForMessage; payload: { messageId: string } } export interface GetUserQuery { type: typeof QueryType.GetUser; payload: { userId: string } } export interface GetCurrentUserQuery { type: typeof QueryType.GetCurrentUser; payload: Record } export interface GetUsersByRoomQuery { type: typeof QueryType.GetUsersByRoom; payload: { roomId: string } } export interface GetRoomQuery { type: typeof QueryType.GetRoom; payload: { roomId: string } } export interface GetAllRoomsQuery { type: typeof QueryType.GetAllRooms; payload: Record } export interface GetBansForRoomQuery { type: typeof QueryType.GetBansForRoom; payload: { roomId: string } } export interface IsUserBannedQuery { type: typeof QueryType.IsUserBanned; payload: { userId: string; roomId: string } } export interface GetAttachmentsForMessageQuery { type: typeof QueryType.GetAttachmentsForMessage; payload: { messageId: string } } export interface GetAllAttachmentsQuery { type: typeof QueryType.GetAllAttachments; payload: Record } export type Query = | GetMessagesQuery | GetMessageByIdQuery | GetReactionsForMessageQuery | GetUserQuery | GetCurrentUserQuery | GetUsersByRoomQuery | GetRoomQuery | GetAllRoomsQuery | GetBansForRoomQuery | IsUserBannedQuery | GetAttachmentsForMessageQuery | GetAllAttachmentsQuery;