Completed
Push — master ( aa79a7...51f1cd )
by Thomas
05:09
created

ViewController::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 9
nc 1
nop 8
dl 0
loc 10
ccs 9
cts 9
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
	/**
54
	 * @var IUserSession
55
	 */
56
	private $userSession;
57
58
	/**
59
	 * @var IMailer
60
	 */
61
	private $mailer;
62
63
	/**
64
	 * @var L10N
65
	 */
66
	private $l10n;
67
68
	/**
69
	 * @var Defaults
70
	 */
71
	private $defaults;
72
73
	/**
74
	 * @param string $appName
75
	 * @param IRequest $request an instance of the request
76
	 * @param IUserSession $userSession
77
	 * @param IConfig $config
78
	 * @param IMailer $mailer
79
	 * @param L10N $l10N
80
	 * @param Defaults $defaults
81
	 * @param IURLGenerator $urlGenerator
82
	 */
83 14
	public function __construct($appName, IRequest $request,
84
								IUserSession $userSession, IConfig $config, IMailer $mailer, L10N $l10N, Defaults $defaults, IURLGenerator $urlGenerator) {
85 14
		parent::__construct($appName, $request);
86 14
		$this->config = $config;
87 14
		$this->userSession = $userSession;
88 14
		$this->mailer = $mailer;
89 14
		$this->l10n = $l10N;
90 14
		$this->defaults = $defaults;
91 14
		$this->urlGenerator = $urlGenerator;
92 14
	}
93
94
	/**
95
	 * @NoAdminRequired
96
	 * @NoCSRFRequired
97
	 *
98
	 * @return TemplateResponse
99
	 */
100 5
	public function index() {
101 5
		$runningOn = $this->config->getSystemValue('version');
102 5
		$runningOnServer91OrLater = version_compare($runningOn, '9.1', '>=');
103
104 5
		$supportsClass = $runningOnServer91OrLater;
105 5
		$assetPipelineBroken = !$runningOnServer91OrLater;
106
107 5
		$isAssetPipelineEnabled = $this->config->getSystemValue('asset-pipeline.enabled', false);
108 5
		if ($isAssetPipelineEnabled && $assetPipelineBroken) {
109 2
			return new TemplateResponse('calendar', 'main-asset-pipeline-unsupported');
110
		}
111
112 3
		$user = $this->userSession->getUser();
113 3
		$userId = $user->getUID();
114 3
		$emailAddress = $user->getEMailAddress();
115
116 3
		$appVersion = $this->config->getAppValue($this->appName, 'installed_version');
117 3
		$defaultView = $this->config->getUserValue($userId, $this->appName, 'currentView', 'month');
118 3
		$skipPopover = $this->config->getUserValue($userId, $this->appName, 'skipPopover', 'no');
119 3
		$weekNumbers = $this->config->getUserValue($userId, $this->appName, 'showWeekNr', 'no');
120 3
		$defaultColor = $this->config->getAppValue('theming', 'color', '#0082C9');
121
		
122 3
		$webCalWorkaround = $runningOnServer91OrLater ? 'no' : 'yes';
123
124 3
		return new TemplateResponse('calendar', 'main', [
125 3
			'appVersion' => $appVersion,
126 3
			'defaultView' => $defaultView,
127 3
			'emailAddress' => $emailAddress,
128 3
			'skipPopover' => $skipPopover,
129 3
			'weekNumbers' => $weekNumbers,
130 3
			'supportsClass' => $supportsClass,
131 3
			'defaultColor' => $defaultColor,
132 3
			'webCalWorkaround' => $webCalWorkaround,
133 3
			'isPublic' => false,
134 3
		]);
135
	}
136
137
	/**
138
	 * @PublicPage
139
	 * @NoCSRFRequired
140
	 *
141
	 * @return TemplateResponse
142
	 */
143 4
	public function publicIndex() {
144 3
		$runningOn = $this->config->getSystemValue('version');
145 3
		$runningOnServer91OrLater = version_compare($runningOn, '9.1', '>=');
146
147 3
		$supportsClass = $runningOnServer91OrLater;
148 3
		$assetPipelineBroken = !$runningOnServer91OrLater;
149
150 4
		$isAssetPipelineEnabled = $this->config->getSystemValue('asset-pipeline.enabled', false);
151 3
		if ($isAssetPipelineEnabled && $assetPipelineBroken) {
152
			return new TemplateResponse('calendar', 'main-asset-pipeline-unsupported');
153
		}
154
155 3
		$appVersion = $this->config->getAppValue($this->appName, 'installed_version');
156
157 3
		$response = new TemplateResponse('calendar', 'main', [
158 3
			'appVersion' => $appVersion,
159 3
			'defaultView' => 'month',
160 3
			'emailAddress' => '',
161 3
			'supportsClass' => $supportsClass,
162 3
			'isPublic' => true,
163 3
			'shareURL' => $this->request->getServerProtocol() . '://' . $this->request->getServerHost() . $this->request->getRequestUri(),
164 3
			'previewImage' => $this->urlGenerator->getAbsoluteURL($this->urlGenerator->imagePath('core', 'favicon-touch.png')),
165 3
		], 'public');
166 3
		$response->addHeader('X-Frame-Options', 'ALLOW');
167 3
		$csp = new ContentSecurityPolicy();
168 3
		$csp->addAllowedScriptDomain('*');
169 3
		$response->setContentSecurityPolicy($csp);
170
171 3
		return $response;
172
	}
173
174
	/**
175
	 * @NoAdminRequired
176
	 *
177
	 * @param string $id
178
	 * @return NotFoundResponse|DataDisplayResponse
179
	 */
180 4
	public function getTimezone($id) {
181 4
		if (!in_array($id, $this->getTimezoneList())) {
182 2
			return new NotFoundResponse();
183
		}
184
185 2
		$tzData = file_get_contents(__DIR__ . '/../timezones/' . $id);
186
187 2
		return new DataDisplayResponse($tzData, HTTP::STATUS_OK, [
188 2
			'content-type' => 'text/calendar',
189 2
		]);
190
	}
191
192
193
	/**
194
	 * @NoAdminRequired
195
	 * @NoCSRFRequired
196
	 * @PublicPage
197
	 *
198
	 * @param $region
199
	 * @param $city
200
	 * @return DataDisplayResponse
201
	 */
202 2
	public function getTimezoneWithRegion($region, $city) {
203 2
		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 4
	private function getTimezoneList() {
228 4
		$allFiles = scandir(__DIR__ . '/../timezones/');
229
230 4
		return array_values(array_filter($allFiles, function($file) {
231 4
			return (substr($file, -4) === '.ics');
232 4
		}));
233
	}
234
235
	/**
236
	 * @param string $to
237
	 * @param string $url
238
	 * @param string $name
239
	 * @return JSONResponse
240
	 * @NoAdminRequired
241
	 */
242 2
	public function sendEmailPublicLink($to, $url, $name) {
243
244 2
		$user = $this->userSession->getUser();
245 2
		$username = $user->getDisplayName();
246
247 2
		$subject = $this->l10n->t('%s has published the calendar "%s"', [$username, $name]);
248
249 2
		$emailTemplateHTML = new TemplateResponse('calendar', 'mail.publication.html', ['subject' => $subject, 'username' => $username, 'calendarname' => $name, 'calendarurl' => $url, 'defaults' => $this->defaults], 'public');
250 2
		$bodyHTML = $emailTemplateHTML->render();
251 2
		$emailTemplateText = new TemplateResponse('calendar', 'mail.publication.text', ['subject' => $subject, 'username' => $username, 'calendarname' => $name, 'calendarurl' => $url], 'blank');
252 2
		$textBody = $emailTemplateText->render();
253
254 2
		$status = $this->sendEmail($to, $subject, $bodyHTML, $textBody);
255
256 2
		return new JSONResponse([], $status);
257
	}
258
259
	/**
260
	 * @param string $target
261
	 * @param string $subject
262
	 * @param string $body
263
	 * @param string $textBody
264
	 * @return int
265
	 */
266 2
	private function sendEmail($target, $subject, $body, $textBody) {
267 2
		if (!$this->mailer->validateMailAddress($target)) {
268 2
			return Http::STATUS_BAD_REQUEST;
269
		}
270
271
		$sendFromDomain = $this->config->getSystemValue('mail_domain', 'domain.org');
272
		$sendFromAddress = $this->config->getSystemValue('mail_from_address', 'owncloud');
273
		$sendFrom = $sendFromAddress . '@' . $sendFromDomain;
274
275
		$message = $this->mailer->createMessage();
276
		$message->setSubject($subject);
277
		$message->setFrom([$sendFrom => $this->defaults->getName()]);
278
		$message->setTo([$target => 'Recipient']);
279
		$message->setPlainBody($textBody);
280
		$message->setHtmlBody($body);
281
		$this->mailer->send($message);
282
283
		return Http::STATUS_OK;
284
	}
285
}
286