MDL-63303 message: fix bugs in message drawer part 4
[moodle.git] / message / amd / src / message_repository.js
blob8fa57e838853c2824a1243132ca5ed95c539e394
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.
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/>.
16 /**
17  * Retrieves messages from the server.
18  *
19  * @module     core_message/message_repository
20  * @class      message_repository
21  * @package    message
22  * @copyright  2016 Ryan Wyllie <ryan@moodle.com>
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
25 define(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {
27     var CONVERSATION_TYPES = {
28         PRIVATE: 1,
29         PUBLIC: 2
30     };
32     /**
33      * Retrieve a list of messages from the server.
34      *
35      * @param {object} args The request arguments:
36      * @return {object} jQuery promise
37      */
38     var query = function(args) {
39         // Normalise the arguments to use limit/offset rather than limitnum/limitfrom.
40         if (typeof args.limit === 'undefined') {
41             args.limit = 0;
42         }
44         if (typeof args.offset === 'undefined') {
45             args.offset = 0;
46         }
48         if (typeof args.type === 'undefined') {
49             args.type = null;
50         }
52         if (typeof args.favouritesonly === 'undefined') {
53             args.favouritesonly = false;
54         }
56         args.limitfrom = args.offset;
57         args.limitnum = args.limit;
59         delete args.limit;
60         delete args.offset;
62         var request = {
63             methodname: 'core_message_data_for_messagearea_conversations',
64             args: args
65         };
67         var promise = Ajax.call([request])[0];
69         promise.fail(Notification.exception);
71         return promise;
72     };
74     /**
75      * Count the number of unread conversations (one or more messages from a user)
76      * for a given user.
77      *
78      * @param {object} args The request arguments:
79      * @return {object} jQuery promise
80      */
81     var countUnreadConversations = function(args) {
82         var request = {
83             methodname: 'core_message_get_unread_conversations_count',
84             args: args
85         };
87         var promise = Ajax.call([request])[0];
89         promise.fail(Notification.exception);
91         return promise;
92     };
94     /**
95      * Mark all of unread messages for a user as read.
96      *
97      * @param {object} args The request arguments:
98      * @return {object} jQuery promise
99      */
100     var markAllAsRead = function(args) {
101         var request = {
102             methodname: 'core_message_mark_all_messages_as_read',
103             args: args
104         };
106         var promise = Ajax.call([request])[0];
108         promise.fail(Notification.exception);
110         return promise;
111     };
113     /**
114      * Get contacts for given user.
115      *
116      * @param {int} userId The user id
117      * @param {int} limit Limit for results
118      * @param {int} offset Offset for results
119      * @return {object} jQuery promise
120      */
121     var getContacts = function(userId, limit, offset) {
122         var args = {
123             userid: userId
124         };
126         if (typeof limit !== 'undefined') {
127             args.limitnum = limit;
128         }
130         if (typeof offset !== 'undefined') {
131             args.limitfrom = offset;
132         }
134         var request = {
135             methodname: 'core_message_data_for_messagearea_contacts',
136             args: args
137         };
139         return Ajax.call([request])[0];
140     };
142     /**
143      * Request profile information as a user for a given user.
144      *
145      * @param {int} userId The requesting user
146      * @param {int} profileUserId The id of the user who's profile is being requested
147      * @return {object} jQuery promise
148      */
149     var getProfile = function(userId, profileUserId) {
150         var request = {
151             methodname: 'core_message_data_for_messagearea_get_profile',
152             args: {
153                 currentuserid: userId,
154                 otheruserid: profileUserId
155             }
156         };
158         return Ajax.call([request])[0];
159     };
161     /**
162      * Block a user.
163      *
164      * @param {int} userId The requesting user
165      * @param {int} blockedUserId Id of user to block
166      * @return {object} jQuery promise
167      */
168     var blockUser = function(userId, blockedUserId) {
169         var requests = [
170             {
171                 methodname: 'core_message_block_user',
172                 args: {
173                     userid: userId,
174                     blockeduserid: blockedUserId
175                 }
176             },
177             {
178                 methodname: 'core_message_get_member_info',
179                 args: {
180                     referenceuserid: userId,
181                     userids: [blockedUserId],
182                     includecontactrequests: true,
183                     includeprivacyinfo: true
184                 }
185             }
186         ];
188         // Wrap both requests in a single promise so that we can catch an error
189         // from either request.
190         return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {
191             // Only return the profile.
192             return profiles.length ? profiles[0] : {};
193         });
194     };
196     /**
197      * Unblock a user.
198      *
199      * @param {int} userId The requesting user
200      * @param {int} unblockedUserId Id of user to unblock
201      * @return {object} jQuery promise
202      */
203     var unblockUser = function(userId, unblockedUserId) {
204         var requests = [
205             {
206                 methodname: 'core_message_unblock_user',
207                 args: {
208                     userid: userId,
209                     unblockeduserid: unblockedUserId
210                 }
211             },
212             {
213                 methodname: 'core_message_get_member_info',
214                 args: {
215                     referenceuserid: userId,
216                     userids: [unblockedUserId],
217                     includecontactrequests: true,
218                     includeprivacyinfo: true
219                 }
220             }
221         ];
223         // Wrap both requests in a single promise so that we can catch an error
224         // from either request.
225         return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {
226             // Only return the profile.
227             return profiles.length ? profiles[0] : {};
228         });
229     };
231     /**
232      * Create a request to add a user as a contact.
233      *
234      * @param {int} userId The requesting user
235      * @param {int[]} requestUserIds List of user ids to add
236      * @return {object} jQuery promise
237      */
238     var createContactRequest = function(userId, requestUserIds) {
239         var request = {
240             methodname: 'core_message_create_contact_request',
241             args: {
242                 userid: userId,
243                 requesteduserid: requestUserIds
244             }
245         };
247         return Ajax.call([request])[0];
248     };
250     /**
251      * Remove a list of users as contacts.
252      *
253      * @param {int} userId The requesting user
254      * @param {int[]} contactUserIds List of user ids to add
255      * @return {object} jQuery promise
256      */
257     var deleteContacts = function(userId, contactUserIds) {
258         var requests = [
259             {
260                 methodname: 'core_message_delete_contacts',
261                 args: {
262                     userid: userId,
263                     userids: contactUserIds
264                 }
265             },
266             {
267                 methodname: 'core_message_get_member_info',
268                 args: {
269                     referenceuserid: userId,
270                     userids: contactUserIds,
271                     includecontactrequests: true,
272                     includeprivacyinfo: true
273                 }
274             }
275         ];
277         return $.when.apply(null, Ajax.call(requests)).then(function(response1, profiles) {
278             // Return all of the profiles as an array.
279             return profiles;
280         });
281     };
283     /**
284      * Get messages between two users.
285      *
286      * @param {int} currentUserId The requesting user
287      * @param {int} conversationId Other user in the conversation
288      * @param {int} limit Limit for results
289      * @param {int} offset Offset for results
290      * @param {bool} newestFirst Order results by newest first
291      * @param {int} timeFrom Only return messages after this timestamp
292      * @return {object} jQuery promise
293      */
294     var getMessages = function(currentUserId, conversationId, limit, offset, newestFirst, timeFrom) {
295         var args = {
296             currentuserid: currentUserId,
297             convid: conversationId,
298             newest: newestFirst ? true : false
299         };
301         if (typeof limit !== 'undefined') {
302             args.limitnum = limit;
303         }
305         if (typeof offset !== 'undefined') {
306             args.limitfrom = offset;
307         }
309         if (typeof timeFrom !== 'undefined') {
310             args.timefrom = timeFrom;
311         }
313         var request = {
314             methodname: 'core_message_get_conversation_messages',
315             args: args
316         };
317         return Ajax.call([request])[0];
318     };
320     /**
321      * Search for users.
322      *
323      * @param {int} userId The requesting user
324      * @param {string} searchString Search string
325      * @param {int} limit Limit for results
326      * @param {int} offset Offset for results
327      * @return {object} jQuery promise
328      */
329     var searchUsers = function(userId, searchString, limit, offset) {
330         var args = {
331             userid: userId,
332             search: searchString
333         };
335         if (typeof limit !== 'undefined') {
336             args.limitnum = limit;
337         }
339         if (typeof offset !== 'undefined') {
340             args.limitfrom = offset;
341         }
343         var request = {
344             methodname: 'core_message_message_search_users',
345             args: args
346         };
348         return Ajax.call([request])[0];
349     };
351     /**
352      * Search for messages.
353      *
354      * @param {int} userId The requesting user
355      * @param {string} searchString Search string
356      * @param {int} limit Limit for results
357      * @param {int} offset Offset for results
358      * @return {object} jQuery promise
359      */
360     var searchMessages = function(userId, searchString, limit, offset) {
361         var args = {
362             userid: userId,
363             search: searchString
364         };
366         if (typeof limit !== 'undefined') {
367             args.limitnum = limit;
368         }
370         if (typeof offset !== 'undefined') {
371             args.limitfrom = offset;
372         }
374         var request = {
375             methodname: 'core_message_data_for_messagearea_search_messages',
376             args: args
377         };
379         return Ajax.call([request])[0];
380     };
382     /**
383      * Send a list of messages to a user.
384      *
385      * @param {int} toUserId The recipient user id
386      * @param {string[]} messages List of messages to send
387      * @return {object} jQuery promise
388      */
389     var sendMessagesToUser = function(toUserId, messages) {
390         var formattedMessages = messages.map(function(message) {
391             return {
392                 touserid: toUserId,
393                 text: message
394             };
395         });
396         var request = {
397             methodname: 'core_message_send_instant_messages',
398             args: {
399                 messages: formattedMessages
400             }
401         };
403         return Ajax.call([request])[0]
404             .then(function(results) {
405                 // Error handling for the weird way the old function works.
406                 var errors = results.reduce(function(carry, result) {
407                     if (result.errormessage) {
408                         carry.push(result.errormessage);
409                     }
411                     return carry;
412                 }, []);
413                 if (errors.length) {
414                     throw new Error(errors.join("\n"));
415                 }
417                 return results;
418             })
419             .then(function(results) {
420                 // Format the results to match the other send message function.
421                 return results.map(function(result) {
422                     return {
423                         id: result.msgid,
424                         text: result.text,
425                         timecreated: result.timecreated,
426                         useridfrom: result.useridfrom,
427                         conversationid: result.conversationid
428                     };
429                 });
430             });
431     };
433     /**
434      * Send a single message to a user.
435      *
436      * @param {int} toUserId The recipient user id
437      * @param {string} text The message text
438      * @return {object} jQuery promise
439      */
440     var sendMessageToUser = function(toUserId, text) {
441         return sendMessagesToUser(toUserId, [text])
442             .then(function(results) {
443                 return results[0];
444             });
445     };
447     /**
448      * Send messages to a conversation.
449      *
450      * @param {int} conversationId The conversation id
451      * @param {string[]} messages List of messages to send
452      * @return {object} jQuery promise
453      */
454     var sendMessagesToConversation = function(conversationId, messages) {
455         var formattedMessages = messages.map(function(message) {
456             return {
457                 text: message
458             };
459         });
460         var request = {
461             methodname: 'core_message_send_messages_to_conversation',
462             args: {
463                 conversationid: conversationId,
464                 messages: formattedMessages
465             }
466         };
468         return Ajax.call([request])[0];
469     };
471     /**
472      * Send a message to a conversation.
473      *
474      * @param {int} conversationId The conversation id
475      * @param {string} text The message text
476      * @return {object} jQuery promise
477      */
478     var sendMessageToConversation = function(conversationId, text) {
479         return sendMessagesToConversation(conversationId, [text])
480             .then(function(result) {
481                 return result[0];
482             });
483     };
485     /**
486      * Save message preferences.
487      *
488      * @param {int} userId The owner of the preferences
489      * @param {object[]} preferences New preferences values
490      * @return {object} jQuery promise
491      */
492     var savePreferences = function(userId, preferences) {
493         var request = {
494             methodname: 'core_user_update_user_preferences',
495             args: {
496                 userid: userId,
497                 preferences: preferences
498             }
499         };
500         return Ajax.call([request])[0];
501     };
503     /**
504      * Get the user's preferences.
505      *
506      * @param {int} userId The target user
507      * @return {object} jQuery promise
508      */
509     var getPreferences = function(userId) {
510         var request = {
511             methodname: 'core_user_get_user_preferences',
512             args: {
513                 userid: userId
514             }
515         };
516         return Ajax.call([request])[0];
517     };
519     /**
520      * Delete a list of messages.
521      *
522      * @param {int} userId The user to delete messages for
523      * @param {int[]} messageIds List of message ids to delete
524      * @return {object} jQuery promise
525      */
526     var deleteMessages = function(userId, messageIds) {
527         return Ajax.call(messageIds.map(function(messageId) {
528             return {
529                 methodname: 'core_message_delete_message',
530                 args: {
531                     messageid: messageId,
532                     userid: userId
533                 }
534             };
535         }));
536     };
538     /**
539      * Delete a conversation between two users.
540      *
541      * @param {int} userId The user to delete messages for
542      * @param {int} otherUserId The other member of the conversation
543      * @return {object} jQuery promise
544      */
545     var deleteCoversation = function(userId, otherUserId) {
546         var request = {
547             methodname: 'core_message_delete_conversation',
548             args: {
549                 userid: userId,
550                 otheruserid: otherUserId
551             }
552         };
553         return Ajax.call([request])[0];
554     };
556     /**
557      * Get the list of contact requests for a user.
558      *
559      * @param {int} userId The user id
560      * @return {object} jQuery promise
561      */
562     var getContactRequests = function(userId) {
563         var request = {
564             methodname: 'core_message_get_contact_requests',
565             args: {
566                 userid: userId
567             }
568         };
569         return Ajax.call([request])[0];
570     };
572     /**
573      * Accept a contact request.
574      *
575      * @param {int} sendingUserId The user that sent the request
576      * @param {int} recipientUserId The user that received the request
577      * @return {object} jQuery promise
578      */
579     var acceptContactRequest = function(sendingUserId, recipientUserId) {
580         var requests = [
581             {
582                 methodname: 'core_message_confirm_contact_request',
583                 args: {
584                     userid: sendingUserId,
585                     requesteduserid: recipientUserId
586                 }
587             },
588             {
589                 methodname: 'core_message_get_member_info',
590                 args: {
591                     referenceuserid: recipientUserId,
592                     userids: [sendingUserId],
593                     includecontactrequests: true,
594                     includeprivacyinfo: true
595                 }
596             }
597         ];
599         // Wrap both requests in a single promise so that we can catch an error
600         // from either request.
601         return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {
602             // Only return the profile.
603             return profiles.length ? profiles[0] : {};
604         });
605     };
607     /**
608      * Decline a contact request.
609      *
610      * @param {int} sendingUserId The user that sent the request
611      * @param {int} recipientUserId The user that received the request
612      * @return {object} jQuery promise
613      */
614     var declineContactRequest = function(sendingUserId, recipientUserId) {
615         var requests = [
616             {
617                 methodname: 'core_message_decline_contact_request',
618                 args: {
619                     userid: sendingUserId,
620                     requesteduserid: recipientUserId
621                 }
622             },
623             {
624                 methodname: 'core_message_get_member_info',
625                 args: {
626                     referenceuserid: recipientUserId,
627                     userids: [sendingUserId],
628                     includecontactrequests: true,
629                     includeprivacyinfo: true
630                 }
631             }
632         ];
634         // Wrap both requests in a single promise so that we can catch an error
635         // from either request.
636         return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {
637             // Only return the profile.
638             return profiles.length ? profiles[0] : {};
639         });
640     };
642     /**
643      * Get a conversation.
644      *
645      * @param {int} loggedInUserId The logged in user
646      * @param {int} conversationId The conversation id
647      * @param {bool} includeContactRequests Incldue contact requests between members
648      * @param {bool} includePrivacyInfo Include privacy info for members
649      * @param {int} memberLimit Limit for members
650      * @param {int} memberOffset Offset for members
651      * @param {int} messageLimit Limit for messages
652      * @param {int} messageOffset Offset for messages
653      * @param {bool} newestMessagesFirst Order the messages by newest first
654      * @return {object} jQuery promise
655      */
656     var getConversation = function(
657         loggedInUserId,
658         conversationId,
659         includeContactRequests,
660         includePrivacyInfo,
661         memberLimit,
662         memberOffset,
663         messageLimit,
664         messageOffset,
665         newestMessagesFirst
666     ) {
667         var args = {
668             userid: loggedInUserId,
669             conversationid: conversationId
670         };
672         if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) {
673             args.includecontactrequests = includeContactRequests;
674         }
676         if (typeof includePrivacyInfo != 'undefined' && includePrivacyInfo !== null) {
677             args.includeprivacyinfo = includePrivacyInfo;
678         }
680         if (typeof memberLimit != 'undefined' && memberLimit !== null) {
681             args.memberlimit = memberLimit;
682         }
684         if (typeof memberOffset != 'undefined' && memberOffset !== null) {
685             args.memberoffset = memberOffset;
686         }
688         if (typeof messageLimit != 'undefined' && messageLimit !== null) {
689             args.messagelimit = messageLimit;
690         }
692         if (typeof messageOffset != 'undefined' && messageOffset !== null) {
693             args.messageoffset = messageOffset;
694         }
696         if (typeof newestMessagesFirst != 'undefined' && newestMessagesFirst !== null) {
697             args.newestmessagesfirst = newestMessagesFirst;
698         }
700         var request = {
701             methodname: 'core_message_get_conversation',
702             args: args
703         };
705         return Ajax.call([request])[0];
706     };
708     /**
709      * Get a conversation between users.
710      *
711      * @param {int} loggedInUserId The logged in user
712      * @param {int} otherUserId The other user id
713      * @param {bool} includeContactRequests Incldue contact requests between members
714      * @param {bool} includePrivacyInfo Include privacy info for members
715      * @param {int} memberLimit Limit for members
716      * @param {int} memberOffset Offset for members
717      * @param {int} messageLimit Limit for messages
718      * @param {int} messageOffset Offset for messages
719      * @param {bool} newestMessagesFirst Order the messages by newest first
720      * @return {object} jQuery promise
721      */
722     var getConversationBetweenUsers = function(
723         loggedInUserId,
724         otherUserId,
725         includeContactRequests,
726         includePrivacyInfo,
727         memberLimit,
728         memberOffset,
729         messageLimit,
730         messageOffset,
731         newestMessagesFirst
732     ) {
733         var args = {
734             userid: loggedInUserId,
735             otheruserid: otherUserId
736         };
738         if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) {
739             args.includecontactrequests = includeContactRequests;
740         }
742         if (typeof includePrivacyInfo != 'undefined' && includePrivacyInfo !== null) {
743             args.includeprivacyinfo = includePrivacyInfo;
744         }
746         if (typeof memberLimit != 'undefined' && memberLimit !== null) {
747             args.memberlimit = memberLimit;
748         }
750         if (typeof memberOffset != 'undefined' && memberOffset !== null) {
751             args.memberoffset = memberOffset;
752         }
754         if (typeof messageLimit != 'undefined' && messageLimit !== null) {
755             args.messagelimit = messageLimit;
756         }
758         if (typeof messageOffset != 'undefined' && messageOffset !== null) {
759             args.messageoffset = messageOffset;
760         }
762         if (typeof newestMessagesFirst != 'undefined' && newestMessagesFirst !== null) {
763             args.newestmessagesfirst = newestMessagesFirst;
764         }
766         var request = {
767             methodname: 'core_message_get_conversation_between_users',
768             args: args
769         };
771         return Ajax.call([request])[0];
772     };
774     /**
775      * Get the conversations for a user.
776      *
777      * @param {int} userId The logged in user
778      * @param {int|null} type The type of conversation to get
779      * @param {int} limit Limit for results
780      * @param {int} offset Offset for results
781      * @param {bool|null} favourites If favourites should be included or not
782      * @return {object} jQuery promise
783      */
784     var getConversations = function(
785         userId,
786         type,
787         limit,
788         offset,
789         favourites
790     ) {
791         var args = {
792             userid: userId,
793             type: type
794         };
796         if (typeof limit != 'undefined' && limit !== null) {
797             args.limitnum = limit;
798         }
800         if (typeof offset != 'undefined' && offset !== null) {
801             args.limitfrom = offset;
802         }
804         if (typeof favourites != 'undefined' && favourites !== null) {
805             args.favourites = favourites;
806         }
808         var request = {
809             methodname: 'core_message_get_conversations',
810             args: args
811         };
813         return Ajax.call([request])[0]
814             .then(function(result) {
815                 if (result.conversations.length) {
816                     result.conversations = result.conversations.map(function(conversation) {
817                         if (conversation.type == CONVERSATION_TYPES.PRIVATE) {
818                             var otherUser = conversation.members.length ? conversation.members[0] : null;
820                             if (otherUser) {
821                                 conversation.name = conversation.name ? conversation.name : otherUser.fullname;
822                                 conversation.imageurl = conversation.imageurl ? conversation.imageurl : otherUser.profileimageurl;
823                             }
824                         }
826                         return conversation;
827                     });
828                 }
830                 return result;
831             });
832     };
834     /**
835      * Get the conversations for a user.
836      *
837      * @param {int} conversationId The conversation id
838      * @param {int} loggedInUserId The logged in user
839      * @param {int} limit Limit for results
840      * @param {int} offset Offset for results
841      * @param {bool} includeContactRequests If contact requests should be included in result
842      * @return {object} jQuery promise
843      */
844     var getConversationMembers = function(conversationId, loggedInUserId, limit, offset, includeContactRequests) {
845         var args = {
846             userid: loggedInUserId,
847             conversationid: conversationId
848         };
850         if (typeof limit != 'undefined' && limit !== null) {
851             args.limitnum = limit;
852         }
854         if (typeof offset != 'undefined' && offset !== null) {
855             args.limitfrom = offset;
856         }
858         if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) {
859             args.includecontactrequests = includeContactRequests;
860         }
862         var request = {
863             methodname: 'core_message_get_conversation_members',
864             args: args
865         };
867         return Ajax.call([request])[0];
868     };
870     /**
871      * Set a list of conversations to set as favourites for the given user.
872      *
873      * @param {int} userId The user id
874      * @param {array} conversationIds List of conversation ids to set as favourite
875      * @return {object} jQuery promise
876      */
877     var setFavouriteConversations = function(userId, conversationIds) {
879         var request = {
880             methodname: 'core_message_set_favourite_conversations',
881             args: {
882                 userid: userId,
883                 conversations: conversationIds
884             }
885         };
886         return Ajax.call([request])[0];
887     };
889     /**
890      * Set a list of conversations to unset as favourites for the given user.
891      *
892      * @param {int} userId The user id
893      * @param {array} conversationIds List of conversation ids to unset as favourite
894      * @return {object} jQuery promise
895      */
896     var unsetFavouriteConversations = function(userId, conversationIds) {
898         var request = {
899             methodname: 'core_message_unset_favourite_conversations',
900             args: {
901                 userid: userId,
902                 conversations: conversationIds
903             }
904         };
905         return Ajax.call([request])[0];
906     };
908     /**
909      * Get a list of user's member info.
910      *
911      * @param {int} referenceUserId The user id
912      * @param {array} userIds List of user ids to get
913      * @param {bool} includeContactRequests Include contact requests between users in response
914      * @param {bool} includePrivacyInfo Include privacy info for reference user in response
915      * @return {object} jQuery promise
916      */
917     var getMemberInfo = function(referenceUserId, userIds, includeContactRequests, includePrivacyInfo) {
918         var args = {
919             referenceuserid: referenceUserId,
920             userids: userIds
921         };
923         if (typeof includeContactRequests != 'undefined') {
924             args.includecontactrequests = includeContactRequests;
925         }
927         if (typeof includePrivacyInfo != 'undefined') {
928             args.includeprivacyinfo = includePrivacyInfo;
929         }
931         var request = {
932             methodname: 'core_message_get_member_info',
933             args: args
934         };
935         return Ajax.call([request])[0];
936     };
938     /**
939      * Get a list of user's member info.
940      *
941      * @param {int} userId The user id to mark as read for
942      * @param {int} conversationId The conversation to mark as read
943      * @return {object} jQuery promise
944      */
945     var markAllConversationMessagesAsRead = function(userId, conversationId) {
947         var request = {
948             methodname: 'core_message_mark_all_conversation_messages_as_read',
949             args: {
950                 userid: userId,
951                 conversationid: conversationId
952             }
953         };
954         return Ajax.call([request])[0];
955     };
957     return {
958         query: query,
959         countUnreadConversations: countUnreadConversations,
960         markAllAsRead: markAllAsRead,
961         getContacts: getContacts,
962         getProfile: getProfile,
963         blockUser: blockUser,
964         unblockUser: unblockUser,
965         createContactRequest: createContactRequest,
966         deleteContacts: deleteContacts,
967         getMessages: getMessages,
968         searchUsers: searchUsers,
969         searchMessages: searchMessages,
970         sendMessagesToUser: sendMessagesToUser,
971         sendMessageToUser: sendMessageToUser,
972         sendMessagesToConversation: sendMessagesToConversation,
973         sendMessageToConversation: sendMessageToConversation,
974         savePreferences: savePreferences,
975         getPreferences: getPreferences,
976         deleteMessages: deleteMessages,
977         deleteCoversation: deleteCoversation,
978         getContactRequests: getContactRequests,
979         acceptContactRequest: acceptContactRequest,
980         declineContactRequest: declineContactRequest,
981         getConversation: getConversation,
982         getConversationBetweenUsers: getConversationBetweenUsers,
983         getConversations: getConversations,
984         getConversationMembers: getConversationMembers,
985         setFavouriteConversations: setFavouriteConversations,
986         unsetFavouriteConversations: unsetFavouriteConversations,
987         getMemberInfo: getMemberInfo,
988         markAllConversationMessagesAsRead: markAllConversationMessagesAsRead
989     };