Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 49
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
ApiDiscussionToolsSubscribe
0.00% covered (danger)
0.00%
0 / 49
0.00% covered (danger)
0.00%
0 / 5
110
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 execute
0.00% covered (danger)
0.00%
0 / 30
0.00% covered (danger)
0.00%
0 / 1
42
 getAllowedParams
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
2
 needsToken
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 isWriteMode
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace MediaWiki\Extension\DiscussionTools;
4
5use ApiBase;
6use ApiMain;
7use ApiUsageException;
8use MediaWiki\Title\Title;
9use Wikimedia\ParamValidator\ParamValidator;
10
11class ApiDiscussionToolsSubscribe extends ApiBase {
12
13    private SubscriptionStore $subscriptionStore;
14
15    public function __construct(
16        ApiMain $main,
17        string $name,
18        SubscriptionStore $subscriptionStore
19    ) {
20        parent::__construct( $main, $name );
21        $this->subscriptionStore = $subscriptionStore;
22    }
23
24    /**
25     * @inheritDoc
26     * @throws ApiUsageException
27     */
28    public function execute() {
29        $user = $this->getUser();
30        if ( !$user->isNamed() ) {
31            $this->dieWithError( 'apierror-mustbeloggedin-generic', 'notloggedin' );
32        }
33
34        $params = $this->extractRequestParams();
35        $title = Title::newFromText( $params['page'] );
36        $result = null;
37
38        if ( !$title ) {
39            $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['page'] ) ] );
40        }
41        $commentName = $params['commentname'];
42        $subscribe = $params['subscribe'];
43
44        if ( $subscribe ) {
45            $success = $this->subscriptionStore->addSubscriptionForUser(
46                $user,
47                $title,
48                $commentName
49            );
50            if ( !$success ) {
51                $this->dieWithError( 'apierror-discussiontools-subscription-failed-add', 'subscription-failed' );
52            }
53        } else {
54            $success = $this->subscriptionStore->removeSubscriptionForUser(
55                $user,
56                $commentName
57            );
58            if ( !$success ) {
59                $this->dieWithError( 'apierror-discussiontools-subscription-failed-remove', 'subscription-failed' );
60            }
61        }
62
63        $result = [
64            'page' => $title,
65            'commentname' => $commentName,
66            'subscribe' => $subscribe,
67        ];
68
69        $this->getResult()->addValue( null, $this->getModuleName(), $result );
70    }
71
72    /**
73     * @inheritDoc
74     */
75    public function getAllowedParams() {
76        return [
77            'page' => [
78                ParamValidator::PARAM_REQUIRED => true,
79            ],
80            'token' => [
81                ParamValidator::PARAM_REQUIRED => true,
82            ],
83            'commentname' => [
84                ParamValidator::PARAM_REQUIRED => true,
85            ],
86            'subscribe' => [
87                ParamValidator::PARAM_TYPE => 'boolean',
88                ParamValidator::PARAM_REQUIRED => true,
89            ],
90        ];
91    }
92
93    /**
94     * @inheritDoc
95     */
96    public function needsToken() {
97        return 'csrf';
98    }
99
100    /**
101     * @inheritDoc
102     */
103    public function isWriteMode() {
104        return true;
105    }
106}