Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 57
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
SpecialEditEventRegistration
0.00% covered (danger)
0.00%
0 / 57
0.00% covered (danger)
0.00%
0 / 5
132
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
2
 getFormMessages
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 execute
0.00% covered (danger)
0.00%
0 / 36
0.00% covered (danger)
0.00%
0 / 1
56
 getValidationFlags
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getShowAlways
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3declare( strict_types=1 );
4
5namespace MediaWiki\Extension\CampaignEvents\Special;
6
7use MediaWiki\DAO\WikiAwareEntity;
8use MediaWiki\Extension\CampaignEvents\Event\EditEventCommand;
9use MediaWiki\Extension\CampaignEvents\Event\EventFactory;
10use MediaWiki\Extension\CampaignEvents\Event\Store\EventNotFoundException;
11use MediaWiki\Extension\CampaignEvents\Event\Store\IEventLookup;
12use MediaWiki\Extension\CampaignEvents\Hooks\CampaignEventsHookRunner;
13use MediaWiki\Extension\CampaignEvents\MWEntity\CampaignsCentralUserLookup;
14use MediaWiki\Extension\CampaignEvents\MWEntity\MWAuthorityProxy;
15use MediaWiki\Extension\CampaignEvents\Organizers\OrganizersStore;
16use MediaWiki\Extension\CampaignEvents\Permissions\PermissionChecker;
17use MediaWiki\Extension\CampaignEvents\PolicyMessagesLookup;
18use MediaWiki\Extension\CampaignEvents\Questions\EventQuestionsRegistry;
19use MediaWiki\Extension\CampaignEvents\TrackingTool\TrackingToolRegistry;
20use MediaWiki\WikiMap\WikiMap;
21use OOUI\HtmlSnippet;
22use OOUI\MessageWidget;
23
24class SpecialEditEventRegistration extends AbstractEventRegistrationSpecialPage {
25    public const PAGE_NAME = 'EditEventRegistration';
26
27    /**
28     * @param IEventLookup $eventLookup
29     * @param EventFactory $eventFactory
30     * @param EditEventCommand $editEventCommand
31     * @param PermissionChecker $permissionChecker
32     * @param PolicyMessagesLookup $policyMessagesLookup
33     * @param OrganizersStore $organizersStore
34     * @param CampaignsCentralUserLookup $centralUserLookup
35     * @param TrackingToolRegistry $trackingToolRegistry
36     * @param EventQuestionsRegistry $eventQuestionsRegistry
37     * @param CampaignEventsHookRunner $hookRunner
38     */
39    public function __construct(
40        IEventLookup $eventLookup,
41        EventFactory $eventFactory,
42        EditEventCommand $editEventCommand,
43        PermissionChecker $permissionChecker,
44        PolicyMessagesLookup $policyMessagesLookup,
45        OrganizersStore $organizersStore,
46        CampaignsCentralUserLookup $centralUserLookup,
47        TrackingToolRegistry $trackingToolRegistry,
48        EventQuestionsRegistry $eventQuestionsRegistry,
49        CampaignEventsHookRunner $hookRunner
50    ) {
51        parent::__construct(
52            self::PAGE_NAME,
53            '',
54            $eventLookup,
55            $eventFactory,
56            $editEventCommand,
57            $policyMessagesLookup,
58            $organizersStore,
59            $permissionChecker,
60            $centralUserLookup,
61            $trackingToolRegistry,
62            $eventQuestionsRegistry,
63            $hookRunner
64        );
65    }
66
67    /**
68     * @inheritDoc
69     */
70    protected function getFormMessages(): array {
71        return [
72            'success' => 'campaignevents-edit-success-msg',
73            'details-section-subtitle' => 'campaignevents-edit-form-details-subtitle',
74            'submit' => 'campaignevents-edit-form-submit',
75        ];
76    }
77
78    /**
79     * @inheritDoc
80     */
81    public function execute( $par ): void {
82        if ( $par === null ) {
83            $this->outputErrorBox( 'campaignevents-edit-no-event-id-provided' );
84            return;
85        }
86        $this->eventID = (int)$par;
87        if ( (string)$this->eventID !== $par ) {
88            $this->outputErrorBox( 'campaignevents-edit-invalid-id' );
89            return;
90        }
91        try {
92            $this->event = $this->eventLookup->getEventByID( $this->eventID );
93        } catch ( EventNotFoundException $_ ) {
94            $this->outputErrorBox( 'campaignevents-edit-event-notfound' );
95            return;
96        }
97
98        $mwAuthority = new MWAuthorityProxy( $this->getAuthority() );
99        if ( !$this->permissionChecker->userCanEditRegistration( $mwAuthority, $this->eventID ) ) {
100            $this->outputErrorBox( 'campaignevents-edit-not-allowed-registration' );
101            return;
102        }
103
104        if ( $this->event->getDeletionTimestamp() !== null ) {
105            $this->outputErrorBox( 'campaignevents-edit-error-deleted' );
106            return;
107        }
108
109        $eventPage = $this->event->getPage();
110        $wikiID = $eventPage->getWikiId();
111        if ( $wikiID !== WikiAwareEntity::LOCAL ) {
112            $foreignEditURL = WikiMap::getForeignURL( $wikiID, 'Special:' . self::PAGE_NAME . "/{$this->eventID}" );
113
114            $this->setHeaders();
115            $this->getOutput()->enableOOUI();
116
117            $messageWidget = new MessageWidget( [
118                'type' => 'notice',
119                'label' => new HtmlSnippet(
120                    $this->msg( 'campaignevents-edit-page-nonlocal' )
121                        ->params( [
122                            $foreignEditURL, WikiMap::getWikiName( $wikiID )
123                        ] )->parse()
124                )
125            ] );
126
127            $this->getOutput()->addHTML( $messageWidget );
128            return;
129        }
130        parent::execute( $par );
131    }
132
133    /**
134     * @inheritDoc
135     */
136    protected function getValidationFlags(): int {
137        return EventFactory::VALIDATE_SKIP_DATES_PAST;
138    }
139
140    /**
141     * @inheritDoc
142     */
143    protected function getShowAlways(): bool {
144        return true;
145    }
146}