Completed
Push — master ( 71fccb...81712d )
by Georg
04:51
created

ViewController::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 1

Importance

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

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 OCP\AppFramework\Controller;
27
use OCP\AppFramework\Http;
28
use OCP\AppFramework\Http\ContentSecurityPolicy;
29
use OCP\AppFramework\Http\DataDisplayResponse;
30
use OCP\AppFramework\Http\JSONResponse;
31
use OCP\AppFramework\Http\NotFoundResponse;
32
use OCP\AppFramework\Http\TemplateResponse;
33
use OCP\Defaults;
34
use OCP\IConfig;
35
use OCP\IL10N;
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 IL10N
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 IL10N $l10N
80
	 * @param Defaults $defaults
81
	 * @param IURLGenerator $urlGenerator
82
	 */
83 14
	public function __construct($appName, IRequest $request, IUserSession $userSession,
84
								IConfig $config, IMailer $mailer, IL10N $l10N,
85
								Defaults $defaults, IURLGenerator $urlGenerator) {
86 14
		parent::__construct($appName, $request);
87 14
		$this->config = $config;
88 14
		$this->userSession = $userSession;
89 14
		$this->mailer = $mailer;
90 14
		$this->l10n = $l10N;
91 14
		$this->defaults = $defaults;
92 14
		$this->urlGenerator = $urlGenerator;
93 14
	}
94
95
	/**
96
	 * @NoAdminRequired
97
	 * @NoCSRFRequired
98
	 *
99
	 * @return TemplateResponse
100
	 */
101 5
	public function index() {
102 5
		$runningOn = $this->config->getSystemValue('version');
103 5
		$runningOnNextcloud10OrLater = version_compare($runningOn, '9.1', '>=');
104
105 5
		$supportsClass = $runningOnNextcloud10OrLater;
106 5
		$assetPipelineBroken = !$runningOnNextcloud10OrLater;
107
108 5
		$isAssetPipelineEnabled = $this->config->getSystemValue('asset-pipeline.enabled', false);
109 5
		if ($isAssetPipelineEnabled && $assetPipelineBroken) {
110 2
			return new TemplateResponse('calendar', 'main-asset-pipeline-unsupported');
111
		}
112
113 3
		$user = $this->userSession->getUser();
114 3
		$userId = $user->getUID();
115 3
		$emailAddress = $user->getEMailAddress();
116
117 3
		$appVersion = $this->config->getAppValue($this->appName, 'installed_version');
118 3
		$defaultView = $this->config->getUserValue($userId, $this->appName, 'currentView', 'month');
119 3
		$skipPopover = $this->config->getUserValue($userId, $this->appName, 'skipPopover', 'no');
120 3
		$weekNumbers = $this->config->getUserValue($userId, $this->appName, 'showWeekNr', 'no');
121 3
		$defaultColor = $this->config->getAppValue('theming', 'color', '#0082C9');
122
		
123 3
		$webCalWorkaround = $runningOnNextcloud10OrLater ? 'no' : 'yes';
124
125 3
		return new TemplateResponse('calendar', 'main', [
126 3
			'appVersion' => $appVersion,
127 3
			'defaultView' => $defaultView,
128 3
			'emailAddress' => $emailAddress,
129 3
			'skipPopover' => $skipPopover,
130 3
			'weekNumbers' => $weekNumbers,
131 3
			'supportsClass' => $supportsClass,
132 3
			'defaultColor' => $defaultColor,
133 3
			'webCalWorkaround' => $webCalWorkaround,
134 3
			'isPublic' => false,
135 3
		]);
136
	}
137
138
	/**
139
	 * @PublicPage
140
	 * @NoCSRFRequired
141
	 *
142
	 * @return TemplateResponse
143
	 */
144 4
	public function publicIndex() {
145 3
		$runningOn = $this->config->getSystemValue('version');
146 3
		$runningOnServer91OrLater = version_compare($runningOn, '9.1', '>=');
147
148 3
		$supportsClass = $runningOnServer91OrLater;
149 3
		$assetPipelineBroken = !$runningOnServer91OrLater;
150
151 4
		$isAssetPipelineEnabled = $this->config->getSystemValue('asset-pipeline.enabled', false);
152 3
		if ($isAssetPipelineEnabled && $assetPipelineBroken) {
153
			return new TemplateResponse('calendar', 'main-asset-pipeline-unsupported');
154
		}
155
156 3
		$appVersion = $this->config->getAppValue($this->appName, 'installed_version');
157
158 3
		$response = new TemplateResponse('calendar', 'main', [
159 3
			'appVersion' => $appVersion,
160 3
			'defaultView' => 'month',
161 3
			'emailAddress' => '',
162 3
			'supportsClass' => $supportsClass,
163 3
			'isPublic' => true,
164 3
			'shareURL' => $this->request->getServerProtocol() . '://' . $this->request->getServerHost() . $this->request->getRequestUri(),
165 3
			'previewImage' => $this->urlGenerator->getAbsoluteURL($this->urlGenerator->imagePath('core', 'favicon-touch.png')),
166 3
		], 'public');
167 3
		$response->addHeader('X-Frame-Options', 'ALLOW');
168 3
		$csp = new ContentSecurityPolicy();
169 3
		$csp->addAllowedScriptDomain('*');
170 3
		$response->setContentSecurityPolicy($csp);
171
172 3
		return $response;
173
	}
174
175
	/**
176
	 * @NoAdminRequired
177
	 *
178
	 * @param string $id
179
	 * @return NotFoundResponse|DataDisplayResponse
180
	 */
181 4
	public function getTimezone($id) {
182 4
		if (!in_array($id, $this->getTimezoneList())) {
183 2
			return new NotFoundResponse();
184
		}
185
186 2
		$tzData = file_get_contents(__DIR__ . '/../timezones/' . $id);
187
188 2
		return new DataDisplayResponse($tzData, Http::STATUS_OK, [
189 2
			'content-type' => 'text/calendar',
190 2
		]);
191
	}
192
193
194
	/**
195
	 * @NoAdminRequired
196
	 * @NoCSRFRequired
197
	 * @PublicPage
198
	 *
199
	 * @param $region
200
	 * @param $city
201
	 * @return DataDisplayResponse
202
	 */
203 2
	public function getTimezoneWithRegion($region, $city) {
204 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 204 which is incompatible with the return type documented by OCA\Calendar\Controller\...::getTimezoneWithRegion of type OCP\AppFramework\Http\DataDisplayResponse.
Loading history...
205
	}
206
207
208
	/**
209
	 * @NoAdminRequired
210
	 * @PublicPage
211
	 * @NoCSRFRequired
212
	 *
213
	 * @param $region
214
	 * @param $subregion
215
	 * @param $city
216
	 * @return DataDisplayResponse
217
	 */
218
	public function getTimezoneWithSubRegion($region, $subregion, $city) {
219
		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 219 which is incompatible with the return type documented by OCA\Calendar\Controller\...etTimezoneWithSubRegion of type OCP\AppFramework\Http\DataDisplayResponse.
Loading history...
220
	}
221
222
223
	/**
224
	 * get a list of default timezones
225
	 *
226
	 * @return array
227
	 */
228 4
	private function getTimezoneList() {
229 4
		$allFiles = scandir(__DIR__ . '/../timezones/');
230
231 4
		return array_values(array_filter($allFiles, function($file) {
232 4
			return (substr($file, -4) === '.ics');
233 4
		}));
234
	}
235
236
	/**
237
	 * @param string $to
238
	 * @param string $url
239
	 * @param string $name
240
	 * @return JSONResponse
241
	 * @NoAdminRequired
242
	 */
243 2
	public function sendEmailPublicLink($to, $url, $name) {
244
245 2
		$user = $this->userSession->getUser();
246 2
		$username = $user->getDisplayName();
247
248 2
		$subject = $this->l10n->t('%s has published the calendar "%s"', [$username, $name]);
249
250 2
		$emailTemplateHTML = new TemplateResponse('calendar', 'mail.publication.html', ['subject' => $subject, 'username' => $username, 'calendarname' => $name, 'calendarurl' => $url, 'defaults' => $this->defaults], 'public');
251 2
		$bodyHTML = $emailTemplateHTML->render();
252 2
		$emailTemplateText = new TemplateResponse('calendar', 'mail.publication.text', ['subject' => $subject, 'username' => $username, 'calendarname' => $name, 'calendarurl' => $url], 'blank');
253 2
		$textBody = $emailTemplateText->render();
254
255 2
		$status = $this->sendEmail($to, $subject, $bodyHTML, $textBody);
256
257 2
		return new JSONResponse([], $status);
258
	}
259
260
	/**
261
	 * @param string $target
262
	 * @param string $subject
263
	 * @param string $body
264
	 * @param string $textBody
265
	 * @return int
266
	 */
267 2
	private function sendEmail($target, $subject, $body, $textBody) {
268 2
		if (!$this->mailer->validateMailAddress($target)) {
269 2
			return Http::STATUS_BAD_REQUEST;
270
		}
271
272
		$sendFromDomain = $this->config->getSystemValue('mail_domain', 'domain.org');
273
		$sendFromAddress = $this->config->getSystemValue('mail_from_address', 'nextcloud');
274
		$sendFrom = $sendFromAddress . '@' . $sendFromDomain;
275
276
		$message = $this->mailer->createMessage();
277
		$message->setSubject($subject);
278
		$message->setFrom([$sendFrom => $this->defaults->getName()]);
279
		$message->setTo([$target => 'Recipient']);
280
		$message->setPlainBody($textBody);
281
		$message->setHtmlBody($body);
282
		$this->mailer->send($message);
283
284
		return Http::STATUS_OK;
285
	}
286
}
287