diff --git a/BackendAcademy/src/chat/chat.controller.ts b/BackendAcademy/src/chat/chat.controller.ts new file mode 100644 index 000000000..aa531d68d --- /dev/null +++ b/BackendAcademy/src/chat/chat.controller.ts @@ -0,0 +1,34 @@ +import { Controller, Get, Post, Body, Param } from '@nestjs/common'; +import { ChatService } from './chat.service'; +import { CreateMessageDto } from './dto/create-message.dto'; +import { CreateRoomDto } from './dto/create-room.dto'; + +@Controller('chat') +export class ChatController { + constructor(private readonly chatService: ChatService) {} + + @Post('rooms') + createRoom(@Body() createRoomDto: CreateRoomDto) { + return this.chatService.createRoom(createRoomDto); + } + + @Get('rooms') + findAllRooms() { + return this.chatService.findAllRooms(); + } + + @Get('rooms/:roomId') + findRoom(@Param('roomId') roomId: string) { + return this.chatService.findRoomById(roomId); + } + + @Post('messages') + createMessage(@Body() createMessageDto: CreateMessageDto) { + return this.chatService.createMessage(createMessageDto); + } + + @Get('rooms/:roomId/messages') + findMessagesByRoom(@Param('roomId') roomId: string) { + return this.chatService.findMessagesByRoom(roomId); + } +} diff --git a/BackendAcademy/src/chat/chat.module.ts b/BackendAcademy/src/chat/chat.module.ts new file mode 100644 index 000000000..57e6ddcf2 --- /dev/null +++ b/BackendAcademy/src/chat/chat.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { ChatController } from './chat.controller'; +import { ChatService } from './chat.service'; + +@Module({ + controllers: [ChatController], + providers: [ChatService], + exports: [ChatService], +}) +export class ChatModule {} diff --git a/BackendAcademy/src/chat/chat.service.ts b/BackendAcademy/src/chat/chat.service.ts new file mode 100644 index 000000000..8dd3d4b25 --- /dev/null +++ b/BackendAcademy/src/chat/chat.service.ts @@ -0,0 +1,42 @@ +import { Injectable } from '@nestjs/common'; +import { ChatRoom, Message } from './interfaces/chat.interface'; +import { CreateMessageDto } from './dto/create-message.dto'; +import { CreateRoomDto } from './dto/create-room.dto'; + +@Injectable() +export class ChatService { + private rooms: ChatRoom[] = []; + private messages: Message[] = []; + + createRoom(createRoomDto: CreateRoomDto): ChatRoom { + const newRoom: ChatRoom = { + id: Math.random().toString(36).substring(2, 9), + ...createRoomDto, + createdAt: new Date(), + }; + this.rooms.push(newRoom); + return newRoom; + } + + findAllRooms(): ChatRoom[] { + return this.rooms; + } + + findRoomById(roomId: string): ChatRoom | undefined { + return this.rooms.find(r => r.id === roomId); + } + + createMessage(createMessageDto: CreateMessageDto): Message { + const newMessage: Message = { + id: Math.random().toString(36).substring(2, 9), + ...createMessageDto, + createdAt: new Date(), + }; + this.messages.push(newMessage); + return newMessage; + } + + findMessagesByRoom(roomId: string): Message[] { + return this.messages.filter(m => m.roomId === roomId); + } +} diff --git a/BackendAcademy/src/chat/dto/create-message.dto.ts b/BackendAcademy/src/chat/dto/create-message.dto.ts new file mode 100644 index 000000000..4f43f41d8 --- /dev/null +++ b/BackendAcademy/src/chat/dto/create-message.dto.ts @@ -0,0 +1,5 @@ +export class CreateMessageDto { + roomId: string; + senderId: string; + content: string; +} diff --git a/BackendAcademy/src/chat/dto/create-room.dto.ts b/BackendAcademy/src/chat/dto/create-room.dto.ts new file mode 100644 index 000000000..fd3b91eb6 --- /dev/null +++ b/BackendAcademy/src/chat/dto/create-room.dto.ts @@ -0,0 +1,5 @@ +export class CreateRoomDto { + name?: string; + type: 'direct' | 'room'; + participants: string[]; +} diff --git a/BackendAcademy/src/chat/interfaces/chat.interface.ts b/BackendAcademy/src/chat/interfaces/chat.interface.ts new file mode 100644 index 000000000..4a19ea462 --- /dev/null +++ b/BackendAcademy/src/chat/interfaces/chat.interface.ts @@ -0,0 +1,17 @@ +export type ChatType = 'direct' | 'room'; + +export interface ChatRoom { + id: string; + name?: string; + type: ChatType; + participants: string[]; + createdAt: Date; +} + +export interface Message { + id: string; + roomId: string; + senderId: string; + content: string; + createdAt: Date; +}