TaskManager   A
last analyzed

Complexity

Total Complexity 17

Size/Duplication

Total Lines 169
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 71
dl 0
loc 169
rs 10
c 0
b 0
f 0
wmc 17

8 Methods

Rating   Name   Duplication   Size   Complexity  
A runSubtasks() 0 7 3
A runTask() 0 6 2
A getTaskInstance() 0 8 1
A run() 0 8 4
A runSubtask() 0 7 2
A runTasks() 0 7 3
A getSubtaskInstance() 0 7 1
A __construct() 0 15 1
1
<?php declare( strict_types=1 );
2
3
namespace BotRiconferme;
4
5
use BadMethodCallException;
6
use BotRiconferme\Task\CloseOld;
7
use BotRiconferme\Task\StartNew;
8
use BotRiconferme\Task\StartVote;
9
use BotRiconferme\Task\Subtask\ArchivePages;
10
use BotRiconferme\Task\Subtask\ClosePages;
11
use BotRiconferme\Task\Subtask\CreatePages;
12
use BotRiconferme\Task\Subtask\FailedUpdates;
13
use BotRiconferme\Task\Subtask\OpenUpdates;
14
use BotRiconferme\Task\Subtask\SimpleUpdates;
15
use BotRiconferme\Task\Subtask\Subtask;
16
use BotRiconferme\Task\Subtask\UserNotice;
17
use BotRiconferme\Task\Task;
18
use BotRiconferme\Task\UpdateList;
19
use BotRiconferme\TaskHelper\TaskDataProvider;
20
use BotRiconferme\TaskHelper\TaskResult;
21
use BotRiconferme\Wiki\Page\PageBotList;
22
use BotRiconferme\Wiki\WikiGroup;
23
use InvalidArgumentException;
24
use Psr\Log\LoggerInterface;
25
26
/**
27
 * Wrapper for single tasks
28
 * @todo Reduce duplication with Task class and subclasses
29
 */
30
class TaskManager {
31
	// Run modes
32
	public const MODE_COMPLETE = 'full';
33
	public const MODE_TASK = 'task';
34
	public const MODE_SUBTASK = 'subtask';
35
36
	/** @var string[] */
37
	private const TASKS_MAP = [
38
		'start-new' => StartNew::class,
39
		'close-old' => CloseOld::class,
40
		'update-list' => UpdateList::class,
41
		'start-vote' => StartVote::class
42
	];
43
	private const SUBTASKS_MAP = [
44
		'archive-pages' => ArchivePages::class,
45
		'close-pages' => ClosePages::class,
46
		'create-pages' => CreatePages::class,
47
		'failed-updates' => FailedUpdates::class,
48
		'simple-updates' => SimpleUpdates::class,
49
		'open-updates' => OpenUpdates::class,
50
		'user-notice' => UserNotice::class
51
	];
52
	private const FULL_RUN_ORDERED = [
53
		'update-list',
54
		'start-new',
55
		'start-vote',
56
		'close-old'
57
	];
58
	/** @var TaskDataProvider */
59
	private $provider;
60
	/** @var LoggerInterface */
61
	private $logger;
62
	/** @var WikiGroup */
63
	private $wikiGroup;
64
	/** @var MessageProvider */
65
	private $messageProvider;
66
	/** @var PageBotList */
67
	private $pageBotList;
68
69
	/**
70
	 * @param LoggerInterface $logger
71
	 * @param WikiGroup $wikiGroup
72
	 * @param MessageProvider $mp
73
	 * @param PageBotList $pbl
74
	 */
75
	public function __construct(
76
		LoggerInterface $logger,
77
		WikiGroup $wikiGroup,
78
		MessageProvider $mp,
79
		PageBotList $pbl
80
	) {
81
		$this->logger = $logger;
82
		$this->wikiGroup = $wikiGroup;
83
		$this->messageProvider = $mp;
84
		$this->pageBotList = $pbl;
85
		$this->provider = new TaskDataProvider(
86
			$this->logger,
87
			$this->wikiGroup,
88
			$this->messageProvider,
89
			$pbl
90
		);
91
	}
92
93
	/**
94
	 * Main entry point
95
	 *
96
	 * @param string $mode One of the MODE_ constants
97
	 * @param string[] $tasks Only used in MODE_TASK and MODE_SUBTASK
98
	 * @return TaskResult
99
	 */
100
	public function run( string $mode, array $tasks = [] ): TaskResult {
101
		if ( $mode === self::MODE_COMPLETE ) {
102
			return $this->runTasks( self::FULL_RUN_ORDERED );
103
		}
104
		if ( !$tasks ) {
105
			throw new BadMethodCallException( 'MODE_TASK and MODE_SUBTASK need at least a (sub)task name.' );
106
		}
107
		return $mode === self::MODE_TASK ? $this->runTasks( $tasks ) : $this->runSubtasks( $tasks );
108
	}
109
110
	/**
111
	 * Run $tasks in the given order
112
	 *
113
	 * @param string[] $tasks
114
	 * @return TaskResult
115
	 */
116
	private function runTasks( array $tasks ): TaskResult {
117
		$res = new TaskResult( TaskResult::STATUS_GOOD );
118
		do {
119
			$res->merge( $this->runTask( current( $tasks ) ) );
120
		} while ( $res->isOK() && next( $tasks ) );
121
122
		return $res;
123
	}
124
125
	/**
126
	 * Run a single task
127
	 *
128
	 * @param string $name
129
	 * @return TaskResult
130
	 */
131
	protected function runTask( string $name ): TaskResult {
132
		if ( !isset( self::TASKS_MAP[ $name ] ) ) {
133
			throw new InvalidArgumentException( "'$name' is not a valid task." );
134
		}
135
136
		return $this->getTaskInstance( $name )->run();
137
	}
138
139
	/**
140
	 * Run $subtasks in the given order
141
	 *
142
	 * @param string[] $subtasks
143
	 * @return TaskResult
144
	 */
145
	private function runSubtasks( array $subtasks ): TaskResult {
146
		$res = new TaskResult( TaskResult::STATUS_GOOD );
147
		do {
148
			$res->merge( $this->runSubtask( current( $subtasks ) ) );
149
		} while ( $res->isOK() && next( $subtasks ) );
150
151
		return $res;
152
	}
153
154
	/**
155
	 * Run a single subtask
156
	 *
157
	 * @param string $name
158
	 * @return TaskResult
159
	 */
160
	protected function runSubtask( string $name ): TaskResult {
161
		if ( !isset( self::SUBTASKS_MAP[ $name ] ) ) {
162
			throw new InvalidArgumentException( "'$name' is not a valid subtask." );
163
		}
164
165
		$class = self::SUBTASKS_MAP[ $name ];
166
		return $this->getSubtaskInstance( $class )->run();
167
	}
168
169
	/**
170
	 * Helper to make type inferencing easier
171
	 *
172
	 * @param string $name
173
	 * @return Task
174
	 */
175
	private function getTaskInstance( string $name ): Task {
176
		$class = self::TASKS_MAP[ $name ];
177
		return new $class(
178
			$this->logger,
179
			$this->wikiGroup,
180
			$this->provider,
181
			$this->messageProvider,
182
			$this->pageBotList
183
		);
184
	}
185
186
	/**
187
	 * Helper to make type inferencing easier
188
	 *
189
	 * @param string $class
190
	 * @return Subtask
191
	 */
192
	private function getSubtaskInstance( string $class ): Subtask {
193
		return new $class(
194
			$this->logger,
195
			$this->wikiGroup,
196
			$this->provider,
197
			$this->messageProvider,
198
			$this->pageBotList
199
		);
200
	}
201
}
202