message/amd/src/message_repository.js

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