Spaces:
Sleeping
Sleeping
| import { | |
| Controller, | |
| Get, | |
| Post, | |
| Patch, | |
| Delete, | |
| Body, | |
| Param, | |
| Query, | |
| UseGuards, | |
| Request, | |
| HttpCode, | |
| HttpStatus, | |
| ParseUUIDPipe, | |
| } from '@nestjs/common'; | |
| import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; | |
| import { MessagesService } from './messages.service'; | |
| import { RedisService } from '../../redis/redis.service'; | |
| import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard'; | |
| import { | |
| CreateMessageDto, | |
| UpdateMessageDto, | |
| AddReactionDto, | |
| QueryMessagesDto, | |
| } from './dto'; | |
| interface RequestWithUser extends Request { | |
| user: { | |
| id: string; | |
| email: string; | |
| }; | |
| } | |
| ('Messages') | |
| (JwtAuthGuard) | |
| () | |
| () | |
| export class MessagesController { | |
| constructor( | |
| private readonly messagesService: MessagesService, | |
| private readonly redisService: RedisService, | |
| ) {} | |
| /** | |
| * POST /rooms/:roomId/messages | |
| * Send a message to a room | |
| */ | |
| ('rooms/:roomId/messages') | |
| (HttpStatus.CREATED) | |
| async createMessage( | |
| ('roomId') roomId: string, | |
| () dto: CreateMessageDto, | |
| () req: RequestWithUser, | |
| ): Promise<any> { | |
| const message = await this.messagesService.createMessage( | |
| roomId, | |
| req.user.id, | |
| dto, | |
| ); | |
| return { | |
| success: true, | |
| data: message, | |
| }; | |
| } | |
| /** | |
| * GET /rooms/:roomId/messages | |
| * Get messages in a room | |
| */ | |
| ('rooms/:roomId/messages') | |
| (HttpStatus.OK) | |
| async getRoomMessages( | |
| ('roomId') roomId: string, | |
| () query: QueryMessagesDto, | |
| () req: RequestWithUser, | |
| ): Promise<any> { | |
| const result = await this.messagesService.getRoomMessages( | |
| roomId, | |
| req.user.id, | |
| query, | |
| ); | |
| return { | |
| success: true, | |
| data: result.messages, | |
| meta: { | |
| total: result.total, | |
| hasMore: result.hasMore, | |
| page: query.page || 1, | |
| limit: query.limit || 20, | |
| }, | |
| }; | |
| } | |
| /** | |
| * GET /messages/:messageId | |
| * Get a specific message | |
| */ | |
| ('messages/:messageId') | |
| (HttpStatus.OK) | |
| async getMessage( | |
| ('messageId', ParseUUIDPipe) messageId: string, | |
| () req: RequestWithUser, | |
| ): Promise<any> { | |
| const message = await this.messagesService.getMessageWithDetails( | |
| messageId, | |
| req.user.id, | |
| ); | |
| return { | |
| success: true, | |
| data: message, | |
| }; | |
| } | |
| /** | |
| * GET /messages/:messageId/read-receipts | |
| * Get read receipts for a message with timestamps and latency | |
| */ | |
| ('messages/:messageId/read-receipts') | |
| (HttpStatus.OK) | |
| async getMessageReadReceipts( | |
| ('messageId', ParseUUIDPipe) messageId: string, | |
| () req: RequestWithUser, | |
| ): Promise<any> { | |
| const latency = await this.messagesService.getRoomMessageReadLatency( | |
| messageId, | |
| req.user.id, | |
| ); | |
| return { | |
| success: true, | |
| data: latency, | |
| }; | |
| } | |
| /** | |
| * PATCH /messages/:messageId | |
| * Update a message | |
| */ | |
| ('messages/:messageId') | |
| (HttpStatus.OK) | |
| async updateMessage( | |
| ('messageId') messageId: string, | |
| () dto: UpdateMessageDto, | |
| () req: RequestWithUser, | |
| ): Promise<any> { | |
| const message = await this.messagesService.updateMessage( | |
| messageId, | |
| req.user.id, | |
| dto, | |
| ); | |
| return { | |
| success: true, | |
| data: message, | |
| }; | |
| } | |
| /** | |
| * DELETE /messages/:messageId | |
| * Delete a message (soft delete) | |
| */ | |
| ('messages/:messageId') | |
| (HttpStatus.OK) | |
| async deleteMessage( | |
| ('messageId') messageId: string, | |
| () req: RequestWithUser, | |
| ): Promise<any> { | |
| await this.messagesService.deleteMessage(messageId, req.user.id); | |
| return { | |
| success: true, | |
| message: 'Message deleted successfully', | |
| }; | |
| } | |
| /** | |
| * GET /messages/:messageId/thread | |
| * Get thread replies | |
| */ | |
| ('messages/:messageId/thread') | |
| (HttpStatus.OK) | |
| async getThreadReplies( | |
| ('messageId') messageId: string, | |
| () query: QueryMessagesDto, | |
| () req: RequestWithUser, | |
| ): Promise<any> { | |
| const result = await this.messagesService.getThreadReplies( | |
| messageId, | |
| req.user.id, | |
| query, | |
| ); | |
| return { | |
| success: true, | |
| data: result.messages, | |
| meta: { | |
| total: result.total, | |
| hasMore: result.hasMore, | |
| page: query.page || 1, | |
| limit: query.limit || 20, | |
| }, | |
| }; | |
| } | |
| /** | |
| * POST /messages/:messageId/pin | |
| * Pin a message | |
| */ | |
| ('messages/:messageId/pin') | |
| (HttpStatus.OK) | |
| async pinMessage( | |
| ('messageId') messageId: string, | |
| () req: RequestWithUser, | |
| ): Promise<any> { | |
| await this.messagesService.pinMessage(messageId, req.user.id); | |
| return { | |
| success: true, | |
| message: 'Message pinned successfully', | |
| }; | |
| } | |
| /** | |
| * DELETE /messages/:messageId/pin | |
| * Unpin a message | |
| */ | |
| ('messages/:messageId/pin') | |
| (HttpStatus.OK) | |
| async unpinMessage( | |
| ('messageId') messageId: string, | |
| () req: RequestWithUser, | |
| ): Promise<any> { | |
| await this.messagesService.unpinMessage(messageId, req.user.id); | |
| return { | |
| success: true, | |
| message: 'Message unpinned successfully', | |
| }; | |
| } | |
| /** | |
| * GET /rooms/:roomId/pins | |
| * Get pinned messages in a room | |
| */ | |
| ('rooms/:roomId/pins') | |
| (HttpStatus.OK) | |
| async getPinnedMessages( | |
| ('roomId') roomId: string, | |
| () req: RequestWithUser, | |
| ): Promise<any> { | |
| const messages = await this.messagesService.getPinnedMessages( | |
| roomId, | |
| req.user.id, | |
| ); | |
| return { | |
| success: true, | |
| data: messages, | |
| }; | |
| } | |
| /** | |
| * POST /messages/:messageId/reactions | |
| * Add reaction to a message | |
| */ | |
| ('messages/:messageId/reactions') | |
| (HttpStatus.CREATED) | |
| async addReaction( | |
| ('messageId') messageId: string, | |
| () dto: AddReactionDto, | |
| () req: RequestWithUser, | |
| ): Promise<any> { | |
| const reaction = await this.messagesService.addReaction( | |
| messageId, | |
| req.user.id, | |
| dto, | |
| ); | |
| return { | |
| success: true, | |
| data: reaction, | |
| }; | |
| } | |
| /** | |
| * DELETE /messages/:messageId/reactions/:emoji | |
| * Remove reaction from a message | |
| */ | |
| ('messages/:messageId/reactions/:emoji') | |
| (HttpStatus.OK) | |
| async removeReaction( | |
| ('messageId') messageId: string, | |
| ('emoji') emoji: string, | |
| () req: RequestWithUser, | |
| ): Promise<any> { | |
| await this.messagesService.removeReaction(messageId, req.user.id, emoji); | |
| return { | |
| success: true, | |
| message: 'Reaction removed successfully', | |
| }; | |
| } | |
| } | |