xref: /webtrees/app/Http/RequestHandlers/UserListData.php (revision d11be7027e34e3121be11cc025421873364403f9)
14c3563c0SGreg Roach<?php
24c3563c0SGreg Roach
34c3563c0SGreg Roach/**
44c3563c0SGreg Roach * webtrees: online genealogy
5*d11be702SGreg Roach * Copyright (C) 2023 webtrees development team
64c3563c0SGreg Roach * This program is free software: you can redistribute it and/or modify
74c3563c0SGreg Roach * it under the terms of the GNU General Public License as published by
84c3563c0SGreg Roach * the Free Software Foundation, either version 3 of the License, or
94c3563c0SGreg Roach * (at your option) any later version.
104c3563c0SGreg Roach * This program is distributed in the hope that it will be useful,
114c3563c0SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
124c3563c0SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
134c3563c0SGreg Roach * GNU General Public License for more details.
144c3563c0SGreg Roach * You should have received a copy of the GNU General Public License
1589f7189bSGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>.
164c3563c0SGreg Roach */
174c3563c0SGreg Roach
184c3563c0SGreg Roachdeclare(strict_types=1);
194c3563c0SGreg Roach
204c3563c0SGreg Roachnamespace Fisharebest\Webtrees\Http\RequestHandlers;
214c3563c0SGreg Roach
224c3563c0SGreg Roachuse Fisharebest\Webtrees\Contracts\UserInterface;
234c3563c0SGreg Roachuse Fisharebest\Webtrees\I18N;
244c3563c0SGreg Roachuse Fisharebest\Webtrees\Module\ModuleLanguageInterface;
25d97083feSGreg Roachuse Fisharebest\Webtrees\Registry;
264c3563c0SGreg Roachuse Fisharebest\Webtrees\Services\DatatablesService;
274c3563c0SGreg Roachuse Fisharebest\Webtrees\Services\ModuleService;
284c3563c0SGreg Roachuse Fisharebest\Webtrees\Services\UserService;
29b55cbc6bSGreg Roachuse Fisharebest\Webtrees\Validator;
304c3563c0SGreg Roachuse Illuminate\Database\Capsule\Manager as DB;
314c3563c0SGreg Roachuse Illuminate\Database\Query\JoinClause;
324c3563c0SGreg Roachuse Psr\Http\Message\ResponseInterface;
334c3563c0SGreg Roachuse Psr\Http\Message\ServerRequestInterface;
344c3563c0SGreg Roachuse Psr\Http\Server\RequestHandlerInterface;
354c3563c0SGreg Roach
364c3563c0SGreg Roachuse function e;
374c3563c0SGreg Roach
384c3563c0SGreg Roach/**
394c3563c0SGreg Roach * List of users.
404c3563c0SGreg Roach */
414c3563c0SGreg Roachclass UserListData implements RequestHandlerInterface
424c3563c0SGreg Roach{
43c4943cffSGreg Roach    private DatatablesService $datatables_service;
444c3563c0SGreg Roach
45c4943cffSGreg Roach    private ModuleService $module_service;
464c3563c0SGreg Roach
47c4943cffSGreg Roach    private UserService $user_service;
484c3563c0SGreg Roach
494c3563c0SGreg Roach    /**
504c3563c0SGreg Roach     * UserListData constructor.
514c3563c0SGreg Roach     *
524c3563c0SGreg Roach     * @param DatatablesService $datatables_service
534c3563c0SGreg Roach     * @param ModuleService     $module_service
544c3563c0SGreg Roach     * @param UserService       $user_service
554c3563c0SGreg Roach     */
564c3563c0SGreg Roach    public function __construct(
574c3563c0SGreg Roach        DatatablesService $datatables_service,
584c3563c0SGreg Roach        ModuleService $module_service,
594c3563c0SGreg Roach        UserService $user_service
604c3563c0SGreg Roach    ) {
614c3563c0SGreg Roach        $this->datatables_service = $datatables_service;
624c3563c0SGreg Roach        $this->module_service     = $module_service;
634c3563c0SGreg Roach        $this->user_service       = $user_service;
644c3563c0SGreg Roach    }
654c3563c0SGreg Roach
664c3563c0SGreg Roach    /**
674c3563c0SGreg Roach     * @param ServerRequestInterface $request
684c3563c0SGreg Roach     *
694c3563c0SGreg Roach     * @return ResponseInterface
704c3563c0SGreg Roach     */
714c3563c0SGreg Roach    public function handle(ServerRequestInterface $request): ResponseInterface
724c3563c0SGreg Roach    {
73b55cbc6bSGreg Roach        $user = Validator::attributes($request)->user();
744c3563c0SGreg Roach
754c3563c0SGreg Roach        $languages = $this->module_service->findByInterface(ModuleLanguageInterface::class, true)
764c3563c0SGreg Roach            ->mapWithKeys(static function (ModuleLanguageInterface $module): array {
774c3563c0SGreg Roach                $locale = $module->locale();
784c3563c0SGreg Roach
794c3563c0SGreg Roach                return [$locale->languageTag() => $locale->endonym()];
804c3563c0SGreg Roach            });
814c3563c0SGreg Roach
824c3563c0SGreg Roach        $query = DB::table('user')
834c3563c0SGreg Roach            ->leftJoin('user_setting AS us1', static function (JoinClause $join): void {
844c3563c0SGreg Roach                $join
854c3563c0SGreg Roach                    ->on('us1.user_id', '=', 'user.user_id')
864c3563c0SGreg Roach                    ->where('us1.setting_name', '=', 'language');
874c3563c0SGreg Roach            })
884c3563c0SGreg Roach            ->leftJoin('user_setting AS us2', static function (JoinClause $join): void {
894c3563c0SGreg Roach                $join
904c3563c0SGreg Roach                    ->on('us2.user_id', '=', 'user.user_id')
914c3563c0SGreg Roach                    ->where('us2.setting_name', '=', UserInterface::PREF_TIMESTAMP_REGISTERED);
924c3563c0SGreg Roach            })
934c3563c0SGreg Roach            ->leftJoin('user_setting AS us3', static function (JoinClause $join): void {
944c3563c0SGreg Roach                $join
954c3563c0SGreg Roach                    ->on('us3.user_id', '=', 'user.user_id')
964c3563c0SGreg Roach                    ->where('us3.setting_name', '=', UserInterface::PREF_TIMESTAMP_ACTIVE);
974c3563c0SGreg Roach            })
984c3563c0SGreg Roach            ->leftJoin('user_setting AS us4', static function (JoinClause $join): void {
994c3563c0SGreg Roach                $join
1004c3563c0SGreg Roach                    ->on('us4.user_id', '=', 'user.user_id')
1014c3563c0SGreg Roach                    ->where('us4.setting_name', '=', UserInterface::PREF_IS_EMAIL_VERIFIED);
1024c3563c0SGreg Roach            })
1034c3563c0SGreg Roach            ->leftJoin('user_setting AS us5', static function (JoinClause $join): void {
1044c3563c0SGreg Roach                $join
1054c3563c0SGreg Roach                    ->on('us5.user_id', '=', 'user.user_id')
1064c3563c0SGreg Roach                    ->where('us5.setting_name', '=', UserInterface::PREF_IS_ACCOUNT_APPROVED);
1074c3563c0SGreg Roach            })
1084c3563c0SGreg Roach            ->where('user.user_id', '>', '0')
1094c3563c0SGreg Roach            ->select([
1104c3563c0SGreg Roach                'user.user_id AS edit_menu', // Hidden column
1114c3563c0SGreg Roach                'user.user_id',
1124c3563c0SGreg Roach                'user_name',
1134c3563c0SGreg Roach                'real_name',
1144c3563c0SGreg Roach                'email',
1154c3563c0SGreg Roach                'us1.setting_value AS language',
1164c3563c0SGreg Roach                'us2.setting_value AS registered_at_sort', // Hidden column
1174c3563c0SGreg Roach                'us2.setting_value AS registered_at',
1184c3563c0SGreg Roach                'us3.setting_value AS active_at_sort', // Hidden column
1194c3563c0SGreg Roach                'us3.setting_value AS active_at',
1204c3563c0SGreg Roach                'us4.setting_value AS verified',
1214c3563c0SGreg Roach                'us5.setting_value AS verified_by_admin',
1224c3563c0SGreg Roach            ]);
1234c3563c0SGreg Roach
1244c3563c0SGreg Roach        $search_columns = ['user_name', 'real_name', 'email'];
1254c3563c0SGreg Roach        $sort_columns   = [];
1264c3563c0SGreg Roach
127f70bcff5SGreg Roach        $callback = function (object $row) use ($languages, $user): array {
1284708b347SGreg Roach            $row_user = $this->user_service->find((int) $row->user_id);
1294c3563c0SGreg Roach            $datum = [
1304c3563c0SGreg Roach                view('admin/users-table-options', ['row' => $row, 'self' => $user, 'user' => $row_user]),
1314c3563c0SGreg Roach                $row->user_id,
132315eb316SGreg Roach                '<bdi>' . e($row->user_name) . '</bdi>',
133315eb316SGreg Roach                '<bdi>' . e($row->real_name) . '</bdi>',
1344c3563c0SGreg Roach                '<a href="mailto:' . e($row->email) . '">' . e($row->email) . '</a>',
1354c3563c0SGreg Roach                $languages->get($row->language, $row->language),
1364c3563c0SGreg Roach                $row->registered_at,
137d97083feSGreg Roach                $row->registered_at ? view('components/datetime-diff', ['timestamp' => Registry::timestampFactory()->make((int) $row->registered_at)]) : '',
1384c3563c0SGreg Roach                $row->active_at,
139d97083feSGreg Roach                $row->active_at ? view('components/datetime-diff', ['timestamp' => Registry::timestampFactory()->make((int) $row->active_at)]) : I18N::translate('Never'),
1404c3563c0SGreg Roach                $row->verified ? I18N::translate('yes') : I18N::translate('no'),
1414c3563c0SGreg Roach                $row->verified_by_admin ? I18N::translate('yes') : I18N::translate('no'),
1424c3563c0SGreg Roach            ];
1434c3563c0SGreg Roach
1444c3563c0SGreg Roach            // Highlight old registrations.
1454c3563c0SGreg Roach            if (!$datum[10] && date('U') - $datum[6] > 604800) {
1464c3563c0SGreg Roach                $datum[7] = '<span class="text-danger">' . $datum[7] . '</span>';
1474c3563c0SGreg Roach            }
1484c3563c0SGreg Roach
1494c3563c0SGreg Roach            return $datum;
1504c3563c0SGreg Roach        };
1514c3563c0SGreg Roach
1524c3563c0SGreg Roach        return $this->datatables_service->handleQuery($request, $query, $search_columns, $sort_columns, $callback);
1534c3563c0SGreg Roach    }
1544c3563c0SGreg Roach}
155