3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
6 * Galette ajax controller
10 * Copyright © 2023 The Galette Team
12 * This file is part of Galette (http://galette.tuxfamily.org).
14 * Galette is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation, either version 3 of the License, or
17 * (at your option) any later version.
19 * Galette is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * along with Galette. If not, see <http://www.gnu.org/licenses/>.
27 * @category Controllers
30 * @author Johan Cwiklinski <johan@x-tnd.be>
31 * @copyright 2023 The Galette Team
32 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
33 * @link https://galette.eu
37 namespace Galette\Controllers
;
40 use Galette\Entity\Adherent
;
41 use Galette\Entity\Contribution
;
42 use Galette\Filters\MembersList
;
43 use Galette\Repository\Members
;
44 use Galette\Util\Password
;
45 use Galette\Util\Telemetry
;
46 use Slim\Psr7\Request
;
47 use Slim\Psr7\Response
;
51 * Galette ajax controller
53 * @category Controllers
54 * @name GaletteController
56 * @author Johan Cwiklinski <johan@x-tnd.be>
57 * @copyright 2023 The Galette Team
58 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
59 * @link https://galette.eu
63 class AjaxController
extends AbstractController
68 * @param Request $request PSR Request
69 * @param Response $response PSR Response
73 public function messages(Request
$request, Response
$response): Response
77 'elements/ajax_messages.html.twig'
83 * Ajax Drag'N'Drop photo
85 * @param Request $request PSR Request
86 * @param Response $response PSR Response
90 public function photo(Request
$request, Response
$response): Response
92 $post = $request->getParsedBody();
93 $ret = ['result' => false];
96 !isset($post['member_id'])
97 ||
!isset($post['file'])
98 ||
!isset($post['filename'])
99 ||
!isset($post['filesize'])
101 $this->flash
->addMessage(
103 _T("Required argument not present!")
105 return $this->withJson($response, $ret);
108 $mid = $post['member_id'];
109 $fsize = $post['filesize'];
110 $fname = $post['filename'];
112 if ($post['cropping'] != false) {
113 $cropping = $post['cropping'];
115 $tmpname = GALETTE_TEMPIMAGES_PATH
. 'ajax_upload_' . $fname;
117 $temp = explode('base64,', $post['file']);
118 $raw_file = base64_decode($temp[1]);
120 //write temporary file
121 $fp = fopen($tmpname, 'w');
122 fwrite($fp, $raw_file);
125 $adh = new Adherent($this->zdb
, (int)$mid);
127 $res = $adh->picture
->store(
130 'tmp_name' => $tmpname,
138 $ret['message'] = $adh->picture
->getErrorMessage($res);
139 $this->flash
->addMessage(
144 $ret['result'] = true;
145 $this->flash
->addMessage(
147 _T('Member photo has been changed.')
151 return $this->withJson($response, $ret);
155 * Ajax town suggestion
157 * @param Request $request PSR Request
158 * @param Response $response PSR Response
159 * @param string $term Search term
163 public function suggestTowns(Request
$request, Response
$response, string $term): Response
168 $select1 = $this->zdb
->select(Adherent
::TABLE
);
169 $select1->columns(['ville_adh']);
170 $select1->where
->like('ville_adh', '%' . html_entity_decode($term) . '%');
172 $select2 = $this->zdb
->select(Adherent
::TABLE
);
173 $select2->columns(['lieu_naissance']);
174 $select2->where
->like('lieu_naissance', '%' . html_entity_decode($term) . '%');
176 $select1->combine($select2);
178 $select = $this->zdb
->sql
->select();
179 $select->from(['sub' => $select1])
180 ->order('ville_adh ASCC')
183 $towns = $this->zdb
->execute($select);
185 $ret['success'] = true;
186 $ret['results'] = [];
187 foreach ($towns as $town) {
188 $ret['results'][] = [
189 'title' => $town->ville_adh
192 } catch (Throwable
$e) {
194 'Something went wrong is towns suggestion: ' . $e->getMessage(),
200 return $this->withJson($response, $ret);
204 * Ajax countries suggestion
206 * @param Request $request PSR Request
207 * @param Response $response PSR Response
208 * @param string $term Search term
212 public function suggestCountries(Request
$request, Response
$response, string $term): Response
217 $select = $this->zdb
->select(Adherent
::TABLE
);
218 $select->columns(['pays_adh']);
219 $select->where
->like('pays_adh', '%' . html_entity_decode($term) . '%');
221 $select->order(['pays_adh ASC']);
223 $countries = $this->zdb
->execute($select);
225 $ret['success'] = true;
226 $ret['results'] = [];
227 foreach ($countries as $country) {
228 $ret['results'][] = [
229 'title' => $country->pays_adh
232 } catch (Throwable
$e) {
234 'Something went wrong is countries suggestion: ' . $e->getMessage(),
240 return $this->withJson($response, $ret);
244 * Telemetry info preview
246 * @param Request $request PSR Request
247 * @param Response $response PSR Response
251 public function telemetryInfos(Request
$request, Response
$response): Response
253 $telemetry = new Telemetry(
258 $body = $response->getBody();
259 $body->write('<pre>' . json_encode($telemetry->getTelemetryInfos(), JSON_PRETTY_PRINT
) . '</pre>');
264 * Send telemetry info
266 * @param Request $request PSR Request
267 * @param Response $response PSR Response
271 public function telemetrySend(Request
$request, Response
$response): Response
273 $telemetry = new Telemetry(
280 $message = _T('Telemetry information has been sent. Thank you!');
283 'message' => $message
285 } catch (Throwable
$e) {
288 'message' => $e->getMessage()
291 return $this->withJson($response, $result);
295 * Successful telemetry registration
297 * @param Request $request PSR Request
298 * @param Response $response PSR Response
302 public function telemetryRegistered(Request
$request, Response
$response): Response
304 $this->preferences
->pref_registration_date
= date('Y-m-d H:i:s');
305 $this->preferences
->store();
306 return $this->withJson($response, ['message' => _T('Thank you for registering!')]);
310 * Contributions dates
312 * @param Request $request PSR Request
313 * @param Response $response PSR Response
317 public function contributionDates(Request
$request, Response
$response): Response
319 $post = $request->getParsedBody();
321 $contrib = new Contribution(
325 'type' => (int)$post['fee_id'],
326 'adh' => (int)$post['member_id']
330 return $this->withJson(
333 'date_debut_cotis' => $contrib->begin_date
,
334 'date_fin_cotis' => $contrib->end_date
340 * Contributions dates
342 * @param Request $request PSR Request
343 * @param Response $response PSR Response
344 * @param int|null $page Page number
345 * @param string|null $search Search string
349 public function contributionMembers(Request
$request, Response
$response, int $page = null, string $search = null): Response
351 $post = $request->getParsedBody();
352 $filters = new MembersList();
353 if (isset($post['page'])) {
354 $filters->current_page
= (int)$post['page'];
355 } elseif ($page !== null) {
356 $filters->current_page
= $page;
359 if (isset($post['search'])) {
360 $search = $post['search'];
362 if ($search !== null) {
363 $filters->filter_str
= $search;
364 if (is_numeric($search)) {
365 $filters->field_filter
= Members
::FILTER_ID
;
369 $m = new Members($filters);
370 $list_members = $m->getDropdownMembers($this->zdb
, $this->login
);
373 if (count($list_members) > 0) {
374 foreach ($list_members as $pk => $member) {
382 return $this->withJson(
385 'results' => $members
393 * @param Request $request PSR Request
394 * @param Response $response PSR Response
398 public function passwordStrength(Request
$request, Response
$response): Response
400 //post params may be passed from security tab test password
401 $post = $request->getParsedBody();
403 if (isset($post['pref_password_length'])) {
404 $this->preferences
->pref_password_length
= $post['pref_password_length'];
407 if (isset($post['pref_password_strength'])) {
408 $this->preferences
->pref_password_strength
= $post['pref_password_strength'];
411 if (isset($post['pref_password_blacklist'])) {
412 $this->preferences
->pref_password_blacklist
= $post['pref_password_blacklist'];
415 $pass = new Password($this->preferences
);
416 $valid = $pass->isValid($post['value']);
418 return $this->withJson(
422 'score' => $pass->getStrenght(),
423 'errors' => $pass->getErrors(),
424 'warnings' => ($valid ?
$pass->getStrenghtErrors() : null)