diff --git a/backend/code/src/rooms/dto/change-owner.dto.ts b/backend/code/src/rooms/dto/change-owner.dto.ts index ea537f9..d95a09d 100644 --- a/backend/code/src/rooms/dto/change-owner.dto.ts +++ b/backend/code/src/rooms/dto/change-owner.dto.ts @@ -1,16 +1,13 @@ -// import { ApiProperty } from '@nestjs/swagger'; -import { - IsNotEmpty, - IsString, -} from 'class-validator'; +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; -export class ChangeOwnerDto{ - // @ApiProperty() - @IsNotEmpty() - @IsString() - roomId: string; - @IsNotEmpty() - @IsString() - NewOwnerId: string; - -} \ No newline at end of file +export class ChangeOwnerDto { + @ApiProperty() + @IsNotEmpty() + @IsString() + roomId: string; + @ApiProperty() + @IsNotEmpty() + @IsString() + NewOwnerId: string; +} diff --git a/backend/code/src/rooms/dto/set-admin.dto.ts b/backend/code/src/rooms/dto/set-admin.dto.ts new file mode 100644 index 0000000..6c9600c --- /dev/null +++ b/backend/code/src/rooms/dto/set-admin.dto.ts @@ -0,0 +1,13 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class SetAdminDto { + @ApiProperty() + @IsNotEmpty() + @IsString() + roomId: string; + @ApiProperty() + @IsNotEmpty() + @IsString() + newAdmin: string; +} diff --git a/backend/code/src/rooms/rooms.controller.ts b/backend/code/src/rooms/rooms.controller.ts index 76ef3d5..eb02b41 100644 --- a/backend/code/src/rooms/rooms.controller.ts +++ b/backend/code/src/rooms/rooms.controller.ts @@ -15,6 +15,7 @@ import { LeaveRoomDto } from './dto/leave-room.dto'; import { DeleteRoomDto } from './dto/delete-room.dto'; import { UpdateRoomDto } from './dto/update-room.dto'; import { ChangeOwnerDto } from './dto/change-owner.dto'; +import { SetAdminDto } from './dto/set-admin.dto'; import { ApiCookieAuth, ApiTags } from '@nestjs/swagger'; @ApiTags('rooms') @@ -77,7 +78,16 @@ export class RoomsController { async changeOwner( @Body() roomdata: ChangeOwnerDto, @GetCurrentUser('userId') userId: string, - ){ + ) { return await this.roomsService.changeOwner(roomdata, userId); } + @Post('setAdmin') + @HttpCode(HttpStatus.OK) + @UseGuards(AtGuard) + async setAdmin( + @Body() roomdata: SetAdminDto, + @GetCurrentUser('userId') userId: string, + ) { + return await this.roomsService.setAdmin(roomdata, userId); + } } diff --git a/backend/code/src/rooms/rooms.service.ts b/backend/code/src/rooms/rooms.service.ts index 7362fa9..c344dac 100644 --- a/backend/code/src/rooms/rooms.service.ts +++ b/backend/code/src/rooms/rooms.service.ts @@ -10,6 +10,7 @@ import { JoinRoomDto } from './dto/join-room.dto'; import { LeaveRoomDto } from './dto/leave-room.dto'; import { DeleteRoomDto } from './dto/delete-room.dto'; import { ChangeOwnerDto } from './dto/change-owner.dto'; +import { SetAdminDto } from './dto/set-admin.dto'; import * as bcrypt from 'bcrypt'; import { UpdateRoomDto } from './dto/update-room.dto'; @@ -125,17 +126,49 @@ export class RoomsService { }); } async changeOwner(roomData: ChangeOwnerDto, userId: string) { - const { ownerId } = await this.prisma.room.findUnique({ + const room = await this.prisma.room.findUnique({ where: { id: roomData.roomId }, select: { ownerId: true }, }); - if (ownerId !== userId) + const member = await this.prisma.roomMember.findUnique({ + where: { unique_user_room: { userId: userId, roomId: roomData.roomId } }, + select: { id: true }, + }); + if (room.ownerId !== userId) throw new UnauthorizedException('You are not the owner of this room'); - const updateRoomOwner = await this.prisma.room.update({ + if (!member) + throw new UnauthorizedException('new owner is not a member of this room'); + await this.prisma.room.update({ where: { id: roomData.roomId }, - data: { owner: { connect: { userId: roomData.NewOwnerId } } } + data: { owner: { connect: { userId: roomData.NewOwnerId } } }, }); - return { message: 'change roomOwner successfully' }; - } - + return { message: 'roomOwner changed successfully' }; + } + async setAdmin(roomData: SetAdminDto, userId: string) { + const room = await this.prisma.room.findUnique({ + where: { id: roomData.roomId }, + select: { ownerId: true }, + }); + const user = await this.prisma.roomMember.findUnique({ + where: { unique_user_room: { userId: userId, roomId: roomData.roomId } }, + select: { is_admin: true }, + }); + if (room.ownerId !== userId) + throw new UnauthorizedException('You are not the owner of this room'); + if (!user) + throw new UnauthorizedException('new admin is not a member of this room'); + if (user.is_admin || room.ownerId === roomData.newAdmin) + throw new UnauthorizedException( + 'new admin is already an admin of this room', + ); + return await this.prisma.roomMember.update({ + where: { + unique_user_room: { + userId: roomData.newAdmin, + roomId: roomData.roomId, + }, + }, + data: { is_admin: true }, + }); + } }