Skip to content

Commit

Permalink
Merge pull request #140 from platinouss/feature/231125-enter-room-api
Browse files Browse the repository at this point in the history
Feature: DBμ—μ„œ μ°Έμ—¬ μ½”λ“œ 관리 & κ°•μ˜μ‹€ μž…μž₯ μ‹œ ν•΄λ‹Ή μœ μ €μ˜ μˆ˜κ°•ν•œ κ°•μ˜ λͺ©λ‘μ— μΆ”κ°€
  • Loading branch information
tmddus2 authored Nov 26, 2023
2 parents 0587c48 + 11eb760 commit 79a1793
Show file tree
Hide file tree
Showing 9 changed files with 82 additions and 23 deletions.
1 change: 1 addition & 0 deletions backend/src/room/dto/create-room.dto.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export class CreateRoomDto {
email: string;
title: string;
description: string;
}
3 changes: 3 additions & 0 deletions backend/src/room/dto/enter-room.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export class EnterRoomDto {
email: string;
}
14 changes: 14 additions & 0 deletions backend/src/room/room-code.schema.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import mongoose from 'mongoose';
import { Lecture } from '../lecture/lecture.schema';

@Schema()
export class EnterCode {
@Prop({ required: true })
code: string;

@Prop({ type: mongoose.Schema.Types.ObjectId, ref: 'Lecture' })
lecture_id: Lecture;
}

export const EnterCodeSchema = SchemaFactory.createForClass(EnterCode);
26 changes: 21 additions & 5 deletions backend/src/room/room.controller.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,31 @@
import { Body, Controller, HttpStatus, Post, Res } from '@nestjs/common';
import { Body, Controller, HttpStatus, Param, Patch, Post, Res } from '@nestjs/common';
import { RoomService } from './room.service';
import { Response } from 'express';
import { CreateRoomDto } from './dto/create-room.dto';
import { EnterRoomDto } from './dto/enter-room.dto';
import { UserService } from '../user/user.service';

@Controller('/room')
export class RoomController {
constructor(private readonly roomService: RoomService) {}
constructor(
private readonly roomService: RoomService,
private readonly userService: UserService
) {}

@Post()
create(@Body() createRoomDto: CreateRoomDto, @Res() res: Response) {
this.roomService.createRoom(createRoomDto);
res.status(HttpStatus.CREATED).send({ code: this.roomService.generateRoomCode() });
async create(@Body() createRoomDto: CreateRoomDto, @Res() res: Response) {
const code = await this.roomService.createRoom(createRoomDto);
res.status(HttpStatus.CREATED).send({ code: code });
}

@Patch('/:code')
async enter(@Param('code') code: string, @Body() enterRoomDto: EnterRoomDto, @Res() res: Response) {
const enterCodeDocument = await this.roomService.findRoomByCode(code);
if (!enterCodeDocument) {
res.status(HttpStatus.NOT_FOUND).send();
return;
}
const result = await this.userService.updateLecture(enterRoomDto.email, enterCodeDocument.lecture_id);
res.status(HttpStatus.OK).send(result);
}
}
13 changes: 11 additions & 2 deletions backend/src/room/room.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,19 @@ import { RoomController } from './room.controller';
import { RoomService } from './room.service';
import { MongooseModule } from '@nestjs/mongoose';
import { Room, RoomSchema } from './room.schema';
import { EnterCode, EnterCodeSchema } from './room-code.schema';
import { UserService } from '../user/user.service';
import { User, UserSchema } from '../schema/user.schema';

@Module({
imports: [MongooseModule.forFeature([{ name: Room.name, schema: RoomSchema }])],
imports: [
MongooseModule.forFeature([
{ name: Room.name, schema: RoomSchema },
{ name: EnterCode.name, schema: EnterCodeSchema },
{ name: User.name, schema: UserSchema }
])
],
controllers: [RoomController],
providers: [RoomService]
providers: [RoomService, UserService]
})
export class RoomModule {}
36 changes: 24 additions & 12 deletions backend/src/room/room.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,40 @@ import { InjectModel } from '@nestjs/mongoose';
import { Room } from './room.schema';
import { Model } from 'mongoose';
import { CreateRoomDto } from './dto/create-room.dto';
import { EnterCode } from './room-code.schema';
import { UserService } from '../user/user.service';

@Injectable()
export class RoomService {
private readonly currentRoomCode;
constructor(
@InjectModel(Room.name)
private roomModel: Model<Room>,
@InjectModel(EnterCode.name)
private enterCodeModel: Model<EnterCode>,
private readonly userService: UserService
) {}

constructor(@InjectModel(Room.name) private roomModel: Model<Room>) {
// TODO: ν˜„μž¬ μ‚¬μš© 쀑인 λ°© μ½”λ“œλ₯Ό Redis 같은 κ³³μ—μ„œ 관리 ν•„μš”
this.currentRoomCode = new Set();
async createRoom(createRoomDto: CreateRoomDto) {
const user = await this.userService.findOneByEmail(createRoomDto.email);
const createdRoom = new this.roomModel({ ...createRoomDto, presenter_id: user.id });
const createdEnterCode = new this.enterCodeModel({
code: await this.generateRoomCode(),
lecture_id: createdRoom.id
});
await Promise.all([createdRoom.save(), createdEnterCode.save()]);
return createdEnterCode.code;
}

async createRoom(createRoomDto: CreateRoomDto): Promise<void> {
const createdRoom = new this.roomModel(createRoomDto);
await createdRoom.save();
}

generateRoomCode(): string {
async generateRoomCode() {
const generateUtils = new GenerateUtils();
let roomCode = generateUtils.generateRandomNumber();
while (this.currentRoomCode.has(roomCode)) {
while (await this.findRoomByCode(roomCode)) {
roomCode = generateUtils.generateRandomNumber();
}
this.currentRoomCode.add(roomCode);
return roomCode;
}

async findRoomByCode(code: string) {
return await this.enterCodeModel.findOne({ code: code });
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export class UsernameUpdateDto {
export class UserUpdateDto {
email: string;
username: string;
}
6 changes: 3 additions & 3 deletions backend/src/user/user.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Body, Controller, Get, HttpStatus, Post, Query, Res } from '@nestjs/com
import { Response } from 'express';
import { UserService } from './user.service';
import { UserInfoDto } from '../auth/dto/userInfo.dto';
import { UsernameUpdateDto } from './dto/username.update.dto';
import { UserUpdateDto } from './dto/user.update.dto';

@Controller('/profile')
export class UserController {
Expand All @@ -19,8 +19,8 @@ export class UserController {
}

@Post()
async changeUsername(@Body() usernameUpdateDto: UsernameUpdateDto, @Res() res: Response) {
const result = await this.userService.updateUsername(usernameUpdateDto);
async changeUsername(@Body() userUpdateDto: UserUpdateDto, @Res() res: Response) {
const result = await this.userService.updateUsername(userUpdateDto);
if (!result) {
res.status(HttpStatus.NOT_FOUND).send();
return;
Expand Down
4 changes: 4 additions & 0 deletions backend/src/user/user.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,8 @@ export class UserService {
async updateUsername({ email, username }) {
return await this.userModel.findOneAndUpdate({ email: email }, { username: username }, { new: true });
}

async updateLecture(email, lecture) {
return await this.userModel.findOneAndUpdate({ email: email }, { $push: { lecture_id: lecture } }, { new: true });
}
}

0 comments on commit 79a1793

Please sign in to comment.