-
Notifications
You must be signed in to change notification settings - Fork 0
/
resolvers.js
116 lines (103 loc) · 2.68 KB
/
resolvers.js
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
104
105
106
107
108
109
110
111
112
113
114
115
116
const { PubSub, withFilter } = require('graphql-yoga');
const { User, Message } = require('./model');
const resolvers = {
Query: {
users: () => User.find(),
messages: () => Message.find(),
},
User: {
messages: async ({ email }) => {
return Message.find({ senderMail: email });
},
},
Message: {
users: async ({ senderMail }) => {
return User.find({ email: senderMail });
},
},
Mutation: {
createUser: async (_, { name, email }) => {
const user = new User({ name, email });
await user.save();
pubsub.publish('newUser', { newUser: user });
return user;
},
updateUser: async (_, { id, name }) => {
const user = await User.findOneAndUpdate(
{ _id: id },
{ name },
{ new: true }
);
return user;
},
deleteUser: async (_, { email }) => {
await Promise.all([
User.findOneAndDelete({ email: email }),
Message.deleteMany({ senderMail: email }),
]);
pubsub.publish('oldUser', { oldUser: email });
return true;
},
userTyping: (_, { email, receiverMail }) => {
pubsub.publish('userTyping', { userTyping: email, receiverMail });
return true;
},
createMessage: async (
_,
{ senderMail, receiverMail, message, timestamp }
) => {
const userText = new Message({
senderMail,
receiverMail,
message,
timestamp,
});
await userText.save();
pubsub.publish('newMessage', {
newMessage: userText,
receiverMail: receiverMail,
});
return userText;
},
updateMessage: async (_, { id, message }) => {
const userText = await Message.findOneAndUpdate(
{ _id: id },
{ message },
{ new: true }
);
return userText;
},
deleteMessage: async (_, { id }) => {
await Message.findOneAndDelete({ _id: id });
return true;
},
Subscription: {
newMessage: {
subscribe: withFilter(
() => pubsub.asyncIterator('newMessage'),
(payload, variables) => {
return payload.receiverMail === variables.receiverMail;
}
),
},
newUser: {
subscribe: (_, {}, { pubsub }) => {
return pubsub.asyncIterator('newUser');
},
},
oldUser: {
subscribe: (_, {}, { pubsub }) => {
return pubsub.asyncIterator('oldUser');
},
},
userTyping: {
subscribe: withFilter(
() => pubsub.asyncIterator('userTyping'),
(payload, variables) => {
return payload.receiverMail === variables.receiverMail;
}
),
},
},
},
};