Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🚀 fix(rooms) : room 모듈 관련 피드백 작업 토글 구조, 입장관련 하나로 #14

Merged
merged 1 commit into from
Apr 16, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/apis/letter/dto/twoUserList.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Types } from 'mongoose';
import { UserIdDto } from 'src/common/dtos/UserId.dto';

export class TwoUserListDto {
constructor(user1: UserIdDto, user2: UserIdDto) {
this.userList.push(user1.userId);
this.userList.push(user2.userId);
}
userList: Types.ObjectId[];
}
2 changes: 1 addition & 1 deletion src/apis/letter/letter.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export class LetterService {
return;
}

async deleteLetterRooms() {
async leaveLetterRooms() {
return;
}

Expand Down
11 changes: 11 additions & 0 deletions src/apis/rooms/dto/FavoriteToggle.res.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsBoolean } from 'class-validator';

export class ResFavoriteToggleDto {
@ApiProperty({
example: true,
description: '최신값의 투르폴스 데이타받아서 최신화 시키셔유',
})
@IsBoolean()
iFavoritRoom: boolean;
}
11 changes: 11 additions & 0 deletions src/apis/rooms/dto/chatAlarmToggle.res.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsBoolean } from 'class-validator';

export class ResChatAlarmToggleDto {
@ApiProperty({
example: true,
description: '최신값의 투르폴스 데이타받아서 최신화 시키셔유',
})
@IsBoolean()
isChatAlarmOn: boolean;
}
8 changes: 8 additions & 0 deletions src/apis/rooms/dto/find-room.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,12 @@ export class FindRoomDto extends PickType(CoordinatesDto, [
@ApiProperty({ enum: FIND_ROOM_FILTER_TYPE })
@IsEnum(FIND_ROOM_FILTER_TYPE)
filter: FIND_ROOM_FILTER_TYPE;

@ApiProperty({
type: Number,
description: '미터단위 내 주변 몇m 까지 장소를 뽑아올지에 대한 반경정보',
example: 1000000,
})
@IsNumber()
radius: number;
}
3 changes: 2 additions & 1 deletion src/apis/rooms/dto/findOne-room.res.dto.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { ApiProperty, PickType } from '@nestjs/swagger';
import { Expose } from 'class-transformer';
import { Expose, plainToClass, plainToInstance } from 'class-transformer';
import { Types } from 'mongoose';
import { CATEGORY_TYPE } from 'src/common/consts/enum';

Expand All @@ -17,6 +17,7 @@ export class ResFindOneRoomDto {
this.iFavoriteRoom = iFavoriteRoom;
this.iAlarm = iAlarm;
this.userCount = room.userList.length;
this.userList = room.userList;
}
@ApiProperty()
_id: string;
Expand Down
73 changes: 28 additions & 45 deletions src/apis/rooms/rooms.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
UsePipes,
SerializeOptions,
UseGuards,
UseInterceptors,
} from '@nestjs/common';
import { RoomsService } from './rooms.service';
import { CreateRoomDto } from './dto/create-room.dto';
Expand All @@ -35,12 +36,15 @@ import { ResFindRoomDto } from './dto/find-room.res.dto copy';
import { ReqUser } from 'src/common/decorators/user.decorator';
import { User } from 'src/models/user.model';
import { JwtAuthGuard } from 'src/auth/guards/jwt.guard';
import { SuccessInterceptor } from 'src/common/interceptors/sucess.interceptor';
import { ResChatAlarmToggleDto } from './dto/chatAlarmToggle.res.dto';
import { ResFavoriteToggleDto } from './dto/FavoriteToggle.res.dto';

@ApiTags('rooms')
@Controller('rooms')
@ApiBearerAuth()
@UseGuards(JwtAuthGuard)
// TODO : 나중에 가드오면 가드달아야함 이찬진 4월 14일
@UseInterceptors(SuccessInterceptor)
export class RoomsController {
constructor(private readonly roomsService: RoomsService) {}

Expand Down Expand Up @@ -93,26 +97,7 @@ export class RoomsController {
// 경도lng 위도lat
return this.roomsService.getPopularRooms();
}

@ApiOperation({
summary:
'(채팅방용)이미들어간 채팅창에 들어갈때만 사용, 룸의 세부정보를 볼수있음, 유저 목록과 함께, ',
})
@ApiResponse({
status: 200,
description: '요청 성공시',
type: ResFindOneRoomDto,
})
@Get(':roomId')
getMyChatRoomInfo(@Param() roomId: RoomIdDto, @ReqUser() user: User) {
//, @ReqUser() user: User
// 알람정보 리턴필요함
console.log(roomId);
return this.roomsService.findOneRoomById(roomId, new UserIdDto(user._id));
}

// TODO : user id field 가드 통해서 받아와야함 지금은 바디로
@ApiOperation({ summary: '유저가 채팅방에 입장할 때' })
@ApiOperation({ summary: '유저가 채팅방에 입장할 때 ( 모든 경우 사용)' })
@Post(':roomId/join')
joinRoom(@Param() roomId: RoomIdDto, @ReqUser() user: User) {
// 조인 룸시에 다른 룸에서 자동으로 나가져야함
Expand All @@ -126,39 +111,37 @@ export class RoomsController {
return this.roomsService.pullUserFromRoom(roomId, new UserIdDto(user._id));
}

@ApiOperation({ summary: '유저가 룸을 즐겨찾기한다' })
@Post(':roomId/favorite')
pushRoomToUserFavoriteList(
@Param() roomId: RoomIdDto,
@ReqUser() user: User,
) {
return this.roomsService.pushRoomToUserFavoriteList(
roomId,
new UserIdDto(user._id),
);
}

@ApiOperation({ summary: '유저가 룸을 즐겨찾기에서 뺀다' })
@Delete(':roomId/favorite')
pullRoomToUserFavoriteList(
@ApiOperation({ summary: '유저가 룸을 즐겨찾기에서 빼고넣는다' })
@ApiResponse({
status: 200,
description: '요청 성공시',
type: ResFavoriteToggleDto,
})
@Patch(':roomId/favorite')
toggleRoomToUserFavoriteList(
@Param() roomId: RoomIdDto,
@ReqUser() user: User,
) {
return this.roomsService.pullRoomToUserFavoriteList(
return this.roomsService.toggleRoomToUserFavoriteList(
roomId,
new UserIdDto(user._id),
);
}

@ApiOperation({ summary: '유저가 채팅 알림을 킨다' })
@Post(':roomId/alarm')
@ApiOperation({ summary: '유저가 채팅 알림을 키고 끈다' })
@Patch(':roomId/alarm')
@ApiResponse({
status: 200,
description: '요청 성공시',
type: ResChatAlarmToggleDto,
})
turnOnChatAlarm(@Param() roomId: RoomIdDto, @ReqUser() user: User) {
return this.roomsService.turnOnChatAlarm(new UserIdDto(user._id));
return this.roomsService.toggleChatAlarm(new UserIdDto(user._id));
}

@ApiOperation({ summary: '유저가 채팅 알림을 끈다' })
@Delete(':roomId/alarm')
turnOffChatAlarm(@Param() roomId: RoomIdDto, @ReqUser() user: User) {
return this.roomsService.turnOffChatAlarm(new UserIdDto(user._id));
}
// @ApiOperation({ summary: '유저가 채팅 알림을 끈다' })
// @Delete(':roomId/alarm')
// turnOffChatAlarm(@Param() roomId: RoomIdDto, @ReqUser() user: User) {
// return this.roomsService.turnOffChatAlarm(new UserIdDto(user._id));
// }
}
113 changes: 75 additions & 38 deletions src/apis/rooms/rooms.service.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { BadRequestException, Injectable, Type } from '@nestjs/common';
import { plainToInstance } from 'class-transformer';
import { ObjectId, Types } from 'mongoose';
import { CATEGORY_TYPE, FIND_ROOM_FILTER_TYPE } from 'src/common/consts/enum';
import { MongoId } from 'src/common/dtos/MongoId.dto';
Expand All @@ -8,7 +9,9 @@ import { Room } from 'src/models/room.model';
import { User } from 'src/models/user.model';
import { RoomRepository } from 'src/repositories/room.repository';
import { UserRepository } from 'src/repositories/user.repository';
import { ResChatAlarmToggleDto } from './dto/chatAlarmToggle.res.dto';
import { CreateRoomDto } from './dto/create-room.dto';
import { ResFavoriteToggleDto } from './dto/FavoriteToggle.res.dto';
import { FindRoomDto } from './dto/find-room.dto';
import { ResFindRoomDto } from './dto/find-room.res.dto copy';
import { ResFindOneRoomDto } from './dto/findOne-room.res.dto';
Expand Down Expand Up @@ -80,27 +83,37 @@ export class RoomsService {
async addUserToRoom(
roomIdDto: RoomIdDto,
userIdDto: UserIdDto,
): Promise<Room> {
): Promise<ResFindOneRoomDto> {
// 이전 룸에서 빼주는 로직 추가해야함
const user = await this.userRepository.findOneByUserId(userIdDto.userId);
// 유저가현재 들어가있는 방이있으면
// safe 어프로치 populate 안때려도 가상으로 데려감 몽고디비 Document 형식이면
// console.log(typeof roomIdDto.roomId, roomIdDto.roomId, user.myRoom._id);

if (user.myRoom) {
// 유저가 들어간 채팅방이 있을경우
if (roomIdDto.roomId.equals(user.myRoom._id)) {
// 룸이 같을경우
throw new BadRequestException('같은 룸 입장 시도');
// 룸이 같을경우 룸의 정보를 리턴
const isFavoritRoom = user.favoriteRoomList.includes(user.myRoom._id);
const room = await this.roomRepository.findOneByRoomId(roomIdDto);
return new ResFindOneRoomDto(room, isFavoritRoom, user.chatAlarm);
} else {
// 다른 룸일 경우 다른룸에서 해당 유저를 빼줌
await this.roomRepository.pullUserFromRoom(
new RoomIdDto(user.myRoom._id),
userIdDto,
);
}
// 다른 룸일 경우 다른룸에서 해당 유저를 빼줌
await this.roomRepository.pullUserFromRoom(
new RoomIdDto(user.myRoom._id),
userIdDto,
);
}
// 룸에 새로 들어갈때,,,?
await this.userRepository.setMyRoom(userIdDto, roomIdDto);
await this.userRepository.turnOnChatAlarm(userIdDto);
return await this.roomRepository.addUserToRoom(roomIdDto, userIdDto);
const room = await this.roomRepository.addUserToRoom(roomIdDto, userIdDto);
//check
const isFavoritRoom = user.favoriteRoomList.includes(room._id);
console.log('new room', isFavoritRoom);

return new ResFindOneRoomDto(room, isFavoritRoom, true);
}

async pullUserFromRoom(
Expand All @@ -111,34 +124,58 @@ export class RoomsService {
return await this.roomRepository.pullUserFromRoom(roomIdDto, userIdDto);
}

async pushRoomToUserFavoriteList(roomIdDto: RoomIdDto, userIdDto: UserIdDto) {
console.log(await this.roomRepository.isRoomExist(roomIdDto));
if (!(await this.roomRepository.isRoomExist(roomIdDto))) {
throw new BadRequestException('Room does not exist');
}
return this.userRepository.pushRoomToFavoriteList(userIdDto, roomIdDto);
}
async pullRoomToUserFavoriteList(roomIdDto: RoomIdDto, userIdDto: UserIdDto) {
return this.userRepository.pullRoomToFavoriteList(userIdDto, roomIdDto);
}
private isObjectIdArray(arg: any): arg is Types.ObjectId[] {
return true;
}
// async pushRoomToUserFavoriteList(roomIdDto: RoomIdDto, userIdDto: UserIdDto) {
// console.log(await this.roomRepository.isRoomExist(roomIdDto));
// }
// async pullRoomToUserFavoriteList(roomIdDto: RoomIdDto, userIdDto: UserIdDto) {
// return this.userRepository.pullRoomToFavoriteList(userIdDto, roomIdDto);
// }

async findOneRoomById(roomIdDto: RoomIdDto, userIdDto: UserIdDto) {
async toggleRoomToUserFavoriteList(
roomIdDto: RoomIdDto,
userIdDto: UserIdDto,
): Promise<ResFavoriteToggleDto> {
const user = await this.userRepository.findOneByUserId(userIdDto.userId);
let isUserFavoritRoom = false;
if (!user.myRoom._id.equals(roomIdDto.roomId)) {
throw new BadRequestException('유저가 들어간 방이 아닙니다.');
}
if (this.isObjectIdArray(user.favoriteRoomList)) {
isUserFavoritRoom = user.favoriteRoomList.includes(roomIdDto.roomId);
const isFavoritRoom = user.favoriteRoomList.find((room) =>
roomIdDto.roomId.equals(room._id),
);
console.log('asdfasdf', isFavoritRoom);
let iFavoritRoom: boolean;
if (isFavoritRoom) {
//내가 이미 즐겨찾기해놨으면
iFavoritRoom = await this.userRepository.pullRoomToFavoriteList(
userIdDto,
roomIdDto,
);
} else {
// 즐겨찾기 안해놨으면
if (!(await this.roomRepository.isRoomExist(roomIdDto))) {
throw new BadRequestException('Room does not exist');
}
iFavoritRoom = await this.userRepository.pushRoomToFavoriteList(
userIdDto,
roomIdDto,
);
}
const room = await this.roomRepository.findOneByRoomId(roomIdDto);
const send = new ResFindOneRoomDto(room, isUserFavoritRoom, user.chatAlarm);

return send;
return plainToInstance(ResFavoriteToggleDto, {
iFavoritRoom: iFavoritRoom,
});
}

// async findOneRoomById(roomIdDto: RoomIdDto, userIdDto: UserIdDto) {
// const user = await this.userRepository.findOneByUserId(userIdDto.userId);
// let isUserFavoritRoom = false;
// if (!user.myRoom._id.equals(roomIdDto.roomId)) {
// throw new BadRequestException('유저가 들어간 방이 아닙니다.');
// }
// if (this.isObjectIdArray(user.favoriteRoomList)) {
// isUserFavoritRoom = user.favoriteRoomList.includes(roomIdDto.roomId);
// }
// const room = await this.roomRepository.findOneByRoomId(roomIdDto);
// const send = new ResFindOneRoomDto(room, isUserFavoritRoom, user.chatAlarm);

// return send;
// }
async getMyRoomShortCutInfo(userId: UserIdDto) {
const roomInfo = await this.userRepository.getMyRoom(userId);
console.log(roomInfo);
Expand All @@ -150,12 +187,12 @@ export class RoomsService {
async getMyFavorite(userId: UserIdDto) {
return await this.userRepository.findMyFavoriteRooms(userId);
}
async turnOnChatAlarm(userId: UserIdDto) {
return await this.userRepository.turnOnChatAlarm(userId);
}
async toggleChatAlarm(userId: UserIdDto): Promise<ResChatAlarmToggleDto> {
const isChatAlarmOn = await this.userRepository.toggleChatAlarm(userId);

async turnOffChatAlarm(userId: UserIdDto) {
return await this.userRepository.turnOffChatAlarm(userId);
return plainToInstance(ResChatAlarmToggleDto, {
isChatAlarmOn: isChatAlarmOn,
});
}

async getPopularRooms() {
Expand Down
8 changes: 4 additions & 4 deletions src/common/dtos/LetterRoomId.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import { Transform } from 'class-transformer';
/**
* mongoId 용 DTO
*/
export class LetterRoomId {
constructor(letterRoom: string) {
this.letterRoom = Types.ObjectId(letterRoom);
export class LetterRoomIdDto {
constructor(letterRoomId: string) {
this.letterRoomId = Types.ObjectId(letterRoomId);
}

@ApiProperty({
Expand All @@ -20,5 +20,5 @@ export class LetterRoomId {
@IsNotEmpty()
@IsObjectId({ message: '쪽지방 아이디가 몽고아이디 형식이 아닙니다.' })
@Transform(({ value }) => Types.ObjectId(value))
letterRoom: Types.ObjectId;
letterRoomId: Types.ObjectId;
}
4 changes: 3 additions & 1 deletion src/common/dtos/UserProfile.dto.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { ApiProperty, PickType } from '@nestjs/swagger';
import { Expose } from 'class-transformer';
import { string } from 'joi';
import { Types } from 'mongoose';

Expand All @@ -9,5 +10,6 @@ export class UserProfileDto extends PickType(User, [
'profileUrl',
] as const) {
@ApiProperty({ type: string, example: '624c24cae25c551b68a6645c' })
_id: Types.ObjectId;
@Expose()
_id?: Types.ObjectId;
}
Loading