Merge "Http::getProxy() method to get proxy configuration"
[lhc/web/wiklou.git] / includes / WatchedItem.php
1 <?php
2 /**
3 * This program 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 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program 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 along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 * http://www.gnu.org/copyleft/gpl.html
17 *
18 * @file
19 * @ingroup Watchlist
20 */
21
22 /**
23 * Representation of a pair of user and title for watchlist entries.
24 *
25 * @author Tim Starling
26 * @author Addshore
27 *
28 * @ingroup Watchlist
29 */
30 class WatchedItem {
31
32 /**
33 * @deprecated since 1.27, see User::IGNORE_USER_RIGHTS
34 */
35 const IGNORE_USER_RIGHTS = User::IGNORE_USER_RIGHTS;
36
37 /**
38 * @deprecated since 1.27, see User::CHECK_USER_RIGHTS
39 */
40 const CHECK_USER_RIGHTS = User::CHECK_USER_RIGHTS;
41
42 /**
43 * @deprecated Internal class use only
44 */
45 const DEPRECATED_USAGE_TIMESTAMP = -100;
46
47 /**
48 * @var bool
49 * @deprecated Internal class use only
50 */
51 public $checkRights = User::CHECK_USER_RIGHTS;
52
53 /**
54 * @var Title
55 * @deprecated Internal class use only
56 */
57 private $title;
58
59 /**
60 * @var LinkTarget
61 */
62 private $linkTarget;
63
64 /**
65 * @var User
66 */
67 private $user;
68
69 /**
70 * @var null|string the value of the wl_notificationtimestamp field
71 */
72 private $notificationTimestamp;
73
74 /**
75 * @param User $user
76 * @param LinkTarget $linkTarget
77 * @param null|string $notificationTimestamp the value of the wl_notificationtimestamp field
78 * @param bool|null $checkRights DO NOT USE - used internally for backward compatibility
79 */
80 public function __construct(
81 User $user,
82 LinkTarget $linkTarget,
83 $notificationTimestamp,
84 $checkRights = null
85 ) {
86 $this->user = $user;
87 $this->linkTarget = $linkTarget;
88 $this->notificationTimestamp = $notificationTimestamp;
89 if ( $checkRights !== null ) {
90 $this->checkRights = $checkRights;
91 }
92 }
93
94 /**
95 * @return User
96 */
97 public function getUser() {
98 return $this->user;
99 }
100
101 /**
102 * @return LinkTarget
103 */
104 public function getLinkTarget() {
105 return $this->linkTarget;
106 }
107
108 /**
109 * Get the notification timestamp of this entry.
110 *
111 * @return bool|null|string
112 */
113 public function getNotificationTimestamp() {
114 // Back compat for objects constructed using self::fromUserTitle
115 if ( $this->notificationTimestamp === self::DEPRECATED_USAGE_TIMESTAMP ) {
116 // wfDeprecated( __METHOD__, '1.27' );
117 if ( $this->checkRights && !$this->user->isAllowed( 'viewmywatchlist' ) ) {
118 return false;
119 }
120 $item = WatchedItemStore::getDefaultInstance()
121 ->loadWatchedItem( $this->user, $this->linkTarget );
122 if ( $item ) {
123 $this->notificationTimestamp = $item->getNotificationTimestamp();
124 } else {
125 $this->notificationTimestamp = false;
126 }
127 }
128 return $this->notificationTimestamp;
129 }
130
131 /**
132 * Back compat pre 1.27 with the WatchedItemStore introduction
133 * @todo remove in 1.28/9
134 * -------------------------------------------------
135 */
136
137 /**
138 * @return Title
139 * @deprecated Internal class use only
140 */
141 public function getTitle() {
142 if ( !$this->title ) {
143 if ( $this->linkTarget instanceof Title ) {
144 $this->title = $this->linkTarget;
145 } else {
146 $this->title = Title::newFromLinkTarget( $this->linkTarget );
147 }
148 }
149 return $this->title;
150 }
151
152 /**
153 * @deprecated since 1.27 Use the constructor, WatchedItemStore::getWatchedItem()
154 * or WatchedItemStore::loadWatchedItem()
155 */
156 public static function fromUserTitle( $user, $title, $checkRights = User::CHECK_USER_RIGHTS ) {
157 // wfDeprecated( __METHOD__, '1.27' );
158 return new self( $user, $title, self::DEPRECATED_USAGE_TIMESTAMP, (bool)$checkRights );
159 }
160
161 /**
162 * @deprecated since 1.27 Use WatchedItemStore::resetNotificationTimestamp()
163 */
164 public function resetNotificationTimestamp( $force = '', $oldid = 0 ) {
165 // wfDeprecated( __METHOD__, '1.27' );
166 if ( $this->checkRights && !$this->user->isAllowed( 'editmywatchlist' ) ) {
167 return;
168 }
169 WatchedItemStore::getDefaultInstance()->resetNotificationTimestamp(
170 $this->user,
171 $this->getTitle(),
172 $force,
173 $oldid
174 );
175 }
176
177 /**
178 * @deprecated since 1.27 Use WatchedItemStore::addWatchBatch()
179 */
180 public static function batchAddWatch( array $items ) {
181 // wfDeprecated( __METHOD__, '1.27' );
182 if ( !$items ) {
183 return false;
184 }
185
186 $targets = [];
187 $users = [];
188 /** @var WatchedItem $watchedItem */
189 foreach ( $items as $watchedItem ) {
190 $user = $watchedItem->getUser();
191 if ( $watchedItem->checkRights && !$user->isAllowed( 'editmywatchlist' ) ) {
192 continue;
193 }
194 $userId = $user->getId();
195 $users[$userId] = $user;
196 $targets[$userId][] = $watchedItem->getTitle()->getSubjectPage();
197 $targets[$userId][] = $watchedItem->getTitle()->getTalkPage();
198 }
199
200 $store = WatchedItemStore::getDefaultInstance();
201 $success = true;
202 foreach ( $users as $userId => $user ) {
203 $success &= $store->addWatchBatchForUser( $user, $targets[$userId] );
204 }
205
206 return $success;
207 }
208
209 /**
210 * @deprecated since 1.27 Use User::addWatch()
211 * @return bool
212 */
213 public function addWatch() {
214 // wfDeprecated( __METHOD__, '1.27' );
215 $this->user->addWatch( $this->getTitle(), $this->checkRights );
216 return true;
217 }
218
219 /**
220 * @deprecated since 1.27 Use User::removeWatch()
221 * @return bool
222 */
223 public function removeWatch() {
224 // wfDeprecated( __METHOD__, '1.27' );
225 if ( $this->checkRights && !$this->user->isAllowed( 'editmywatchlist' ) ) {
226 return false;
227 }
228 $this->user->removeWatch( $this->getTitle(), $this->checkRights );
229 return true;
230 }
231
232 /**
233 * @deprecated since 1.27 Use User::isWatched()
234 * @return bool
235 */
236 public function isWatched() {
237 // wfDeprecated( __METHOD__, '1.27' );
238 return $this->user->isWatched( $this->getTitle(), $this->checkRights );
239 }
240
241 /**
242 * @deprecated since 1.27 Use WatchedItemStore::duplicateAllAssociatedEntries()
243 */
244 public static function duplicateEntries( Title $oldTitle, Title $newTitle ) {
245 // wfDeprecated( __METHOD__, '1.27' );
246 $store = WatchedItemStore::getDefaultInstance();
247 $store->duplicateAllAssociatedEntries( $oldTitle, $newTitle );
248 }
249
250 }