From 3ea46c8e312072780f189861ee3b2f338dc78f17 Mon Sep 17 00:00:00 2001 From: Ryan Wyllie Date: Tue, 16 Oct 2018 11:45:59 +0800 Subject: [PATCH] MDL-63303 message: add functions to message_repository.js --- message/amd/build/message_repository.min.js | 2 +- message/amd/src/message_repository.js | 878 ++++++++++++++++++++ 2 files changed, 879 insertions(+), 1 deletion(-) diff --git a/message/amd/build/message_repository.min.js b/message/amd/build/message_repository.min.js index 5f20161d194..4e55810c9a1 100644 --- a/message/amd/build/message_repository.min.js +++ b/message/amd/build/message_repository.min.js @@ -1 +1 @@ -define(["jquery","core/ajax","core/notification"],function(a,b,c){var d=function(a){"undefined"==typeof a.limit&&(a.limit=0),"undefined"==typeof a.offset&&(a.offset=0),a.limitfrom=a.offset,a.limitnum=a.limit,delete a.limit,delete a.offset;var d={methodname:"core_message_data_for_messagearea_conversations",args:a},e=b.call([d])[0];return e.fail(c.exception),e},e=function(a){var d={methodname:"core_message_get_unread_conversations_count",args:a},e=b.call([d])[0];return e.fail(c.exception),e},f=function(a){var d={methodname:"core_message_mark_all_messages_as_read",args:a},e=b.call([d])[0];return e.fail(c.exception),e};return{query:d,countUnreadConversations:e,markAllAsRead:f}}); \ No newline at end of file +define(["jquery","core/ajax","core/notification"],function(a,b,c){var d={PRIVATE:1,PUBLIC:2},e=function(a){"undefined"==typeof a.limit&&(a.limit=0),"undefined"==typeof a.offset&&(a.offset=0),"undefined"==typeof a.type&&(a.type=null),"undefined"==typeof a.favouritesonly&&(a.favouritesonly=!1),a.limitfrom=a.offset,a.limitnum=a.limit,delete a.limit,delete a.offset;var d={methodname:"core_message_data_for_messagearea_conversations",args:a},e=b.call([d])[0];return e.fail(c.exception),e},f=function(a){var d={methodname:"core_message_get_unread_conversations_count",args:a},e=b.call([d])[0];return e.fail(c.exception),e},g=function(a){var d={methodname:"core_message_mark_all_messages_as_read",args:a},e=b.call([d])[0];return e.fail(c.exception),e},h=function(a,c,d){var e={userid:a};"undefined"!=typeof c&&(e.limitnum=c),"undefined"!=typeof d&&(e.limitfrom=d);var f={methodname:"core_message_data_for_messagearea_contacts",args:e};return b.call([f])[0]},i=function(a,c){var d={methodname:"core_message_data_for_messagearea_get_profile",args:{currentuserid:a,otheruserid:c}};return b.call([d])[0]},j=function(c,d){var e=[{methodname:"core_message_block_user",args:{userid:c,blockeduserid:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:c,userids:[d],includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b.length?b[0]:{}})},k=function(c,d){var e=[{methodname:"core_message_unblock_user",args:{userid:c,unblockeduserid:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:c,userids:[d],includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b.length?b[0]:{}})},l=function(a,c){var d={methodname:"core_message_create_contact_request",args:{userid:a,requesteduserid:c}};return b.call([d])[0]},m=function(c,d){var e=[{methodname:"core_message_delete_contacts",args:{userid:c,userids:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:c,userids:d,includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b})},n=function(a,c,d,e,f,g){var h={currentuserid:a,convid:c,newest:!!f};"undefined"!=typeof d&&(h.limitnum=d),"undefined"!=typeof e&&(h.limitfrom=e),"undefined"!=typeof g&&(h.timefrom=g);var i={methodname:"core_message_get_conversation_messages",args:h};return b.call([i])[0]},o=function(a,c,d,e){var f={userid:a,search:c};"undefined"!=typeof d&&(f.limitnum=d),"undefined"!=typeof e&&(f.limitfrom=e);var g={methodname:"core_message_message_search_users",args:f};return b.call([g])[0]},p=function(a,c,d,e){var f={userid:a,search:c};"undefined"!=typeof d&&(f.limitnum=d),"undefined"!=typeof e&&(f.limitfrom=e);var g={methodname:"core_message_data_for_messagearea_search_messages",args:f};return b.call([g])[0]},q=function(a,c){var d=c.map(function(b){return{touserid:a,text:b}}),e={methodname:"core_message_send_instant_messages",args:{messages:d}};return b.call([e])[0].then(function(a){var b=a.reduce(function(a,b){return b.errormessage&&a.push(b.errormessage),a},[]);if(b.length)throw new Error(b.join("\n"));return a}).then(function(a){return a.map(function(a){return{id:a.msgid,text:a.text,timecreated:a.timecreated,useridfrom:a.useridfrom,conversationid:a.conversationid}})})},r=function(a,b){return q(a,[b]).then(function(a){return a[0]})},s=function(a,c){var d=c.map(function(a){return{text:a}}),e={methodname:"core_message_send_messages_to_conversation",args:{conversationid:a,messages:d}};return b.call([e])[0]},t=function(a,b){return s(a,[b]).then(function(a){return a[0]})},u=function(a,c){var d={methodname:"core_user_update_user_preferences",args:{userid:a,preferences:c}};return b.call([d])[0]},v=function(a){var c={methodname:"core_user_get_user_preferences",args:{userid:a}};return b.call([c])[0]},w=function(a,c){return b.call(c.map(function(b){return{methodname:"core_message_delete_message",args:{messageid:b,userid:a}}}))},x=function(a,c){var d={methodname:"core_message_delete_conversation",args:{userid:a,otheruserid:c}};return b.call([d])[0]},y=function(a){var c={methodname:"core_message_get_contact_requests",args:{userid:a}};return b.call([c])[0]},z=function(c,d){var e=[{methodname:"core_message_confirm_contact_request",args:{userid:c,requesteduserid:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:d,userids:[c],includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b.length?b[0]:{}})},A=function(c,d){var e=[{methodname:"core_message_decline_contact_request",args:{userid:c,requesteduserid:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:d,userids:[c],includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b.length?b[0]:{}})},B=function(a,c,d,e,f,g,h,i,j){var k={userid:a,conversationid:c};"undefined"!=typeof d&&null!==d&&(k.includecontactrequests=d),"undefined"!=typeof e&&null!==e&&(k.includeprivacyinfo=e),"undefined"!=typeof f&&null!==f&&(k.memberlimit=f),"undefined"!=typeof g&&null!==g&&(k.memberoffset=g),"undefined"!=typeof h&&null!==h&&(k.messagelimit=h),"undefined"!=typeof i&&null!==i&&(k.messageoffset=i),"undefined"!=typeof j&&null!==j&&(k.newestmessagesfirst=j);var l={methodname:"core_message_get_conversation",args:k};return b.call([l])[0]},C=function(a,c,d,e,f,g,h,i,j){var k={userid:a,otheruserid:c};"undefined"!=typeof d&&null!==d&&(k.includecontactrequests=d),"undefined"!=typeof e&&null!==e&&(k.includeprivacyinfo=e),"undefined"!=typeof f&&null!==f&&(k.memberlimit=f),"undefined"!=typeof g&&null!==g&&(k.memberoffset=g),"undefined"!=typeof h&&null!==h&&(k.messagelimit=h),"undefined"!=typeof i&&null!==i&&(k.messageoffset=i),"undefined"!=typeof j&&null!==j&&(k.newestmessagesfirst=j);var l={methodname:"core_message_get_conversation_between_users",args:k};return b.call([l])[0]},D=function(a,c,e,f,g){var h={userid:a,type:c};"undefined"!=typeof e&&null!==e&&(h.limitnum=e),"undefined"!=typeof f&&null!==f&&(h.limitfrom=f),"undefined"!=typeof g&&null!==g&&(h.favourites=g);var i={methodname:"core_message_get_conversations",args:h};return b.call([i])[0].then(function(a){return a.conversations.length&&(a.conversations=a.conversations.map(function(a){if(a.type==d.PRIVATE){var b=a.members.length?a.members[0]:null;b&&(a.name=a.name?a.name:b.fullname,a.imageurl=a.imageurl?a.imageurl:b.profileimageurl)}return a})),a})},E=function(a,c,d,e,f){var g={userid:c,conversationid:a};"undefined"!=typeof d&&null!==d&&(g.limitnum=d),"undefined"!=typeof e&&null!==e&&(g.limitfrom=e),"undefined"!=typeof f&&null!==f&&(g.includecontactrequests=f);var h={methodname:"core_message_get_conversation_members",args:g};return b.call([h])[0]},F=function(a,c){var d={methodname:"core_message_set_favourite_conversations",args:{userid:a,conversations:c}};return b.call([d])[0]},G=function(a,c){var d={methodname:"core_message_unset_favourite_conversations",args:{userid:a,conversations:c}};return b.call([d])[0]},H=function(a,c,d,e){var f={referenceuserid:a,userids:c};"undefined"!=typeof d&&(f.includecontactrequests=d),"undefined"!=typeof e&&(f.includeprivacyinfo=e);var g={methodname:"core_message_get_member_info",args:f};return b.call([g])[0]},I=function(a,c){var d={methodname:"core_message_mark_all_conversation_messages_as_read",args:{userid:a,conversationid:c}};return b.call([d])[0]};return{query:e,countUnreadConversations:f,markAllAsRead:g,getContacts:h,getProfile:i,blockUser:j,unblockUser:k,createContactRequest:l,deleteContacts:m,getMessages:n,searchUsers:o,searchMessages:p,sendMessagesToUser:q,sendMessageToUser:r,sendMessagesToConversation:s,sendMessageToConversation:t,savePreferences:u,getPreferences:v,deleteMessages:w,deleteCoversation:x,getContactRequests:y,acceptContactRequest:z,declineContactRequest:A,getConversation:B,getConversationBetweenUsers:C,getConversations:D,getConversationMembers:E,setFavouriteConversations:F,unsetFavouriteConversations:G,getMemberInfo:H,markAllConversationMessagesAsRead:I}}); \ No newline at end of file diff --git a/message/amd/src/message_repository.js b/message/amd/src/message_repository.js index 6c0ee94f039..3eb4d470d37 100644 --- a/message/amd/src/message_repository.js +++ b/message/amd/src/message_repository.js @@ -23,6 +23,12 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) { + + var CONVERSATION_TYPES = { + PRIVATE: 1, + PUBLIC: 2 + }; + /** * Retrieve a list of messages from the server. * @@ -39,6 +45,14 @@ define(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notificat args.offset = 0; } + if (typeof args.type === 'undefined') { + args.type = null; + } + + if (typeof args.favouritesonly === 'undefined') { + args.favouritesonly = false; + } + args.limitfrom = args.offset; args.limitnum = args.limit; @@ -96,9 +110,873 @@ define(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notificat return promise; }; + /** + * Get contacts for given user. + * + * @param {int} userId The user id + * @param {int} limit Limit for results + * @param {int} offset Offset for results + * @return {object} jQuery promise + */ + var getContacts = function(userId, limit, offset) { + var args = { + userid: userId + }; + + if (typeof limit !== 'undefined') { + args.limitnum = limit; + } + + if (typeof offset !== 'undefined') { + args.limitfrom = offset; + } + + var request = { + methodname: 'core_message_data_for_messagearea_contacts', + args: args + }; + + return Ajax.call([request])[0]; + }; + + /** + * Request profile information as a user for a given user. + * + * @param {int} userId The requesting user + * @param {int} profileUserId The id of the user who's profile is being requested + * @return {object} jQuery promise + */ + var getProfile = function(userId, profileUserId) { + var request = { + methodname: 'core_message_data_for_messagearea_get_profile', + args: { + currentuserid: userId, + otheruserid: profileUserId + } + }; + + return Ajax.call([request])[0]; + }; + + /** + * Block a user. + * + * @param {int} userId The requesting user + * @param {int} blockedUserId Id of user to block + * @return {object} jQuery promise + */ + var blockUser = function(userId, blockedUserId) { + var requests = [ + { + methodname: 'core_message_block_user', + args: { + userid: userId, + blockeduserid: blockedUserId + } + }, + { + methodname: 'core_message_get_member_info', + args: { + referenceuserid: userId, + userids: [blockedUserId], + includecontactrequests: true, + includeprivacyinfo: true + } + } + ]; + + // Wrap both requests in a single promise so that we can catch an error + // from either request. + return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) { + // Only return the profile. + return profiles.length ? profiles[0] : {}; + }); + }; + + /** + * Unblock a user. + * + * @param {int} userId The requesting user + * @param {int} unblockedUserId Id of user to unblock + * @return {object} jQuery promise + */ + var unblockUser = function(userId, unblockedUserId) { + var requests = [ + { + methodname: 'core_message_unblock_user', + args: { + userid: userId, + unblockeduserid: unblockedUserId + } + }, + { + methodname: 'core_message_get_member_info', + args: { + referenceuserid: userId, + userids: [unblockedUserId], + includecontactrequests: true, + includeprivacyinfo: true + } + } + ]; + + // Wrap both requests in a single promise so that we can catch an error + // from either request. + return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) { + // Only return the profile. + return profiles.length ? profiles[0] : {}; + }); + }; + + /** + * Create a request to add a user as a contact. + * + * @param {int} userId The requesting user + * @param {int[]} requestUserIds List of user ids to add + * @return {object} jQuery promise + */ + var createContactRequest = function(userId, requestUserIds) { + var request = { + methodname: 'core_message_create_contact_request', + args: { + userid: userId, + requesteduserid: requestUserIds + } + }; + + return Ajax.call([request])[0]; + }; + + /** + * Remove a list of users as contacts. + * + * @param {int} userId The requesting user + * @param {int[]} contactUserIds List of user ids to add + * @return {object} jQuery promise + */ + var deleteContacts = function(userId, contactUserIds) { + var requests = [ + { + methodname: 'core_message_delete_contacts', + args: { + userid: userId, + userids: contactUserIds + } + }, + { + methodname: 'core_message_get_member_info', + args: { + referenceuserid: userId, + userids: contactUserIds, + includecontactrequests: true, + includeprivacyinfo: true + } + } + ]; + + return $.when.apply(null, Ajax.call(requests)).then(function(response1, profiles) { + // Return all of the profiles as an array. + return profiles; + }); + }; + + /** + * Get messages between two users. + * + * @param {int} currentUserId The requesting user + * @param {int} conversationId Other user in the conversation + * @param {int} limit Limit for results + * @param {int} offset Offset for results + * @param {bool} newestFirst Order results by newest first + * @param {int} timeFrom Only return messages after this timestamp + * @return {object} jQuery promise + */ + var getMessages = function(currentUserId, conversationId, limit, offset, newestFirst, timeFrom) { + var args = { + currentuserid: currentUserId, + convid: conversationId, + newest: newestFirst ? true : false + }; + + if (typeof limit !== 'undefined') { + args.limitnum = limit; + } + + if (typeof offset !== 'undefined') { + args.limitfrom = offset; + } + + if (typeof timeFrom !== 'undefined') { + args.timefrom = timeFrom; + } + + var request = { + methodname: 'core_message_get_conversation_messages', + args: args + }; + return Ajax.call([request])[0]; + }; + + /** + * Search for users. + * + * @param {int} userId The requesting user + * @param {string} searchString Search string + * @param {int} limit Limit for results + * @param {int} offset Offset for results + * @return {object} jQuery promise + */ + var searchUsers = function(userId, searchString, limit, offset) { + var args = { + userid: userId, + search: searchString + }; + + if (typeof limit !== 'undefined') { + args.limitnum = limit; + } + + if (typeof offset !== 'undefined') { + args.limitfrom = offset; + } + + var request = { + methodname: 'core_message_message_search_users', + args: args + }; + + return Ajax.call([request])[0]; + }; + + /** + * Search for messages. + * + * @param {int} userId The requesting user + * @param {string} searchString Search string + * @param {int} limit Limit for results + * @param {int} offset Offset for results + * @return {object} jQuery promise + */ + var searchMessages = function(userId, searchString, limit, offset) { + var args = { + userid: userId, + search: searchString + }; + + if (typeof limit !== 'undefined') { + args.limitnum = limit; + } + + if (typeof offset !== 'undefined') { + args.limitfrom = offset; + } + + var request = { + methodname: 'core_message_data_for_messagearea_search_messages', + args: args + }; + + return Ajax.call([request])[0]; + }; + + /** + * Send a list of messages to a user. + * + * @param {int} toUserId The recipient user id + * @param {string[]} messages List of messages to send + * @return {object} jQuery promise + */ + var sendMessagesToUser = function(toUserId, messages) { + var formattedMessages = messages.map(function(message) { + return { + touserid: toUserId, + text: message + }; + }); + var request = { + methodname: 'core_message_send_instant_messages', + args: { + messages: formattedMessages + } + }; + + return Ajax.call([request])[0] + .then(function(results) { + // Error handling for the weird way the old function works. + var errors = results.reduce(function(carry, result) { + if (result.errormessage) { + carry.push(result.errormessage); + } + + return carry; + }, []); + if (errors.length) { + throw new Error(errors.join("\n")); + } + + return results; + }) + .then(function(results) { + // Format the results to match the other send message function. + return results.map(function(result) { + return { + id: result.msgid, + text: result.text, + timecreated: result.timecreated, + useridfrom: result.useridfrom, + conversationid: result.conversationid + }; + }); + }); + }; + + /** + * Send a single message to a user. + * + * @param {int} toUserId The recipient user id + * @param {string} text The message text + * @return {object} jQuery promise + */ + var sendMessageToUser = function(toUserId, text) { + return sendMessagesToUser(toUserId, [text]) + .then(function(results) { + return results[0]; + }); + }; + + /** + * Send messages to a conversation. + */ + var sendMessagesToConversation = function(conversationId, messages) { + var formattedMessages = messages.map(function(message) { + return { + text: message + }; + }); + var request = { + methodname: 'core_message_send_messages_to_conversation', + args: { + conversationid: conversationId, + messages: formattedMessages + } + }; + + return Ajax.call([request])[0]; + }; + + /** + * Send a message to a conversation. + */ + var sendMessageToConversation = function(conversationId, text) { + return sendMessagesToConversation(conversationId, [text]) + .then(function(result) { + return result[0]; + }); + }; + + /** + * Save message preferences. + * + * @param {int} userId The owner of the preferences + * @param {object[]} preferences New preferences values + * @return {object} jQuery promise + */ + var savePreferences = function(userId, preferences) { + var request = { + methodname: 'core_user_update_user_preferences', + args: { + userid: userId, + preferences: preferences + } + }; + return Ajax.call([request])[0]; + }; + + /** + * Get the user's preferences. + * + * @param {int} userId The target user + * @return {object} jQuery promise + */ + var getPreferences = function(userId) { + var request = { + methodname: 'core_user_get_user_preferences', + args: { + userid: userId + } + }; + return Ajax.call([request])[0]; + }; + + /** + * Delete a list of messages. + * + * @param {int} userId The user to delete messages for + * @param {int[]} messageIds List of message ids to delete + * @return {object} jQuery promise + */ + var deleteMessages = function(userId, messageIds) { + return Ajax.call(messageIds.map(function(messageId) { + return { + methodname: 'core_message_delete_message', + args: { + messageid: messageId, + userid: userId + } + }; + })); + }; + + /** + * Delete a conversation between two users. + * + * @param {int} userId The user to delete messages for + * @param {int} otherUserId The other member of the conversation + * @return {object} jQuery promise + */ + var deleteCoversation = function(userId, otherUserId) { + var request = { + methodname: 'core_message_delete_conversation', + args: { + userid: userId, + otheruserid: otherUserId + } + }; + return Ajax.call([request])[0]; + }; + + /** + * Get the list of contact requests for a user. + * + * @param {int} userId The user id + * @return {object} jQuery promise + */ + var getContactRequests = function(userId) { + var request = { + methodname: 'core_message_get_contact_requests', + args: { + userid: userId + } + }; + return Ajax.call([request])[0]; + }; + + /** + * Accept a contact request. + * + * @param {int} sendingUserId The user that sent the request + * @param {int} recipientUserId The user that received the request + * @return {object} jQuery promise + */ + var acceptContactRequest = function(sendingUserId, recipientUserId) { + var requests = [ + { + methodname: 'core_message_confirm_contact_request', + args: { + userid: sendingUserId, + requesteduserid: recipientUserId + } + }, + { + methodname: 'core_message_get_member_info', + args: { + referenceuserid: recipientUserId, + userids: [sendingUserId], + includecontactrequests: true, + includeprivacyinfo: true + } + } + ]; + + // Wrap both requests in a single promise so that we can catch an error + // from either request. + return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) { + // Only return the profile. + return profiles.length ? profiles[0] : {}; + }); + }; + + /** + * Decline a contact request. + * + * @param {int} sendingUserId The user that sent the request + * @param {int} recipientUserId The user that received the request + * @return {object} jQuery promise + */ + var declineContactRequest = function(sendingUserId, recipientUserId) { + var requests = [ + { + methodname: 'core_message_decline_contact_request', + args: { + userid: sendingUserId, + requesteduserid: recipientUserId + } + }, + { + methodname: 'core_message_get_member_info', + args: { + referenceuserid: recipientUserId, + userids: [sendingUserId], + includecontactrequests: true, + includeprivacyinfo: true + } + } + ]; + + // Wrap both requests in a single promise so that we can catch an error + // from either request. + return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) { + // Only return the profile. + return profiles.length ? profiles[0] : {}; + }); + }; + + /** + * Get a conversation. + * + * @param {int} loggedInUserId The logged in user + * @param {int} conversationId The conversation id + * @param {bool} includeContactRequests Incldue contact requests between members + * @param {bool} includePrivacyInfo Include privacy info for members + * @param {int} memberLimit Limit for members + * @param {int} memberOffset Offset for members + * @param {int} messageLimit Limit for messages + * @param {int} messageOffset Offset for messages + * @param {bool} newestMessagesFirst Order the messages by newest first + * @return {object} jQuery promise + */ + var getConversation = function( + loggedInUserId, + conversationId, + includeContactRequests, + includePrivacyInfo, + memberLimit, + memberOffset, + messageLimit, + messageOffset, + newestMessagesFirst + ) { + var args = { + userid: loggedInUserId, + conversationid: conversationId + }; + + if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) { + args.includecontactrequests = includeContactRequests; + } + + if (typeof includePrivacyInfo != 'undefined' && includePrivacyInfo !== null) { + args.includeprivacyinfo = includePrivacyInfo; + } + + if (typeof memberLimit != 'undefined' && memberLimit !== null) { + args.memberlimit = memberLimit; + } + + if (typeof memberOffset != 'undefined' && memberOffset !== null) { + args.memberoffset = memberOffset; + } + + if (typeof messageLimit != 'undefined' && messageLimit !== null) { + args.messagelimit = messageLimit; + } + + if (typeof messageOffset != 'undefined' && messageOffset !== null) { + args.messageoffset = messageOffset; + } + + if (typeof newestMessagesFirst != 'undefined' && newestMessagesFirst !== null) { + args.newestmessagesfirst = newestMessagesFirst; + } + + var request = { + methodname: 'core_message_get_conversation', + args: args + }; + + return Ajax.call([request])[0]; + }; + + /** + * Get a conversation between users. + * + * @param {int} loggedInUserId The logged in user + * @param {int} otherUserId The other user id + * @param {bool} includeContactRequests Incldue contact requests between members + * @param {bool} includePrivacyInfo Include privacy info for members + * @param {int} memberLimit Limit for members + * @param {int} memberOffset Offset for members + * @param {int} messageLimit Limit for messages + * @param {int} messageOffset Offset for messages + * @param {bool} newestMessagesFirst Order the messages by newest first + * @return {object} jQuery promise + */ + var getConversationBetweenUsers = function( + loggedInUserId, + otherUserId, + includeContactRequests, + includePrivacyInfo, + memberLimit, + memberOffset, + messageLimit, + messageOffset, + newestMessagesFirst + ) { + var args = { + userid: loggedInUserId, + otheruserid: otherUserId + }; + + if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) { + args.includecontactrequests = includeContactRequests; + } + + if (typeof includePrivacyInfo != 'undefined' && includePrivacyInfo !== null) { + args.includeprivacyinfo = includePrivacyInfo; + } + + if (typeof memberLimit != 'undefined' && memberLimit !== null) { + args.memberlimit = memberLimit; + } + + if (typeof memberOffset != 'undefined' && memberOffset !== null) { + args.memberoffset = memberOffset; + } + + if (typeof messageLimit != 'undefined' && messageLimit !== null) { + args.messagelimit = messageLimit; + } + + if (typeof messageOffset != 'undefined' && messageOffset !== null) { + args.messageoffset = messageOffset; + } + + if (typeof newestMessagesFirst != 'undefined' && newestMessagesFirst !== null) { + args.newestmessagesfirst = newestMessagesFirst; + } + + var request = { + methodname: 'core_message_get_conversation_between_users', + args: args + }; + + return Ajax.call([request])[0]; + }; + + /** + * Get the conversations for a user. + * + * @param {int} userId The logged in user + * @param {int|null} type The type of conversation to get + * @param {int} limit Limit for results + * @param {int} offset Offset for results + * @param {bool|null} favourites If favourites should be included or not + * @return {object} jQuery promise + */ + var getConversations = function( + userId, + type, + limit, + offset, + favourites + ) { + var args = { + userid: userId, + type: type + }; + + if (typeof limit != 'undefined' && limit !== null) { + args.limitnum = limit; + } + + if (typeof offset != 'undefined' && offset !== null) { + args.limitfrom = offset; + } + + if (typeof favourites != 'undefined' && favourites !== null) { + args.favourites = favourites; + } + + var request = { + methodname: 'core_message_get_conversations', + args: args + }; + + return Ajax.call([request])[0] + .then(function(result) { + if (result.conversations.length) { + result.conversations = result.conversations.map(function(conversation) { + if (conversation.type == CONVERSATION_TYPES.PRIVATE) { + var otherUser = conversation.members.length ? conversation.members[0] : null; + + if (otherUser) { + conversation.name = conversation.name ? conversation.name : otherUser.fullname; + conversation.imageurl = conversation.imageurl ? conversation.imageurl : otherUser.profileimageurl; + } + } + + return conversation; + }); + } + + return result; + }); + }; + + /** + * Get the conversations for a user. + * + * @param {int} conversationId The conversation id + * @param {int} loggedInUserId The logged in user + * @param {int} limit Limit for results + * @param {int} offset Offset for results + * @param {bool} includeContactRequests If contact requests should be included in result + * @return {object} jQuery promise + */ + var getConversationMembers = function(conversationId, loggedInUserId, limit, offset, includeContactRequests) { + var args = { + userid: loggedInUserId, + conversationid: conversationId + }; + + if (typeof limit != 'undefined' && limit !== null) { + args.limitnum = limit; + } + + if (typeof offset != 'undefined' && offset !== null) { + args.limitfrom = offset; + } + + if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) { + args.includecontactrequests = includeContactRequests; + } + + var request = { + methodname: 'core_message_get_conversation_members', + args: args + }; + + return Ajax.call([request])[0]; + }; + + /** + * Set a list of conversations to set as favourites for the given user. + * + * @param {int} userId The user id + * @param {array} conversationIds List of conversation ids to set as favourite + * @return {object} jQuery promise + */ + var setFavouriteConversations = function(userId, conversationIds) { + + var request = { + methodname: 'core_message_set_favourite_conversations', + args: { + userid: userId, + conversations: conversationIds + } + }; + return Ajax.call([request])[0]; + }; + + /** + * Set a list of conversations to unset as favourites for the given user. + * + * @param {int} userId The user id + * @param {array} conversationIds List of conversation ids to unset as favourite + * @return {object} jQuery promise + */ + var unsetFavouriteConversations = function(userId, conversationIds) { + + var request = { + methodname: 'core_message_unset_favourite_conversations', + args: { + userid: userId, + conversations: conversationIds + } + }; + return Ajax.call([request])[0]; + }; + + /** + * Get a list of user's member info. + * + * @param {int} referenceUserId The user id + * @param {array} userIds List of user ids to get + * @param {bool} includeContactRequests Include contact requests between users in response + * @param {bool} includePrivacyInfo Include privacy info for reference user in response + * @return {object} jQuery promise + */ + var getMemberInfo = function(referenceUserId, userIds, includeContactRequests, includePrivacyInfo) { + var args = { + referenceuserid: referenceUserId, + userids: userIds + }; + + if (typeof includeContactRequests != 'undefined') { + args.includecontactrequests = includeContactRequests; + } + + if (typeof includePrivacyInfo != 'undefined') { + args.includeprivacyinfo = includePrivacyInfo; + } + + var request = { + methodname: 'core_message_get_member_info', + args: args + }; + return Ajax.call([request])[0]; + }; + + /** + * Get a list of user's member info. + * + * @param {int} userId The user id to mark as read for + * @param {int} conversationId The conversation to mark as read + * @return {object} jQuery promise + */ + var markAllConversationMessagesAsRead = function(userId, conversationId) { + + var request = { + methodname: 'core_message_mark_all_conversation_messages_as_read', + args: { + userid: userId, + conversationid: conversationId + } + }; + return Ajax.call([request])[0]; + }; + return { query: query, countUnreadConversations: countUnreadConversations, markAllAsRead: markAllAsRead, + getContacts: getContacts, + getProfile: getProfile, + blockUser: blockUser, + unblockUser: unblockUser, + createContactRequest: createContactRequest, + deleteContacts: deleteContacts, + getMessages: getMessages, + searchUsers: searchUsers, + searchMessages: searchMessages, + sendMessagesToUser: sendMessagesToUser, + sendMessageToUser: sendMessageToUser, + sendMessagesToConversation: sendMessagesToConversation, + sendMessageToConversation: sendMessageToConversation, + savePreferences: savePreferences, + getPreferences: getPreferences, + deleteMessages: deleteMessages, + deleteCoversation: deleteCoversation, + getContactRequests: getContactRequests, + acceptContactRequest: acceptContactRequest, + declineContactRequest: declineContactRequest, + getConversation: getConversation, + getConversationBetweenUsers: getConversationBetweenUsers, + getConversations: getConversations, + getConversationMembers: getConversationMembers, + setFavouriteConversations: setFavouriteConversations, + unsetFavouriteConversations: unsetFavouriteConversations, + getMemberInfo: getMemberInfo, + markAllConversationMessagesAsRead: markAllConversationMessagesAsRead }; });