From 9f31efd762762b41e5d4934b41fcd8c4947fbc11 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 27 Jun 2026 12:28:05 +0100 Subject: [PATCH] feat: add chat module skeleton --- BackendAcademy/src/app.module.ts | 3 +- BackendAcademy/src/chat/chat.controller.ts | 34 +++++++++++++++ BackendAcademy/src/chat/chat.module.ts | 10 +++++ BackendAcademy/src/chat/chat.service.ts | 42 +++++++++++++++++++ .../src/chat/dto/create-message.dto.ts | 5 +++ .../src/chat/dto/create-room.dto.ts | 5 +++ .../src/chat/interfaces/chat.interface.ts | 17 ++++++++ 7 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 BackendAcademy/src/chat/chat.controller.ts create mode 100644 BackendAcademy/src/chat/chat.module.ts create mode 100644 BackendAcademy/src/chat/chat.service.ts create mode 100644 BackendAcademy/src/chat/dto/create-message.dto.ts create mode 100644 BackendAcademy/src/chat/dto/create-room.dto.ts create mode 100644 BackendAcademy/src/chat/interfaces/chat.interface.ts diff --git a/BackendAcademy/src/app.module.ts b/BackendAcademy/src/app.module.ts index 953c0c7dc..6878934e7 100644 --- a/BackendAcademy/src/app.module.ts +++ b/BackendAcademy/src/app.module.ts @@ -4,9 +4,10 @@ import { AppService } from './app.service'; import { TutorProfileModule } from './users/tutor-profile.module'; import { SubmissionModule } from './submissions/submission.module'; import { RewardsModule } from './rewards/rewards.module'; +import { ChatModule } from './chat/chat.module'; @Module({ - imports: [TutorProfileModule, SubmissionModule, RewardsModule], + imports: [TutorProfileModule, SubmissionModule, RewardsModule, ChatModule], controllers: [AppController], providers: [AppService], }) 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; +}