@roadmanjs/chat 0.0.63 → 0.0.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat/methods/ChatMessageResolver.methods.js +4 -3
- package/dist/chat/methods/ChatMessageResolver.methods.js.map +1 -1
- package/package.json +2 -1
- package/src/chat/fragments/README.md +1 -0
- package/src/chat/fragments/chatAttachment.fragment.ts +15 -0
- package/src/chat/fragments/chatConvo.fragment.ts +29 -0
- package/src/chat/fragments/chatMessage.fragment.ts +35 -0
- package/src/chat/fragments/chatUser.fragment.ts +23 -0
- package/src/chat/fragments/index.ts +5 -0
- package/src/chat/fragments/resType.ts +15 -0
- package/src/chat/index-client.ts +7 -0
- package/src/chat/index.ts +5 -0
- package/src/chat/methods/ChatConvo.methods.ts +336 -0
- package/src/chat/methods/ChatConvo.test.ts +122 -0
- package/src/chat/methods/ChatConvoResolver.methods.ts +243 -0
- package/src/chat/methods/ChatMessageResolver.methods.ts +218 -0
- package/src/chat/methods/index.ts +3 -0
- package/src/chat/models/ChatAttachment.model.ts +43 -0
- package/src/chat/models/ChatConvo.model.ts +108 -0
- package/src/chat/models/ChatMessage.model.ts +102 -0
- package/src/chat/models/ChatUser.model.ts +67 -0
- package/src/chat/models/chat.txt +17 -0
- package/src/chat/models/index.ts +3 -0
- package/src/chat/mutations/chatConvo.mutation.ts +20 -0
- package/src/chat/mutations/chatMessage.mutation.ts +11 -0
- package/src/chat/mutations/index.ts +2 -0
- package/src/chat/query/README.md +1 -0
- package/src/chat/query/chatConvo.query.ts +33 -0
- package/src/chat/query/chatMessage.query.ts +21 -0
- package/src/chat/query/index.ts +2 -0
- package/src/chat/resolvers/ChatConvo.public.resolver.ts +15 -0
- package/src/chat/resolvers/ChatConvo.resolver.ts +71 -0
- package/src/chat/resolvers/ChatMessage.resolver.ts +62 -0
- package/src/chat/resolvers/index.ts +2 -0
- package/src/chat/subscriptions/README.md +1 -0
- package/src/chat/subscriptions/chatConvo.subscription.ts +19 -0
- package/src/chat/subscriptions/chatMessage.subscription.ts +13 -0
- package/src/chat/subscriptions/index.ts +2 -0
- package/src/example.ts +16 -0
- package/src/index.ts +2 -0
- package/src/roadman.ts +25 -0
- package/src/scripts/copyClient.ts +64 -0
- package/src/scripts/createPackageJsonForClient.ts +32 -0
- package/src/shared/ContextType.ts +67 -0
- package/src/shared/pubsub.utils.ts +93 -0
|
@@ -102,8 +102,8 @@ const chatMessage = async (args) => {
|
|
|
102
102
|
const query = `
|
|
103
103
|
SELECT *
|
|
104
104
|
FROM \`${bucket}\` chat
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
LEFT JOIN \`${bucket}\` owner ON KEYS chat.owner
|
|
106
|
+
LEFT JOIN \`${bucket}\` attachments ON KEYS chat.attachments
|
|
107
107
|
WHERE chat._type = "${ChatMessage_model_1.ChatMessageModelName}"
|
|
108
108
|
AND chat.convoId = "${convoId}"
|
|
109
109
|
AND chat.createdAt ${sign} "${time.toISOString()}"
|
|
@@ -125,7 +125,8 @@ const chatMessage = async (args) => {
|
|
|
125
125
|
}
|
|
126
126
|
const dataToSend = rows.map((d) => {
|
|
127
127
|
const { chat, attachments, owner } = d;
|
|
128
|
-
return ChatMessage_model_1.default.parse(Object.assign(Object.assign({}, chat), { attachments,
|
|
128
|
+
return ChatMessage_model_1.default.parse(Object.assign(Object.assign({}, chat), { attachments,
|
|
129
|
+
owner }));
|
|
129
130
|
});
|
|
130
131
|
// TODO just add as a queue non-blocking queries
|
|
131
132
|
if (!isPublic) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatMessageResolver.methods.js","sourceRoot":"","sources":["../../../src/chat/methods/ChatMessageResolver.methods.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ChatMessageResolver.methods.js","sourceRoot":"","sources":["../../../src/chat/methods/ChatMessageResolver.methods.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@roadmanjs/chat",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.64",
|
|
4
4
|
"description": " A roadman for chat and groups, using UserType from 'auth'",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"files": [
|
|
8
|
+
"src/",
|
|
8
9
|
"docs/",
|
|
9
10
|
"dist/",
|
|
10
11
|
"register/",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Only for client query graphql-tags
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import {ChatMessageTypeFragment} from './chatMessage.fragment';
|
|
2
|
+
import {ChatUserTypeFragment} from './chatUser.fragment';
|
|
3
|
+
import gql from 'graphql-tag';
|
|
4
|
+
|
|
5
|
+
export const ChatConvoFragment = gql`
|
|
6
|
+
fragment ChatConvoFragment on ChatConvo {
|
|
7
|
+
id
|
|
8
|
+
convoId
|
|
9
|
+
name
|
|
10
|
+
avatar
|
|
11
|
+
owner {
|
|
12
|
+
...ChatUserTypeFragment
|
|
13
|
+
}
|
|
14
|
+
createdAt
|
|
15
|
+
updatedAt
|
|
16
|
+
group
|
|
17
|
+
public
|
|
18
|
+
unread
|
|
19
|
+
lastMessage {
|
|
20
|
+
...ChatMessageTypeFragment
|
|
21
|
+
}
|
|
22
|
+
members {
|
|
23
|
+
...ChatUserTypeFragment
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
${ChatMessageTypeFragment}
|
|
28
|
+
${ChatUserTypeFragment}
|
|
29
|
+
`;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {ChatAttachmentTypeFragment} from './chatAttachment.fragment';
|
|
2
|
+
import {ChatUserTypeFragment} from './chatUser.fragment';
|
|
3
|
+
import gql from 'graphql-tag';
|
|
4
|
+
|
|
5
|
+
export const ChatMessageTypeFragment = gql`
|
|
6
|
+
fragment ChatMessageTypeFragment on ChatMessageType {
|
|
7
|
+
id
|
|
8
|
+
owner
|
|
9
|
+
createdAt
|
|
10
|
+
updatedAt
|
|
11
|
+
system
|
|
12
|
+
convoId
|
|
13
|
+
attachments
|
|
14
|
+
message
|
|
15
|
+
}
|
|
16
|
+
`;
|
|
17
|
+
|
|
18
|
+
export const ChatMessageFragment = gql`
|
|
19
|
+
fragment ChatMessageFragment on ChatMessage {
|
|
20
|
+
id
|
|
21
|
+
owner {
|
|
22
|
+
...ChatUserTypeFragment
|
|
23
|
+
}
|
|
24
|
+
createdAt
|
|
25
|
+
updatedAt
|
|
26
|
+
system
|
|
27
|
+
convoId
|
|
28
|
+
attachments {
|
|
29
|
+
...ChatAttachmentTypeFragment
|
|
30
|
+
}
|
|
31
|
+
message
|
|
32
|
+
}
|
|
33
|
+
${ChatUserTypeFragment}
|
|
34
|
+
${ChatAttachmentTypeFragment}
|
|
35
|
+
`;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import gql from 'graphql-tag';
|
|
2
|
+
|
|
3
|
+
export const ChatUserTypeFragment = gql`
|
|
4
|
+
fragment ChatUserTypeFragment on ChatUserType {
|
|
5
|
+
id
|
|
6
|
+
username
|
|
7
|
+
fullname
|
|
8
|
+
firstname
|
|
9
|
+
lastname
|
|
10
|
+
email
|
|
11
|
+
phone
|
|
12
|
+
website
|
|
13
|
+
country
|
|
14
|
+
bio
|
|
15
|
+
address
|
|
16
|
+
tokenVersion
|
|
17
|
+
avatar
|
|
18
|
+
balance
|
|
19
|
+
currency
|
|
20
|
+
}
|
|
21
|
+
`;
|
|
22
|
+
|
|
23
|
+
export default ChatUserTypeFragment;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import gql from 'graphql-tag';
|
|
2
|
+
|
|
3
|
+
export interface ChatResType {
|
|
4
|
+
success: boolean;
|
|
5
|
+
message?: string;
|
|
6
|
+
data?: any;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const ChatResTypeFragment = gql`
|
|
10
|
+
fragment ChatResTypeFragment on ChatResType {
|
|
11
|
+
success
|
|
12
|
+
message
|
|
13
|
+
data
|
|
14
|
+
}
|
|
15
|
+
`;
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import ChatConvoModel, {
|
|
2
|
+
ChatConvo,
|
|
3
|
+
ChatConvoModelName,
|
|
4
|
+
ChatConvoType,
|
|
5
|
+
chatConvoSelectors,
|
|
6
|
+
} from '../models/ChatConvo.model';
|
|
7
|
+
import {ChatMessage, ChatMessageModel} from '../models';
|
|
8
|
+
import {connectionOptions, createUpdate} from '@roadmanjs/couchset';
|
|
9
|
+
import {publishMessageToTopic, sendPushNotification} from '../../shared/pubsub.utils';
|
|
10
|
+
|
|
11
|
+
import {ContextType} from '../../shared/ContextType';
|
|
12
|
+
import {awaitTo} from '@stoqey/client-graphql';
|
|
13
|
+
import compact from 'lodash/compact';
|
|
14
|
+
import isEmpty from 'lodash/isEmpty';
|
|
15
|
+
import {log} from '@roadmanjs/logs';
|
|
16
|
+
|
|
17
|
+
export const createAConvoAndReturnIt = async (newConvo: ChatConvoType): Promise<ChatConvoType> => {
|
|
18
|
+
const {members = [], group = false, owner, ...others} = newConvo;
|
|
19
|
+
|
|
20
|
+
const [errorCreatingConvo, createdChatConvo = []] = await awaitTo(
|
|
21
|
+
createChatConvoType({
|
|
22
|
+
...others,
|
|
23
|
+
members,
|
|
24
|
+
group,
|
|
25
|
+
owner,
|
|
26
|
+
})
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
if (errorCreatingConvo) {
|
|
30
|
+
throw errorCreatingConvo;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let convo = createdChatConvo[0];
|
|
34
|
+
if (owner) {
|
|
35
|
+
const selected = createdChatConvo.find((chat) => chat.owner === owner);
|
|
36
|
+
if (selected) {
|
|
37
|
+
convo = selected;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return convo;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const createChatConvoType = async (
|
|
45
|
+
props: Partial<ChatConvoType>
|
|
46
|
+
): Promise<ChatConvoType[]> => {
|
|
47
|
+
const {members = [], group = false, ...others} = props;
|
|
48
|
+
|
|
49
|
+
if (isEmpty(members)) {
|
|
50
|
+
throw new Error('members have to be more than one');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const defaultConvo: ChatConvoType = {
|
|
54
|
+
...others,
|
|
55
|
+
members,
|
|
56
|
+
group,
|
|
57
|
+
owner: 'system',
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const isPublicChat = defaultConvo.public;
|
|
61
|
+
|
|
62
|
+
if (isPublicChat) {
|
|
63
|
+
const existingPublicChat = await ChatConvoModel.pagination({
|
|
64
|
+
where: {convoId: defaultConvo.convoId},
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
if (existingPublicChat && existingPublicChat.length) {
|
|
68
|
+
return existingPublicChat;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const [errorSystemConvo, createdSystemConvo] = await awaitTo(
|
|
73
|
+
createUpdate<ChatConvoType>({
|
|
74
|
+
model: ChatConvoModel,
|
|
75
|
+
data: defaultConvo,
|
|
76
|
+
...defaultConvo,
|
|
77
|
+
})
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
if (errorSystemConvo) {
|
|
81
|
+
throw errorSystemConvo;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (isPublicChat) {
|
|
85
|
+
return [createdSystemConvo];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// create a convo for each member
|
|
89
|
+
const [errorConvos, convos] = await awaitTo(
|
|
90
|
+
Promise.all(
|
|
91
|
+
members.map((member) =>
|
|
92
|
+
createUpdate<ChatConvoType>({
|
|
93
|
+
model: ChatConvoModel,
|
|
94
|
+
data: {
|
|
95
|
+
...defaultConvo,
|
|
96
|
+
owner: member,
|
|
97
|
+
convoId: createdSystemConvo?.id,
|
|
98
|
+
},
|
|
99
|
+
...defaultConvo,
|
|
100
|
+
owner: member,
|
|
101
|
+
})
|
|
102
|
+
)
|
|
103
|
+
)
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
if (errorConvos) {
|
|
107
|
+
throw errorConvos;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return convos as ChatConvoType[];
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export const getChatConvoById = async (id: string, owner: string): Promise<ChatConvo | null> => {
|
|
114
|
+
try {
|
|
115
|
+
const bucket = connectionOptions.bucketName;
|
|
116
|
+
|
|
117
|
+
const query = `
|
|
118
|
+
SELECT *
|
|
119
|
+
FROM \`${bucket}\` convo
|
|
120
|
+
JOIN \`${bucket}\` owner
|
|
121
|
+
ON KEYS convo.owner
|
|
122
|
+
NEST \`${bucket}\` members
|
|
123
|
+
ON KEYS convo.members
|
|
124
|
+
LEFT JOIN \`${bucket}\` lastMessage
|
|
125
|
+
ON KEYS convo.lastMessage
|
|
126
|
+
|
|
127
|
+
WHERE convo._type = "${ChatConvoModelName}"
|
|
128
|
+
AND (convo.id = "${id}" OR convo.convoId = "${id}")
|
|
129
|
+
AND convo.owner = "${owner}"
|
|
130
|
+
LIMIT 1;
|
|
131
|
+
`;
|
|
132
|
+
|
|
133
|
+
const [errorFetching, data = []] = await awaitTo(
|
|
134
|
+
ChatConvoModel.customQuery<any>({
|
|
135
|
+
limit: 1,
|
|
136
|
+
query,
|
|
137
|
+
params: {limit: 1, id},
|
|
138
|
+
})
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
if (errorFetching) {
|
|
142
|
+
throw errorFetching;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const [rows = []] = data;
|
|
146
|
+
|
|
147
|
+
const dataToSend = rows.map((d) => {
|
|
148
|
+
const {convo, lastMessage = {}, members, owner} = d;
|
|
149
|
+
const lastMessageParsed = ChatMessageModel.parse(lastMessage);
|
|
150
|
+
const chatConvoItem = ChatConvoModel.parse({
|
|
151
|
+
...convo,
|
|
152
|
+
members,
|
|
153
|
+
owner,
|
|
154
|
+
});
|
|
155
|
+
chatConvoItem.lastMessage = lastMessageParsed;
|
|
156
|
+
return chatConvoItem;
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
return dataToSend[0];
|
|
160
|
+
} catch (error) {
|
|
161
|
+
log('error getting chat messages', error);
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
interface UpdateConvoLastMessage {
|
|
167
|
+
sender: string;
|
|
168
|
+
convoId: string;
|
|
169
|
+
lastMessageId: string;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export const updateConvoLastMessage = async (args: UpdateConvoLastMessage): Promise<boolean> => {
|
|
173
|
+
const {sender, convoId, lastMessageId} = args;
|
|
174
|
+
try {
|
|
175
|
+
// find all convo by convoId
|
|
176
|
+
// add update them all with the new lastMessageId
|
|
177
|
+
|
|
178
|
+
const convos: ChatConvoType[] = await ChatConvoModel.pagination({
|
|
179
|
+
select: chatConvoSelectors,
|
|
180
|
+
where: {convoId: {$eq: convoId}},
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
if (!isEmpty(convos)) {
|
|
184
|
+
// update convo objects
|
|
185
|
+
const [errorConvos, updatedConvos] = await awaitTo(
|
|
186
|
+
Promise.all(
|
|
187
|
+
convos.map((convo) => {
|
|
188
|
+
const update = {
|
|
189
|
+
...convo,
|
|
190
|
+
lastMessage: lastMessageId,
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
if (convo.owner !== sender) {
|
|
194
|
+
// if this is not creator, update unread
|
|
195
|
+
update.unread = (convo.unread || 0) + 1;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return createUpdate<ChatConvoType>({
|
|
199
|
+
model: ChatConvoModel,
|
|
200
|
+
data: update,
|
|
201
|
+
...convo,
|
|
202
|
+
});
|
|
203
|
+
})
|
|
204
|
+
)
|
|
205
|
+
);
|
|
206
|
+
if (errorConvos) {
|
|
207
|
+
throw errorConvos;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
log(
|
|
211
|
+
`updated convos with lastMessage=${lastMessageId}`,
|
|
212
|
+
updatedConvos.map((uc) => uc.id)
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return true;
|
|
217
|
+
} catch (error) {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
interface UpdateConvoSubscriptions {
|
|
223
|
+
context: ContextType;
|
|
224
|
+
sender: string;
|
|
225
|
+
convoId: string;
|
|
226
|
+
data: any;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Send data to convo expect the sender
|
|
231
|
+
* @param args
|
|
232
|
+
* @returns
|
|
233
|
+
*/
|
|
234
|
+
export const updateConvoSubscriptions = async (
|
|
235
|
+
args: UpdateConvoSubscriptions
|
|
236
|
+
): Promise<boolean> => {
|
|
237
|
+
const {context, sender, convoId, data} = args;
|
|
238
|
+
|
|
239
|
+
const getSubscriptionData = () => {
|
|
240
|
+
if (data.id) {
|
|
241
|
+
// contains message payload
|
|
242
|
+
return {message: data.id};
|
|
243
|
+
}
|
|
244
|
+
return data;
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
const subscriptionData = getSubscriptionData();
|
|
248
|
+
|
|
249
|
+
const publishToMessageTopic = async () => {
|
|
250
|
+
return publishMessageToTopic(context, [ChatMessage.name], {
|
|
251
|
+
convoId,
|
|
252
|
+
owner: sender,
|
|
253
|
+
...subscriptionData,
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
try {
|
|
258
|
+
// send to message topic
|
|
259
|
+
await publishToMessageTopic();
|
|
260
|
+
|
|
261
|
+
// send to convo topics
|
|
262
|
+
const membersConvos: ChatConvoType[] = await ChatConvoModel.pagination({
|
|
263
|
+
select: chatConvoSelectors,
|
|
264
|
+
where: {convoId: {$eq: convoId}, owner: {$neq: sender}},
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
if (!isEmpty(membersConvos)) {
|
|
268
|
+
const isPublicChat = compact(membersConvos.map((c) => c.public));
|
|
269
|
+
|
|
270
|
+
if (!isEmpty(isPublicChat)) {
|
|
271
|
+
log(`updated subscriptions isPublicChat`);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// push notification here
|
|
276
|
+
|
|
277
|
+
// update sockets, no need for results
|
|
278
|
+
await awaitTo(
|
|
279
|
+
Promise.all(
|
|
280
|
+
membersConvos.map((convo) => {
|
|
281
|
+
const pushmessage = {
|
|
282
|
+
...data,
|
|
283
|
+
convoId,
|
|
284
|
+
owner: convo.owner,
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
// unhandled promises
|
|
288
|
+
if (!subscriptionData.typing) {
|
|
289
|
+
sendPushNotification(sender, pushmessage);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Send subscriptions to owners
|
|
293
|
+
return publishMessageToTopic(context, [ChatConvo.name], {
|
|
294
|
+
convoId,
|
|
295
|
+
owner: convo.owner,
|
|
296
|
+
...subscriptionData,
|
|
297
|
+
}); // update sockets
|
|
298
|
+
})
|
|
299
|
+
)
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
log(
|
|
303
|
+
`updated subscriptions from=${sender} with data=${data}`,
|
|
304
|
+
membersConvos.map((uc) => uc.id)
|
|
305
|
+
);
|
|
306
|
+
|
|
307
|
+
// update sockets
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return true;
|
|
311
|
+
} catch (error) {
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
export const removeUnreadCount = async (owner: string, convoId: string): Promise<any> => {
|
|
317
|
+
try {
|
|
318
|
+
const convos: ChatConvoType[] = await ChatConvoModel.pagination({
|
|
319
|
+
select: chatConvoSelectors,
|
|
320
|
+
where: {convoId: {$eq: convoId}, owner: {$eq: owner}},
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
if (!isEmpty(convos)) {
|
|
324
|
+
const convo = convos[0];
|
|
325
|
+
if (convo.unread > 0) {
|
|
326
|
+
convo.unread = 0; // remove the unread
|
|
327
|
+
await ChatConvoModel.updateById(convo.id, convo, {silent: true}); // do not updatedAt
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return true;
|
|
332
|
+
} catch (err) {
|
|
333
|
+
log(err);
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
};
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import 'mocha';
|
|
3
|
+
|
|
4
|
+
import {expect} from 'chai';
|
|
5
|
+
import { getChatConvoById } from './ChatConvo.methods';
|
|
6
|
+
import {startCouchbase} from '@roadmanjs/couchset';
|
|
7
|
+
|
|
8
|
+
before((done) => {
|
|
9
|
+
startCouchbase().then(() => done());
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
describe('ChatConvo', () => {
|
|
13
|
+
// it('it should send a push notification to a user', async () => {
|
|
14
|
+
// const senderId = '1c01d85f-b811-44b1-8a4f-bef8030bf265';
|
|
15
|
+
// const convoId = 'b613b7c5-5f73-4331-8703-3a1176728a31';
|
|
16
|
+
|
|
17
|
+
// const owner = '99bc43ba-02ab-4394-b48b-49a39a95443c';
|
|
18
|
+
|
|
19
|
+
// const sendMessage = await sendPushNotification(senderId, {
|
|
20
|
+
// owner,
|
|
21
|
+
// convoId,
|
|
22
|
+
// message: 'some message',
|
|
23
|
+
// });
|
|
24
|
+
// expect(sendMessage).to.not.be.empty;
|
|
25
|
+
// });
|
|
26
|
+
// it('it should create an new convo and return it', async () => {
|
|
27
|
+
// const newConvo: ChatConvoType = {
|
|
28
|
+
// owner: '1c01d85f-b811-44b1-8a4f-bef8030bf265',
|
|
29
|
+
// members: [
|
|
30
|
+
// '1c01d85f-b811-44b1-8a4f-bef8030bf265',
|
|
31
|
+
// '0ac710ce-4530-4ea9-8f70-9d19383c95d4',
|
|
32
|
+
// ],
|
|
33
|
+
// group: true,
|
|
34
|
+
// };
|
|
35
|
+
|
|
36
|
+
// const newConvoCreated = await startConvo(newConvo);
|
|
37
|
+
|
|
38
|
+
// console.log('new convo create', newConvoCreated);
|
|
39
|
+
// console.log('new convo create members', newConvoCreated.data.members);
|
|
40
|
+
|
|
41
|
+
// expect(newConvoCreated).to.be.not.empty;
|
|
42
|
+
// });
|
|
43
|
+
|
|
44
|
+
it("it should return chat convo with joins", async () => {
|
|
45
|
+
const convo = await getChatConvoById("d2bb6ba6-1bc5-480a-a3ae-c28bec3708bf", "1c01d85f-b811-44b1-8a4f-bef8030bf265");
|
|
46
|
+
|
|
47
|
+
console.log('convo with joins', convo);
|
|
48
|
+
expect(convo.members[0].id).to.be.not.empty;
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
// it("Create convo", async () => {
|
|
52
|
+
// const owner = "1c01d85f-b811-44b1-8a4f-bef8030bf265";
|
|
53
|
+
// const otherUser = "99bc43ba-02ab-4394-b48b-49a39a95443c";
|
|
54
|
+
// const members = [owner, otherUser];
|
|
55
|
+
|
|
56
|
+
// const chatConvo = {
|
|
57
|
+
// members,
|
|
58
|
+
// group: false,
|
|
59
|
+
|
|
60
|
+
// };
|
|
61
|
+
|
|
62
|
+
// const createdConvo = await createChatConvoType(chatConvo);
|
|
63
|
+
|
|
64
|
+
// console.log("Created", createdConvo);
|
|
65
|
+
// expect(createdConvo).to.not.be.empty;
|
|
66
|
+
// });
|
|
67
|
+
|
|
68
|
+
// it("Remove read count", async () => {
|
|
69
|
+
// const owner = "1c01d85f-b811-44b1-8a4f-bef8030bf265";
|
|
70
|
+
// const convoId = "b613b7c5-5f73-4331-8703-3a1176728a31";
|
|
71
|
+
|
|
72
|
+
// const hasUpdateCount = await removeUnreadCount(owner, convoId);
|
|
73
|
+
|
|
74
|
+
// console.log("Created", hasUpdateCount);
|
|
75
|
+
// expect(hasUpdateCount).to.be.true;
|
|
76
|
+
// });
|
|
77
|
+
|
|
78
|
+
// it('Start public ChatConvo', async () => {
|
|
79
|
+
// const id = 'rtv-1';
|
|
80
|
+
|
|
81
|
+
// const publicConvo = await startPublicConvo(id);
|
|
82
|
+
|
|
83
|
+
// console.log('Created', publicConvo);
|
|
84
|
+
|
|
85
|
+
// expect(publicConvo.public).to.be.true;
|
|
86
|
+
// });
|
|
87
|
+
|
|
88
|
+
// it('GetConvoOwnerNAuth public convo', async () => {
|
|
89
|
+
// const convoId = 'e8e15949-311e-4954-8701-3fe46cc21b98';
|
|
90
|
+
// const mockContext = {
|
|
91
|
+
// req: {
|
|
92
|
+
// headers: {
|
|
93
|
+
// authorization: '',
|
|
94
|
+
// },
|
|
95
|
+
// },
|
|
96
|
+
// };
|
|
97
|
+
|
|
98
|
+
// const publicMessages = await getConvoOwnerNAuth(convoId, mockContext);
|
|
99
|
+
|
|
100
|
+
// console.log('publicMessages', publicMessages);
|
|
101
|
+
|
|
102
|
+
// expect(publicMessages).not.to.be.empty;
|
|
103
|
+
// });
|
|
104
|
+
|
|
105
|
+
// it('GetConvoOwnerNAuth private convo', async () => {
|
|
106
|
+
// const convoId = 'e9992706-e854-4aef-bb5f-5e09d4224bf4';
|
|
107
|
+
// const mockContext = {
|
|
108
|
+
// req: {
|
|
109
|
+
// headers: {
|
|
110
|
+
// authorization:
|
|
111
|
+
// 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI5OWJjNDNiYS0wMmFiLTQzOTQtYjQ4Yi00OWEzOWE5NTQ0M2MiLCJpYXQiOjE2NjMyMTc2MjMsImV4cCI6MTY2MzQ3NjgyM30.zvCJo95goSCemwhvSEXF5nd3jIDhMZTfVrn9jUeo1OA',
|
|
112
|
+
// },
|
|
113
|
+
// },
|
|
114
|
+
// };
|
|
115
|
+
|
|
116
|
+
// const publicMessages = await getConvoOwnerNAuth(convoId, mockContext);
|
|
117
|
+
|
|
118
|
+
// console.log('publicMessages', publicMessages);
|
|
119
|
+
|
|
120
|
+
// expect(publicMessages).not.to.be.empty;
|
|
121
|
+
// });
|
|
122
|
+
});
|