Merge branch '2.1'
[GitHub/WoltLab/com.woltlab.wcf.conversation.git] / files / lib / system / conversation / ConversationHandler.class.php
1 <?php
2 namespace wcf\system\conversation;
3 use wcf\system\database\util\PreparedStatementConditionBuilder;
4 use wcf\system\user\storage\UserStorageHandler;
5 use wcf\system\SingletonFactory;
6 use wcf\system\WCF;
7
8 /**
9 * Handles the number of conversations and unread conversations of the active user.
10 *
11 * @author Marcel Werk
12 * @copyright 2001-2017 WoltLab GmbH
13 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
14 * @package WoltLabSuite\Core\System\Conversation
15 */
16 class ConversationHandler extends SingletonFactory {
17 /**
18 * number of unread conversations
19 * @var integer[]
20 */
21 protected $unreadConversationCount = [];
22
23 /**
24 * number of conversations
25 * @var integer[]
26 */
27 protected $conversationCount = [];
28
29 /**
30 * Returns the number of unread conversations for given user.
31 *
32 * @param integer $userID
33 * @param boolean $skipCache
34 * @return integer
35 */
36 public function getUnreadConversationCount($userID = null, $skipCache = false) {
37 if ($userID === null) $userID = WCF::getUser()->userID;
38
39 if (!isset($this->unreadConversationCount[$userID]) || $skipCache) {
40 $this->unreadConversationCount[$userID] = 0;
41
42 // load storage data
43 UserStorageHandler::getInstance()->loadStorage([$userID]);
44
45 // get ids
46 $data = UserStorageHandler::getInstance()->getStorage([$userID], 'unreadConversationCount');
47
48 // cache does not exist or is outdated
49 if ($data[$userID] === null || $skipCache) {
50 $conditionBuilder = new PreparedStatementConditionBuilder();
51 $conditionBuilder->add('conversation.conversationID = conversation_to_user.conversationID');
52 $conditionBuilder->add('conversation_to_user.participantID = ?', [$userID]);
53 $conditionBuilder->add('conversation_to_user.hideConversation = 0');
54 $conditionBuilder->add('conversation_to_user.lastVisitTime < conversation.lastPostTime');
55
56 $sql = "SELECT COUNT(*) AS count
57 FROM wcf".WCF_N."_conversation_to_user conversation_to_user,
58 wcf".WCF_N."_conversation conversation
59 ".$conditionBuilder->__toString();
60 $statement = WCF::getDB()->prepareStatement($sql);
61 $statement->execute($conditionBuilder->getParameters());
62 $row = $statement->fetchArray();
63 $this->unreadConversationCount[$userID] = $row['count'];
64
65 // update storage data
66 UserStorageHandler::getInstance()->update($userID, 'unreadConversationCount', serialize($this->unreadConversationCount[$userID]));
67 }
68 else {
69 $this->unreadConversationCount[$userID] = unserialize($data[$userID]);
70 }
71 }
72
73 return $this->unreadConversationCount[$userID];
74 }
75
76 /**
77 * Returns the number of conversations for given user.
78 *
79 * @param integer $userID
80 * @return integer
81 */
82 public function getConversationCount($userID = null) {
83 if ($userID === null) $userID = WCF::getUser()->userID;
84
85 if (!isset($this->conversationCount[$userID])) {
86 $this->conversationCount[$userID] = 0;
87
88 // load storage data
89 UserStorageHandler::getInstance()->loadStorage([$userID]);
90
91 // get ids
92 $data = UserStorageHandler::getInstance()->getStorage([$userID], 'conversationCount');
93
94 // cache does not exist or is outdated
95 if ($data[$userID] === null) {
96 $conditionBuilder1 = new PreparedStatementConditionBuilder();
97 $conditionBuilder1->add('conversation_to_user.participantID = ?', [$userID]);
98 $conditionBuilder1->add('conversation_to_user.hideConversation IN (0,1)');
99 $conditionBuilder2 = new PreparedStatementConditionBuilder();
100 $conditionBuilder2->add('conversation.userID = ?', [$userID]);
101 $conditionBuilder2->add('conversation.isDraft = 1');
102
103 $sql = "SELECT (SELECT COUNT(*)
104 FROM wcf".WCF_N."_conversation_to_user conversation_to_user
105 ".$conditionBuilder1->__toString().")
106 +
107 (SELECT COUNT(*)
108 FROM wcf".WCF_N."_conversation conversation
109 ".$conditionBuilder2->__toString().") AS count";
110 $statement = WCF::getDB()->prepareStatement($sql);
111 $statement->execute(array_merge($conditionBuilder1->getParameters(), $conditionBuilder2->getParameters()));
112 $row = $statement->fetchArray();
113 $this->conversationCount[$userID] = $row['count'];
114
115 // update storage data
116 UserStorageHandler::getInstance()->update($userID, 'conversationCount', serialize($this->conversationCount[$userID]));
117 }
118 else {
119 $this->conversationCount[$userID] = unserialize($data[$userID]);
120 }
121 }
122
123 return $this->conversationCount[$userID];
124 }
125 }