Completed
Pull Request — master (#1)
by Thomas
09:34 queued 04:26
created

ViewController::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 9
nc 1
nop 8
dl 0
loc 10
ccs 8
cts 8
cp 1
crap 1
rs 9.4285
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
/**
3
 * Calendar App
4
 *
5
 * @author Georg Ehrke
6
 * @copyright 2016 Georg Ehrke <[email protected]>
7
 * @author Raghu Nayyar
8
 * @copyright 2016 Raghu Nayyar <[email protected]>
9
 *
10
 * This library is free software; you can redistribute it and/or
11
 * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
12
 * License as published by the Free Software Foundation; either
13
 * version 3 of the License, or any later version.
14
 *
15
 * This library is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
19
 *
20
 * You should have received a copy of the GNU Affero General Public
21
 * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
22
 *
23
 */
24
namespace OCA\Calendar\Controller;
25
26
use OC\AppFramework\Http;
27
use OC\L10N\L10N;
28
use OCP\AppFramework\Controller;
29
use OCP\AppFramework\Http\ContentSecurityPolicy;
30
use OCP\AppFramework\Http\DataDisplayResponse;
31
use OCP\AppFramework\Http\JSONResponse;
32
use OCP\AppFramework\Http\NotFoundResponse;
33
use OCP\AppFramework\Http\TemplateResponse;
34
use OCP\Defaults;
35
use OCP\IConfig;
36
use OCP\IRequest;
37
use OCP\IUserSession;
38
use OCP\Mail\IMailer;
39
use OCP\IURLGenerator;
40
41
class ViewController extends Controller {
42
43
	/**
44
	 * @var IURLGenerator
45
	 */
46
	private $urlGenerator;
47
48
	/**
49
	 * @var IConfig
50
	 */
51
	private $config;
52
53 8
	/**
54
	 * @var IUserSession
55 8
	 */
56 8
	private $userSession;
57 8
58 8
	/**
59
	 * @var IMailer
60
	 */
61
	private $mailer;
62
63
	/**
64
	 * @var L10N
65
	 */
66 4
	private $l10n;
67 4
68 4
	/**
69
	 * @var Defaults
70 4
	 */
71 4
	private $defaults;
72
73 4
	/**
74 4
	 * @param string $appName
75 1
	 * @param IRequest $request an instance of the request
76
	 * @param IUserSession $userSession
77
	 * @param IConfig $config
78 3
	 * @param IMailer $mailer
79 3
	 * @param L10N $l10N
80 3
	 * @param Defaults $defaults
81
	 * @param IURLGenerator $urlGenerator
82 3
	 */
83 3
	public function __construct($appName, IRequest $request,
84 3
								IUserSession $userSession, IConfig $config, IMailer $mailer, L10N $l10N, Defaults $defaults, IURLGenerator $urlGenerator) {
85 3
		parent::__construct($appName, $request);
86 3
		$this->config = $config;
87
		$this->userSession = $userSession;
88 3
		$this->mailer = $mailer;
89
		$this->l10n = $l10N;
90 3
		$this->defaults = $defaults;
91 3
		$this->urlGenerator = $urlGenerator;
92 3
	}
93 3
94 3
	/**
95 3
	 * @NoAdminRequired
96 3
	 * @NoCSRFRequired
97 3
	 *
98 3
	 * @return TemplateResponse
99 3
	 */
100
	public function index() {
101
		$runningOn = $this->config->getSystemValue('version');
102
		$runningOnNextcloud10OrLater = version_compare($runningOn, '9.1', '>=');
103
104
		$supportsClass = $runningOnNextcloud10OrLater;
105
		$assetPipelineBroken = !$runningOnNextcloud10OrLater;
106
107
		$isAssetPipelineEnabled = $this->config->getSystemValue('asset-pipeline.enabled', false);
108 4
		if ($isAssetPipelineEnabled && $assetPipelineBroken) {
109 4
			return new TemplateResponse('calendar', 'main-asset-pipeline-unsupported');
110 2
		}
111
112
		$user = $this->userSession->getUser();
113 2
		$userId = $user->getUID();
114
		$emailAddress = $user->getEMailAddress();
115 2
116 2
		$appVersion = $this->config->getAppValue($this->appName, 'installed_version');
117 2
		$defaultView = $this->config->getUserValue($userId, $this->appName, 'currentView', 'month');
118
		$skipPopover = $this->config->getUserValue($userId, $this->appName, 'skipPopover', 'no');
119
		$weekNumbers = $this->config->getUserValue($userId, $this->appName, 'showWeekNr', 'no');
120
		$defaultColor = $this->config->getAppValue('theming', 'color', '#0082C9');
121
		
122
		$webCalWorkaround = $runningOnNextcloud10OrLater ? 'no' : 'yes';
123
124
		return new TemplateResponse('calendar', 'main', [
125
			'appVersion' => $appVersion,
126
			'defaultView' => $defaultView,
127
			'emailAddress' => $emailAddress,
128 2
			'skipPopover' => $skipPopover,
129 2
			'weekNumbers' => $weekNumbers,
130
			'supportsClass' => $supportsClass,
131
			'defaultColor' => $defaultColor,
132
			'webCalWorkaround' => $webCalWorkaround,
133
			'isPublic' => false,
134
		]);
135
	}
136
137
	/**
138
	 * @PublicPage
139
	 * @NoCSRFRequired
140
	 *
141
	 * @return TemplateResponse
142
	 */
143
	public function publicIndex() {
144
		$runningOn = $this->config->getSystemValue('version');
145
		$runningOnServer91OrLater = version_compare($runningOn, '9.1', '>=');
146
147
		$supportsClass = $runningOnServer91OrLater;
148
		$assetPipelineBroken = !$runningOnServer91OrLater;
149
150
		$isAssetPipelineEnabled = $this->config->getSystemValue('asset-pipeline.enabled', false);
151 4
		if ($isAssetPipelineEnabled && $assetPipelineBroken) {
152 4
			return new TemplateResponse('calendar', 'main-asset-pipeline-unsupported');
153
		}
154 4
155 4
		$appVersion = $this->config->getAppValue($this->appName, 'installed_version');
156 4
157
		$response = new TemplateResponse('calendar', 'main', [
158
			'appVersion' => $appVersion,
159
			'defaultView' => 'month',
160
			'emailAddress' => '',
161
			'supportsClass' => $supportsClass,
162
			'isPublic' => true,
163
			'shareURL' => $this->request->getServerProtocol() . '://' . $this->request->getServerHost() . $this->request->getRequestUri(),
164
			'previewImage' => $this->urlGenerator->getAbsoluteURL($this->urlGenerator->imagePath('core', 'favicon-touch.png')),
165
		], 'public');
166
		$response->addHeader('X-Frame-Options', 'ALLOW');
167
		$csp = new ContentSecurityPolicy();
168
		$csp->addAllowedScriptDomain('*');
169
		$response->setContentSecurityPolicy($csp);
170
171
		return $response;
172
	}
173
174
	/**
175
	 * @NoAdminRequired
176
	 *
177
	 * @param string $id
178
	 * @return NotFoundResponse|DataDisplayResponse
179
	 */
180
	public function getTimezone($id) {
181
		if (!in_array($id, $this->getTimezoneList())) {
182
			return new NotFoundResponse();
183
		}
184
185
		$tzData = file_get_contents(__DIR__ . '/../timezones/' . $id);
186
187
		return new DataDisplayResponse($tzData, HTTP::STATUS_OK, [
188
			'content-type' => 'text/calendar',
189
		]);
190
	}
191
192
193
	/**
194
	 * @NoAdminRequired
195
	 * @NoCSRFRequired
196
	 * @PublicPage
197
	 *
198
	 * @param $region
199
	 * @param $city
200
	 * @return DataDisplayResponse
201
	 */
202
	public function getTimezoneWithRegion($region, $city) {
203
		return $this->getTimezone($region . '-' . $city);
0 ignored issues
show
Bug Compatibility introduced by
The expression $this->getTimezone($region . '-' . $city); of type OCP\AppFramework\Http\No...ttp\DataDisplayResponse adds the type OCP\AppFramework\Http\NotFoundResponse to the return on line 203 which is incompatible with the return type documented by OCA\Calendar\Controller\...::getTimezoneWithRegion of type OCP\AppFramework\Http\DataDisplayResponse.
Loading history...
204
	}
205
206
207
	/**
208
	 * @NoAdminRequired
209
	 * @PublicPage
210
	 * @NoCSRFRequired
211
	 *
212
	 * @param $region
213
	 * @param $subregion
214
	 * @param $city
215
	 * @return DataDisplayResponse
216
	 */
217
	public function getTimezoneWithSubRegion($region, $subregion, $city) {
218
		return $this->getTimezone($region . '-' . $subregion . '-' . $city);
0 ignored issues
show
Bug Compatibility introduced by
The expression $this->getTimezone($regi...bregion . '-' . $city); of type OCP\AppFramework\Http\No...ttp\DataDisplayResponse adds the type OCP\AppFramework\Http\NotFoundResponse to the return on line 218 which is incompatible with the return type documented by OCA\Calendar\Controller\...etTimezoneWithSubRegion of type OCP\AppFramework\Http\DataDisplayResponse.
Loading history...
219
	}
220
221
222
	/**
223
	 * get a list of default timezones
224
	 *
225
	 * @return array
226
	 */
227
	private function getTimezoneList() {
228
		$allFiles = scandir(__DIR__ . '/../timezones/');
229
230
		return array_values(array_filter($allFiles, function($file) {
231
			return (substr($file, -4) === '.ics');
232
		}));
233
	}
234
235
	/**
236
	 * @param string $to
237
	 * @param string $url
238
	 * @param string $name
239
	 * @return JSONResponse
240
	 * @NoAdminRequired
241
	 */
242
	public function sendEmailPublicLink($to, $url, $name) {
243
244
		$user = $this->userSession->getUser();
245
		$username = $user->getDisplayName();
246
247
		$subject = $this->l10n->t('%s has published the calendar "%s"', [$username, $name]);
248
249
		$emailTemplate = new TemplateResponse('calendar', 'mail.publication', ['subject' => $subject, 'username' => $username, 'calendarname' => $name, 'calendarurl' => $url, 'defaults' => $this->defaults], 'public');
250
		$body = $emailTemplate->render();
251
252
		return $this->sendEmail($to, $subject, $body, true);
253
	}
254
255
	/**
256
	 * @param string $target
257
	 * @param string $subject
258
	 * @param string $body
259
	 * @param boolean $useHTML
260
	 * @return JSONResponse
261
	 *
262
	 * TODO : This should be moved to a Tools class
263
	 *
264
	 */
265
	private function sendEmail($target, $subject, $body, $useHTML = false) {
266
		if (!$this->mailer->validateMailAddress($target)) {
267
			return new JSONResponse([], Http::STATUS_BAD_REQUEST);
268
		}
269
270
		$sendFromDomain = $this->config->getSystemValue('mail_domain', 'domain.org');
271
		$sendFromAddress = $this->config->getSystemValue('mail_from_address', 'owncloud');
272
		$sendFrom = $sendFromAddress . '@' . $sendFromDomain;
273
274
		$message = $this->mailer->createMessage();
275
		$message->setSubject($subject);
276
		$message->setFrom([$sendFrom => 'ownCloud Notifier']);
277
		$message->setTo([$target => 'Recipient']);
278
		if ($useHTML) {
279
			$message->setHtmlBody($body);
280
		} else {
281
			$message->setPlainBody($body);
282
		}
283
		$this->mailer->send($message);
284
285
		return new JSONResponse([], Http::STATUS_OK);
286
	}
287
}
288