. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Module\ModuleLanguageInterface; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\DatatablesService; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\JoinClause; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function e; /** * List of users. */ class UserListData implements RequestHandlerInterface { private DatatablesService $datatables_service; private ModuleService $module_service; private UserService $user_service; /** * @param DatatablesService $datatables_service * @param ModuleService $module_service * @param UserService $user_service */ public function __construct( DatatablesService $datatables_service, ModuleService $module_service, UserService $user_service ) { $this->datatables_service = $datatables_service; $this->module_service = $module_service; $this->user_service = $user_service; } /** * @param ServerRequestInterface $request * * @return ResponseInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { $user = Validator::attributes($request)->user(); $languages = $this->module_service->findByInterface(ModuleLanguageInterface::class, true) ->mapWithKeys(static function (ModuleLanguageInterface $module): array { $locale = $module->locale(); return [$locale->languageTag() => $locale->endonym()]; }); $query = DB::table('user') ->leftJoin('user_setting AS us1', static function (JoinClause $join): void { $join ->on('us1.user_id', '=', 'user.user_id') ->where('us1.setting_name', '=', 'language'); }) ->leftJoin('user_setting AS us2', static function (JoinClause $join): void { $join ->on('us2.user_id', '=', 'user.user_id') ->where('us2.setting_name', '=', UserInterface::PREF_TIMESTAMP_REGISTERED); }) ->leftJoin('user_setting AS us3', static function (JoinClause $join): void { $join ->on('us3.user_id', '=', 'user.user_id') ->where('us3.setting_name', '=', UserInterface::PREF_TIMESTAMP_ACTIVE); }) ->leftJoin('user_setting AS us4', static function (JoinClause $join): void { $join ->on('us4.user_id', '=', 'user.user_id') ->where('us4.setting_name', '=', UserInterface::PREF_IS_EMAIL_VERIFIED); }) ->leftJoin('user_setting AS us5', static function (JoinClause $join): void { $join ->on('us5.user_id', '=', 'user.user_id') ->where('us5.setting_name', '=', UserInterface::PREF_IS_ACCOUNT_APPROVED); }) ->where('user.user_id', '>', '0') ->select([ 'user.user_id AS edit_menu', // Hidden column 'user.user_id', 'user_name', 'real_name', 'email', 'us1.setting_value AS language', 'us2.setting_value AS registered_at_sort', // Hidden column 'us2.setting_value AS registered_at', 'us3.setting_value AS active_at_sort', // Hidden column 'us3.setting_value AS active_at', 'us4.setting_value AS verified', 'us5.setting_value AS verified_by_admin', ]); $search_columns = ['user_name', 'real_name', 'email']; $sort_columns = []; $callback = function (object $row) use ($languages, $user): array { $row_user = $this->user_service->find((int) $row->user_id); $datum = [ view('admin/users-table-options', ['row' => $row, 'self' => $user, 'user' => $row_user]), $row->user_id, '' . e($row->user_name) . '', '' . e($row->real_name) . '', '' . e($row->email) . '', $languages->get($row->language, $row->language), $row->registered_at, $row->registered_at ? view('components/datetime-diff', ['timestamp' => Registry::timestampFactory()->make((int) $row->registered_at)]) : '', $row->active_at, $row->active_at ? view('components/datetime-diff', ['timestamp' => Registry::timestampFactory()->make((int) $row->active_at)]) : I18N::translate('Never'), $row->verified ? I18N::translate('yes') : I18N::translate('no'), $row->verified_by_admin ? I18N::translate('yes') : I18N::translate('no'), ]; // Highlight old registrations. if (!$datum[10] && date('U') - $datum[6] > 604800) { $datum[7] = '' . $datum[7] . ''; } return $datum; }; return $this->datatables_service->handleQuery($request, $query, $search_columns, $sort_columns, $callback); } }