-
-
Notifications
You must be signed in to change notification settings - Fork 250
/
room.resolver.ts
103 lines (81 loc) · 2.4 KB
/
room.resolver.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import { Resolver, Mutation, Args, Query, Context } from '@nestjs/graphql'
import { getMongoRepository } from 'typeorm'
import { ForbiddenError } from 'apollo-server-core'
import { Room, User } from '@models'
import { CreateRoomInput } from '../generator/graphql.schema'
@Resolver('Room')
export class RoomResolver {
@Query(() => [Room])
async rooms(): Promise<Room[]> {
return getMongoRepository(Room).find({
cache: true,
})
}
@Query(() => Room)
async room(@Args('_id') _id: string): Promise<Room> {
const room = await getMongoRepository(Room).findOne({
_id,
})
if (!room) {
throw new ForbiddenError('Room not found.')
}
return getMongoRepository(Room).findOne({
_id,
})
}
@Mutation(() => Room)
async createRoom(
@Args('input') input: CreateRoomInput,
@Context('currentUser') currentUser: User
): Promise<Room> {
const { title, userIds } = input
if (userIds.length === 0) {
throw new ForbiddenError('Room must have at least 2 people.')
}
const existedUserIds = await getMongoRepository(User).find({
where: { _id: { $in: userIds, $ne: currentUser._id } },
})
if (userIds.length !== existedUserIds.length) {
throw new ForbiddenError('One of userIds is invalid.')
}
return await getMongoRepository(Room).save(
new Room({ title, users: [...existedUserIds, currentUser] })
)
}
@Mutation(() => Boolean)
async joinRoom(
@Args('_id') _id: string,
@Context('currentUser') currentUser: User
): Promise<boolean> {
const room = await getMongoRepository(Room).findOne({
_id,
})
if (!room) {
throw new ForbiddenError('Room not found.')
}
const rs = room.users.filter(item => item._id === currentUser._id)
if (rs.length > 0) {
throw new ForbiddenError('You joined the room.')
}
room.users = [...room.users, currentUser]
return getMongoRepository(Room).save(room) ? true : false
}
@Mutation(() => Boolean)
async leaveRoom(
@Args('_id') _id: string,
@Context('currentUser') currentUser: User
): Promise<boolean> {
const room = await getMongoRepository(Room).findOne({
_id,
})
if (!room) {
throw new ForbiddenError('Room not found.')
}
const rs = room.users.filter(item => item._id === currentUser._id)
if (rs.length === 0) {
throw new ForbiddenError('You are not in the room.')
}
room.users = room.users.filter(item => item._id !== currentUser._id)
return getMongoRepository(Room).save(room) ? true : false
}
}