Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
26.21% covered (danger)
26.21%
27 / 103
25.00% covered (danger)
25.00%
1 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
ManageMentorsEditMentor
26.21% covered (danger)
26.21%
27 / 103
25.00% covered (danger)
25.00%
1 / 4
41.54
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
2
 getFormFields
0.00% covered (danger)
0.00%
0 / 60
0.00% covered (danger)
0.00%
0 / 1
6
 onSubmit
82.61% covered (warning)
82.61%
19 / 23
0.00% covered (danger)
0.00%
0 / 1
5.13
 onSuccess
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace GrowthExperiments\Specials\Forms;
4
5use GrowthExperiments\MentorDashboard\MentorTools\IMentorWeights;
6use GrowthExperiments\MentorDashboard\MentorTools\MentorStatusManager;
7use GrowthExperiments\Mentorship\Provider\IMentorWriter;
8use GrowthExperiments\Mentorship\Provider\MentorProvider;
9use IContextSource;
10use MediaWiki\Status\Status;
11use MediaWiki\User\UserIdentity;
12use MediaWiki\Utils\MWTimestamp;
13
14class ManageMentorsEditMentor extends ManageMentorsAbstractForm {
15
16    private MentorProvider $mentorProvider;
17    private IMentorWriter $mentorWriter;
18    private MentorStatusManager $mentorStatusManager;
19
20    /**
21     * @param MentorProvider $mentorProvider
22     * @param IMentorWriter $mentorWriter
23     * @param MentorStatusManager $mentorStatusManager
24     * @param UserIdentity $mentorUser
25     * @param IContextSource $context
26     */
27    public function __construct(
28        MentorProvider $mentorProvider,
29        IMentorWriter $mentorWriter,
30        MentorStatusManager $mentorStatusManager,
31        UserIdentity $mentorUser,
32        IContextSource $context
33    ) {
34        $this->mentorProvider = $mentorProvider;
35        $this->mentorWriter = $mentorWriter;
36        $this->mentorStatusManager = $mentorStatusManager;
37        parent::__construct(
38            $mentorUser,
39            $context,
40            'growthexperiments-manage-mentors-'
41        );
42
43        $this->setPreHtml( $this->msg(
44            'growthexperiments-manage-mentors-edit-pretext',
45            $mentorUser->getName()
46        )->parse() );
47    }
48
49    /**
50     * @inheritDoc
51     */
52    protected function getFormFields(): array {
53        $mentor = $this->mentorProvider->newMentorFromUserIdentity( $this->mentorUser );
54        $awayTimestamp = $this->mentorStatusManager->getMentorBackTimestamp( $this->mentorUser );
55        $canChangeStatusBool = $this->mentorStatusManager->canChangeStatus(
56            $this->mentorUser
57        )->isOK();
58
59        return [
60            'message' => [
61                'type' => 'text',
62                'label-message' => 'growthexperiments-manage-mentors-edit-intro-msg',
63                'default' => $mentor->getIntroText(),
64            ],
65            'weight' => [
66                'type' => 'radio',
67                'label-message' => 'growthexperiments-manage-mentors-edit-weight',
68                'options-messages' => [
69                    'growthexperiments-mentor-dashboard-mentor-tools-mentor-weight-none' =>
70                        IMentorWeights::WEIGHT_NONE,
71                    'growthexperiments-mentor-dashboard-mentor-tools-mentor-weight-low' =>
72                        IMentorWeights::WEIGHT_LOW,
73                    'growthexperiments-mentor-dashboard-mentor-tools-mentor-weight-medium' =>
74                        IMentorWeights::WEIGHT_NORMAL,
75                    'growthexperiments-mentor-dashboard-mentor-tools-mentor-weight-high' =>
76                        IMentorWeights::WEIGHT_HIGH,
77                ],
78                'default' => $mentor->getWeight(),
79            ],
80            'isAway' => [
81                'type' => 'check',
82                'label-message' => 'growthexperiments-manage-mentors-edit-is-away',
83                'disabled' => !$canChangeStatusBool,
84                'help' => !$canChangeStatusBool ? $this->msg(
85                    'growthexperiments-manage-mentors-edit-is-away-blocked'
86                )
87                    ->params( $this->mentorUser->getName() )
88                    ->escaped() : '',
89                'default' => $this->mentorStatusManager->getMentorStatus(
90                    $this->mentorUser
91                    ) === MentorStatusManager::STATUS_AWAY,
92            ],
93            'isAwayChangeable' => [
94                'type' => 'hidden',
95                'default' => $canChangeStatusBool,
96            ],
97            'awayTimestamp' => [
98                'type' => 'datetime',
99                'label-message' => 'growthexperiments-manage-mentors-edit-away-until',
100                'hide-if' => [
101                    'OR',
102                    [ '!==', 'isAway', '1' ],
103                    [ '!==', 'isAwayChangeable', '1' ],
104                ],
105                'min' => MWTimestamp::getInstance()->getTimestamp( TS_MW ),
106                'default' => MWTimestamp::getInstance( (string)$awayTimestamp )
107                    ->format( 'Y-m-d\TH:m:s\Z' ),
108            ],
109            'reason' => [
110                'type' => 'text',
111                'label-message' => 'growthexperiments-manage-mentors-edit-reason',
112            ],
113        ];
114    }
115
116    /**
117     * @inheritDoc
118     */
119    public function onSubmit( array $data ) {
120        if ( !self::canManageMentors( $this->getAuthority() ) ) {
121            return false;
122        }
123
124        $mentor = $this->mentorProvider->newMentorFromUserIdentity( $this->mentorUser );
125        $mentorStatus = $this->mentorStatusManager->getMentorStatus( $this->mentorUser );
126        $awayTimestamp = $this->mentorStatusManager->getMentorBackTimestamp( $this->mentorUser );
127
128        $mentor->setIntroText( $data['message'] !== '' ? $data['message'] : null );
129        $mentor->setWeight( (int)$data['weight'] );
130
131        $status = Status::newGood();
132        if ( ( $mentorStatus === MentorStatusManager::STATUS_AWAY ) !== $data['isAway'] ) {
133            // isAway changed, implement the change
134            if ( $data['isAway'] ) {
135                $status->merge( $this->mentorStatusManager->markMentorAsAwayTimestamp(
136                    $this->mentorUser,
137                    $data['awayTimestamp']
138                ) );
139            } else {
140                $status->merge( $this->mentorStatusManager->markMentorAsActive(
141                    $this->mentorUser
142                ) );
143            }
144        }
145
146        $status->merge( $this->mentorWriter->changeMentor(
147            $mentor,
148            $this->getUser(),
149            $data['reason']
150        ) );
151        return $status;
152    }
153
154    /**
155     * @inheritDoc
156     */
157    protected function onSuccess(): void {
158        $out = $this->getOutput();
159        $out->addWikiMsg(
160            'growthexperiments-manage-mentors-edit-success',
161            $this->mentorUser->getName()
162        );
163        $out->addWikiMsg(
164            'growthexperiments-manage-mentors-return-back'
165        );
166    }
167}