Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
// This file is part of Moodle - http://moodle.org/
2
//
3
// Moodle is free software: you can redistribute it and/or modify
4
// it under the terms of the GNU General Public License as published by
5
// the Free Software Foundation, either version 3 of the License, or
6
// (at your option) any later version.
7
//
8
// Moodle is distributed in the hope that it will be useful,
9
// but WITHOUT ANY WARRANTY; without even the implied warranty of
10
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
// GNU General Public License for more details.
12
//
13
// You should have received a copy of the GNU General Public License
14
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
15
 
16
/**
17
 * Retrieves messages from the server.
18
 *
19
 * @module     core_message/message_repository
20
 * @copyright  2016 Ryan Wyllie <ryan@moodle.com>
21
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
22
 */
23
define(
24
[
25
    'jquery',
26
    'core/ajax',
27
    'core/notification',
28
    'core_message/message_drawer_view_conversation_constants'
29
], function(
30
    $,
31
    Ajax,
32
    Notification,
33
    Constants) {
34
 
35
    var CONVERSATION_TYPES = Constants.CONVERSATION_TYPES;
36
 
37
    /**
38
     * Count the number of unread conversations (one or more messages from a user)
39
     * for a given user.
40
     *
41
     * @param {object} args The request arguments:
42
     * @return {object} jQuery promise
43
     */
44
    var countUnreadConversations = function(args) {
45
        var request = {
46
            methodname: 'core_message_get_unread_conversations_count',
47
            args: args
48
        };
49
 
50
        var promise = Ajax.call([request])[0];
51
 
52
        promise.fail(Notification.exception);
53
 
54
        return promise;
55
    };
56
 
57
    /**
58
     * Get contacts for given user.
59
     *
60
     * @param {int} userId The user id
61
     * @param {int} limit Limit for results
62
     * @param {int} offset Offset for results
63
     * @return {object} jQuery promise
64
     */
65
    var getContacts = function(userId, limit, offset) {
66
        var args = {
67
            userid: userId
68
        };
69
 
70
        if (typeof limit !== 'undefined') {
71
            args.limitnum = limit;
72
        }
73
 
74
        if (typeof offset !== 'undefined') {
75
            args.limitfrom = offset;
76
        }
77
 
78
        var request = {
79
            methodname: 'core_message_get_user_contacts',
80
            args: args
81
        };
82
 
83
        return Ajax.call([request])[0];
84
    };
85
 
86
    /**
87
     * Block a user.
88
     *
89
     * @param {int} userId The requesting user
90
     * @param {int} blockedUserId Id of user to block
91
     * @return {object} jQuery promise
92
     */
93
    var blockUser = function(userId, blockedUserId) {
94
        var requests = [
95
            {
96
                methodname: 'core_message_block_user',
97
                args: {
98
                    userid: userId,
99
                    blockeduserid: blockedUserId
100
                }
101
            },
102
            {
103
                methodname: 'core_message_get_member_info',
104
                args: {
105
                    referenceuserid: userId,
106
                    userids: [blockedUserId],
107
                    includecontactrequests: true,
108
                    includeprivacyinfo: true
109
                }
110
            }
111
        ];
112
 
113
        // Wrap both requests in a single promise so that we can catch an error
114
        // from either request.
115
        return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {
116
            // Only return the profile.
117
            return profiles.length ? profiles[0] : {};
118
        });
119
    };
120
 
121
    /**
122
     * Unblock a user.
123
     *
124
     * @param {int} userId The requesting user
125
     * @param {int} unblockedUserId Id of user to unblock
126
     * @return {object} jQuery promise
127
     */
128
    var unblockUser = function(userId, unblockedUserId) {
129
        var requests = [
130
            {
131
                methodname: 'core_message_unblock_user',
132
                args: {
133
                    userid: userId,
134
                    unblockeduserid: unblockedUserId
135
                }
136
            },
137
            {
138
                methodname: 'core_message_get_member_info',
139
                args: {
140
                    referenceuserid: userId,
141
                    userids: [unblockedUserId],
142
                    includecontactrequests: true,
143
                    includeprivacyinfo: true
144
                }
145
            }
146
        ];
147
 
148
        // Wrap both requests in a single promise so that we can catch an error
149
        // from either request.
150
        return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {
151
            // Only return the profile.
152
            return profiles.length ? profiles[0] : {};
153
        });
154
    };
155
 
156
    /**
157
     * Create a request to add a user as a contact.
158
     *
159
     * @param {int} userId The requesting user
160
     * @param {int[]} requestUserIds List of user ids to add
161
     * @return {object} jQuery promise
162
     */
163
    var createContactRequest = function(userId, requestUserIds) {
164
        var request = {
165
            methodname: 'core_message_create_contact_request',
166
            args: {
167
                userid: userId,
168
                requesteduserid: requestUserIds
169
            }
170
        };
171
 
172
        return Ajax.call([request])[0];
173
    };
174
 
175
    /**
176
     * Remove a list of users as contacts.
177
     *
178
     * @param {int} userId The requesting user
179
     * @param {int[]} contactUserIds List of user ids to add
180
     * @return {object} jQuery promise
181
     */
182
    var deleteContacts = function(userId, contactUserIds) {
183
        var requests = [
184
            {
185
                methodname: 'core_message_delete_contacts',
186
                args: {
187
                    userid: userId,
188
                    userids: contactUserIds
189
                }
190
            },
191
            {
192
                methodname: 'core_message_get_member_info',
193
                args: {
194
                    referenceuserid: userId,
195
                    userids: contactUserIds,
196
                    includecontactrequests: true,
197
                    includeprivacyinfo: true
198
                }
199
            }
200
        ];
201
 
202
        return $.when.apply(null, Ajax.call(requests)).then(function(response1, profiles) {
203
            // Return all of the profiles as an array.
204
            return profiles;
205
        });
206
    };
207
 
208
    /**
209
     * Get messages between two users.
210
     *
211
     * @param {int} currentUserId The requesting user
212
     * @param {int} conversationId Other user in the conversation
213
     * @param {int} limit Limit for results
214
     * @param {int} offset Offset for results
215
     * @param {bool} newestFirst Order results by newest first
216
     * @param {int} timeFrom Only return messages after this timestamp
217
     * @return {object} jQuery promise
218
     */
219
    var getMessages = function(currentUserId, conversationId, limit, offset, newestFirst, timeFrom) {
220
        var args = {
221
            currentuserid: currentUserId,
222
            convid: conversationId,
223
            newest: newestFirst ? true : false
224
        };
225
 
226
        if (typeof limit !== 'undefined') {
227
            args.limitnum = limit;
228
        }
229
 
230
        if (typeof offset !== 'undefined') {
231
            args.limitfrom = offset;
232
        }
233
 
234
        if (typeof timeFrom !== 'undefined') {
235
            args.timefrom = timeFrom;
236
        }
237
 
238
        var request = {
239
            methodname: 'core_message_get_conversation_messages',
240
            args: args
241
        };
242
        return Ajax.call([request])[0];
243
    };
244
 
245
    /**
246
     * Search for users.
247
     *
248
     * @param {int} userId The requesting user
249
     * @param {string} searchString Search string
250
     * @param {int} limit Limit for results
251
     * @param {int} offset Offset for results
252
     * @return {object} jQuery promise
253
     */
254
    var searchUsers = function(userId, searchString, limit, offset) {
255
        var args = {
256
            userid: userId,
257
            search: searchString
258
        };
259
 
260
        if (typeof limit !== 'undefined') {
261
            args.limitnum = limit;
262
        }
263
 
264
        if (typeof offset !== 'undefined') {
265
            args.limitfrom = offset;
266
        }
267
 
268
        var request = {
269
            methodname: 'core_message_message_search_users',
270
            args: args
271
        };
272
 
273
        return Ajax.call([request])[0];
274
    };
275
 
276
    /**
277
     * Search for messages.
278
     *
279
     * @param {int} userId The requesting user
280
     * @param {string} searchString Search string
281
     * @param {int} limit Limit for results
282
     * @param {int} offset Offset for results
283
     * @return {object} jQuery promise
284
     */
285
    var searchMessages = function(userId, searchString, limit, offset) {
286
        var args = {
287
            userid: userId,
288
            search: searchString
289
        };
290
 
291
        if (typeof limit !== 'undefined') {
292
            args.limitnum = limit;
293
        }
294
 
295
        if (typeof offset !== 'undefined') {
296
            args.limitfrom = offset;
297
        }
298
 
299
        var request = {
300
            methodname: 'core_message_data_for_messagearea_search_messages',
301
            args: args
302
        };
303
 
304
        return Ajax.call([request])[0];
305
    };
306
 
307
    /**
308
     * Send a list of messages to a user.
309
     *
310
     * @param {int} toUserId The recipient user id
311
     * @param {string[]} messages List of messages to send
312
     * @return {object} jQuery promise
313
     */
314
    var sendMessagesToUser = function(toUserId, messages) {
315
        var formattedMessages = messages.map(function(message) {
316
            return {
317
                touserid: toUserId,
318
                text: message
319
            };
320
        });
321
        var request = {
322
            methodname: 'core_message_send_instant_messages',
323
            args: {
324
                messages: formattedMessages
325
            }
326
        };
327
 
328
        return Ajax.call([request])[0]
329
            .then(function(results) {
330
                // Error handling for the weird way the old function works.
331
                var errors = results.reduce(function(carry, result) {
332
                    if (result.errormessage) {
333
                        carry.push(result.errormessage);
334
                    }
335
 
336
                    return carry;
337
                }, []);
338
                if (errors.length) {
339
                    throw new Error(errors.join("\n"));
340
                }
341
 
342
                return results;
343
            })
344
            .then(function(results) {
345
                // Format the results to match the other send message function.
346
                return results.map(function(result) {
347
                    return {
348
                        id: result.msgid,
349
                        text: result.text,
350
                        timecreated: result.timecreated,
351
                        useridfrom: result.useridfrom,
352
                        conversationid: result.conversationid,
353
                        candeletemessagesforallusers: result.candeletemessagesforallusers
354
                    };
355
                });
356
            });
357
    };
358
 
359
    /**
360
     * Send a single message to a user.
361
     *
362
     * @param {int} toUserId The recipient user id
363
     * @param {string} text The message text
364
     * @return {object} jQuery promise
365
     */
366
    var sendMessageToUser = function(toUserId, text) {
367
        return sendMessagesToUser(toUserId, [text])
368
            .then(function(results) {
369
                return results[0];
370
            });
371
    };
372
 
373
    /**
374
     * Send messages to a conversation.
375
     *
376
     * @param {int} conversationId The conversation id
377
     * @param {string[]} messages List of messages to send
378
     * @return {object} jQuery promise
379
     */
380
    var sendMessagesToConversation = function(conversationId, messages) {
381
        var formattedMessages = messages.map(function(message) {
382
            return {
383
                text: message
384
            };
385
        });
386
        var request = {
387
            methodname: 'core_message_send_messages_to_conversation',
388
            args: {
389
                conversationid: conversationId,
390
                messages: formattedMessages
391
            }
392
        };
393
 
394
        return Ajax.call([request])[0];
395
    };
396
 
397
    /**
398
     * Send a message to a conversation.
399
     *
400
     * @param {int} conversationId The conversation id
401
     * @param {string} text The message text
402
     * @return {object} jQuery promise
403
     */
404
    var sendMessageToConversation = function(conversationId, text) {
405
        return sendMessagesToConversation(conversationId, [text])
406
            .then(function(result) {
407
                return result[0];
408
            });
409
    };
410
 
411
    /**
412
     * Save message preferences.
413
     *
414
     * @param {int} userId The owner of the preferences
415
     * @param {object[]} preferences New preferences values
416
     * @return {object} jQuery promise
417
     */
418
    var savePreferences = function(userId, preferences) {
419
        var request = {
420
            methodname: 'core_user_update_user_preferences',
421
            args: {
422
                userid: userId,
423
                preferences: preferences
424
            }
425
        };
426
        return Ajax.call([request])[0];
427
    };
428
 
429
    /**
430
     * Get the user's preferences.
431
     *
432
     * @param {int} userId The target user
433
     * @return {object} jQuery promise
434
     */
435
    var getPreferences = function(userId) {
436
        var request = {
437
            methodname: 'core_user_get_user_preferences',
438
            args: {
439
                userid: userId
440
            }
441
        };
442
        return Ajax.call([request])[0];
443
    };
444
 
445
    /**
446
     * Delete a list of messages.
447
     *
448
     * @param {int} userId The user to delete messages for
449
     * @param {int[]} messageIds List of message ids to delete
450
     * @return {object} jQuery promise
451
     */
452
    var deleteMessages = function(userId, messageIds) {
453
        return $.when.apply(null, Ajax.call(messageIds.map(function(messageId) {
454
            return {
455
                methodname: 'core_message_delete_message',
456
                args: {
457
                    messageid: messageId,
458
                    userid: userId
459
                }
460
            };
461
        })));
462
    };
463
 
464
    /**
465
     * Delete a list of messages for all users.
466
     *
467
     * @param {int} userId The user to delete messages for
468
     * @param {int[]} messageIds List of message ids to delete
469
     * @return {object} jQuery promise
470
     */
471
    var deleteMessagesForAllUsers = function(userId, messageIds) {
472
        return $.when.apply(null, Ajax.call(messageIds.map(function(messageId) {
473
            return {
474
                methodname: 'core_message_delete_message_for_all_users',
475
                args: {
476
                    messageid: messageId,
477
                    userid: userId
478
                }
479
            };
480
        })));
481
    };
482
 
483
    /**
484
     * Delete a conversation between two users.
485
     *
486
     * @param {int} userId The user to delete messages for
487
     * @param {int} conversationId The id of the conversation
488
     * @return {object} jQuery promise
489
     */
490
    var deleteConversation = function(userId, conversationId) {
491
        var request = {
492
            methodname: 'core_message_delete_conversations_by_id',
493
            args: {
494
                userid: userId,
495
                conversationids: [conversationId]
496
            }
497
        };
498
        return Ajax.call([request])[0];
499
    };
500
 
501
    /**
502
     * Get the list of contact requests for a user.
503
     *
504
     * @param {int} userId The user id
505
     * @return {object} jQuery promise
506
     */
507
    var getContactRequests = function(userId) {
508
        var request = {
509
            methodname: 'core_message_get_contact_requests',
510
            args: {
511
                userid: userId
512
            }
513
        };
514
        return Ajax.call([request])[0];
515
    };
516
 
517
    /**
518
     * Accept a contact request.
519
     *
520
     * @param {int} sendingUserId The user that sent the request
521
     * @param {int} recipientUserId The user that received the request
522
     * @return {object} jQuery promise
523
     */
524
    var acceptContactRequest = function(sendingUserId, recipientUserId) {
525
        var requests = [
526
            {
527
                methodname: 'core_message_confirm_contact_request',
528
                args: {
529
                    userid: sendingUserId,
530
                    requesteduserid: recipientUserId
531
                }
532
            },
533
            {
534
                methodname: 'core_message_get_member_info',
535
                args: {
536
                    referenceuserid: recipientUserId,
537
                    userids: [sendingUserId],
538
                    includecontactrequests: true,
539
                    includeprivacyinfo: true
540
                }
541
            }
542
        ];
543
 
544
        // Wrap both requests in a single promise so that we can catch an error
545
        // from either request.
546
        return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {
547
            // Only return the profile.
548
            return profiles.length ? profiles[0] : {};
549
        });
550
    };
551
 
552
    /**
553
     * Decline a contact request.
554
     *
555
     * @param {int} sendingUserId The user that sent the request
556
     * @param {int} recipientUserId The user that received the request
557
     * @return {object} jQuery promise
558
     */
559
    var declineContactRequest = function(sendingUserId, recipientUserId) {
560
        var requests = [
561
            {
562
                methodname: 'core_message_decline_contact_request',
563
                args: {
564
                    userid: sendingUserId,
565
                    requesteduserid: recipientUserId
566
                }
567
            },
568
            {
569
                methodname: 'core_message_get_member_info',
570
                args: {
571
                    referenceuserid: recipientUserId,
572
                    userids: [sendingUserId],
573
                    includecontactrequests: true,
574
                    includeprivacyinfo: true
575
                }
576
            }
577
        ];
578
 
579
        // Wrap both requests in a single promise so that we can catch an error
580
        // from either request.
581
        return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {
582
            // Only return the profile.
583
            return profiles.length ? profiles[0] : {};
584
        });
585
    };
586
 
587
    /**
588
     * Get a conversation.
589
     *
590
     * @param {int} loggedInUserId The logged in user
591
     * @param {int} conversationId The conversation id
592
     * @param {bool} includeContactRequests Incldue contact requests between members
593
     * @param {bool} includePrivacyInfo Include privacy info for members
594
     * @param {int} memberLimit Limit for members
595
     * @param {int} memberOffset Offset for members
596
     * @param {int} messageLimit Limit for messages
597
     * @param {int} messageOffset Offset for messages
598
     * @param {bool} newestMessagesFirst Order the messages by newest first
599
     * @return {object} jQuery promise
600
     */
601
    var getConversation = function(
602
        loggedInUserId,
603
        conversationId,
604
        includeContactRequests,
605
        includePrivacyInfo,
606
        memberLimit,
607
        memberOffset,
608
        messageLimit,
609
        messageOffset,
610
        newestMessagesFirst
611
    ) {
612
        var args = {
613
            userid: loggedInUserId,
614
            conversationid: conversationId
615
        };
616
 
617
        if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) {
618
            args.includecontactrequests = includeContactRequests;
619
        }
620
 
621
        if (typeof includePrivacyInfo != 'undefined' && includePrivacyInfo !== null) {
622
            args.includeprivacyinfo = includePrivacyInfo;
623
        }
624
 
625
        if (typeof memberLimit != 'undefined' && memberLimit !== null) {
626
            args.memberlimit = memberLimit;
627
        }
628
 
629
        if (typeof memberOffset != 'undefined' && memberOffset !== null) {
630
            args.memberoffset = memberOffset;
631
        }
632
 
633
        if (typeof messageLimit != 'undefined' && messageLimit !== null) {
634
            args.messagelimit = messageLimit;
635
        }
636
 
637
        if (typeof messageOffset != 'undefined' && messageOffset !== null) {
638
            args.messageoffset = messageOffset;
639
        }
640
 
641
        if (typeof newestMessagesFirst != 'undefined' && newestMessagesFirst !== null) {
642
            args.newestmessagesfirst = newestMessagesFirst;
643
        }
644
 
645
        var request = {
646
            methodname: 'core_message_get_conversation',
647
            args: args
648
        };
649
 
650
        return Ajax.call([request])[0];
651
    };
652
 
653
    /**
654
     * Get a conversation between users.
655
     *
656
     * @param {int} loggedInUserId The logged in user
657
     * @param {int} otherUserId The other user id
658
     * @param {bool} includeContactRequests Incldue contact requests between members
659
     * @param {bool} includePrivacyInfo Include privacy info for members
660
     * @param {int} memberLimit Limit for members
661
     * @param {int} memberOffset Offset for members
662
     * @param {int} messageLimit Limit for messages
663
     * @param {int} messageOffset Offset for messages
664
     * @param {bool} newestMessagesFirst Order the messages by newest first
665
     * @return {object} jQuery promise
666
     */
667
    var getConversationBetweenUsers = function(
668
        loggedInUserId,
669
        otherUserId,
670
        includeContactRequests,
671
        includePrivacyInfo,
672
        memberLimit,
673
        memberOffset,
674
        messageLimit,
675
        messageOffset,
676
        newestMessagesFirst
677
    ) {
678
        var args = {
679
            userid: loggedInUserId,
680
            otheruserid: otherUserId
681
        };
682
 
683
        if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) {
684
            args.includecontactrequests = includeContactRequests;
685
        }
686
 
687
        if (typeof includePrivacyInfo != 'undefined' && includePrivacyInfo !== null) {
688
            args.includeprivacyinfo = includePrivacyInfo;
689
        }
690
 
691
        if (typeof memberLimit != 'undefined' && memberLimit !== null) {
692
            args.memberlimit = memberLimit;
693
        }
694
 
695
        if (typeof memberOffset != 'undefined' && memberOffset !== null) {
696
            args.memberoffset = memberOffset;
697
        }
698
 
699
        if (typeof messageLimit != 'undefined' && messageLimit !== null) {
700
            args.messagelimit = messageLimit;
701
        }
702
 
703
        if (typeof messageOffset != 'undefined' && messageOffset !== null) {
704
            args.messageoffset = messageOffset;
705
        }
706
 
707
        if (typeof newestMessagesFirst != 'undefined' && newestMessagesFirst !== null) {
708
            args.newestmessagesfirst = newestMessagesFirst;
709
        }
710
 
711
        var request = {
712
            methodname: 'core_message_get_conversation_between_users',
713
            args: args
714
        };
715
 
716
        return Ajax.call([request])[0];
717
    };
718
 
719
    /**
720
     * Get a self-conversation.
721
     *
722
     * @param {int} loggedInUserId The logged in user
723
     * @param {int} messageLimit Limit for messages
724
     * @param {int} messageOffset Offset for messages
725
     * @param {bool} newestMessagesFirst Order the messages by newest first
726
     * @return {object} jQuery promise
727
     */
728
    var getSelfConversation = function(
729
        loggedInUserId,
730
        messageLimit,
731
        messageOffset,
732
        newestMessagesFirst
733
    ) {
734
        var args = {
735
            userid: loggedInUserId
736
        };
737
 
738
        if (typeof messageLimit != 'undefined' && messageLimit !== null) {
739
            args.messagelimit = messageLimit;
740
        }
741
 
742
        if (typeof messageOffset != 'undefined' && messageOffset !== null) {
743
            args.messageoffset = messageOffset;
744
        }
745
 
746
        if (typeof newestMessagesFirst != 'undefined' && newestMessagesFirst !== null) {
747
            args.newestmessagesfirst = newestMessagesFirst;
748
        }
749
 
750
        var request = {
751
            methodname: 'core_message_get_self_conversation',
752
            args: args
753
        };
754
 
755
        return Ajax.call([request])[0];
756
    };
757
 
758
    /**
759
     * Get the conversations for a user.
760
     *
761
     * @param {int} userId The logged in user
762
     * @param {int|null} type The type of conversation to get
763
     * @param {int} limit Limit for results
764
     * @param {int} offset Offset for results
765
     * @param {bool|null} favourites If favourites should be included or not
766
     * @param {bool} mergeself
767
     * @return {object} jQuery promise
768
     */
769
    var getConversations = function(
770
        userId,
771
        type,
772
        limit,
773
        offset,
774
        favourites,
775
        mergeself
776
    ) {
777
        var args = {
778
            userid: userId,
779
            type: type
780
        };
781
 
782
        if (typeof limit != 'undefined' && limit !== null) {
783
            args.limitnum = limit;
784
        }
785
 
786
        if (typeof offset != 'undefined' && offset !== null) {
787
            args.limitfrom = offset;
788
        }
789
 
790
        if (typeof favourites != 'undefined' && favourites !== null) {
791
            args.favourites = favourites;
792
        }
793
 
794
        if (typeof mergeself != 'undefined' && mergeself !== null) {
795
            args.mergeself = mergeself;
796
        }
797
 
798
        var request = {
799
            methodname: 'core_message_get_conversations',
800
            args: args
801
        };
802
 
803
        return Ajax.call([request])[0]
804
            .then(function(result) {
805
                if (result.conversations.length) {
806
                    result.conversations = result.conversations.map(function(conversation) {
807
                        if (conversation.type == CONVERSATION_TYPES.PRIVATE || conversation.type == CONVERSATION_TYPES.SELF) {
808
                            var otherUser = conversation.members.length ? conversation.members[0] : null;
809
 
810
                            if (otherUser) {
811
                                conversation.name = conversation.name ? conversation.name : otherUser.fullname;
812
                                conversation.imageurl = conversation.imageurl ? conversation.imageurl : otherUser.profileimageurl;
813
                            }
814
                        }
815
 
816
                        return conversation;
817
                    });
818
                }
819
 
820
                return result;
821
            });
822
    };
823
 
824
    /**
825
     * Get the conversations for a user.
826
     *
827
     * @param {int} conversationId The conversation id
828
     * @param {int} loggedInUserId The logged in user
829
     * @param {int} limit Limit for results
830
     * @param {int} offset Offset for results
831
     * @param {bool} includeContactRequests If contact requests should be included in result
832
     * @return {object} jQuery promise
833
     */
834
    var getConversationMembers = function(conversationId, loggedInUserId, limit, offset, includeContactRequests) {
835
        var args = {
836
            userid: loggedInUserId,
837
            conversationid: conversationId
838
        };
839
 
840
        if (typeof limit != 'undefined' && limit !== null) {
841
            args.limitnum = limit;
842
        }
843
 
844
        if (typeof offset != 'undefined' && offset !== null) {
845
            args.limitfrom = offset;
846
        }
847
 
848
        if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) {
849
            args.includecontactrequests = includeContactRequests;
850
        }
851
 
852
        var request = {
853
            methodname: 'core_message_get_conversation_members',
854
            args: args
855
        };
856
 
857
        return Ajax.call([request])[0];
858
    };
859
 
860
    /**
861
     * Set a list of conversations to set as favourites for the given user.
862
     *
863
     * @param {int} userId The user id
864
     * @param {array} conversationIds List of conversation ids to set as favourite
865
     * @return {object} jQuery promise
866
     */
867
    var setFavouriteConversations = function(userId, conversationIds) {
868
 
869
        var request = {
870
            methodname: 'core_message_set_favourite_conversations',
871
            args: {
872
                userid: userId,
873
                conversations: conversationIds
874
            }
875
        };
876
        return Ajax.call([request])[0];
877
    };
878
 
879
    /**
880
     * Set a list of conversations to unset as favourites for the given user.
881
     *
882
     * @param {int} userId The user id
883
     * @param {array} conversationIds List of conversation ids to unset as favourite
884
     * @return {object} jQuery promise
885
     */
886
    var unsetFavouriteConversations = function(userId, conversationIds) {
887
 
888
        var request = {
889
            methodname: 'core_message_unset_favourite_conversations',
890
            args: {
891
                userid: userId,
892
                conversations: conversationIds
893
            }
894
        };
895
        return Ajax.call([request])[0];
896
    };
897
 
898
    /**
899
     * Set a list of conversations to set as muted for the given user.
900
     *
901
     * @param {int} userId The user id
902
     * @param {array} conversationIds List of conversation ids to set as favourite
903
     * @return {object} jQuery promise
904
     */
905
    var setMutedConversations = function(userId, conversationIds) {
906
        var request = {
907
            methodname: 'core_message_mute_conversations',
908
            args: {
909
                userid: userId,
910
                conversationids: conversationIds
911
            }
912
        };
913
        return Ajax.call([request])[0];
914
    };
915
 
916
    /**
917
     * Set a list of conversations to unset as muted for the given user.
918
     *
919
     * @param {int} userId The user id
920
     * @param {array} conversationIds List of conversation ids to unset as favourite
921
     * @return {object} jQuery promise
922
     */
923
    var unsetMutedConversations = function(userId, conversationIds) {
924
        var request = {
925
            methodname: 'core_message_unmute_conversations',
926
            args: {
927
                userid: userId,
928
                conversationids: conversationIds
929
            }
930
        };
931
        return Ajax.call([request])[0];
932
    };
933
 
934
    /**
935
     * Get a list of user's member info.
936
     *
937
     * @param {int} referenceUserId The user id
938
     * @param {array} userIds List of user ids to get
939
     * @param {bool} includeContactRequests Include contact requests between users in response
940
     * @param {bool} includePrivacyInfo Include privacy info for reference user in response
941
     * @return {object} jQuery promise
942
     */
943
    var getMemberInfo = function(referenceUserId, userIds, includeContactRequests, includePrivacyInfo) {
944
        var args = {
945
            referenceuserid: referenceUserId,
946
            userids: userIds
947
        };
948
 
949
        if (typeof includeContactRequests != 'undefined') {
950
            args.includecontactrequests = includeContactRequests;
951
        }
952
 
953
        if (typeof includePrivacyInfo != 'undefined') {
954
            args.includeprivacyinfo = includePrivacyInfo;
955
        }
956
 
957
        var request = {
958
            methodname: 'core_message_get_member_info',
959
            args: args
960
        };
961
        return Ajax.call([request])[0];
962
    };
963
 
964
    /**
965
     * Get a list of user's member info.
966
     *
967
     * @param {int} userId The user id to mark as read for
968
     * @param {int} conversationId The conversation to mark as read
969
     * @return {object} jQuery promise
970
     */
971
    var markAllConversationMessagesAsRead = function(userId, conversationId) {
972
 
973
        var request = {
974
            methodname: 'core_message_mark_all_conversation_messages_as_read',
975
            args: {
976
                userid: userId,
977
                conversationid: conversationId
978
            }
979
        };
980
        return Ajax.call([request])[0];
981
    };
982
 
983
    /**
984
     * Get the user's message preferences.
985
     *
986
     * @param {int} userId The user id to load preferences for
987
     * @return {object} jQuery promise
988
     */
989
    var getUserMessagePreferences = function(userId) {
990
        var request = {
991
            methodname: 'core_message_get_user_message_preferences',
992
            args: {
993
                userid: userId
994
            }
995
        };
996
        return Ajax.call([request])[0];
997
    };
998
 
999
    /**
1000
     * The the count of the user's conversations grouped by type.
1001
     *
1002
     * @param {Number} userId The user's id.
1003
     * @return {Object} jQuery promise.
1004
     */
1005
    var getTotalConversationCounts = function(userId) {
1006
        var request = {
1007
            methodname: 'core_message_get_conversation_counts',
1008
            args: {
1009
                userid: userId
1010
            }
1011
        };
1012
        return Ajax.call([request])[0];
1013
    };
1014
 
1015
    /**
1016
     * The the count of the user's unread conversations grouped by type.
1017
     *
1018
     * @param {Number} userId The user's id.
1019
     * @return {Object} jQuery promise.
1020
     */
1021
    var getUnreadConversationCounts = function(userId) {
1022
        var request = {
1023
            methodname: 'core_message_get_unread_conversation_counts',
1024
            args: {
1025
                userid: userId
1026
            }
1027
        };
1028
        return Ajax.call([request])[0];
1029
    };
1030
 
1031
    /**
1032
     * Get both the unread and total conversation counts in a single request.
1033
     *
1034
     * @param {Number} userId The user's id.
1035
     * @return {Object} jQuery promise.
1036
     */
1037
    var getAllConversationCounts = function(userId) {
1038
        var requests = [
1039
            {
1040
                methodname: 'core_message_get_conversation_counts',
1041
                args: {
1042
                    userid: userId
1043
                }
1044
            },
1045
            {
1046
                methodname: 'core_message_get_unread_conversation_counts',
1047
                args: {
1048
                    userid: userId
1049
                }
1050
            },
1051
        ];
1052
        return $.when.apply(null, Ajax.call(requests)).then(function(total, unread) {
1053
            return {
1054
                total: total,
1055
                unread: unread
1056
            };
1057
        });
1058
    };
1059
 
1060
    return {
1061
        countUnreadConversations: countUnreadConversations,
1062
        getContacts: getContacts,
1063
        blockUser: blockUser,
1064
        unblockUser: unblockUser,
1065
        createContactRequest: createContactRequest,
1066
        deleteContacts: deleteContacts,
1067
        getMessages: getMessages,
1068
        searchUsers: searchUsers,
1069
        searchMessages: searchMessages,
1070
        sendMessagesToUser: sendMessagesToUser,
1071
        sendMessageToUser: sendMessageToUser,
1072
        sendMessagesToConversation: sendMessagesToConversation,
1073
        sendMessageToConversation: sendMessageToConversation,
1074
        savePreferences: savePreferences,
1075
        getPreferences: getPreferences,
1076
        deleteMessages: deleteMessages,
1077
        deleteMessagesForAllUsers: deleteMessagesForAllUsers,
1078
        deleteConversation: deleteConversation,
1079
        getContactRequests: getContactRequests,
1080
        acceptContactRequest: acceptContactRequest,
1081
        declineContactRequest: declineContactRequest,
1082
        getConversation: getConversation,
1083
        getConversationBetweenUsers: getConversationBetweenUsers,
1084
        getSelfConversation: getSelfConversation,
1085
        getConversations: getConversations,
1086
        getConversationMembers: getConversationMembers,
1087
        setFavouriteConversations: setFavouriteConversations,
1088
        setMutedConversations: setMutedConversations,
1089
        unsetFavouriteConversations: unsetFavouriteConversations,
1090
        unsetMutedConversations: unsetMutedConversations,
1091
        getMemberInfo: getMemberInfo,
1092
        markAllConversationMessagesAsRead: markAllConversationMessagesAsRead,
1093
        getUserMessagePreferences: getUserMessagePreferences,
1094
        getTotalConversationCounts: getTotalConversationCounts,
1095
        getUnreadConversationCounts: getUnreadConversationCounts,
1096
        getAllConversationCounts: getAllConversationCounts
1097
    };
1098
});