From 57ab22314b2599feb432b1a1ed71643cfc2f0452 Mon Sep 17 00:00:00 2001 From: Greg Roach Date: Fri, 27 Sep 2019 16:53:23 +0100 Subject: Add tree to request; preparing for router --- app/Http/Controllers/AccountController.php | 24 +-- .../Controllers/Admin/ChangesLogController.php | 37 +++- .../Controllers/Admin/ControlPanelController.php | 237 ++++++++++++--------- .../Controllers/Admin/FixLevel0MediaController.php | 21 +- .../Admin/ImportThumbnailsController.php | 4 +- app/Http/Controllers/Admin/LocationController.php | 7 +- .../Controllers/Admin/MapProviderController.php | 4 +- app/Http/Controllers/Admin/MediaController.php | 42 ++-- app/Http/Controllers/Admin/ModuleController.php | 52 +++-- app/Http/Controllers/Admin/UpgradeController.php | 4 +- app/Http/Controllers/Admin/UsersController.php | 59 +++-- app/Http/Controllers/AdminController.php | 17 +- app/Http/Controllers/AdminSiteController.php | 78 ++++--- app/Http/Controllers/AdminTreesController.php | 120 ++++++----- app/Http/Controllers/Auth/LoginController.php | 34 +-- app/Http/Controllers/Auth/RegisterController.php | 13 +- .../Controllers/Auth/VerifyEmailController.php | 15 +- app/Http/Controllers/AutocompleteController.php | 44 ++-- app/Http/Controllers/BranchesController.php | 9 +- app/Http/Controllers/CalendarController.php | 8 +- app/Http/Controllers/EditFamilyController.php | 33 ++- .../Controllers/EditGedcomRecordController.php | 66 +++--- app/Http/Controllers/EditIndividualController.php | 91 ++++---- app/Http/Controllers/EditMediaController.php | 54 ++--- app/Http/Controllers/EditNoteController.php | 17 +- app/Http/Controllers/EditRepositoryController.php | 9 +- app/Http/Controllers/EditSourceController.php | 9 +- app/Http/Controllers/EditSubmitterController.php | 9 +- app/Http/Controllers/FamilyController.php | 21 +- app/Http/Controllers/GedcomFileController.php | 24 ++- app/Http/Controllers/GedcomRecordController.php | 5 +- app/Http/Controllers/HomePageController.php | 89 ++++---- app/Http/Controllers/IndividualController.php | 29 +-- app/Http/Controllers/ListController.php | 39 ++-- app/Http/Controllers/MediaController.php | 21 +- app/Http/Controllers/MediaFileController.php | 9 +- app/Http/Controllers/MessageController.php | 29 ++- app/Http/Controllers/NoteController.php | 41 ++-- app/Http/Controllers/PendingChangesController.php | 40 ++-- app/Http/Controllers/PlaceHierarchyController.php | 22 +- app/Http/Controllers/ReportEngineController.php | 20 +- app/Http/Controllers/RepositoryController.php | 21 +- app/Http/Controllers/SearchController.php | 31 ++- app/Http/Controllers/SourceController.php | 21 +- app/Http/Middleware/UseSession.php | 8 +- app/Http/Middleware/UseTree.php | 2 + app/Http/RequestHandlers/MasqueradeAsUser.php | 12 +- app/Http/RequestHandlers/ModuleAction.php | 3 +- app/Http/RequestHandlers/PasswordRequestAction.php | 2 +- app/Http/RequestHandlers/PasswordResetForm.php | 5 - app/Module/AncestorsChartModule.php | 22 +- app/Module/BatchUpdateModule.php | 15 +- app/Module/BranchesListModule.php | 18 +- app/Module/CensusAssistantModule.php | 5 +- app/Module/ClippingsCartModule.php | 75 +++---- app/Module/CompactTreeChartModule.php | 23 +- app/Module/CustomCssJsModule.php | 4 +- app/Module/DescendancyChartModule.php | 31 ++- app/Module/DescendancyModule.php | 24 ++- app/Module/FamilyBookChartModule.php | 8 +- app/Module/FamilyListModule.php | 11 +- app/Module/FamilyTreeFavoritesModule.php | 13 +- app/Module/FamilyTreeNewsModule.php | 14 +- app/Module/FanChartModule.php | 23 +- app/Module/FrequentlyAskedQuestionsModule.php | 31 +-- app/Module/HourglassChartModule.php | 7 +- app/Module/IndividualListModule.php | 12 +- app/Module/InteractiveTreeModule.php | 16 +- app/Module/LifespansChartModule.php | 8 +- app/Module/MediaListModule.php | 10 +- app/Module/ModuleAnalyticsInterface.php | 4 +- app/Module/ModuleAnalyticsTrait.php | 4 +- app/Module/NoteListModule.php | 10 +- app/Module/PedigreeChartModule.php | 23 +- app/Module/PedigreeMapModule.php | 27 ++- app/Module/PlaceHierarchyListModule.php | 12 +- app/Module/RelationshipsChartModule.php | 11 +- app/Module/RepositoryListModule.php | 12 +- app/Module/SiteMapModule.php | 8 +- app/Module/SourceListModule.php | 12 +- app/Module/StatisticsChartModule.php | 40 ++-- app/Module/StoriesModule.php | 24 ++- app/Module/TimelineChartModule.php | 8 +- app/Module/UserFavoritesModule.php | 12 +- app/Module/UserJournalModule.php | 9 +- app/Module/UserMessagesModule.php | 4 +- app/Router.php | 4 +- app/Services/MailService.php | 1 - app/SiteUser.php | 1 - resources/views/admin/trees-preferences.phtml | 1 - resources/views/emails/approve-user-html.phtml | 4 +- resources/views/lists/individuals-table.phtml | 2 +- resources/views/media-page-menu.phtml | 2 - .../views/statistics/families/age-difference.phtml | 3 +- tests/TestCase.php | 97 ++++----- .../Controllers/Admin/ChangesLogControllerTest.php | 24 +-- .../Admin/ControlPanelControllerTest.php | 26 +-- .../Admin/FixLevel0MediaControllerTest.php | 12 +- .../Admin/ImportThumbnailsControllerTest.php | 4 +- .../Controllers/Admin/LocationControllerTest.php | 5 +- .../Admin/MapProviderControllerTest.php | 4 +- .../Http/Controllers/Admin/MediaControllerTest.php | 58 +++-- .../Controllers/Admin/ModuleControllerTest.php | 48 ++--- .../Controllers/Admin/UpgradeControllerTest.php | 31 +-- .../Http/Controllers/Admin/UsersControllerTest.php | 39 ++-- .../Http/Controllers/CalendarControllerTest.php | 30 +-- tests/app/Http/RequestHandlers/DeleteUserTest.php | 14 +- .../Http/RequestHandlers/MasqueradeAsUserTest.php | 36 ++-- .../app/Http/RequestHandlers/ModuleActionTest.php | 9 +- .../app/Http/RequestHandlers/PrivacyPolicyTest.php | 6 +- tests/app/TreeTest.php | 1 - tests/feature/ImportGedcomTest.php | 2 +- tests/feature/IndividualListTest.php | 29 ++- tests/feature/UserAdminTest.php | 56 +++-- 114 files changed, 1533 insertions(+), 1217 deletions(-) diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 8fa6eea9bb..3fb969d379 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -19,18 +19,14 @@ namespace Fisharebest\Webtrees\Http\Controllers; use DateTimeZone; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\Functions\FunctionsEdit; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; -use Fisharebest\Webtrees\Module\ModuleThemeInterface; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Session; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; -use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -61,13 +57,15 @@ class AccountController extends AbstractBaseController } /** - * @param Tree $tree - * @param UserInterface $user + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function edit(Tree $tree, UserInterface $user): ResponseInterface + public function edit(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + $my_individual_record = Individual::getInstance($tree->getUserPreference(Auth::user(), 'gedcomid'), $tree); $contact_methods = FunctionsEdit::optionsContactMethods(); $default_individual = Individual::getInstance($tree->getUserPreference(Auth::user(), 'rootid'), $tree); @@ -106,13 +104,13 @@ class AccountController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function update(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function update(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $params = $request->getParsedBody(); $contact_method = $params['contact_method']; @@ -164,12 +162,14 @@ class AccountController extends AbstractBaseController } /** - * @param UserInterface $user + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function delete(UserInterface $user): ResponseInterface + public function delete(ServerRequestInterface $request): ResponseInterface { + $user = $request->getAttribute('user'); + // An administrator can only be deleted by another administrator if ($user instanceof User && !$user->getPreference('canadmin')) { $this->user_service->delete($user); diff --git a/app/Http/Controllers/Admin/ChangesLogController.php b/app/Http/Controllers/Admin/ChangesLogController.php index e731949baa..4e27186a2e 100644 --- a/app/Http/Controllers/Admin/ChangesLogController.php +++ b/app/Http/Controllers/Admin/ChangesLogController.php @@ -42,15 +42,36 @@ use function preg_replace_callback; */ class ChangesLogController extends AbstractAdminController { + /** @var DatatablesService */ + private $datatables_service; + + /** @var MyersDiff */ + private $myers_diff; + + /** @var UserService */ + private $user_service; + + /** + * ChangesLogController constructor. + * + * @param DatatablesService $datatables_service + * @param MyersDiff $myers_diff + * @param UserService $user_service + */ + public function __construct(DatatablesService $datatables_service, MyersDiff $myers_diff, UserService $user_service) { + $this->datatables_service = $datatables_service; + $this->myers_diff = $myers_diff; + $this->user_service = $user_service; + } + /** * Show the edit history for a tree. * * @param ServerRequestInterface $request - * @param UserService $user_service * * @return ResponseInterface */ - public function changesLog(ServerRequestInterface $request, UserService $user_service): ResponseInterface + public function changesLog(ServerRequestInterface $request): ResponseInterface { $tree_list = []; foreach (Tree::getAll() as $tree) { @@ -60,7 +81,7 @@ class ChangesLogController extends AbstractAdminController } $user_list = ['' => '']; - foreach ($user_service->all() as $tmp_user) { + foreach ($this->user_service->all() as $tmp_user) { $user_list[$tmp_user->userName()] = $tmp_user->userName(); } @@ -130,20 +151,18 @@ class ChangesLogController extends AbstractAdminController * Show the edit history for a tree. * * @param ServerRequestInterface $request - * @param DatatablesService $datatables_service - * @param MyersDiff $myers_diff * * @return ResponseInterface */ - public function changesLogData(ServerRequestInterface $request, DatatablesService $datatables_service, MyersDiff $myers_diff): ResponseInterface + public function changesLogData(ServerRequestInterface $request): ResponseInterface { $query = $this->changesQuery($request); - $callback = static function (stdClass $row) use ($myers_diff): array { + $callback = function (stdClass $row): array { $old_lines = explode("\n", $row->old_gedcom); $new_lines = explode("\n", $row->new_gedcom); - $differences = $myers_diff->calculate($old_lines, $new_lines); + $differences = $this->myers_diff->calculate($old_lines, $new_lines); $diff_lines = []; foreach ($differences as $difference) { @@ -184,7 +203,7 @@ class ChangesLogController extends AbstractAdminController ]; }; - return $datatables_service->handle($request, $query, [], [], $callback); + return $this->datatables_service->handle($request, $query, [], [], $callback); } /** diff --git a/app/Http/Controllers/Admin/ControlPanelController.php b/app/Http/Controllers/Admin/ControlPanelController.php index f790ba61c9..2d3b1d9115 100644 --- a/app/Http/Controllers/Admin/ControlPanelController.php +++ b/app/Http/Controllers/Admin/ControlPanelController.php @@ -51,44 +51,75 @@ use Illuminate\Support\Collection; use League\Flysystem\Adapter\Local; use League\Flysystem\Filesystem; use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; /** * Controller for the administration pages */ class ControlPanelController extends AbstractAdminController { + /** @var ModuleService */ + private $module_service; + + /** @var HousekeepingService */ + private $housekeeping_service; + + /** @var ServerCheckService */ + private $server_check_service; + + /** @var UpgradeService */ + private $upgrade_service; + + /** @var UserService */ + private $user_service; + /** - * The control panel shows a summary of the site and links to admin functions. + * ControlPanelController constructor. * * @param HousekeepingService $housekeeping_service - * @param UpgradeService $upgrade_service * @param ModuleService $module_service * @param ServerCheckService $server_check_service + * @param UpgradeService $upgrade_service * @param UserService $user_service - * - * @return ResponseInterface */ - public function controlPanel( + public function __construct( HousekeepingService $housekeeping_service, - UpgradeService $upgrade_service, ModuleService $module_service, ServerCheckService $server_check_service, + UpgradeService $upgrade_service, UserService $user_service - ): ResponseInterface { + ) + { + $this->module_service = $module_service; + $this->housekeeping_service = $housekeeping_service; + $this->server_check_service = $server_check_service; + $this->upgrade_service = $upgrade_service; + $this->user_service = $user_service; + } + + /** + * The control panel shows a summary of the site and links to admin functions. + * + * @param ServerRequestInterface $request + * + * @return ResponseInterface + */ + public function controlPanel(ServerRequestInterface $request): ResponseInterface + { $filesystem = new Filesystem(new Local(Webtrees::ROOT_DIR)); - $files_to_delete = $housekeeping_service->deleteOldWebtreesFiles($filesystem); + $files_to_delete = $this->housekeeping_service->deleteOldWebtreesFiles($filesystem); return $this->viewResponse('admin/control-panel', [ 'title' => I18N::translate('Control panel'), - 'server_errors' => $server_check_service->serverErrors(), - 'server_warnings' => $server_check_service->serverWarnings(), - 'latest_version' => $upgrade_service->latestVersion(), - 'all_users' => $user_service->all(), - 'administrators' => $user_service->administrators(), - 'managers' => $user_service->managers(), - 'moderators' => $user_service->moderators(), - 'unapproved' => $user_service->unapproved(), - 'unverified' => $user_service->unverified(), + 'server_errors' => $this->server_check_service->serverErrors(), + 'server_warnings' => $this->server_check_service->serverWarnings(), + 'latest_version' => $this->upgrade_service->latestVersion(), + 'all_users' => $this->user_service->all(), + 'administrators' => $this->user_service->administrators(), + 'managers' => $this->user_service->managers(), + 'moderators' => $this->user_service->moderators(), + 'unapproved' => $this->user_service->unapproved(), + 'unverified' => $this->user_service->unverified(), 'all_trees' => Tree::getAll(), 'changes' => $this->totalChanges(), 'individuals' => $this->totalIndividuals(), @@ -97,73 +128,41 @@ class ControlPanelController extends AbstractAdminController 'media' => $this->totalMediaObjects(), 'repositories' => $this->totalRepositories(), 'notes' => $this->totalNotes(), - 'individual_list_module' => $module_service->findByInterface(IndividualListModule::class)->first(), - 'family_list_module' => $module_service->findByInterface(FamilyListModule::class)->first(), - 'media_list_module' => $module_service->findByInterface(MediaListModule::class)->first(), - 'note_list_module' => $module_service->findByInterface(NoteListModule::class)->first(), - 'repository_list_module' => $module_service->findByInterface(RepositoryListModule::class)->first(), - 'source_list_module' => $module_service->findByInterface(SourceListModule::class)->first(), + 'individual_list_module' => $this->module_service->findByInterface(IndividualListModule::class)->first(), + 'family_list_module' => $this->module_service->findByInterface(FamilyListModule::class)->first(), + 'media_list_module' => $this->module_service->findByInterface(MediaListModule::class)->first(), + 'note_list_module' => $this->module_service->findByInterface(NoteListModule::class)->first(), + 'repository_list_module' => $this->module_service->findByInterface(RepositoryListModule::class)->first(), + 'source_list_module' => $this->module_service->findByInterface(SourceListModule::class)->first(), 'files_to_delete' => $files_to_delete, - 'all_modules_disabled' => $module_service->all(true), - 'all_modules_enabled' => $module_service->all(false), - 'deleted_modules' => $module_service->deletedModules(), - 'analytics_modules_disabled' => $module_service->findByInterface(ModuleAnalyticsInterface::class, true), - 'analytics_modules_enabled' => $module_service->findByInterface(ModuleAnalyticsInterface::class, false), - 'block_modules_disabled' => $module_service->findByInterface(ModuleBlockInterface::class, true), - 'block_modules_enabled' => $module_service->findByInterface(ModuleBlockInterface::class, false), - 'chart_modules_disabled' => $module_service->findByInterface(ModuleChartInterface::class, true), - 'chart_modules_enabled' => $module_service->findByInterface(ModuleChartInterface::class, false), - 'other_modules' => $module_service->otherModules(true), - 'footer_modules_disabled' => $module_service->findByInterface(ModuleFooterInterface::class, true), - 'footer_modules_enabled' => $module_service->findByInterface(ModuleFooterInterface::class, false), - 'history_modules_disabled' => $module_service->findByInterface(ModuleHistoricEventsInterface::class, true), - 'history_modules_enabled' => $module_service->findByInterface(ModuleHistoricEventsInterface::class, false), - 'language_modules_disabled' => $module_service->findByInterface(ModuleLanguageInterface::class, true), - 'language_modules_enabled' => $module_service->findByInterface(ModuleLanguageInterface::class, false), - 'list_modules_disabled' => $module_service->findByInterface(ModuleListInterface::class, true), - 'list_modules_enabled' => $module_service->findByInterface(ModuleListInterface::class, false), - 'menu_modules_disabled' => $module_service->findByInterface(ModuleMenuInterface::class, true), - 'menu_modules_enabled' => $module_service->findByInterface(ModuleMenuInterface::class, false), - 'report_modules_disabled' => $module_service->findByInterface(ModuleReportInterface::class, true), - 'report_modules_enabled' => $module_service->findByInterface(ModuleReportInterface::class, false), - 'sidebar_modules_disabled' => $module_service->findByInterface(ModuleSidebarInterface::class, true), - 'sidebar_modules_enabled' => $module_service->findByInterface(ModuleSidebarInterface::class, false), - 'tab_modules_disabled' => $module_service->findByInterface(ModuleTabInterface::class, true), - 'tab_modules_enabled' => $module_service->findByInterface(ModuleTabInterface::class, false), - 'theme_modules_disabled' => $module_service->findByInterface(ModuleThemeInterface::class, true), - 'theme_modules_enabled' => $module_service->findByInterface(ModuleThemeInterface::class, false), - ]); - } - - /** - * Managers see a restricted version of the contol panel. - * - * @param ModuleService $module_service - * - * @return ResponseInterface - */ - public function controlPanelManager(ModuleService $module_service): ResponseInterface - { - $all_trees = array_filter(Tree::getAll(), static function (Tree $tree): bool { - return Auth::isManager($tree); - }); - - return $this->viewResponse('admin/control-panel-manager', [ - 'title' => I18N::translate('Control panel'), - 'all_trees' => $all_trees, - 'changes' => $this->totalChanges(), - 'individuals' => $this->totalIndividuals(), - 'families' => $this->totalFamilies(), - 'sources' => $this->totalSources(), - 'media' => $this->totalMediaObjects(), - 'repositories' => $this->totalRepositories(), - 'notes' => $this->totalNotes(), - 'individual_list_module' => $module_service->findByInterface(IndividualListModule::class)->first(), - 'family_list_module' => $module_service->findByInterface(FamilyListModule::class)->first(), - 'media_list_module' => $module_service->findByInterface(MediaListModule::class)->first(), - 'note_list_module' => $module_service->findByInterface(NoteListModule::class)->first(), - 'repository_list_module' => $module_service->findByInterface(RepositoryListModule::class)->first(), - 'source_list_module' => $module_service->findByInterface(SourceListModule::class)->first(), + 'all_modules_disabled' => $this->module_service->all(true), + 'all_modules_enabled' => $this->module_service->all(false), + 'deleted_modules' => $this->module_service->deletedModules(), + 'analytics_modules_disabled' => $this->module_service->findByInterface(ModuleAnalyticsInterface::class, true), + 'analytics_modules_enabled' => $this->module_service->findByInterface(ModuleAnalyticsInterface::class, false), + 'block_modules_disabled' => $this->module_service->findByInterface(ModuleBlockInterface::class, true), + 'block_modules_enabled' => $this->module_service->findByInterface(ModuleBlockInterface::class, false), + 'chart_modules_disabled' => $this->module_service->findByInterface(ModuleChartInterface::class, true), + 'chart_modules_enabled' => $this->module_service->findByInterface(ModuleChartInterface::class, false), + 'other_modules' => $this->module_service->otherModules(true), + 'footer_modules_disabled' => $this->module_service->findByInterface(ModuleFooterInterface::class, true), + 'footer_modules_enabled' => $this->module_service->findByInterface(ModuleFooterInterface::class, false), + 'history_modules_disabled' => $this->module_service->findByInterface(ModuleHistoricEventsInterface::class, true), + 'history_modules_enabled' => $this->module_service->findByInterface(ModuleHistoricEventsInterface::class, false), + 'language_modules_disabled' => $this->module_service->findByInterface(ModuleLanguageInterface::class, true), + 'language_modules_enabled' => $this->module_service->findByInterface(ModuleLanguageInterface::class, false), + 'list_modules_disabled' => $this->module_service->findByInterface(ModuleListInterface::class, true), + 'list_modules_enabled' => $this->module_service->findByInterface(ModuleListInterface::class, false), + 'menu_modules_disabled' => $this->module_service->findByInterface(ModuleMenuInterface::class, true), + 'menu_modules_enabled' => $this->module_service->findByInterface(ModuleMenuInterface::class, false), + 'report_modules_disabled' => $this->module_service->findByInterface(ModuleReportInterface::class, true), + 'report_modules_enabled' => $this->module_service->findByInterface(ModuleReportInterface::class, false), + 'sidebar_modules_disabled' => $this->module_service->findByInterface(ModuleSidebarInterface::class, true), + 'sidebar_modules_enabled' => $this->module_service->findByInterface(ModuleSidebarInterface::class, false), + 'tab_modules_disabled' => $this->module_service->findByInterface(ModuleTabInterface::class, true), + 'tab_modules_enabled' => $this->module_service->findByInterface(ModuleTabInterface::class, false), + 'theme_modules_disabled' => $this->module_service->findByInterface(ModuleThemeInterface::class, true), + 'theme_modules_enabled' => $this->module_service->findByInterface(ModuleThemeInterface::class, false), ]); } @@ -185,6 +184,22 @@ class ControlPanelController extends AbstractAdminController ->all(); } + /** + * Count the number of individuals in each tree. + * + * @return Collection + */ + private function totalIndividuals(): Collection + { + return DB::table('gedcom') + ->leftJoin('individuals', 'i_file', '=', 'gedcom_id') + ->groupBy(['gedcom_id']) + ->pluck(new Expression('COUNT(i_id)'), 'gedcom_id') + ->map(static function (string $count) { + return (int) $count; + }); + } + /** * Count the number of families in each tree. * @@ -202,16 +217,16 @@ class ControlPanelController extends AbstractAdminController } /** - * Count the number of individuals in each tree. + * Count the number of sources in each tree. * * @return Collection */ - private function totalIndividuals(): Collection + private function totalSources(): Collection { return DB::table('gedcom') - ->leftJoin('individuals', 'i_file', '=', 'gedcom_id') + ->leftJoin('sources', 's_file', '=', 'gedcom_id') ->groupBy(['gedcom_id']) - ->pluck(new Expression('COUNT(i_id)'), 'gedcom_id') + ->pluck(new Expression('COUNT(s_id)'), 'gedcom_id') ->map(static function (string $count) { return (int) $count; }); @@ -234,17 +249,17 @@ class ControlPanelController extends AbstractAdminController } /** - * Count the number of notes in each tree. + * Count the number of repositorie in each tree. * * @return Collection */ - private function totalNotes(): Collection + private function totalRepositories(): Collection { return DB::table('gedcom') ->leftJoin('other', static function (JoinClause $join): void { $join ->on('o_file', '=', 'gedcom_id') - ->where('o_type', '=', 'NOTE'); + ->where('o_type', '=', 'REPO'); }) ->groupBy(['gedcom_id']) ->pluck(new Expression('COUNT(o_id)'), 'gedcom_id') @@ -254,17 +269,17 @@ class ControlPanelController extends AbstractAdminController } /** - * Count the number of repositorie in each tree. + * Count the number of notes in each tree. * * @return Collection */ - private function totalRepositories(): Collection + private function totalNotes(): Collection { return DB::table('gedcom') ->leftJoin('other', static function (JoinClause $join): void { $join ->on('o_file', '=', 'gedcom_id') - ->where('o_type', '=', 'REPO'); + ->where('o_type', '=', 'NOTE'); }) ->groupBy(['gedcom_id']) ->pluck(new Expression('COUNT(o_id)'), 'gedcom_id') @@ -274,18 +289,34 @@ class ControlPanelController extends AbstractAdminController } /** - * Count the number of sources in each tree. + * Managers see a restricted version of the contol panel. * - * @return Collection + * @param ServerRequestInterface $request + * + * @return ResponseInterface */ - private function totalSources(): Collection + public function controlPanelManager(ServerRequestInterface $request): ResponseInterface { - return DB::table('gedcom') - ->leftJoin('sources', 's_file', '=', 'gedcom_id') - ->groupBy(['gedcom_id']) - ->pluck(new Expression('COUNT(s_id)'), 'gedcom_id') - ->map(static function (string $count) { - return (int) $count; - }); + $all_trees = array_filter(Tree::getAll(), static function (Tree $tree): bool { + return Auth::isManager($tree); + }); + + return $this->viewResponse('admin/control-panel-manager', [ + 'title' => I18N::translate('Control panel'), + 'all_trees' => $all_trees, + 'changes' => $this->totalChanges(), + 'individuals' => $this->totalIndividuals(), + 'families' => $this->totalFamilies(), + 'sources' => $this->totalSources(), + 'media' => $this->totalMediaObjects(), + 'repositories' => $this->totalRepositories(), + 'notes' => $this->totalNotes(), + 'individual_list_module' => $this->module_service->findByInterface(IndividualListModule::class)->first(), + 'family_list_module' => $this->module_service->findByInterface(FamilyListModule::class)->first(), + 'media_list_module' => $this->module_service->findByInterface(MediaListModule::class)->first(), + 'note_list_module' => $this->module_service->findByInterface(NoteListModule::class)->first(), + 'repository_list_module' => $this->module_service->findByInterface(RepositoryListModule::class)->first(), + 'source_list_module' => $this->module_service->findByInterface(SourceListModule::class)->first(), + ]); } } diff --git a/app/Http/Controllers/Admin/FixLevel0MediaController.php b/app/Http/Controllers/Admin/FixLevel0MediaController.php index 80b6d62bac..713d4cda71 100644 --- a/app/Http/Controllers/Admin/FixLevel0MediaController.php +++ b/app/Http/Controllers/Admin/FixLevel0MediaController.php @@ -35,13 +35,27 @@ use stdClass; */ class FixLevel0MediaController extends AbstractAdminController { + /** @var DatatablesService */ + private $datatables_service; + + /** + * FixLevel0MediaController constructor. + * + * @param DatatablesService $datatables_service + */ + public function __construct(DatatablesService $datatables_service) { + $this->datatables_service = $datatables_service; + } + /** * If media objects are wronly linked to top-level records, reattach them * to facts/events. * + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function fixLevel0Media(): ResponseInterface + public function fixLevel0Media(ServerRequestInterface $request): ResponseInterface { return $this->viewResponse('admin/fix-level-0-media', [ 'title' => I18N::translate('Link media objects to facts and events'), @@ -88,11 +102,10 @@ class FixLevel0MediaController extends AbstractAdminController * to facts/events. * * @param ServerRequestInterface $request - * @param DatatablesService $datatables_service * * @return ResponseInterface */ - public function fixLevel0MediaData(ServerRequestInterface $request, DatatablesService $datatables_service): ResponseInterface + public function fixLevel0MediaData(ServerRequestInterface $request): ResponseInterface { $ignore_facts = [ 'FAMC', @@ -130,7 +143,7 @@ class FixLevel0MediaController extends AbstractAdminController ->orderBy('media.m_id') ->select(['media.m_file', 'media.m_id', 'media.m_gedcom', 'individuals.i_id', 'individuals.i_gedcom']); - return $datatables_service->handle($request, $query, [], [], static function (stdClass $datum) use ($ignore_facts): array { + return $this->datatables_service->handle($request, $query, [], [], static function (stdClass $datum) use ($ignore_facts): array { $tree = Tree::findById((int) $datum->m_file); $media = Media::getInstance($datum->m_id, $tree, $datum->m_gedcom); $individual = Individual::getInstance($datum->i_id, $tree, $datum->i_gedcom); diff --git a/app/Http/Controllers/Admin/ImportThumbnailsController.php b/app/Http/Controllers/Admin/ImportThumbnailsController.php index 2cd257fbe6..18e1c33da7 100644 --- a/app/Http/Controllers/Admin/ImportThumbnailsController.php +++ b/app/Http/Controllers/Admin/ImportThumbnailsController.php @@ -40,9 +40,11 @@ class ImportThumbnailsController extends AbstractAdminController /** * Import custom thumbnails from webtres 1.x. * + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function webtrees1Thumbnails(): ResponseInterface + public function webtrees1Thumbnails(ServerRequestInterface $request): ResponseInterface { return $this->viewResponse('admin/webtrees1-thumbnails', [ 'title' => I18N::translate('Import custom thumbnails from webtrees version 1'), diff --git a/app/Http/Controllers/Admin/LocationController.php b/app/Http/Controllers/Admin/LocationController.php index f3849cc1a4..3e22bfb93e 100644 --- a/app/Http/Controllers/Admin/LocationController.php +++ b/app/Http/Controllers/Admin/LocationController.php @@ -23,7 +23,6 @@ use Fisharebest\Webtrees\Gedcom; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Location; use Fisharebest\Webtrees\Services\GedcomService; -use Fisharebest\Webtrees\Tree; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Illuminate\Database\Query\JoinClause; @@ -717,12 +716,14 @@ class LocationController extends AbstractAdminController } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function importLocationsFromTree(Tree $tree): ResponseInterface + public function importLocationsFromTree(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + // Get all the places from the places table ... $places = DB::table('places AS p0') ->leftJoin('places AS p1', 'p1.p_id', '=', 'p0.p_parent_id') diff --git a/app/Http/Controllers/Admin/MapProviderController.php b/app/Http/Controllers/Admin/MapProviderController.php index bda6511de9..b778c7896c 100644 --- a/app/Http/Controllers/Admin/MapProviderController.php +++ b/app/Http/Controllers/Admin/MapProviderController.php @@ -28,9 +28,11 @@ use Psr\Http\Message\ServerRequestInterface; class MapProviderController extends AbstractAdminController { /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function mapProviderEdit(): ResponseInterface + public function mapProviderEdit(ServerRequestInterface $request): ResponseInterface { return $this->viewResponse('admin/map-provider', [ 'title' => I18N::translate('Map provider'), diff --git a/app/Http/Controllers/Admin/MediaController.php b/app/Http/Controllers/Admin/MediaController.php index 76837c224f..a8d08a9098 100644 --- a/app/Http/Controllers/Admin/MediaController.php +++ b/app/Http/Controllers/Admin/MediaController.php @@ -53,6 +53,23 @@ class MediaController extends AbstractAdminController // How many files to upload on one form. private const MAX_UPLOAD_FILES = 10; + /** @var DatatablesService */ + private $datatables_service; + + /** @var FilesystemInterface */ + private $filesystem; + + /** + * MediaController constructor. + * + * @param DatatablesService $datatables_service + * @param FilesystemInterface $filesystem + */ + public function __construct(DatatablesService $datatables_service, FilesystemInterface $filesystem) { + $this->datatables_service = $datatables_service; + $this->filesystem = $filesystem; + } + /** * @param ServerRequestInterface $request * @@ -116,11 +133,10 @@ class MediaController extends AbstractAdminController /** * @param ServerRequestInterface $request - * @param FilesystemInterface $filesystem * * @return ResponseInterface */ - public function delete(ServerRequestInterface $request, FilesystemInterface $filesystem): ResponseInterface + public function delete(ServerRequestInterface $request): ResponseInterface { $delete_file = $request->getQueryParams()['file']; $media_folder = $request->getQueryParams()['folder']; @@ -132,8 +148,8 @@ class MediaController extends AbstractAdminController if (in_array($delete_file, $disk_files, true)) { $path = $media_folder . $delete_file; try { - if ($filesystem->has($path)) { - $filesystem->delete($path); + if ($this->filesystem->has($path)) { + $this->filesystem->delete($path); } FlashMessages::addMessage(I18N::translate('The file %s has been deleted.', e($path)), 'info'); } catch (Throwable $ex) { @@ -190,11 +206,10 @@ class MediaController extends AbstractAdminController /** * @param ServerRequestInterface $request - * @param DatatablesService $datatables_service * * @return ResponseInterface */ - public function data(ServerRequestInterface $request, DatatablesService $datatables_service): ResponseInterface + public function data(ServerRequestInterface $request): ResponseInterface { $files = $request->getQueryParams()['files']; // local|external|unused $search = $request->getQueryParams()['search']; @@ -235,7 +250,7 @@ class MediaController extends AbstractAdminController $query->where(new Expression('setting_value || multimedia_file_refn'), 'NOT LIKE', $media_folder . '%/%'); } - return $datatables_service->handle($request, $query, $search_columns, $sort_columns, function (stdClass $row): array { + return $this->datatables_service->handle($request, $query, $search_columns, $sort_columns, function (stdClass $row): array { /** @var Media $media */ $media = Media::rowMapper()($row); @@ -269,7 +284,7 @@ class MediaController extends AbstractAdminController }) ->select(['media.*', 'multimedia_file_refn', 'descriptive_title']); - return $datatables_service->handle($request, $query, $search_columns, $sort_columns, function (stdClass $row): array { + return $this->datatables_service->handle($request, $query, $search_columns, $sort_columns, function (stdClass $row): array { /** @var Media $media */ $media = Media::rowMapper()($row); @@ -484,9 +499,11 @@ class MediaController extends AbstractAdminController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function upload(): ResponseInterface + public function upload(ServerRequestInterface $request): ResponseInterface { $media_folders = $this->allMediaFolders(); @@ -507,11 +524,10 @@ class MediaController extends AbstractAdminController /** * @param ServerRequestInterface $request - * @param FilesystemInterface $filesystem * * @return ResponseInterface */ - public function uploadAction(ServerRequestInterface $request, FilesystemInterface $filesystem): ResponseInterface + public function uploadAction(ServerRequestInterface $request): ResponseInterface { $all_folders = $this->allMediaFolders(); @@ -556,14 +572,14 @@ class MediaController extends AbstractAdminController $path = $folder . $filename; - if ($filesystem->has($path)) { + if ($this->filesystem->has($path)) { FlashMessages::addMessage(I18N::translate('The file %s already exists. Use another filename.', $path, 'error')); continue; } // Now copy the file to the correct location. try { - $filesystem->writeStream($path, $uploaded_file->getStream()->detach()); + $this->filesystem->writeStream($path, $uploaded_file->getStream()->detach()); FlashMessages::addMessage(I18N::translate('The file %s has been uploaded.', Html::filename($path)), 'success'); Log::addMediaLog('Media file ' . $path . ' uploaded'); } catch (Throwable $ex) { diff --git a/app/Http/Controllers/Admin/ModuleController.php b/app/Http/Controllers/Admin/ModuleController.php index 5301a16457..311f7d366f 100644 --- a/app/Http/Controllers/Admin/ModuleController.php +++ b/app/Http/Controllers/Admin/ModuleController.php @@ -78,9 +78,11 @@ class ModuleController extends AbstractAdminController /** * Show the administrator a list of modules. * + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function list(): ResponseInterface + public function list(ServerRequestInterface $request): ResponseInterface { return $this->viewResponse('admin/modules', [ 'title' => I18N::translate('All modules'), @@ -90,9 +92,11 @@ class ModuleController extends AbstractAdminController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function listAnalytics(): ResponseInterface + public function listAnalytics(ServerRequestInterface $request): ResponseInterface { return $this->listComponents( ModuleAnalyticsInterface::class, @@ -102,9 +106,11 @@ class ModuleController extends AbstractAdminController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function listBlocks(): ResponseInterface + public function listBlocks(ServerRequestInterface $request): ResponseInterface { return $this->listComponents( ModuleBlockInterface::class, @@ -114,9 +120,11 @@ class ModuleController extends AbstractAdminController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function listCharts(): ResponseInterface + public function listCharts(ServerRequestInterface $request): ResponseInterface { return $this->listComponents( ModuleChartInterface::class, @@ -126,9 +134,11 @@ class ModuleController extends AbstractAdminController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function listFooters(): ResponseInterface + public function listFooters(ServerRequestInterface $request): ResponseInterface { return $this->listComponents( ModuleFooterInterface::class, @@ -138,9 +148,11 @@ class ModuleController extends AbstractAdminController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function listHistory(): ResponseInterface + public function listHistory(ServerRequestInterface $request): ResponseInterface { return $this->listComponents( ModuleHistoricEventsInterface::class, @@ -150,9 +162,11 @@ class ModuleController extends AbstractAdminController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function listLanguages(): ResponseInterface + public function listLanguages(ServerRequestInterface $request): ResponseInterface { return $this->listComponents( ModuleLanguageInterface::class, @@ -162,9 +176,11 @@ class ModuleController extends AbstractAdminController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function listLists(): ResponseInterface + public function listLists(ServerRequestInterface $request): ResponseInterface { return $this->listComponents( ModuleListInterface::class, @@ -174,9 +190,11 @@ class ModuleController extends AbstractAdminController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function listMenus(): ResponseInterface + public function listMenus(ServerRequestInterface $request): ResponseInterface { return $this->listComponents( ModuleMenuInterface::class, @@ -186,9 +204,11 @@ class ModuleController extends AbstractAdminController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function listReports(): ResponseInterface + public function listReports(ServerRequestInterface $request): ResponseInterface { return $this->listComponents( ModuleReportInterface::class, @@ -198,9 +218,11 @@ class ModuleController extends AbstractAdminController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function listSidebars(): ResponseInterface + public function listSidebars(ServerRequestInterface $request): ResponseInterface { return $this->listComponents( ModuleSidebarInterface::class, @@ -210,9 +232,11 @@ class ModuleController extends AbstractAdminController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function listTabs(): ResponseInterface + public function listTabs(ServerRequestInterface $request): ResponseInterface { return $this->listComponents( ModuleTabInterface::class, @@ -222,9 +246,11 @@ class ModuleController extends AbstractAdminController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function listThemes(): ResponseInterface + public function listThemes(ServerRequestInterface $request): ResponseInterface { return $this->listComponents( ModuleThemeInterface::class, diff --git a/app/Http/Controllers/Admin/UpgradeController.php b/app/Http/Controllers/Admin/UpgradeController.php index 6e9b5c09b2..bab3366239 100644 --- a/app/Http/Controllers/Admin/UpgradeController.php +++ b/app/Http/Controllers/Admin/UpgradeController.php @@ -153,12 +153,12 @@ class UpgradeController extends AbstractAdminController * Perform one step of the wizard * * @param ServerRequestInterface $request - * @param Tree|null $tree * * @return ResponseInterface */ - public function step(ServerRequestInterface $request, ?Tree $tree): ResponseInterface + public function step(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $step = $request->getQueryParams()['step'] ?? self::STEP_CHECK; switch ($step) { diff --git a/app/Http/Controllers/Admin/UsersController.php b/app/Http/Controllers/Admin/UsersController.php index 285d09cce4..32d55c4b29 100644 --- a/app/Http/Controllers/Admin/UsersController.php +++ b/app/Http/Controllers/Admin/UsersController.php @@ -40,6 +40,8 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use stdClass; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use function e; +use function route; /** * Controller for user administration. @@ -48,33 +50,32 @@ class UsersController extends AbstractAdminController { private const SECONDS_PER_DAY = 24 * 60 * 60; - /** - * @var MailService - */ + /** @var DatatablesService */ + private $datatables_service; + + /** @var MailService */ private $mail_service; - /** - * @var ModuleService - */ + /** @var ModuleService */ private $module_service; - /** - * @var UserService - */ + /** @var UserService */ private $user_service; /** * UsersController constructor. * - * @param MailService $mail_service - * @param ModuleService $module_service - * @param UserService $user_service + * @param DatatablesService $datatables_service + * @param MailService $mail_service + * @param ModuleService $module_service + * @param UserService $user_service */ - public function __construct(MailService $mail_service, ModuleService $module_service, UserService $user_service) + public function __construct(DatatablesService $datatables_service, MailService $mail_service, ModuleService $module_service, UserService $user_service) { - $this->mail_service = $mail_service; - $this->module_service = $module_service; - $this->user_service = $user_service; + $this->datatables_service = $datatables_service; + $this->mail_service = $mail_service; + $this->module_service = $module_service; + $this->user_service = $user_service; } /** @@ -147,12 +148,13 @@ class UsersController extends AbstractAdminController /** * @param ServerRequestInterface $request - * @param UserInterface $user * * @return ResponseInterface */ - public function index(ServerRequestInterface $request, UserInterface $user): ResponseInterface + public function index(ServerRequestInterface $request): ResponseInterface { + $user = $request->getAttribute('user'); + $filter = $request->getQueryParams()['filter'] ?? ''; $all_users = $this->user_service->all(); @@ -170,14 +172,14 @@ class UsersController extends AbstractAdminController } /** - * @param DatatablesService $datatables_service * @param ServerRequestInterface $request - * @param UserInterface $user * * @return ResponseInterface */ - public function data(DatatablesService $datatables_service, ServerRequestInterface $request, UserInterface $user): ResponseInterface + public function data(ServerRequestInterface $request): ResponseInterface { + $user = $request->getAttribute('user'); + $installed_languages = []; foreach (I18N::installedLocales() as $installed_locale) { $installed_languages[$installed_locale->languageTag()] = $installed_locale->endonym(); @@ -230,18 +232,14 @@ class UsersController extends AbstractAdminController $callback = static function (stdClass $row) use ($installed_languages, $user): array { if ($row->user_id !== $user->id()) { - $admin_options = '' . ''; + $admin_options = '' . ''; } else { // Do not delete ourself! $admin_options = ''; } // Link to send email to other users. - if ($row->user_id != $user->id()) { - $row->email = '' . e($row->email) . ''; - } else { - $row->email = e($row->email); - } + $row->email = '' . e($row->email) . ''; $datum = [ '', @@ -266,7 +264,7 @@ class UsersController extends AbstractAdminController return $datum; }; - return $datatables_service->handle($request, $query, $search_columns, $sort_columns, $callback); + return $this->datatables_service->handle($request, $query, $search_columns, $sort_columns, $callback); } /** @@ -366,12 +364,13 @@ class UsersController extends AbstractAdminController /** * @param ServerRequestInterface $request - * @param UserInterface $user * * @return ResponseInterface */ - public function update(ServerRequestInterface $request, UserInterface $user): ResponseInterface + public function update(ServerRequestInterface $request): ResponseInterface { + $user = $request->getAttribute('user'); + $user_id = (int) $request->getParsedBody()['user_id']; $username = $request->getParsedBody()['username']; $real_name = $request->getParsedBody()['real_name']; diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 6c830f251b..f6c2f02e54 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -47,12 +47,12 @@ class AdminController extends AbstractBaseController * Merge two genealogy records. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function mergeRecords(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function mergeRecords(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $title = I18N::translate('Merge records') . ' — ' . e($tree->title()); $params = $request->getQueryParams(); @@ -136,12 +136,12 @@ class AdminController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function mergeRecordsAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function mergeRecordsAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref1 = $request->getQueryParams()['xref1']; $xref2 = $request->getQueryParams()['xref2']; $keep1 = $request->getParsedBody()['keep1'] ?? []; @@ -257,12 +257,13 @@ class AdminController extends AbstractBaseController } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function treePrivacyEdit(Tree $tree): ResponseInterface + public function treePrivacyEdit(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $title = e($tree->name()) . ' — ' . I18N::translate('Privacy'); $all_tags = $this->tagsForPrivacy($tree); $privacy_constants = $this->privacyConstants(); @@ -279,12 +280,12 @@ class AdminController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function treePrivacyUpdate(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function treePrivacyUpdate(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $delete_default_resn_id = $params['delete'] ?? []; diff --git a/app/Http/Controllers/AdminSiteController.php b/app/Http/Controllers/AdminSiteController.php index b8f8d6a235..8c47879119 100644 --- a/app/Http/Controllers/AdminSiteController.php +++ b/app/Http/Controllers/AdminSiteController.php @@ -48,37 +48,47 @@ class AdminSiteController extends AbstractBaseController /** @var string */ protected $layout = 'layouts/administration'; - /** - * @var ModuleService - */ + /** @var DatatablesService */ + private $datatables_service; + + /** @var FilesystemInterface */ + private $filesystem; + + /** @var MailService */ + private $mail_service; + + /** @var ModuleService */ private $module_service; - /** - * @var UserService - */ + /** @var UserService */ private $user_service; /** * AdminSiteController constructor. * - * @param ModuleService $module_service - * @param UserService $user_service + * @param DatatablesService $datatables_service + * @param FilesystemInterface $filesystem + * @param MailService $mail_service + * @param ModuleService $module_service + * @param UserService $user_service */ - public function __construct(ModuleService $module_service, UserService $user_service) + public function __construct(DatatablesService $datatables_service, FilesystemInterface $filesystem, MailService $mail_service, ModuleService $module_service, UserService $user_service) { - $this->module_service = $module_service; - $this->user_service = $user_service; + $this->mail_service = $mail_service; + $this->datatables_service = $datatables_service; + $this->filesystem = $filesystem; + $this->module_service = $module_service; + $this->user_service = $user_service; } /** * Show old user files in the data folder. * * @param ServerRequestInterface $request - * @param FilesystemInterface $filesystem * * @return ResponseInterface */ - public function cleanData(ServerRequestInterface $request, FilesystemInterface $filesystem): ResponseInterface + public function cleanData(ServerRequestInterface $request): ResponseInterface { $protected = [ '.htaccess', @@ -102,7 +112,7 @@ class AdminSiteController extends AbstractBaseController // List the top-level contents of the data folder $entries = array_map(static function (array $content) { return $content['path']; - }, $filesystem->listContents()); + }, $this->filesystem->listContents()); return $this->viewResponse('admin/clean-data', [ 'title' => I18N::translate('Clean up data folder'), @@ -115,17 +125,16 @@ class AdminSiteController extends AbstractBaseController * Delete old user files in the data folder. * * @param ServerRequestInterface $request - * @param FilesystemInterface $filesystem * * @return ResponseInterface */ - public function cleanDataAction(ServerRequestInterface $request, FilesystemInterface $filesystem): ResponseInterface + public function cleanDataAction(ServerRequestInterface $request): ResponseInterface { $to_delete = $request->getParsedBody()['to_delete'] ?? []; $to_delete = array_filter($to_delete); foreach ($to_delete as $path) { - $metadata = $filesystem->getMetadata($path); + $metadata = $this->filesystem->getMetadata($path); if ($metadata === false) { // Already deleted? @@ -134,7 +143,7 @@ class AdminSiteController extends AbstractBaseController if ($metadata['type'] === 'dir') { try { - $filesystem->deleteDir($path); + $this->filesystem->deleteDir($path); FlashMessages::addMessage(I18N::translate('The folder %s has been deleted.', e($path)), 'success'); } catch (Exception $ex) { @@ -144,7 +153,7 @@ class AdminSiteController extends AbstractBaseController if ($metadata['type'] === 'file') { try { - $filesystem->delete($path); + $this->filesystem->delete($path); FlashMessages::addMessage(I18N::translate('The file %s has been deleted.', e($path)), 'success'); } catch (Exception $ex) { @@ -213,15 +222,14 @@ class AdminSiteController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param DatatablesService $datatables_service * * @return ResponseInterface */ - public function logsData(ServerRequestInterface $request, DatatablesService $datatables_service): ResponseInterface + public function logsData(ServerRequestInterface $request): ResponseInterface { $query = $this->logsQuery($request->getQueryParams()); - return $datatables_service->handle($request, $query, [], [], static function (stdClass $row): array { + return $this->datatables_service->handle($request, $query, [], [], static function (stdClass $row): array { return [ $row->log_id, Carbon::make($row->log_time)->local()->format('Y-m-d H:i:s'), @@ -329,22 +337,22 @@ class AdminSiteController extends AbstractBaseController } /** - * @param MailService $mail_service + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function mailForm(MailService $mail_service): ResponseInterface + public function mailForm(ServerRequestInterface $request): ResponseInterface { - $mail_ssl_options = $mail_service->mailSslOptions(); - $mail_transport_options = $mail_service->mailTransportOptions(); + $mail_ssl_options = $this->mail_service->mailSslOptions(); + $mail_transport_options = $this->mail_service->mailTransportOptions(); $title = I18N::translate('Sending email'); $SMTP_ACTIVE = Site::getPreference('SMTP_ACTIVE'); $SMTP_AUTH = Site::getPreference('SMTP_AUTH'); $SMTP_AUTH_USER = Site::getPreference('SMTP_AUTH_USER'); - $SMTP_FROM_NAME = $mail_service->senderEmail(); - $SMTP_HELO = $mail_service->localDomain(); + $SMTP_FROM_NAME = $this->mail_service->senderEmail(); + $SMTP_HELO = $this->mail_service->localDomain(); $SMTP_HOST = Site::getPreference('SMTP_HOST'); $SMTP_PORT = Site::getPreference('SMTP_PORT'); $SMTP_SSL = Site::getPreference('SMTP_SSL'); @@ -352,7 +360,7 @@ class AdminSiteController extends AbstractBaseController $DKIM_SELECTOR = Site::getPreference('DKIM_SELECTOR'); $DKIM_KEY = Site::getPreference('DKIM_KEY'); - $smtp_from_name_valid = $mail_service->isValidEmail($SMTP_FROM_NAME); + $smtp_from_name_valid = $this->mail_service->isValidEmail($SMTP_FROM_NAME); $smtp_helo_valid = filter_var($SMTP_HELO, FILTER_VALIDATE_DOMAIN); return $this->viewResponse('admin/site-mail', [ @@ -407,9 +415,11 @@ class AdminSiteController extends AbstractBaseController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function preferencesForm(): ResponseInterface + public function preferencesForm(ServerRequestInterface $request): ResponseInterface { $all_themes = $this->themeOptions(); @@ -462,9 +472,11 @@ class AdminSiteController extends AbstractBaseController } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function registrationForm(): ResponseInterface + public function registrationForm(ServerRequestInterface $request): ResponseInterface { $title = I18N::translate('Sign-in and registration'); @@ -515,9 +527,11 @@ class AdminSiteController extends AbstractBaseController /** * Show the server information page. * + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function serverInformation(): ResponseInterface + public function serverInformation(ServerRequestInterface $request): ResponseInterface { ob_start(); phpinfo(INFO_ALL & ~INFO_CREDITS & ~INFO_LICENSE); diff --git a/app/Http/Controllers/AdminTreesController.php b/app/Http/Controllers/AdminTreesController.php index b248a70dfc..4e4c57c78c 100644 --- a/app/Http/Controllers/AdminTreesController.php +++ b/app/Http/Controllers/AdminTreesController.php @@ -77,35 +77,38 @@ class AdminTreesController extends AbstractBaseController /** @var string */ protected $layout = 'layouts/administration'; - /** - * @var ModuleService - */ + /** @var ModuleService */ private $module_service; - /** - * @var UserService - */ + /** @var TimeoutService */ + private $timeout_service; + + /** @var UserService */ private $user_service; /** * AdminTreesController constructor. * - * @param ModuleService $module_service - * @param UserService $user_service + * @param ModuleService $module_service + * @param TimeoutService $timeout_service + * @param UserService $user_service */ - public function __construct(ModuleService $module_service, UserService $user_service) + public function __construct(ModuleService $module_service, TimeoutService $timeout_service, UserService $user_service) { - $this->module_service = $module_service; - $this->user_service = $user_service; + $this->module_service = $module_service; + $this->timeout_service = $timeout_service; + $this->user_service = $user_service; } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function check(Tree $tree): ResponseInterface + public function check(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + // We need to work with raw GEDCOM data, as we are looking for errors // which may prevent the GedcomRecord objects from working. @@ -386,12 +389,14 @@ class AdminTreesController extends AbstractBaseController } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function delete(Tree $tree): ResponseInterface + public function delete(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + /* I18N: %s is the name of a family tree */ FlashMessages::addMessage(I18N::translate('The family tree “%s” has been deleted.', e($tree->title())), 'success'); @@ -403,15 +408,15 @@ class AdminTreesController extends AbstractBaseController } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function duplicates(Tree $tree): ResponseInterface + public function duplicates(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $duplicates = $this->duplicateRecords($tree); - - $title = I18N::translate('Find duplicates') . ' — ' . e($tree->title()); + $title = I18N::translate('Find duplicates') . ' — ' . e($tree->title()); return $this->viewResponse('admin/trees-duplicates', [ 'duplicates' => $duplicates, @@ -421,12 +426,13 @@ class AdminTreesController extends AbstractBaseController } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function export(Tree $tree): ResponseInterface + public function export(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $title = I18N::translate('Export a GEDCOM file') . ' — ' . e($tree->title()); return $this->viewResponse('admin/trees-export', [ @@ -437,12 +443,12 @@ class AdminTreesController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function exportClient(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function exportClient(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $convert = (bool) ($params['convert'] ?? false); $zip = (bool) ($params['zip'] ?? false); @@ -542,12 +548,13 @@ class AdminTreesController extends AbstractBaseController } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function exportServer(Tree $tree): ResponseInterface + public function exportServer(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $filename = WT_DATA_DIR . $tree->name(); // Force a ".ged" suffix @@ -580,12 +587,12 @@ class AdminTreesController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function importAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function importAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $source = $params['source']; $keep_media = (bool) ($params['keep_media'] ?? false); @@ -628,12 +635,13 @@ class AdminTreesController extends AbstractBaseController } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function importForm(Tree $tree): ResponseInterface + public function importForm(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $default_gedcom_file = $tree->getPreference('gedcom_filename'); $gedcom_media_path = $tree->getPreference('GEDCOM_MEDIA_PATH'); $gedcom_files = $this->gedcomFiles(WT_DATA_DIR); @@ -650,12 +658,14 @@ class AdminTreesController extends AbstractBaseController } /** - * @param Tree|null $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function index(Tree $tree = null): ResponseInterface + public function index(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $multiple_tree_threshold = (int) Site::getPreference('MULTIPLE_TREE_THRESHOLD', self::MULTIPLE_TREE_THRESHOLD); $gedcom_files = $this->gedcomFiles(WT_DATA_DIR); @@ -928,12 +938,12 @@ class AdminTreesController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function places(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function places(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $search = $params['search'] ?? ''; $replace = $params['replace'] ?? ''; @@ -957,12 +967,12 @@ class AdminTreesController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function placesAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function placesAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $search = $params['search'] ?? ''; $replace = $params['replace'] ?? ''; @@ -987,12 +997,13 @@ class AdminTreesController extends AbstractBaseController } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function preferences(Tree $tree): ResponseInterface + public function preferences(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $french_calendar_start = new Date('22 SEP 1792'); $french_calendar_end = new Date('31 DEC 1805'); $gregorian_calendar_start = new Date('15 OCT 1582'); @@ -1114,12 +1125,13 @@ class AdminTreesController extends AbstractBaseController } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function renumber(Tree $tree): ResponseInterface + public function renumber(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xrefs = $this->duplicateXrefs($tree); /* I18N: Renumber the records in a family tree */ @@ -1133,12 +1145,12 @@ class AdminTreesController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function preferencesUpdate(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function preferencesUpdate(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $all_trees = $request->getParsedBody()['all_trees'] ?? ''; if ($all_trees === '1') { @@ -1240,13 +1252,13 @@ class AdminTreesController extends AbstractBaseController } /** - * @param Tree $tree - * @param TimeoutService $timeout_service + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function renumberAction(Tree $tree, TimeoutService $timeout_service): ResponseInterface + public function renumberAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xrefs = $this->duplicateXrefs($tree); foreach ($xrefs as $old_xref => $type) { @@ -1724,7 +1736,7 @@ class AdminTreesController extends AbstractBaseController unset($xrefs[$old_xref]); // How much time do we have left? - if ($timeout_service->isTimeNearlyUp()) { + if ($this->timeout_service->isTimeNearlyUp()) { FlashMessages::addMessage(I18N::translate('The server’s time limit has been reached.'), 'warning'); break; } @@ -1736,12 +1748,13 @@ class AdminTreesController extends AbstractBaseController } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function setDefault(Tree $tree): ResponseInterface + public function setDefault(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); Site::setPreference('DEFAULT_GEDCOM', $tree->name()); /* I18N: %s is the name of a family tree */ @@ -1753,13 +1766,14 @@ class AdminTreesController extends AbstractBaseController } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function synchronize(Tree $tree): ResponseInterface + public function synchronize(ServerRequestInterface $request): ResponseInterface { - $url = route('admin-trees', ['ged' => $tree->name()]); + $tree = $request->getAttribute('tree'); + $url = route('admin-trees', ['ged' => $tree->name()]); $gedcom_files = $this->gedcomFiles(WT_DATA_DIR); @@ -1790,13 +1804,13 @@ class AdminTreesController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function unconnected(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function unconnected(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $associates = (bool) ($request->getQueryParams()['associates'] ?? false); if ($associates) { diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index a734b381c7..434947c9f8 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -28,7 +28,6 @@ use Fisharebest\Webtrees\Services\UpgradeService; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Session; use Fisharebest\Webtrees\Site; -use Fisharebest\Webtrees\Tree; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -38,31 +37,35 @@ use Psr\Http\Message\ServerRequestInterface; */ class LoginController extends AbstractBaseController { - /** - * @var UserService - */ + /** @var UpgradeService */ + private $upgrade_service; + + /** @var UserService */ private $user_service; /** * LoginController constructor. * - * @param UserService $user_service + * @param UpgradeService $upgrade_service + * @param UserService $user_service */ - public function __construct(UserService $user_service) + public function __construct(UpgradeService $upgrade_service, UserService $user_service) { - $this->user_service = $user_service; + $this->upgrade_service = $upgrade_service; + $this->user_service = $user_service; } /** * Show a login page. * * @param ServerRequestInterface $request - * @param Tree|null $tree * * @return ResponseInterface */ - public function loginPage(ServerRequestInterface $request, ?Tree $tree): ResponseInterface + public function loginPage(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + // Already logged in? if (Auth::check()) { $ged = $tree !== null ? $tree->name() : ''; @@ -112,11 +115,10 @@ class LoginController extends AbstractBaseController * Perform a login. * * @param ServerRequestInterface $request - * @param UpgradeService $upgrade_service * * @return ResponseInterface */ - public function loginAction(ServerRequestInterface $request, UpgradeService $upgrade_service): ResponseInterface + public function loginAction(ServerRequestInterface $request): ResponseInterface { $username = $request->getParsedBody()['username'] ?? ''; $password = $request->getParsedBody()['password'] ?? ''; @@ -125,8 +127,8 @@ class LoginController extends AbstractBaseController try { $this->doLogin($username, $password); - if (Auth::isAdmin() && $upgrade_service->isUpgradeAvailable()) { - FlashMessages::addMessage(I18N::translate('A new version of webtrees is available.') . ' ' . I18N::translate('Upgrade to webtrees %s.', '' . $upgrade_service->latestVersion() . '') . ''); + if (Auth::isAdmin() && $this->upgrade_service->isUpgradeAvailable()) { + FlashMessages::addMessage(I18N::translate('A new version of webtrees is available.') . ' ' . I18N::translate('Upgrade to webtrees %s.', '' . $this->upgrade_service->latestVersion() . '') . ''); } // If there was no referring page, redirect to "my page". @@ -202,12 +204,14 @@ class LoginController extends AbstractBaseController /** * Perform a logout. * - * @param Tree|null $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function logoutAction(Tree $tree = null): ResponseInterface + public function logoutAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + if (Auth::check()) { Log::addAuthenticationLog('Logout: ' . Auth::user()->userName() . '/' . Auth::user()->realName()); Auth::logout(); diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 19fa6c0971..a122d598cd 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -96,12 +96,13 @@ class RegisterController extends AbstractBaseController * Perform a registration. * * @param ServerRequestInterface $request - * @param Tree|null $tree * * @return ResponseInterface */ - public function registerAction(ServerRequestInterface $request, ?Tree $tree): ResponseInterface + public function registerAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $this->checkRegistrationAllowed(); $comments = $request->getParsedBody()['comments'] ?? ''; @@ -231,9 +232,11 @@ class RegisterController extends AbstractBaseController /** * Show an email verification page. * + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function verifyPage(): ResponseInterface + public function verifyPage(ServerRequestInterface $request): ResponseInterface { $this->checkRegistrationAllowed(); @@ -247,9 +250,11 @@ class RegisterController extends AbstractBaseController /** * Perform a registration. * + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function verifyAction(): ResponseInterface + public function verifyAction(ServerRequestInterface $request): ResponseInterface { $this->checkRegistrationAllowed(); diff --git a/app/Http/Controllers/Auth/VerifyEmailController.php b/app/Http/Controllers/Auth/VerifyEmailController.php index 9502f8c22f..8c25dd5680 100644 --- a/app/Http/Controllers/Auth/VerifyEmailController.php +++ b/app/Http/Controllers/Auth/VerifyEmailController.php @@ -38,36 +38,41 @@ class VerifyEmailController extends AbstractBaseController * @var MailService */ private $mail_service; + /** + * @var UserService + */ + private $user_service; /** * MessageController constructor. * * @param MailService $mail_service + * @param UserService $user_service */ - public function __construct(MailService $mail_service) + public function __construct(MailService $mail_service, UserService $user_service) { $this->mail_service = $mail_service; + $this->user_service = $user_service; } /** * Respond to a verification link that was emailed to a user. * * @param ServerRequestInterface $request - * @param UserService $user_service * * @return ResponseInterface */ - public function verify(ServerRequestInterface $request, UserService $user_service): ResponseInterface + public function verify(ServerRequestInterface $request): ResponseInterface { $username = $request->getQueryParams()['username'] ?? ''; $token = $request->getQueryParams()['token'] ?? ''; $title = I18N::translate('User verification'); - $user = $user_service->findByUserName($username); + $user = $this->user_service->findByUserName($username); if ($user instanceof User && $user->getPreference('reg_hashcode') === $token) { - foreach ($user_service->administrators() as $administrator) { + foreach ($this->user_service->administrators() as $administrator) { // switch language to administrator settings I18N::init($administrator->getPreference('language')); diff --git a/app/Http/Controllers/AutocompleteController.php b/app/Http/Controllers/AutocompleteController.php index 73464ff482..23fb000a28 100644 --- a/app/Http/Controllers/AutocompleteController.php +++ b/app/Http/Controllers/AutocompleteController.php @@ -79,12 +79,12 @@ class AutocompleteController extends AbstractBaseController * Autocomplete for media folders. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function folder(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function folder(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $query = $request->getQueryParams()['query'] ?? ''; $media_filesystem = $tree->mediaFilesystem(); @@ -106,12 +106,12 @@ class AutocompleteController extends AbstractBaseController * Autocomplete for source citations. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function page(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function page(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $query = $request->getQueryParams()['query'] ?? ''; $xref = $request->getQueryParams()['extra'] ?? ''; @@ -180,12 +180,12 @@ class AutocompleteController extends AbstractBaseController * Autocomplete for place names. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function place(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function place(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $query = $request->getQueryParams()['query'] ?? ''; $data = []; @@ -231,12 +231,12 @@ class AutocompleteController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function select2Family(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function select2Family(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $page = (int) ($request->getParsedBody()['page'] ?? 1); $query = $request->getParsedBody()['q'] ?? ''; @@ -269,12 +269,12 @@ class AutocompleteController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function select2Individual(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function select2Individual(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $page = (int) ($request->getParsedBody()['page'] ?? 1); $query = $request->getParsedBody()['q'] ?? ''; @@ -307,12 +307,12 @@ class AutocompleteController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function select2MediaObject(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function select2MediaObject(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $page = (int) ($request->getParsedBody()['page'] ?? 1); $query = $request->getParsedBody()['q'] ?? ''; @@ -345,12 +345,12 @@ class AutocompleteController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function select2Note(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function select2Note(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $page = (int) ($request->getParsedBody()['page'] ?? 1); $query = $request->getParsedBody()['q'] ?? ''; @@ -378,12 +378,12 @@ class AutocompleteController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function select2Place(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function select2Place(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $page = (int) ($request->getParsedBody()['page'] ?? 1); $query = $request->getParsedBody()['q'] ?? ''; @@ -480,12 +480,12 @@ class AutocompleteController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function select2Repository(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function select2Repository(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $page = (int) ($request->getParsedBody()['page'] ?? 1); $query = $request->getParsedBody()['q'] ?? ''; @@ -513,12 +513,12 @@ class AutocompleteController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function select2Source(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function select2Source(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $page = (int) ($request->getParsedBody()['page'] ?? 1); $query = $request->getParsedBody()['q'] ?? ''; @@ -546,12 +546,12 @@ class AutocompleteController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function select2Submitter(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function select2Submitter(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $page = (int) ($request->getParsedBody()['page'] ?? 1); $query = $request->getParsedBody()['q'] ?? ''; diff --git a/app/Http/Controllers/BranchesController.php b/app/Http/Controllers/BranchesController.php index 7b5bb0cf31..9430d3f54a 100644 --- a/app/Http/Controllers/BranchesController.php +++ b/app/Http/Controllers/BranchesController.php @@ -18,7 +18,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\Controllers; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\GedcomCode\GedcomCodePedi; use Fisharebest\Webtrees\GedcomRecord; @@ -92,14 +91,14 @@ class BranchesController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function list(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function list(ServerRequestInterface $request): ResponseInterface { - $params = $request->getQueryParams(); + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + $params = $request->getQueryParams(); $surname = $params['surname']; $soundex_std = (bool) ($params['soundex_std'] ?? false); $soundex_dm = (bool) ($params['soundex_dm'] ?? false); diff --git a/app/Http/Controllers/CalendarController.php b/app/Http/Controllers/CalendarController.php index 3b979d52d0..3408b088d1 100644 --- a/app/Http/Controllers/CalendarController.php +++ b/app/Http/Controllers/CalendarController.php @@ -63,12 +63,12 @@ class CalendarController extends AbstractBaseController * A form to request the page parameters. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function page(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function page(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $cal = $request->getQueryParams()['cal'] ?? ''; $day = $request->getQueryParams()['day'] ?? ''; $month = $request->getQueryParams()['month'] ?? ''; @@ -158,12 +158,12 @@ class CalendarController extends AbstractBaseController * Show anniveraries that occured on a given day/month/year. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function calendar(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function calendar(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $CALENDAR_FORMAT = $tree->getPreference('CALENDAR_FORMAT'); $cal = $request->getQueryParams()['cal'] ?? ''; diff --git a/app/Http/Controllers/EditFamilyController.php b/app/Http/Controllers/EditFamilyController.php index 93d556d941..ffe480bca6 100644 --- a/app/Http/Controllers/EditFamilyController.php +++ b/app/Http/Controllers/EditFamilyController.php @@ -24,7 +24,6 @@ use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\GedcomCode\GedcomCodePedi; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -35,12 +34,12 @@ class EditFamilyController extends AbstractEditController { /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function reorderChildren(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function reorderChildren(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $family = Family::getInstance($xref, $tree); @@ -56,12 +55,12 @@ class EditFamilyController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function reorderChildrenAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function reorderChildrenAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $order = $request->getParsedBody()['order'] ?? []; $family = Family::getInstance($xref, $tree); @@ -96,12 +95,12 @@ class EditFamilyController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addChild(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addChild(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $xref = $params['xref']; $gender = $params['gender']; @@ -125,12 +124,12 @@ class EditFamilyController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addChildAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addChildAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $xref = $params['xref']; @@ -190,12 +189,12 @@ class EditFamilyController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addSpouse(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addSpouse(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $xref = $params['xref']; $famtag = $params['famtag']; @@ -225,12 +224,12 @@ class EditFamilyController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addSpouseAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addSpouseAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $xref = $params['xref']; @@ -291,12 +290,12 @@ class EditFamilyController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function changeFamilyMembers(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function changeFamilyMembers(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $family = Family::getInstance($xref, $tree); Auth::checkFamilyAccess($family, true); @@ -315,12 +314,12 @@ class EditFamilyController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function changeFamilyMembersAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function changeFamilyMembersAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $xref = $params['xref']; $family = Family::getInstance($xref, $tree); diff --git a/app/Http/Controllers/EditGedcomRecordController.php b/app/Http/Controllers/EditGedcomRecordController.php index 66ef1cd92e..324aab0a14 100644 --- a/app/Http/Controllers/EditGedcomRecordController.php +++ b/app/Http/Controllers/EditGedcomRecordController.php @@ -27,7 +27,6 @@ use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Module\CensusAssistantModule; use Fisharebest\Webtrees\Services\ClipboardService; use Fisharebest\Webtrees\Services\ModuleService; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -37,32 +36,34 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; */ class EditGedcomRecordController extends AbstractEditController { - /** - * @var ModuleService - */ + /** @var ClipboardService */ + private $clipboard_service; + + /** @var ModuleService */ private $module_service; /** * EditGedcomRecordController constructor. * - * @param ModuleService $module_service + * @param ClipboardService $clipboard_service + * @param ModuleService $module_service */ - public function __construct(ModuleService $module_service) + public function __construct(ClipboardService $clipboard_service, ModuleService $module_service) { - $this->module_service = $module_service; + $this->clipboard_service = $clipboard_service; + $this->module_service = $module_service; } /** * Copy a fact to the clipboard. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param ClipboardService $clipboard_service * * @return ResponseInterface */ - public function copyFact(ServerRequestInterface $request, Tree $tree, ClipboardService $clipboard_service): ResponseInterface + public function copyFact(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $xref = $params['xref']; $fact_id = $params['fact_id']; @@ -73,7 +74,7 @@ class EditGedcomRecordController extends AbstractEditController foreach ($record->facts() as $fact) { if ($fact->id() === $fact_id) { - $clipboard_service->copyFact($fact); + $this->clipboard_service->copyFact($fact); FlashMessages::addMessage(I18N::translate('The record has been copied to the clipboard.')); break; @@ -87,12 +88,12 @@ class EditGedcomRecordController extends AbstractEditController * Delete a fact. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function deleteFact(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function deleteFact(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $xref = $params['xref']; $fact_id = $params['fact_id']; @@ -115,12 +116,12 @@ class EditGedcomRecordController extends AbstractEditController * Delete a record. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function deleteRecord(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function deleteRecord(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getParsedBody()['xref']; $record = GedcomRecord::getInstance($xref, $tree); @@ -168,13 +169,12 @@ class EditGedcomRecordController extends AbstractEditController * Paste a fact from the clipboard into a record. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param ClipboardService $clipboard_service * * @return ResponseInterface */ - public function pasteFact(ServerRequestInterface $request, Tree $tree, ClipboardService $clipboard_service): ResponseInterface + public function pasteFact(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $xref = $params['xref']; $fact_id = $params['fact_id']; @@ -183,19 +183,19 @@ class EditGedcomRecordController extends AbstractEditController Auth::checkRecordAccess($record, true); - $clipboard_service->pasteFact($fact_id, $record); + $this->clipboard_service->pasteFact($fact_id, $record); return response(); } /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function editRawFact(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function editRawFact(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $xref = $params['xref']; $fact_id = $params['fact_id']; @@ -219,12 +219,12 @@ class EditGedcomRecordController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function editRawFactAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function editRawFactAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $xref = $params['xref']; $fact_id = $params['fact_id']; @@ -250,12 +250,12 @@ class EditGedcomRecordController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function editRawRecord(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function editRawRecord(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $record = GedcomRecord::getInstance($xref, $tree); @@ -271,12 +271,12 @@ class EditGedcomRecordController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function editRawRecordAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function editRawRecordAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $xref = $params['xref']; $facts = $params['fact'] ?? []; @@ -309,12 +309,12 @@ class EditGedcomRecordController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addFact(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addFact(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $fact = $request->getQueryParams()['fact']; @@ -333,12 +333,12 @@ class EditGedcomRecordController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function editFact(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function editFact(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $fact_id = $request->getQueryParams()['fact_id']; @@ -372,12 +372,12 @@ class EditGedcomRecordController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function updateFact(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function updateFact(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $fact_id = $request->getQueryParams()['fact_id'] ?? ''; diff --git a/app/Http/Controllers/EditIndividualController.php b/app/Http/Controllers/EditIndividualController.php index 17dcebd96e..3f17cfef9a 100644 --- a/app/Http/Controllers/EditIndividualController.php +++ b/app/Http/Controllers/EditIndividualController.php @@ -22,7 +22,6 @@ use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\GedcomCode\GedcomCodePedi; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -34,12 +33,12 @@ class EditIndividualController extends AbstractEditController { /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function reorderMedia(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function reorderMedia(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -55,12 +54,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function reorderMediaAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function reorderMediaAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $order = $request->getParsedBody()['order'] ?? []; $individual = Individual::getInstance($xref, $tree); @@ -95,12 +94,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function reorderNames(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function reorderNames(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -116,12 +115,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function reorderNamesAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function reorderNamesAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $order = $request->getParsedBody()['order'] ?? []; $individual = Individual::getInstance($xref, $tree); @@ -156,12 +155,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function reorderSpouses(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function reorderSpouses(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -177,12 +176,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function reorderSpousesAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function reorderSpousesAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $order = $request->getParsedBody()['order'] ?? []; $individual = Individual::getInstance($xref, $tree); @@ -219,12 +218,12 @@ class EditIndividualController extends AbstractEditController * Add a child to an existing individual (creating a one-parent family). * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addChild(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addChild(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -246,12 +245,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addChildAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addChildAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $xref = $params['xref']; @@ -311,12 +310,12 @@ class EditIndividualController extends AbstractEditController * Add a parent to an existing individual (creating a one-parent family). * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addParent(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addParent(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $xref = $params['xref']; $gender = $params['gender']; @@ -347,12 +346,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addParentAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addParentAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $xref = $params['xref']; @@ -410,12 +409,12 @@ class EditIndividualController extends AbstractEditController * Add a spouse to an existing individual (creating a new family). * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addSpouse(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addSpouse(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -446,12 +445,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addSpouseAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addSpouseAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $xref = $params['xref']; @@ -515,12 +514,14 @@ class EditIndividualController extends AbstractEditController /** * Add an unlinked individual * - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function addUnlinked(Tree $tree): ResponseInterface + public function addUnlinked(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + return $this->viewResponse('edit/new-individual', [ 'tree' => $tree, 'title' => I18N::translate('Create an individual'), @@ -535,12 +536,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addUnlinkedAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addUnlinkedAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $this->glevels = $params['glevels'] ?? []; $this->tag = $params['tag'] ?? []; @@ -575,12 +576,12 @@ class EditIndividualController extends AbstractEditController * Edit a name record. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function editName(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function editName(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $fact_id = $params['fact_id']; $xref = $params['xref']; @@ -610,12 +611,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function editNameAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function editNameAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getParsedBody()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -630,12 +631,12 @@ class EditIndividualController extends AbstractEditController * Add a new name record. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addName(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addName(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -658,12 +659,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addNameAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addNameAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getParsedBody()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -677,12 +678,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function linkChildToFamily(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function linkChildToFamily(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -699,12 +700,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function linkChildToFamilyAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function linkChildToFamilyAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $params = $request->getParsedBody(); $famid = $params['famid']; @@ -746,12 +747,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function linkSpouseToIndividual(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function linkSpouseToIndividual(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -775,12 +776,12 @@ class EditIndividualController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function linkSpouseToIndividualAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function linkSpouseToIndividualAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $spouse = $request->getParsedBody()['spid']; diff --git a/app/Http/Controllers/EditMediaController.php b/app/Http/Controllers/EditMediaController.php index 2e6f98c915..30524395c2 100644 --- a/app/Http/Controllers/EditMediaController.php +++ b/app/Http/Controllers/EditMediaController.php @@ -62,12 +62,12 @@ class EditMediaController extends AbstractEditController * Add a media file to an existing media object. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addMediaFile(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addMediaFile(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $media = Media::getInstance($xref, $tree); @@ -92,12 +92,12 @@ class EditMediaController extends AbstractEditController * Add a media file to an existing media object. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function addMediaFileAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function addMediaFileAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $media = Media::getInstance($xref, $tree); $title = $request->getParsedBody()['title']; @@ -111,7 +111,7 @@ class EditMediaController extends AbstractEditController return redirect(route('tree-page', ['ged' => $tree->name()])); } - $file = $this->uploadFile($request, $tree); + $file = $this->uploadFile($request); if ($file === '') { FlashMessages::addMessage(I18N::translate('There was an error uploading your file.')); @@ -139,12 +139,12 @@ class EditMediaController extends AbstractEditController * Edit an existing media file. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function editMediaFile(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function editMediaFile(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $xref = $params['xref']; $fact_id = $params['fact_id']; @@ -178,12 +178,12 @@ class EditMediaController extends AbstractEditController * Save an edited media file. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function editMediaFileAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function editMediaFileAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $fact_id = $request->getQueryParams()['fact_id']; $folder = $request->getParsedBody()['folder']; @@ -270,12 +270,14 @@ class EditMediaController extends AbstractEditController /** * Show a form to create a new media object. * - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function createMediaObject(Tree $tree): ResponseInterface + public function createMediaObject(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + return response(view('modals/create-media-object', [ 'max_upload_size' => $this->maxUploadFilesize(), 'media_types' => $this->mediaTypes(), @@ -285,12 +287,12 @@ class EditMediaController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function createMediaObjectFromFileAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function createMediaObjectFromFileAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $file = $params['file']; $type = $params['type']; @@ -328,12 +330,12 @@ class EditMediaController extends AbstractEditController * Process a form to create a new media object. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function createMediaObjectAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function createMediaObjectAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $note = $params['media-note']; $title = $params['title']; @@ -352,7 +354,7 @@ class EditMediaController extends AbstractEditController "\n", ], "\n1 CONT ", $note); - $file = $this->uploadFile($request, $tree); + $file = $this->uploadFile($request); if ($file === '') { return response(['error_message' => I18N::translate('There was an error uploading your file.')], 406); @@ -392,12 +394,12 @@ class EditMediaController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function linkMediaToIndividual(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function linkMediaToIndividual(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $media = Media::getInstance($xref, $tree); @@ -410,12 +412,12 @@ class EditMediaController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function linkMediaToFamily(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function linkMediaToFamily(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $media = Media::getInstance($xref, $tree); @@ -428,12 +430,12 @@ class EditMediaController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function linkMediaToSource(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function linkMediaToSource(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $media = Media::getInstance($xref, $tree); @@ -446,12 +448,12 @@ class EditMediaController extends AbstractEditController /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function linkMediaToRecordAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function linkMediaToRecordAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $xref = $params['xref']; $link = $params['link']; @@ -526,12 +528,12 @@ class EditMediaController extends AbstractEditController * or to create a media object. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return string The value to be stored in the 'FILE' field of the media object. */ - private function uploadFile(ServerRequestInterface $request, Tree $tree): string + private function uploadFile(ServerRequestInterface $request): string { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $file_location = $params['file_location']; diff --git a/app/Http/Controllers/EditNoteController.php b/app/Http/Controllers/EditNoteController.php index d3fcfae1be..fa5077ffcb 100644 --- a/app/Http/Controllers/EditNoteController.php +++ b/app/Http/Controllers/EditNoteController.php @@ -20,7 +20,6 @@ namespace Fisharebest\Webtrees\Http\Controllers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Note; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -32,9 +31,11 @@ class EditNoteController extends AbstractEditController /** * Show a form to create a new note object. * + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function createNoteObject(): ResponseInterface + public function createNoteObject(ServerRequestInterface $request): ResponseInterface { return response(view('modals/create-note-object')); } @@ -43,12 +44,12 @@ class EditNoteController extends AbstractEditController * Show a form to create a new note object. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function editNoteObject(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function editNoteObject(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $note = Note::getInstance($xref, $tree); @@ -66,12 +67,12 @@ class EditNoteController extends AbstractEditController * Show a form to create a new note object. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function updateNoteObject(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function updateNoteObject(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $note = Note::getInstance($xref, $tree); @@ -104,12 +105,12 @@ class EditNoteController extends AbstractEditController * Process a form to create a new note object. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function createNoteObjectAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function createNoteObjectAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $note = $params['note']; $privacy_restriction = $params['privacy-restriction']; diff --git a/app/Http/Controllers/EditRepositoryController.php b/app/Http/Controllers/EditRepositoryController.php index a2a2c63f44..d9dc94e1cb 100644 --- a/app/Http/Controllers/EditRepositoryController.php +++ b/app/Http/Controllers/EditRepositoryController.php @@ -18,7 +18,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\Controllers; use Fisharebest\Webtrees\I18N; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -30,9 +29,11 @@ class EditRepositoryController extends AbstractEditController /** * Show a form to create a new repository. * + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function createRepository(): ResponseInterface + public function createRepository(ServerRequestInterface $request): ResponseInterface { return response(view('modals/create-repository')); } @@ -41,12 +42,12 @@ class EditRepositoryController extends AbstractEditController * Process a form to create a new repository. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function createRepositoryAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function createRepositoryAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $name = $params['repository-name']; $privacy_restriction = $params['privacy-restriction']; diff --git a/app/Http/Controllers/EditSourceController.php b/app/Http/Controllers/EditSourceController.php index 5a6b3488a2..df071c959a 100644 --- a/app/Http/Controllers/EditSourceController.php +++ b/app/Http/Controllers/EditSourceController.php @@ -18,7 +18,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\Controllers; use Fisharebest\Webtrees\I18N; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -30,9 +29,11 @@ class EditSourceController extends AbstractEditController /** * Show a form to create a new source. * + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function createSource(): ResponseInterface + public function createSource(ServerRequestInterface $request): ResponseInterface { return response(view('modals/create-source')); } @@ -41,12 +42,12 @@ class EditSourceController extends AbstractEditController * Process a form to create a new source. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function createSourceAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function createSourceAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $title = $params['source-title']; $abbreviation = $params['source-abbreviation']; diff --git a/app/Http/Controllers/EditSubmitterController.php b/app/Http/Controllers/EditSubmitterController.php index 81dc6bb943..0437c34b7e 100644 --- a/app/Http/Controllers/EditSubmitterController.php +++ b/app/Http/Controllers/EditSubmitterController.php @@ -18,7 +18,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\Controllers; use Fisharebest\Webtrees\I18N; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -30,9 +29,11 @@ class EditSubmitterController extends AbstractEditController /** * Show a form to create a new submitter. * + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function createSubmitter(): ResponseInterface + public function createSubmitter(ServerRequestInterface $request): ResponseInterface { return response(view('modals/create-submitter')); } @@ -41,12 +42,12 @@ class EditSubmitterController extends AbstractEditController * Process a form to create a new submitter. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function createSubmitterAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function createSubmitterAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $name = $params['submitter_name']; $address = $params['submitter_address']; diff --git a/app/Http/Controllers/FamilyController.php b/app/Http/Controllers/FamilyController.php index d13745c5de..f6599e458e 100644 --- a/app/Http/Controllers/FamilyController.php +++ b/app/Http/Controllers/FamilyController.php @@ -20,7 +20,6 @@ namespace Fisharebest\Webtrees\Http\Controllers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\Services\ClipboardService; -use Fisharebest\Webtrees\Tree; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -31,23 +30,35 @@ use stdClass; */ class FamilyController extends AbstractBaseController { + /** @var ClipboardService */ + private $clipboard_service; + + /** + * FamilyController constructor. + * + * @param ClipboardService $clipboard_service + */ + public function __construct(ClipboardService $clipboard_service) + { + $this->clipboard_service = $clipboard_service; + } + /** * Show a family's page. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param ClipboardService $clipboard_service * * @return ResponseInterface */ - public function show(ServerRequestInterface $request, Tree $tree, ClipboardService $clipboard_service): ResponseInterface + public function show(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $family = Family::getInstance($xref, $tree); Auth::checkFamilyAccess($family, false); - $clipboard_facts = $clipboard_service->pastableFacts($family, new Collection()); + $clipboard_facts = $this->clipboard_service->pastableFacts($family, new Collection()); return $this->viewResponse('family-page', [ 'facts' => $family->facts([], true), diff --git a/app/Http/Controllers/GedcomFileController.php b/app/Http/Controllers/GedcomFileController.php index 6d3466e136..0572e6536a 100644 --- a/app/Http/Controllers/GedcomFileController.php +++ b/app/Http/Controllers/GedcomFileController.php @@ -23,11 +23,11 @@ use Fisharebest\Webtrees\Functions\FunctionsImport; use Fisharebest\Webtrees\Gedcom; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\TimeoutService; -use Fisharebest\Webtrees\Tree; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Illuminate\Support\Str; use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; /** * Controller for the processing GEDCOM files. @@ -37,16 +37,30 @@ class GedcomFileController extends AbstractBaseController /** @var string */ protected $layout = 'layouts/ajax'; + /** @var TimeoutService */ + private $timeout_service; + /** - * Import the next chunk of a GEDCOM file. + * GedcomFileController constructor. * * @param TimeoutService $timeout_service - * @param Tree $tree + */ + public function __construct(TimeoutService $timeout_service) + { + $this->timeout_service = $timeout_service; + } + + /** + * Import the next chunk of a GEDCOM file. + * + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function import(TimeoutService $timeout_service, Tree $tree): ResponseInterface + public function import(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + try { // Only allow one process to import each gedcom at a time DB::table('gedcom_chunk') @@ -197,7 +211,7 @@ class GedcomFileController extends AbstractBaseController DB::table('gedcom_chunk') ->where('gedcom_chunk_id', '=', $data->gedcom_chunk_id) ->update(['imported' => 1]); - } while (!$timeout_service->isTimeLimitUp()); + } while (!$this->timeout_service->isTimeLimitUp()); return $this->viewResponse('admin/import-progress', [ 'errors' => $errors, diff --git a/app/Http/Controllers/GedcomRecordController.php b/app/Http/Controllers/GedcomRecordController.php index 0f11c03ada..f6b8ab2ed3 100644 --- a/app/Http/Controllers/GedcomRecordController.php +++ b/app/Http/Controllers/GedcomRecordController.php @@ -25,7 +25,6 @@ use Fisharebest\Webtrees\Media; use Fisharebest\Webtrees\Note; use Fisharebest\Webtrees\Repository; use Fisharebest\Webtrees\Source; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -38,12 +37,12 @@ class GedcomRecordController extends AbstractBaseController * Show a gedcom record's page. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function show(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function show(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $record = GedcomRecord::getInstance($xref, $tree); diff --git a/app/Http/Controllers/HomePageController.php b/app/Http/Controllers/HomePageController.php index 3ab97b7dc2..f318f0a293 100644 --- a/app/Http/Controllers/HomePageController.php +++ b/app/Http/Controllers/HomePageController.php @@ -110,15 +110,15 @@ class HomePageController extends AbstractBaseController * Show a form to edit block config options. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function treePageBlockEdit(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function treePageBlockEdit(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $block_id = (int) $request->getQueryParams()['block_id']; - $block = $this->treeBlock($request, $tree, $user); + $block = $this->treeBlock($request, $user); $title = $block->title() . ' — ' . I18N::translate('Preferences'); return $this->viewResponse('modules/edit-block-config', [ @@ -134,14 +134,14 @@ class HomePageController extends AbstractBaseController * Update block config options. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function treePageBlockUpdate(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function treePageBlockUpdate(ServerRequestInterface $request): ResponseInterface { - $block = $this->treeBlock($request, $tree, $user); + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + $block = $this->treeBlock($request, $user); $block_id = (int) $request->getQueryParams()['block_id']; $block->saveBlockConfiguration($request, $block_id); @@ -153,13 +153,13 @@ class HomePageController extends AbstractBaseController * Load a block and check we have permission to edit it. * * @param ServerRequestInterface $request - * @param Tree $tree * @param UserInterface $user * * @return ModuleBlockInterface */ - private function treeBlock(ServerRequestInterface $request, Tree $tree, UserInterface $user): ModuleBlockInterface + private function treeBlock(ServerRequestInterface $request, UserInterface $user): ModuleBlockInterface { + $tree = $request->getAttribute('tree'); $block_id = (int) $request->getQueryParams()['block_id']; $block = DB::table('block') @@ -189,13 +189,13 @@ class HomePageController extends AbstractBaseController * Show a form to edit block config options. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function userPageBlockEdit(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function userPageBlockEdit(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $block_id = (int) $request->getQueryParams()['block_id']; $block = $this->userBlock($request, $user); $title = $block->title() . ' — ' . I18N::translate('Preferences'); @@ -213,13 +213,13 @@ class HomePageController extends AbstractBaseController * Update block config options. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function userPageBlockUpdate(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function userPageBlockUpdate(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $block = $this->userBlock($request, $user); $block_id = (int) $request->getQueryParams()['block_id']; @@ -268,12 +268,14 @@ class HomePageController extends AbstractBaseController /** * Show a tree's page. * - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function treePage(Tree $tree): ResponseInterface + public function treePage(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $has_blocks = DB::table('block') ->where('gedcom_id', '=', $tree->id()) ->exists(); @@ -305,12 +307,12 @@ class HomePageController extends AbstractBaseController * Load block asynchronously. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function treePageBlock(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function treePageBlock(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $block_id = $request->getQueryParams()['block_id']; $block_id = (int) DB::table('block') @@ -330,9 +332,11 @@ class HomePageController extends AbstractBaseController /** * Show a form to edit the default blocks for new trees. * + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function treePageDefaultEdit(): ResponseInterface + public function treePageDefaultEdit(ServerRequestInterface $request): ResponseInterface { $this->checkDefaultTreeBlocksExist(); @@ -375,12 +379,14 @@ class HomePageController extends AbstractBaseController /** * Show a form to edit the blocks on a tree's page. * - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function treePageEdit(Tree $tree): ResponseInterface + public function treePageEdit(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $main_blocks = $this->treeBlocks($tree->id(), self::MAIN_BLOCKS); $side_blocks = $this->treeBlocks($tree->id(), self::SIDE_BLOCKS); @@ -404,12 +410,12 @@ class HomePageController extends AbstractBaseController * Save updated blocks on a tree's page. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function treePageUpdate(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function treePageUpdate(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $defaults = (bool) ($params['defaults'] ?? false); @@ -438,12 +444,14 @@ class HomePageController extends AbstractBaseController /** * Show a users's page. * - * @param UserInterface $user + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function userPage(UserInterface $user): ResponseInterface + public function userPage(ServerRequestInterface $request): ResponseInterface { + $user = $request->getAttribute('user'); + $has_blocks = DB::table('block') ->where('user_id', '=', $user->id()) ->exists(); @@ -474,13 +482,13 @@ class HomePageController extends AbstractBaseController * Load block asynchronously. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function userPageBlock(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function userPageBlock(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $block_id = $request->getQueryParams()['block_id']; $block_id = (int) DB::table('block') @@ -500,9 +508,11 @@ class HomePageController extends AbstractBaseController /** * Show a form to edit the default blocks for new uesrs. * + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function userPageDefaultEdit(): ResponseInterface + public function userPageDefaultEdit(ServerRequestInterface $request): ResponseInterface { $this->checkDefaultUserBlocksExist(); @@ -544,13 +554,14 @@ class HomePageController extends AbstractBaseController /** * Show a form to edit the blocks on the user's page. * - * @param Tree $tree - * @param UserInterface $user + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function userPageEdit(Tree $tree, UserInterface $user): ResponseInterface + public function userPageEdit(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $main_blocks = $this->userBlocks($user->id(), self::MAIN_BLOCKS); $side_blocks = $this->userBlocks($user->id(), self::SIDE_BLOCKS); $all_blocks = $this->availableUserBlocks(); @@ -573,15 +584,14 @@ class HomePageController extends AbstractBaseController * Save the updated blocks on a user's page. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function userPageUpdate(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function userPageUpdate(ServerRequestInterface $request): ResponseInterface { - $params = $request->getParsedBody(); - + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + $params = $request->getParsedBody(); $defaults = (bool) ($params['defaults'] ?? false); if ($defaults) { @@ -664,7 +674,6 @@ class HomePageController extends AbstractBaseController * @param int $block_id * * @return ModuleBlockInterface - * @throws NotFoundHttpException */ private function getBlockModule(Tree $tree, int $block_id): ModuleBlockInterface { diff --git a/app/Http/Controllers/IndividualController.php b/app/Http/Controllers/IndividualController.php index c65ca2bfd4..5d1213bf4a 100644 --- a/app/Http/Controllers/IndividualController.php +++ b/app/Http/Controllers/IndividualController.php @@ -18,7 +18,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\Controllers; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Date; use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\Functions\FunctionsDate; @@ -54,6 +53,9 @@ use function strpos; */ class IndividualController extends AbstractBaseController { + /** @var ClipboardService */ + private $clipboard_service; + /** @var ModuleService */ private $module_service; @@ -63,26 +65,27 @@ class IndividualController extends AbstractBaseController /** * IndividualController constructor. * - * @param ModuleService $module_service - * @param UserService $user_service + * @param ClipboardService $clipboard_service + * @param ModuleService $module_service + * @param UserService $user_service */ - public function __construct(ModuleService $module_service, UserService $user_service) + public function __construct(ClipboardService $clipboard_service, ModuleService $module_service, UserService $user_service) { - $this->module_service = $module_service; - $this->user_service = $user_service; + $this->clipboard_service = $clipboard_service; + $this->module_service = $module_service; + $this->user_service = $user_service; } /** * Show a individual's page. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param ClipboardService $clipboard_service * * @return ResponseInterface */ - public function show(ServerRequestInterface $request, Tree $tree, ClipboardService $clipboard_service): ResponseInterface + public function show(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -134,7 +137,7 @@ class IndividualController extends AbstractBaseController return $this->viewResponse('individual-page', [ 'age' => $age, - 'clipboard_facts' => $clipboard_service->pastableFacts($individual, new Collection()), + 'clipboard_facts' => $this->clipboard_service->pastableFacts($individual, new Collection()), 'count_media' => $this->countFacts($individual, ['OBJE']), 'count_names' => $this->countFacts($individual, ['NAME']), 'count_sex' => $this->countFacts($individual, ['SEX']), @@ -153,13 +156,13 @@ class IndividualController extends AbstractBaseController /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function tab(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function tab(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $xref = $request->getQueryParams()['xref']; $record = Individual::getInstance($xref, $tree); $module_name = $request->getQueryParams()['module']; diff --git a/app/Http/Controllers/ListController.php b/app/Http/Controllers/ListController.php index e17621e8f8..193bb2767f 100644 --- a/app/Http/Controllers/ListController.php +++ b/app/Http/Controllers/ListController.php @@ -17,7 +17,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\Controllers; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Functions\FunctionsPrintLists; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\GedcomTag; @@ -66,43 +65,40 @@ class ListController extends AbstractBaseController * Show a list of all individual or family records. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * @param ModuleListInterface|null $moduleListInterface * * @return ResponseInterface */ - public function familyList(ServerRequestInterface $request, Tree $tree, UserInterface $user, ?ModuleListInterface $moduleListInterface): ResponseInterface + public function familyList(ServerRequestInterface $request, ?ModuleListInterface $moduleListInterface): ResponseInterface { - return $this->individualOrFamilyList($request, $tree, $user, true, $moduleListInterface); + return $this->individualOrFamilyList($request, true, $moduleListInterface); } /** * Show a list of all individual or family records. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * @param ModuleListInterface|null $moduleListInterface * * @return ResponseInterface */ - public function individualList(ServerRequestInterface $request, Tree $tree, UserInterface $user, ?ModuleListInterface $moduleListInterface): ResponseInterface + public function individualList(ServerRequestInterface $request, ?ModuleListInterface $moduleListInterface): ResponseInterface { - return $this->individualOrFamilyList($request, $tree, $user, false, $moduleListInterface); + return $this->individualOrFamilyList($request, false, $moduleListInterface); } /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * @param bool $families * @param ModuleListInterface|null $moduleListInterface * * @return ResponseInterface */ - public function individualOrFamilyList(ServerRequestInterface $request, Tree $tree, UserInterface $user, bool $families, ?ModuleListInterface $moduleListInterface): ResponseInterface + public function individualOrFamilyList(ServerRequestInterface $request, bool $families, ?ModuleListInterface $moduleListInterface): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + // This action can show lists of both families and individuals. //route is assumed to be 'module' $module = $request->getQueryParams()['module']; @@ -396,12 +392,12 @@ class ListController extends AbstractBaseController * Show a list of all media records. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function mediaList(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function mediaList(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $module = $params['module']; $action = $params['action']; @@ -457,12 +453,13 @@ class ListController extends AbstractBaseController /** * Show a list of all note records. * - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function noteList(Tree $tree): ResponseInterface + public function noteList(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $notes = $this->allNotes($tree); return $this->viewResponse('note-list-page', [ @@ -474,12 +471,13 @@ class ListController extends AbstractBaseController /** * Show a list of all repository records. * - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function repositoryList(Tree $tree): ResponseInterface + public function repositoryList(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $repositories = $this->allRepositories($tree); return $this->viewResponse('repository-list-page', [ @@ -491,12 +489,13 @@ class ListController extends AbstractBaseController /** * Show a list of all source records. * - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function sourceList(Tree $tree): ResponseInterface + public function sourceList(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $sources = $this->allSources($tree); return $this->viewResponse('source-list-page', [ diff --git a/app/Http/Controllers/MediaController.php b/app/Http/Controllers/MediaController.php index 49d6cd998c..4d83f0ab56 100644 --- a/app/Http/Controllers/MediaController.php +++ b/app/Http/Controllers/MediaController.php @@ -21,7 +21,6 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\Media; use Fisharebest\Webtrees\Services\ClipboardService; -use Fisharebest\Webtrees\Tree; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -31,24 +30,36 @@ use Psr\Http\Message\ServerRequestInterface; */ class MediaController extends AbstractBaseController { + /** @var ClipboardService */ + private $clipboard_service; + + /** + * MediaController constructor. + * + * @param ClipboardService $clipboard_service + */ + public function __construct(ClipboardService $clipboard_service) + { + $this->clipboard_service = $clipboard_service; + } + /** * Show a repository's page. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param ClipboardService $clipboard_service * * @return ResponseInterface */ - public function show(ServerRequestInterface $request, Tree $tree, ClipboardService $clipboard_service): ResponseInterface + public function show(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $media = Media::getInstance($xref, $tree); Auth::checkMediaAccess($media); return $this->viewResponse('media-page', [ - 'clipboard_facts' => $clipboard_service->pastableFacts($media, new Collection()), + 'clipboard_facts' => $this->clipboard_service->pastableFacts($media, new Collection()), 'families' => $media->linkedFamilies('OBJE'), 'facts' => $this->facts($media), 'individuals' => $media->linkedIndividuals('OBJE'), diff --git a/app/Http/Controllers/MediaFileController.php b/app/Http/Controllers/MediaFileController.php index 11162abd00..3a8305ecd6 100644 --- a/app/Http/Controllers/MediaFileController.php +++ b/app/Http/Controllers/MediaFileController.php @@ -25,7 +25,6 @@ use Fisharebest\Webtrees\Log; use Fisharebest\Webtrees\Media; use Fisharebest\Webtrees\MediaFile; use Fisharebest\Webtrees\Site; -use Fisharebest\Webtrees\Tree; use Intervention\Image\Exception\NotReadableException; use League\Flysystem\Adapter\Local; use League\Flysystem\Filesystem; @@ -76,12 +75,12 @@ class MediaFileController extends AbstractBaseController * Download a non-image media file. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function mediaDownload(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function mediaDownload(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $xref = $params['xref']; $fact_id = $params['fact_id']; @@ -120,12 +119,12 @@ class MediaFileController extends AbstractBaseController * Show an image/thumbnail, with/without a watermark. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function mediaThumbnail(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function mediaThumbnail(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $xref = $params['xref']; $fact_id = $params['fact_id']; diff --git a/app/Http/Controllers/MessageController.php b/app/Http/Controllers/MessageController.php index e466f02e59..527bfd829a 100644 --- a/app/Http/Controllers/MessageController.php +++ b/app/Http/Controllers/MessageController.php @@ -65,14 +65,13 @@ class MessageController extends AbstractBaseController * A form to compose a message from a member. * * @param ServerRequestInterface $request - * @param UserInterface $user * * @return ResponseInterface */ - public function broadcastPage(ServerRequestInterface $request, UserInterface $user): ResponseInterface + public function broadcastPage(ServerRequestInterface $request): ResponseInterface { + $user = $request->getAttribute('user'); $referer = $request->getHeaderLine('referer'); - $params = $request->getQueryParams(); $body = $params['body'] ?? ''; $subject = $params['subject'] ?? ''; @@ -103,13 +102,13 @@ class MessageController extends AbstractBaseController * Send a message. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function broadcastAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function broadcastAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $params = $request->getParsedBody(); $body = $params['body']; $subject = $params['subject']; @@ -150,12 +149,12 @@ class MessageController extends AbstractBaseController * A form to compose a message from a visitor. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function contactPage(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function contactPage(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $referer = $request->getHeaderLine('referer'); $params = $request->getQueryParams(); $body = $params['body'] ?? ''; @@ -191,12 +190,12 @@ class MessageController extends AbstractBaseController * Send a message. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function contactAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function contactAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getParsedBody(); $body = $params['body']; $from_email = $params['from_email']; @@ -270,12 +269,12 @@ class MessageController extends AbstractBaseController * A form to compose a message from a member. * * @param ServerRequestInterface $request - * @param UserInterface $user * * @return ResponseInterface */ - public function messagePage(ServerRequestInterface $request, UserInterface $user): ResponseInterface + public function messagePage(ServerRequestInterface $request): ResponseInterface { + $user = $request->getAttribute('user'); $referer = $request->getHeaderLine('referer'); $params = $request->getQueryParams(); $body = $params['body'] ?? ''; @@ -304,13 +303,13 @@ class MessageController extends AbstractBaseController * Send a message. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function messageAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function messageAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $params = $request->getParsedBody(); $body = $params['body']; $subject = $params['subject']; diff --git a/app/Http/Controllers/NoteController.php b/app/Http/Controllers/NoteController.php index e79eb13de3..141f0f8ce7 100644 --- a/app/Http/Controllers/NoteController.php +++ b/app/Http/Controllers/NoteController.php @@ -22,7 +22,6 @@ use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\Filter; use Fisharebest\Webtrees\Note; use Fisharebest\Webtrees\Services\ClipboardService; -use Fisharebest\Webtrees\Tree; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -32,34 +31,46 @@ use Psr\Http\Message\ServerRequestInterface; */ class NoteController extends AbstractBaseController { + /** @var ClipboardService */ + private $clipboard_service; + + /** + * MediaController constructor. + * + * @param ClipboardService $clipboard_service + */ + public function __construct(ClipboardService $clipboard_service) + { + $this->clipboard_service = $clipboard_service; + } + /** * Show a note's page. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param ClipboardService $clipboard_service * * @return ResponseInterface */ - public function show(ServerRequestInterface $request, Tree $tree, ClipboardService $clipboard_service): ResponseInterface + public function show(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $record = Note::getInstance($xref, $tree); Auth::checkNoteAccess($record, false); return $this->viewResponse('note-page', [ - 'clipboard_facts' => $clipboard_service->pastableFacts($record, new Collection()), - 'facts' => $this->facts($record), - 'families' => $record->linkedFamilies('NOTE'), - 'individuals' => $record->linkedIndividuals('NOTE'), - 'note' => $record, - 'notes' => [], - 'media_objects' => $record->linkedMedia('NOTE'), - 'meta_robots' => 'index,follow', - 'sources' => $record->linkedSources('NOTE'), - 'text' => Filter::formatText($record->getNote(), $tree), - 'title' => $record->fullName(), + 'clipboard_facts' => $this->clipboard_service->pastableFacts($record, new Collection()), + 'facts' => $this->facts($record), + 'families' => $record->linkedFamilies('NOTE'), + 'individuals' => $record->linkedIndividuals('NOTE'), + 'note' => $record, + 'notes' => [], + 'media_objects' => $record->linkedMedia('NOTE'), + 'meta_robots' => 'index,follow', + 'sources' => $record->linkedSources('NOTE'), + 'text' => Filter::formatText($record->getNote(), $tree), + 'title' => $record->fullName(), ]); } diff --git a/app/Http/Controllers/PendingChangesController.php b/app/Http/Controllers/PendingChangesController.php index 3e36873658..db7370af9b 100644 --- a/app/Http/Controllers/PendingChangesController.php +++ b/app/Http/Controllers/PendingChangesController.php @@ -46,13 +46,13 @@ class PendingChangesController extends AbstractBaseController * Accept all changes to a tree. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function acceptAllChanges(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function acceptAllChanges(ServerRequestInterface $request): ResponseInterface { - $url = $request->getQueryParams()['url']; + $tree = $request->getAttribute('tree'); + $url = $request->getQueryParams()['url']; $changes = DB::table('change') ->where('gedcom_id', '=', $tree->id()) @@ -86,16 +86,15 @@ class PendingChangesController extends AbstractBaseController * Accept a change (and all previous changes) to a single record. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function acceptChange(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function acceptChange(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); - - $url = $params['url']; - $xref = $params['xref']; + $url = $params['url']; + $xref = $params['xref']; $change_id = $params['change_id']; $changes = DB::table('change') @@ -132,14 +131,13 @@ class PendingChangesController extends AbstractBaseController * Accept all changes to a single record. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function acceptChanges(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function acceptChanges(ServerRequestInterface $request): ResponseInterface { - $xref = $request->getParsedBody()['xref']; - + $tree = $request->getAttribute('tree'); + $xref = $request->getParsedBody()['xref']; $record = GedcomRecord::getInstance($xref, $tree); Auth::checkRecordAccess($record, false); @@ -162,13 +160,13 @@ class PendingChangesController extends AbstractBaseController * Reject all changes to a tree. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function rejectAllChanges(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function rejectAllChanges(ServerRequestInterface $request): ResponseInterface { - $url = $request->getQueryParams()['url']; + $tree = $request->getAttribute('tree'); + $url = $request->getQueryParams()['url']; DB::table('change') ->where('gedcom_id', '=', $tree->id()) @@ -185,12 +183,12 @@ class PendingChangesController extends AbstractBaseController * Reject a change (and all subsequent changes) to a single record. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function rejectChange(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function rejectChange(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $url = $params['url']; $xref = $params['xref']; @@ -214,12 +212,12 @@ class PendingChangesController extends AbstractBaseController * Accept all changes to a single record. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function rejectChanges(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function rejectChanges(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getParsedBody()['xref']; $record = GedcomRecord::getInstance($xref, $tree); @@ -244,12 +242,12 @@ class PendingChangesController extends AbstractBaseController * Show the pending changes for the current tree. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function showChanges(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function showChanges(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $default_url = route('tree-page', ['ged' => $tree->name()]); $url = $request->getQueryParams()['url'] ?? $default_url; diff --git a/app/Http/Controllers/PlaceHierarchyController.php b/app/Http/Controllers/PlaceHierarchyController.php index a90c912393..86263e8e05 100644 --- a/app/Http/Controllers/PlaceHierarchyController.php +++ b/app/Http/Controllers/PlaceHierarchyController.php @@ -42,30 +42,32 @@ class PlaceHierarchyController extends AbstractBaseController { private const MAP_MODULE = 'openstreetmap'; - /** - * @var Statistics - */ + /** @var SearchService */ + private $search_service; + + /** @var Statistics */ private $statistics; /** * TopGivenNamesModule constructor. * - * @param Statistics $statistics + * @param SearchService $search_service + * @param Statistics $statistics */ - public function __construct(Statistics $statistics) + public function __construct(SearchService $search_service, Statistics $statistics) { - $this->statistics = $statistics; + $this->search_service = $search_service; + $this->statistics = $statistics; } /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param SearchService $search_service * * @return ResponseInterface */ - public function show(ServerRequestInterface $request, Tree $tree, SearchService $search_service): ResponseInterface + public function show(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $action2 = $params['action2'] ?? 'hierarchy'; $parent = $params['parent'] ?? []; @@ -92,7 +94,7 @@ class PlaceHierarchyController extends AbstractBaseController switch ($action2) { case 'list': $nextaction = ['hierarchy' => I18N::translate('Show place hierarchy')]; - $content .= view('place-list', $this->getList($tree, $search_service)); + $content .= view('place-list', $this->getList($tree, $this->search_service)); break; case 'hierarchy': case 'hierarchy-e': diff --git a/app/Http/Controllers/ReportEngineController.php b/app/Http/Controllers/ReportEngineController.php index c99a6f808b..f61340fc70 100644 --- a/app/Http/Controllers/ReportEngineController.php +++ b/app/Http/Controllers/ReportEngineController.php @@ -19,7 +19,6 @@ namespace Fisharebest\Webtrees\Http\Controllers; use function addcslashes; use Fig\Http\Message\StatusCodeInterface; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\Html; use Fisharebest\Webtrees\I18N; @@ -31,7 +30,6 @@ use Fisharebest\Webtrees\Report\ReportParserSetup; use Fisharebest\Webtrees\Report\ReportPdf; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Source; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use function response; @@ -60,13 +58,14 @@ class ReportEngineController extends AbstractBaseController /** * A list of available reports. * - * @param Tree $tree - * @param UserInterface $user + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function reportList(Tree $tree, UserInterface $user): ResponseInterface + public function reportList(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $title = I18N::translate('Choose a report to run'); return $this->viewResponse('report-select-page', [ @@ -79,20 +78,19 @@ class ReportEngineController extends AbstractBaseController * Fetch the options/parameters for a report. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function reportSetup(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function reportSetup(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $pid = $params['xref'] ?? ''; $report = $params['report'] ?? ''; $module = $this->module_service->findByName($report); if (!$module instanceof ModuleReportInterface) { - return $this->reportList($tree, $user); + return $this->reportList($request); } $xml_filename = $module->resourcesFolder() . $module->xmlFilename(); @@ -212,12 +210,12 @@ class ReportEngineController extends AbstractBaseController * Generate a report. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function reportRun(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function reportRun(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $report = $params['report']; $output = $params['output']; diff --git a/app/Http/Controllers/RepositoryController.php b/app/Http/Controllers/RepositoryController.php index e6596b0600..cae762b279 100644 --- a/app/Http/Controllers/RepositoryController.php +++ b/app/Http/Controllers/RepositoryController.php @@ -21,7 +21,6 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\Repository; use Fisharebest\Webtrees\Services\ClipboardService; -use Fisharebest\Webtrees\Tree; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -44,24 +43,36 @@ class RepositoryController extends AbstractBaseController 'RESN', ]; + /** @var ClipboardService */ + private $clipboard_service; + + /** + * MediaController constructor. + * + * @param ClipboardService $clipboard_service + */ + public function __construct(ClipboardService $clipboard_service) + { + $this->clipboard_service = $clipboard_service; + } + /** * Show a repository's page. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param ClipboardService $clipboard_service * * @return ResponseInterface */ - public function show(ServerRequestInterface $request, Tree $tree, ClipboardService $clipboard_service): ResponseInterface + public function show(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $record = Repository::getInstance($xref, $tree); Auth::checkRepositoryAccess($record, false); return $this->viewResponse('repository-page', [ - 'clipboard_facts' => $clipboard_service->pastableFacts($record, new Collection()), + 'clipboard_facts' => $this->clipboard_service->pastableFacts($record, new Collection()), 'facts' => $this->facts($record), 'meta_robots' => 'index,follow', 'repository' => $record, diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index dedbe02bdd..64336fed75 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -137,12 +137,12 @@ class SearchController extends AbstractBaseController * The "omni-search" box in the header. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function quick(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function quick(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $query = $request->getQueryParams()['query'] ?? ''; // Was the search query an XREF in the current tree? @@ -153,22 +153,21 @@ class SearchController extends AbstractBaseController return redirect($record->url()); } - return $this->general($request, $tree); + return $this->general($request); } /** * The standard search. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function general(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function general(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); - - $query = $params['query'] ?? ''; + $query = $params['query'] ?? ''; // What type of records to search? $search_individuals = (bool) ($params['search_individuals'] ?? false); @@ -303,14 +302,13 @@ class SearchController extends AbstractBaseController * The phonetic search. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function phonetic(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function phonetic(ServerRequestInterface $request): ResponseInterface { - $params = $request->getQueryParams(); - + $tree = $request->getAttribute('tree'); + $params = $request->getQueryParams(); $firstname = $params['firstname'] ?? ''; $lastname = $params['lastname'] ?? ''; $place = $params['place'] ?? ''; @@ -382,14 +380,13 @@ class SearchController extends AbstractBaseController * Search and replace. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function replaceAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function replaceAction(ServerRequestInterface $request): ResponseInterface { - $params = $request->getParsedBody(); - + $tree = $request->getAttribute('tree'); + $params = $request->getParsedBody(); $search = $params['search'] ?? ''; $replace = $params['replace'] ?? ''; $context = $params['context'] ?? ''; @@ -538,12 +535,12 @@ class SearchController extends AbstractBaseController * A structured search. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function advanced(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function advanced(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $default_fields = array_fill_keys(self::DEFAULT_ADVANCED_FIELDS, ''); $params = $request->getQueryParams(); diff --git a/app/Http/Controllers/SourceController.php b/app/Http/Controllers/SourceController.php index 0110831cb3..5dea1e1e52 100644 --- a/app/Http/Controllers/SourceController.php +++ b/app/Http/Controllers/SourceController.php @@ -21,7 +21,6 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\Services\ClipboardService; use Fisharebest\Webtrees\Source; -use Fisharebest\Webtrees\Tree; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -49,24 +48,36 @@ class SourceController extends AbstractBaseController 'RESN', ]; + /** @var ClipboardService */ + private $clipboard_service; + + /** + * MediaController constructor. + * + * @param ClipboardService $clipboard_service + */ + public function __construct(ClipboardService $clipboard_service) + { + $this->clipboard_service = $clipboard_service; + } + /** * Show a repository's page. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param ClipboardService $clipboard_service * * @return ResponseInterface */ - public function show(ServerRequestInterface $request, Tree $tree, ClipboardService $clipboard_service): ResponseInterface + public function show(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $record = Source::getInstance($xref, $tree); Auth::checkSourceAccess($record, false); return $this->viewResponse('source-page', [ - 'clipboard_facts' => $clipboard_service->pastableFacts($record, new Collection()), + 'clipboard_facts' => $this->clipboard_service->pastableFacts($record, new Collection()), 'facts' => $this->facts($record), 'families' => $record->linkedFamilies('SOUR'), 'individuals' => $record->linkedIndividuals('SOUR'), diff --git a/app/Http/Middleware/UseSession.php b/app/Http/Middleware/UseSession.php index 2ac0371a66..0f1585726b 100644 --- a/app/Http/Middleware/UseSession.php +++ b/app/Http/Middleware/UseSession.php @@ -42,18 +42,22 @@ class UseSession implements MiddlewareInterface // Sessions Session::start($request); + $user = Auth::user(); + // Update the last-login time no more than once a minute. $next_session_update = Carbon::createFromTimestamp((int) Session::get('session_time_updates'))->addMinute(); if ($next_session_update < Carbon::now()) { $timestamp_now = Carbon::now()->unix(); if (Session::get('masquerade') === null) { - Auth::user()->setPreference('sessiontime', (string) $timestamp_now); + $user->setPreference('sessiontime', (string) $timestamp_now); } Session::put('session_time_updates', $timestamp_now); } - app()->instance(UserInterface::class, Auth::user()); + app()->instance(UserInterface::class, $user); + + $request = $request->withAttribute('user', $user); return $handler->handle($request); } diff --git a/app/Http/Middleware/UseTree.php b/app/Http/Middleware/UseTree.php index 25d9140c83..f980bd6fd5 100644 --- a/app/Http/Middleware/UseTree.php +++ b/app/Http/Middleware/UseTree.php @@ -56,6 +56,8 @@ class UseTree implements MiddlewareInterface return $tree; }); + $request = $request->withAttribute('tree', $tree); + return $handler->handle($request); } } diff --git a/app/Http/RequestHandlers/MasqueradeAsUser.php b/app/Http/RequestHandlers/MasqueradeAsUser.php index 959cf06170..13f3efd064 100644 --- a/app/Http/RequestHandlers/MasqueradeAsUser.php +++ b/app/Http/RequestHandlers/MasqueradeAsUser.php @@ -19,7 +19,6 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Log; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Session; @@ -34,19 +33,14 @@ use function response; */ class MasqueradeAsUser implements RequestHandlerInterface, StatusCodeInterface { - /** @var UserInterface */ - private $user; - /** @var UserService */ private $user_service; /** - * @param UserInterface $user - * @param UserService $user_service + * @param UserService $user_service */ - public function __construct(UserInterface $user, UserService $user_service) + public function __construct(UserService $user_service) { - $this->user = $user; $this->user_service = $user_service; } @@ -65,7 +59,7 @@ class MasqueradeAsUser implements RequestHandlerInterface, StatusCodeInterface throw new NotFoundHttpException('User ID ' . $user_id . ' not found'); } - if ($this->user->id() !== $user_id) { + if ($request->getAttribute('user')->id() !== $user_id) { Log::addAuthenticationLog('Masquerade as user: ' . $user->userName()); Auth::login($user); Session::put('masquerade', '1'); diff --git a/app/Http/RequestHandlers/ModuleAction.php b/app/Http/RequestHandlers/ModuleAction.php index 3022d84fbc..5410da05f2 100644 --- a/app/Http/RequestHandlers/ModuleAction.php +++ b/app/Http/RequestHandlers/ModuleAction.php @@ -25,7 +25,6 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; -use function app; use function method_exists; use function strpos; use function strtolower; @@ -87,6 +86,6 @@ class ModuleAction implements RequestHandlerInterface throw new NotFoundHttpException('Method ' . $method . '() not found in ' . $module_name); } - return app()->dispatch($module, $method); + return $module->$method($request); } } diff --git a/app/Http/RequestHandlers/PasswordRequestAction.php b/app/Http/RequestHandlers/PasswordRequestAction.php index 1c19e36c2e..5f87d9b5f7 100644 --- a/app/Http/RequestHandlers/PasswordRequestAction.php +++ b/app/Http/RequestHandlers/PasswordRequestAction.php @@ -41,7 +41,7 @@ use function view; */ class PasswordRequestAction implements RequestHandlerInterface, StatusCodeInterface, RequestMethodInterface { - const TOKEN_LENGTH = 40; + private const TOKEN_LENGTH = 40; /** @var MailService */ private $mail_service; diff --git a/app/Http/RequestHandlers/PasswordResetForm.php b/app/Http/RequestHandlers/PasswordResetForm.php index 79d21bb717..e08e6c41f6 100644 --- a/app/Http/RequestHandlers/PasswordResetForm.php +++ b/app/Http/RequestHandlers/PasswordResetForm.php @@ -18,20 +18,15 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fig\Http\Message\StatusCodeInterface; -use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; -use Fisharebest\Webtrees\Log; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\User; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use function redirect; -use function response; /** * Set a new password. diff --git a/app/Module/AncestorsChartModule.php b/app/Module/AncestorsChartModule.php index d39a77c8b2..5dd0d18e56 100644 --- a/app/Module/AncestorsChartModule.php +++ b/app/Module/AncestorsChartModule.php @@ -18,7 +18,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; @@ -49,6 +48,18 @@ class AncestorsChartModule extends AbstractModule implements ModuleChartInterfac protected const MINIMUM_GENERATIONS = 2; protected const MAXIMUM_GENERATIONS = 10; + /** @var ChartService */ + private $chart_service; + + /** + * CompactTreeChartModule constructor. + * + * @param ChartService $chart_service + */ + public function __construct(ChartService $chart_service) { + $this->chart_service = $chart_service; + } + /** * How should this module be identified in the control panel, etc.? * @@ -110,14 +121,13 @@ class AncestorsChartModule extends AbstractModule implements ModuleChartInterfac * A form to request the chart parameters. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user - * @param ChartService $chart_service * * @return ResponseInterface */ - public function getChartAction(ServerRequestInterface $request, Tree $tree, UserInterface $user, ChartService $chart_service): ResponseInterface + public function getChartAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $ajax = $request->getQueryParams()['ajax'] ?? ''; $xref = $request->getQueryParams()['xref'] ?? ''; $individual = Individual::getInstance($xref, $tree); @@ -132,7 +142,7 @@ class AncestorsChartModule extends AbstractModule implements ModuleChartInterfac $generations = max($generations, self::MINIMUM_GENERATIONS); if ($ajax === '1') { - $ancestors = $chart_service->sosaStradonitzAncestors($individual, $generations); + $ancestors = $this->chart_service->sosaStradonitzAncestors($individual, $generations); switch ($chart_style) { default: diff --git a/app/Module/BatchUpdateModule.php b/app/Module/BatchUpdateModule.php index c2bb0c110b..cf1d73bf77 100644 --- a/app/Module/BatchUpdateModule.php +++ b/app/Module/BatchUpdateModule.php @@ -19,7 +19,6 @@ namespace Fisharebest\Webtrees\Module; use function array_key_exists; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\I18N; @@ -73,13 +72,14 @@ class BatchUpdateModule extends AbstractModule implements ModuleConfigInterface * Main entry point * * @param ServerRequestInterface $request - * @param UserInterface $user - * @param Tree|null $tree * * @return ResponseInterface */ - public function getAdminAction(ServerRequestInterface $request, UserInterface $user, Tree $tree = null): ResponseInterface + public function getAdminAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + // We need a tree to work with. if ($tree === null) { throw new NotFoundHttpException(); @@ -321,13 +321,14 @@ class BatchUpdateModule extends AbstractModule implements ModuleConfigInterface * Perform an update * * @param ServerRequestInterface $request - * @param UserInterface $user - * @param Tree|null $tree * * @return ResponseInterface */ - public function postAdminAction(ServerRequestInterface $request, UserInterface $user, Tree $tree = null): ResponseInterface + public function postAdminAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + // We need a tree to work with. if ($tree === null) { throw new NotFoundHttpException(); diff --git a/app/Module/BranchesListModule.php b/app/Module/BranchesListModule.php index 99a5443364..7ab0d3b296 100644 --- a/app/Module/BranchesListModule.php +++ b/app/Module/BranchesListModule.php @@ -17,7 +17,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\Controllers\BranchesController; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\ModuleService; @@ -82,13 +81,14 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function getPageAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function getPageAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); $listController = new BranchesController(app(ModuleService::class)); @@ -97,17 +97,17 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function getListAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function getListAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); - $listController = new BranchesController(app(ModuleService::class)); - return $listController->list($request, $tree, $user); + return app(BranchesController::class)->list($request); } /** diff --git a/app/Module/CensusAssistantModule.php b/app/Module/CensusAssistantModule.php index 1941d08187..688411919e 100644 --- a/app/Module/CensusAssistantModule.php +++ b/app/Module/CensusAssistantModule.php @@ -21,7 +21,6 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Census\CensusInterface; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -69,12 +68,12 @@ class CensusAssistantModule extends AbstractModule /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function getCensusIndividualAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function getCensusIndividualAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $individual = Individual::getInstance($params['xref'], $tree); $head = Individual::getInstance($params['head'], $tree); diff --git a/app/Module/ClippingsCartModule.php b/app/Module/ClippingsCartModule.php index a43fb0d84d..45a6385f07 100644 --- a/app/Module/ClippingsCartModule.php +++ b/app/Module/ClippingsCartModule.php @@ -18,7 +18,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Exceptions\FamilyNotFoundException; use Fisharebest\Webtrees\Exceptions\IndividualNotFoundException; use Fisharebest\Webtrees\Exceptions\MediaNotFoundException; @@ -182,12 +181,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function getDownloadAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function getDownloadAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $params = $request->getQueryParams(); $privatize_export = $params['privatize_export']; @@ -312,13 +311,14 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface } /** - * @param Tree $tree - * @param UserInterface $user + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getDownloadFormAction(Tree $tree, UserInterface $user): ResponseInterface + public function getDownloadFormAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $title = I18N::translate('Family tree clippings cart') . ' — ' . I18N::translate('Download'); return $this->viewResponse('modules/clippings/download', [ @@ -329,12 +329,13 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getEmptyAction(Tree $tree): ResponseInterface + public function getEmptyAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $cart = Session::get('cart', []); $cart[$tree->name()] = []; Session::put('cart', $cart); @@ -350,12 +351,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postRemoveAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postRemoveAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $cart = Session::get('cart', []); @@ -372,12 +373,14 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getShowAction(Tree $tree): ResponseInterface + public function getShowAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + return $this->viewResponse('modules/clippings/show', [ 'records' => $this->allRecordsInCart($tree), 'title' => I18N::translate('Family tree clippings cart'), @@ -387,12 +390,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function getAddFamilyAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function getAddFamilyAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $family = Family::getInstance($xref, $tree); @@ -434,12 +437,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postAddFamilyAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postAddFamilyAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $option = $request->getParsedBody()['option']; @@ -519,12 +522,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function getAddIndividualAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function getAddIndividualAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -578,12 +581,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postAddIndividualAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postAddIndividualAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $option = $request->getParsedBody()['option']; @@ -661,12 +664,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function getAddMediaAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function getAddMediaAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $media = Media::getInstance($xref, $tree); @@ -704,12 +707,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postAddMediaAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postAddMediaAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $media = Media::getInstance($xref, $tree); @@ -725,12 +728,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function getAddNoteAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function getAddNoteAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $note = Note::getInstance($xref, $tree); @@ -768,12 +771,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postAddNoteAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postAddNoteAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $note = Note::getInstance($xref, $tree); @@ -789,12 +792,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function getAddRepositoryAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function getAddRepositoryAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $repository = Repository::getInstance($xref, $tree); @@ -832,12 +835,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postAddRepositoryAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postAddRepositoryAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $repository = Repository::getInstance($xref, $tree); @@ -853,12 +856,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function getAddSourceAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function getAddSourceAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $source = Source::getInstance($xref, $tree); @@ -897,12 +900,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postAddSourceAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postAddSourceAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $option = $request->getParsedBody()['option']; diff --git a/app/Module/CompactTreeChartModule.php b/app/Module/CompactTreeChartModule.php index c066cd5e73..5056f1e87b 100644 --- a/app/Module/CompactTreeChartModule.php +++ b/app/Module/CompactTreeChartModule.php @@ -18,12 +18,10 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Services\ChartService; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -34,6 +32,18 @@ class CompactTreeChartModule extends AbstractModule implements ModuleChartInterf { use ModuleChartTrait; + /** @var ChartService */ + private $chart_service; + + /** + * CompactTreeChartModule constructor. + * + * @param ChartService $chart_service + */ + public function __construct(ChartService $chart_service) { + $this->chart_service = $chart_service; + } + /** * How should this module be identified in the control panel, etc.? * @@ -95,14 +105,13 @@ class CompactTreeChartModule extends AbstractModule implements ModuleChartInterf * A form to request the chart parameters. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user - * @param ChartService $chart_service * * @return ResponseInterface */ - public function getChartAction(ServerRequestInterface $request, Tree $tree, UserInterface $user, ChartService $chart_service): ResponseInterface + public function getChartAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $ajax = $request->getQueryParams()['ajax'] ?? ''; $xref = $request->getQueryParams()['xref'] ?? ''; $individual = Individual::getInstance($xref, $tree); @@ -111,7 +120,7 @@ class CompactTreeChartModule extends AbstractModule implements ModuleChartInterf Auth::checkComponentAccess($this, 'chart', $tree, $user); if ($ajax === '1') { - return $this->chartCompact($individual, $chart_service); + return $this->chartCompact($individual, $this->chart_service); } $ajax_url = $this->chartUrl($individual, [ diff --git a/app/Module/CustomCssJsModule.php b/app/Module/CustomCssJsModule.php index abed48578f..88c69740f9 100644 --- a/app/Module/CustomCssJsModule.php +++ b/app/Module/CustomCssJsModule.php @@ -54,9 +54,11 @@ class CustomCssJsModule extends AbstractModule implements ModuleConfigInterface, /** * Show a form to edit the user CSS and JS. * + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function getAdminAction(): ResponseInterface + public function getAdminAction(ServerRequestInterface $request): ResponseInterface { $this->layout = 'layouts/administration'; diff --git a/app/Module/DescendancyChartModule.php b/app/Module/DescendancyChartModule.php index 82ef82e851..e50007a56d 100644 --- a/app/Module/DescendancyChartModule.php +++ b/app/Module/DescendancyChartModule.php @@ -18,7 +18,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; @@ -54,6 +53,18 @@ class DescendancyChartModule extends AbstractModule implements ModuleChartInterf /** @var string[] */ protected $dabo_sex = []; + /** @var ChartService */ + private $chart_service; + + /** + * DescendancyChartModule constructor. + * + * @param ChartService $chart_service + */ + public function __construct(ChartService $chart_service) { + $this->chart_service = $chart_service; + } + /** * How should this module be identified in the control panel, etc.? * @@ -115,14 +126,13 @@ class DescendancyChartModule extends AbstractModule implements ModuleChartInterf * A form to request the chart parameters. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user - * @param ChartService $chart_service * * @return ResponseInterface */ - public function getChartAction(ServerRequestInterface $request, Tree $tree, UserInterface $user, ChartService $chart_service): ResponseInterface + public function getChartAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $ajax = $request->getQueryParams()['ajax'] ?? ''; $xref = $request->getQueryParams()['xref'] ?? ''; $individual = Individual::getInstance($xref, $tree); @@ -137,7 +147,7 @@ class DescendancyChartModule extends AbstractModule implements ModuleChartInterf $generations = max($generations, self::MINIMUM_GENERATIONS); if ($ajax === '1') { - return $this->chart($request, $tree, $chart_service); + return $this->chart($request); } $ajax_url = $this->chartUrl($individual, [ @@ -162,15 +172,14 @@ class DescendancyChartModule extends AbstractModule implements ModuleChartInterf /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param ChartService $chart_service * * @return ResponseInterface */ - public function chart(ServerRequestInterface $request, Tree $tree, ChartService $chart_service): ResponseInterface + public function chart(ServerRequestInterface $request): ResponseInterface { $this->layout = 'layouts/ajax'; + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -188,12 +197,12 @@ class DescendancyChartModule extends AbstractModule implements ModuleChartInterf return response(view('modules/descendancy_chart/tree', ['individual' => $individual, 'generations' => $generations, 'daboville' => '1'])); case self::CHART_STYLE_INDIVIDUALS: - $individuals = $chart_service->descendants($individual, $generations - 1); + $individuals = $this->chart_service->descendants($individual, $generations - 1); return $this->descendantsIndividuals($tree, $individuals); case self::CHART_STYLE_FAMILIES: - $families = $chart_service->descendantFamilies($individual, $generations - 1); + $families = $this->chart_service->descendantFamilies($individual, $generations - 1); return $this->descendantsFamilies($tree, $families); } diff --git a/app/Module/DescendancyModule.php b/app/Module/DescendancyModule.php index 27a6dd574c..c536c1d768 100644 --- a/app/Module/DescendancyModule.php +++ b/app/Module/DescendancyModule.php @@ -21,7 +21,6 @@ use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Services\SearchService; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use function view; @@ -33,6 +32,18 @@ class DescendancyModule extends AbstractModule implements ModuleSidebarInterface { use ModuleSidebarTrait; + /** @var SearchService */ + private $search_service; + + /** + * DescendancyModule constructor. + * + * @param SearchService $search_service + */ + public function __construct(SearchService $search_service) { + $this->search_service = $search_service; + } + /** * How should this module be identified in the control panel, etc.? * @@ -67,19 +78,18 @@ class DescendancyModule extends AbstractModule implements ModuleSidebarInterface /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param SearchService $search_service * * @return ResponseInterface */ - public function getSearchAction(ServerRequestInterface $request, Tree $tree, SearchService $search_service): ResponseInterface + public function getSearchAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $search = $request->getQueryParams()['search']; $html = ''; if (strlen($search) >= 2) { - $html = $search_service + $html = $this->search_service ->searchIndividualNames([$tree], [$search]) ->map(function (Individual $individual): string { return $this->getPersonLi($individual); @@ -96,12 +106,12 @@ class DescendancyModule extends AbstractModule implements ModuleSidebarInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function getDescendantsAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function getDescendantsAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); diff --git a/app/Module/FamilyBookChartModule.php b/app/Module/FamilyBookChartModule.php index a34931bc9f..27a1bac2d1 100644 --- a/app/Module/FamilyBookChartModule.php +++ b/app/Module/FamilyBookChartModule.php @@ -18,11 +18,9 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use function view; @@ -104,13 +102,13 @@ class FamilyBookChartModule extends AbstractModule implements ModuleChartInterfa * A form to request the chart parameters. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function getChartAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function getChartAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $ajax = $request->getQueryParams()['ajax'] ?? ''; $xref = $request->getQueryParams()['xref'] ?? ''; $individual = Individual::getInstance($xref, $tree); diff --git a/app/Module/FamilyListModule.php b/app/Module/FamilyListModule.php index fcc48f0b37..26e404e77e 100644 --- a/app/Module/FamilyListModule.php +++ b/app/Module/FamilyListModule.php @@ -17,12 +17,10 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\Controllers\ListController; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\IndividualListService; use Fisharebest\Webtrees\Services\LocalizationService; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Auth; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -68,17 +66,18 @@ class FamilyListModule extends AbstractModule implements ModuleListInterface /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function getListAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function getListAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); $listController = new ListController(app(IndividualListService::class), app(LocalizationService::class)); - return $listController->familyList($request, $tree, $user, $this); + return $listController->familyList($request, $this); } /** diff --git a/app/Module/FamilyTreeFavoritesModule.php b/app/Module/FamilyTreeFavoritesModule.php index 399a5680f2..0a7a806974 100644 --- a/app/Module/FamilyTreeFavoritesModule.php +++ b/app/Module/FamilyTreeFavoritesModule.php @@ -18,7 +18,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\I18N; @@ -153,13 +152,13 @@ class FamilyTreeFavoritesModule extends AbstractModule implements ModuleBlockInt /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function postAddFavoriteAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function postAddFavoriteAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $params = $request->getParsedBody(); $note = $params['note']; @@ -187,13 +186,13 @@ class FamilyTreeFavoritesModule extends AbstractModule implements ModuleBlockInt /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function postDeleteFavoriteAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function postDeleteFavoriteAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $favorite_id = $request->getQueryParams()['favorite_id']; if (Auth::isManager($tree, $user)) { diff --git a/app/Module/FamilyTreeNewsModule.php b/app/Module/FamilyTreeNewsModule.php index 735c2a9da4..0715b2b0ed 100644 --- a/app/Module/FamilyTreeNewsModule.php +++ b/app/Module/FamilyTreeNewsModule.php @@ -146,12 +146,13 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleBlockInterfac /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function getEditNewsAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function getEditNewsAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + if (!Auth::isManager($tree)) { throw new AccessDeniedHttpException(); } @@ -182,12 +183,13 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleBlockInterfac /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postEditNewsAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postEditNewsAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + if (!Auth::isManager($tree)) { throw new AccessDeniedHttpException(); } @@ -224,12 +226,12 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleBlockInterfac /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postDeleteNewsAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postDeleteNewsAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $news_id = $request->getQueryParams()['news_id']; if (!Auth::isManager($tree)) { diff --git a/app/Module/FanChartModule.php b/app/Module/FanChartModule.php index a0ae250ebd..a0904223a4 100644 --- a/app/Module/FanChartModule.php +++ b/app/Module/FanChartModule.php @@ -18,12 +18,10 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Services\ChartService; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Webtrees; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -51,6 +49,18 @@ class FanChartModule extends AbstractModule implements ModuleChartInterface private const DEFAULT_GENERATIONS = 4; private const DEFAULT_WIDTH = 100; + /** @var ChartService */ + private $chart_service; + + /** + * FanChartModule constructor. + * + * @param ChartService $chart_service + */ + public function __construct(ChartService $chart_service) { + $this->chart_service = $chart_service; + } + /** * How should this module be identified in the control panel, etc.? * @@ -112,14 +122,13 @@ class FanChartModule extends AbstractModule implements ModuleChartInterface * A form to request the chart parameters. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user - * @param ChartService $chart_service * * @return ResponseInterface */ - public function getChartAction(ServerRequestInterface $request, Tree $tree, UserInterface $user, ChartService $chart_service): ResponseInterface + public function getChartAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $ajax = $request->getQueryParams()['ajax'] ?? ''; $xref = $request->getQueryParams()['xref'] ?? ''; $individual = Individual::getInstance($xref, $tree); @@ -138,7 +147,7 @@ class FanChartModule extends AbstractModule implements ModuleChartInterface $generations = max($generations, self::MINIMUM_GENERATIONS); if ($ajax === '1') { - return $this->chart($individual, $chart_style, $fan_width, $generations, $chart_service); + return $this->chart($individual, $chart_style, $fan_width, $generations, $this->chart_service); } $ajax_url = $this->chartUrl($individual, [ diff --git a/app/Module/FrequentlyAskedQuestionsModule.php b/app/Module/FrequentlyAskedQuestionsModule.php index 95c980234e..dbdba12be7 100644 --- a/app/Module/FrequentlyAskedQuestionsModule.php +++ b/app/Module/FrequentlyAskedQuestionsModule.php @@ -102,14 +102,15 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getAdminAction(Tree $tree): ResponseInterface + public function getAdminAction(ServerRequestInterface $request): ResponseInterface { $this->layout = 'layouts/administration'; + $tree = $request->getAttribute('tree'); $faqs = $this->faqsForTree($tree); $min_block_order = DB::table('block') @@ -144,12 +145,12 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postAdminDeleteAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postAdminDeleteAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $block_id = (int) $request->getQueryParams()['block_id']; DB::table('block_setting')->where('block_id', '=', $block_id)->delete(); @@ -167,12 +168,12 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postAdminMoveDownAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postAdminMoveDownAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $block_id = (int) $request->getQueryParams()['block_id']; $block_order = DB::table('block') @@ -216,12 +217,12 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postAdminMoveUpAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postAdminMoveUpAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $block_id = (int) $request->getQueryParams()['block_id']; $block_order = DB::table('block') @@ -265,14 +266,14 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function getAdminEditAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function getAdminEditAction(ServerRequestInterface $request): ResponseInterface { $this->layout = 'layouts/administration'; + $tree = $request->getAttribute('tree'); $block_id = (int) ($request->getQueryParams()['block_id'] ?? 0); if ($block_id === 0) { @@ -317,12 +318,12 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postAdminEditAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postAdminEditAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $block_id = (int) ($request->getQueryParams()['block_id'] ?? 0); $params = $request->getParsedBody(); @@ -367,12 +368,14 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getShowAction(Tree $tree): ResponseInterface + public function getShowAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + // Filter foreign languages. $faqs = $this->faqsForTree($tree) ->filter(static function (stdClass $faq): bool { diff --git a/app/Module/HourglassChartModule.php b/app/Module/HourglassChartModule.php index b1912ae2f1..4aba7c43c7 100644 --- a/app/Module/HourglassChartModule.php +++ b/app/Module/HourglassChartModule.php @@ -18,7 +18,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; @@ -94,13 +93,13 @@ class HourglassChartModule extends AbstractModule implements ModuleChartInterfac * A form to request the chart parameters. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function getChartAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function getChartAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $ajax = $request->getQueryParams()['ajax'] ?? ''; $xref = $request->getQueryParams()['xref'] ?? ''; $individual = Individual::getInstance($xref, $tree); diff --git a/app/Module/IndividualListModule.php b/app/Module/IndividualListModule.php index 6e2d839393..38a35b56b0 100644 --- a/app/Module/IndividualListModule.php +++ b/app/Module/IndividualListModule.php @@ -17,12 +17,10 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\Controllers\ListController; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\IndividualListService; use Fisharebest\Webtrees\Services\LocalizationService; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Auth; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -68,17 +66,19 @@ class IndividualListModule extends AbstractModule implements ModuleListInterface /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function getListAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function getListAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); $listController = new ListController(app(IndividualListService::class), app(LocalizationService::class)); - return $listController->individualList($request, $tree, $user, $this); + + return $listController->individualList($request, $this); } /** diff --git a/app/Module/InteractiveTreeModule.php b/app/Module/InteractiveTreeModule.php index aa6fea6b83..3c5c6b8fee 100644 --- a/app/Module/InteractiveTreeModule.php +++ b/app/Module/InteractiveTreeModule.php @@ -18,14 +18,12 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Exceptions\IndividualAccessDeniedException; use Fisharebest\Webtrees\Exceptions\IndividualNotFoundException; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Module\InteractiveTree\TreeView; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -179,13 +177,13 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function getChartAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function getChartAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -208,12 +206,12 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function getDetailsAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function getDetailsAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $pid = $request->getQueryParams()['pid']; $individual = Individual::getInstance($pid, $tree); @@ -233,12 +231,12 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function getPersonsAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function getPersonsAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $q = $request->getQueryParams()['q']; $instance = $request->getQueryParams()['instance']; $treeview = new TreeView($instance); diff --git a/app/Module/LifespansChartModule.php b/app/Module/LifespansChartModule.php index 2d21cf4bf8..43173cd920 100644 --- a/app/Module/LifespansChartModule.php +++ b/app/Module/LifespansChartModule.php @@ -20,7 +20,6 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\ExtCalendar\GregorianCalendar; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\ColorGenerator; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Date; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; @@ -99,13 +98,14 @@ class LifespansChartModule extends AbstractModule implements ModuleChartInterfac * A form to request the chart parameters. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function getChartAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function getChartAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + Auth::checkComponentAccess($this, 'chart', $tree, $user); $ajax = $request->getQueryParams()['ajax'] ?? ''; diff --git a/app/Module/MediaListModule.php b/app/Module/MediaListModule.php index b99499228a..9e860eb96f 100644 --- a/app/Module/MediaListModule.php +++ b/app/Module/MediaListModule.php @@ -17,7 +17,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\Controllers\ListController; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\IndividualListService; @@ -69,17 +68,18 @@ class MediaListModule extends AbstractModule implements ModuleListInterface /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function getListAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function getListAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); $listController = new ListController(app(IndividualListService::class), app(LocalizationService::class)); - return $listController->mediaList($request, $tree); + return $listController->mediaList($request); } /** diff --git a/app/Module/ModuleAnalyticsInterface.php b/app/Module/ModuleAnalyticsInterface.php index 265158e368..0bccf6c4b6 100644 --- a/app/Module/ModuleAnalyticsInterface.php +++ b/app/Module/ModuleAnalyticsInterface.php @@ -56,9 +56,11 @@ interface ModuleAnalyticsInterface extends ModuleInterface public function analyticsSnippet(array $parameters): string; /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function getAdminAction(): ResponseInterface; + public function getAdminAction(ServerRequestInterface $request): ResponseInterface; /** * @param ServerRequestInterface $request diff --git a/app/Module/ModuleAnalyticsTrait.php b/app/Module/ModuleAnalyticsTrait.php index 7085baa4fd..1cbd356fd9 100644 --- a/app/Module/ModuleAnalyticsTrait.php +++ b/app/Module/ModuleAnalyticsTrait.php @@ -74,9 +74,11 @@ trait ModuleAnalyticsTrait } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function getAdminAction(): ResponseInterface + public function getAdminAction(ServerRequestInterface $request): ResponseInterface { $this->layout = 'layouts/administration'; diff --git a/app/Module/NoteListModule.php b/app/Module/NoteListModule.php index 1520737623..dad5cc93c1 100644 --- a/app/Module/NoteListModule.php +++ b/app/Module/NoteListModule.php @@ -17,7 +17,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\Controllers\ListController; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\IndividualListService; @@ -26,6 +25,7 @@ use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Auth; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; /** * Class IndividualListModule @@ -67,13 +67,15 @@ class NoteListModule extends AbstractModule implements ModuleListInterface } /** - * @param Tree $tree - * @param UserInterface $user + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getListAction(Tree $tree, UserInterface $user): ResponseInterface + public function getListAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); $listController = new ListController(app(IndividualListService::class), app(LocalizationService::class)); diff --git a/app/Module/PedigreeChartModule.php b/app/Module/PedigreeChartModule.php index a0b72ef6a3..3aba947218 100644 --- a/app/Module/PedigreeChartModule.php +++ b/app/Module/PedigreeChartModule.php @@ -18,13 +18,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Functions\FunctionsEdit; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Services\ChartService; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -57,6 +55,18 @@ class PedigreeChartModule extends AbstractModule implements ModuleChartInterface protected const DEFAULT_ORIENTATION = self::ORIENTATION_RIGHT; + /** @var ChartService */ + private $chart_service; + + /** + * PedigreeChartModule constructor. + * + * @param ChartService $chart_service + */ + public function __construct(ChartService $chart_service) { + $this->chart_service = $chart_service; + } + /** * How should this module be identified in the control panel, etc.? * @@ -118,14 +128,13 @@ class PedigreeChartModule extends AbstractModule implements ModuleChartInterface * A form to request the chart parameters. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user - * @param ChartService $chart_service * * @return ResponseInterface */ - public function getChartAction(ServerRequestInterface $request, Tree $tree, UserInterface $user, ChartService $chart_service): ResponseInterface + public function getChartAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $ajax = $request->getQueryParams()['ajax'] ?? ''; $xref = $request->getQueryParams()['xref'] ?? ''; $individual = Individual::getInstance($xref, $tree); @@ -142,7 +151,7 @@ class PedigreeChartModule extends AbstractModule implements ModuleChartInterface $generation_options = $this->generationOptions(); if ($ajax === '1') { - return $this->chart($individual, $orientation, $generations, $chart_service); + return $this->chart($individual, $orientation, $generations, $this->chart_service); } $ajax_url = $this->chartUrl($individual, [ diff --git a/app/Module/PedigreeMapModule.php b/app/Module/PedigreeMapModule.php index e109665693..f99c90df86 100644 --- a/app/Module/PedigreeMapModule.php +++ b/app/Module/PedigreeMapModule.php @@ -66,6 +66,18 @@ class PedigreeMapModule extends AbstractModule implements ModuleChartInterface // Light green ]; + /** @var ChartService */ + private $chart_service; + + /** + * PedigreeMapModule constructor. + * + * @param ChartService $chart_service + */ + public function __construct(ChartService $chart_service) { + $this->chart_service = $chart_service; + } + /** * How should this module be identified in the control panel, etc.? * @@ -143,18 +155,17 @@ class PedigreeMapModule extends AbstractModule implements ModuleChartInterface /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param ChartService $chart_service * * @return ResponseInterface */ - public function getMapDataAction(ServerRequestInterface $request, Tree $tree, ChartService $chart_service): ResponseInterface + public function getMapDataAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['reference']; $indi = Individual::getInstance($xref, $tree); $color_count = count(self::LINE_COLORS); - $facts = $this->getPedigreeMapFacts($request, $tree, $chart_service); + $facts = $this->getPedigreeMapFacts($request, $this->chart_service); $geojson = [ 'type' => 'FeatureCollection', @@ -223,13 +234,13 @@ class PedigreeMapModule extends AbstractModule implements ModuleChartInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * @param ChartService $chart_service * * @return array */ - private function getPedigreeMapFacts(ServerRequestInterface $request, Tree $tree, ChartService $chart_service): array + private function getPedigreeMapFacts(ServerRequestInterface $request, ChartService $chart_service): array { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['reference']; $individual = Individual::getInstance($xref, $tree); $generations = (int) $request->getQueryParams()['generations']; @@ -294,12 +305,12 @@ class PedigreeMapModule extends AbstractModule implements ModuleChartInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return object */ - public function getPedigreeMapAction(ServerRequestInterface $request, Tree $tree) + public function getPedigreeMapAction(ServerRequestInterface $request) { + $tree = $request->getAttribute('tree'); $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); $generations = $request->getQueryParams()['generations'] ?? self::DEFAULT_GENERATIONS; diff --git a/app/Module/PlaceHierarchyListModule.php b/app/Module/PlaceHierarchyListModule.php index d81e3777a5..9f55abd68c 100644 --- a/app/Module/PlaceHierarchyListModule.php +++ b/app/Module/PlaceHierarchyListModule.php @@ -18,12 +18,10 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\Controllers\PlaceHierarchyController; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\SearchService; use Fisharebest\Webtrees\Statistics; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -68,17 +66,17 @@ class PlaceHierarchyListModule extends AbstractModule implements ModuleListInter /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function getListAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function getListAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); - $listController = new PlaceHierarchyController(app(Statistics::class)); - return $listController->show($request, $tree, app(SearchService::class)); + return app(PlaceHierarchyController::class)->show($request); } /** diff --git a/app/Module/RelationshipsChartModule.php b/app/Module/RelationshipsChartModule.php index c3f6ca22dd..9cb6d5acad 100644 --- a/app/Module/RelationshipsChartModule.php +++ b/app/Module/RelationshipsChartModule.php @@ -20,7 +20,6 @@ namespace Fisharebest\Webtrees\Module; use Closure; use Fisharebest\Algorithm\Dijkstra; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\Functions\Functions; @@ -124,9 +123,11 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function getAdminAction(): ResponseInterface + public function getAdminAction(ServerRequestInterface $request): ResponseInterface { $this->layout = 'layouts/administration'; @@ -193,13 +194,13 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte * A form to request the chart parameters. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function getChartAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function getChartAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $ajax = $request->getQueryParams()['ajax'] ?? ''; $xref = $request->getQueryParams()['xref'] ?? ''; diff --git a/app/Module/RepositoryListModule.php b/app/Module/RepositoryListModule.php index 052ddd93da..5fe96bb41d 100644 --- a/app/Module/RepositoryListModule.php +++ b/app/Module/RepositoryListModule.php @@ -17,7 +17,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\Controllers\ListController; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\IndividualListService; @@ -26,6 +25,7 @@ use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Auth; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; /** * Class RepositoryListModule @@ -67,17 +67,19 @@ class RepositoryListModule extends AbstractModule implements ModuleListInterface } /** - * @param Tree $tree - * @param UserInterface $user + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getListAction(Tree $tree, UserInterface $user): ResponseInterface + public function getListAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); $listController = new ListController(app(IndividualListService::class), app(LocalizationService::class)); - return $listController->repositoryList($tree); + return $listController->repositoryList($request); } /** diff --git a/app/Module/SiteMapModule.php b/app/Module/SiteMapModule.php index 9150dd5970..3ecf5be92d 100644 --- a/app/Module/SiteMapModule.php +++ b/app/Module/SiteMapModule.php @@ -68,9 +68,11 @@ class SiteMapModule extends AbstractModule implements ModuleConfigInterface } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function getAdminAction(): ResponseInterface + public function getAdminAction(ServerRequestInterface $request): ResponseInterface { $this->layout = 'layouts/administration'; @@ -124,9 +126,11 @@ class SiteMapModule extends AbstractModule implements ModuleConfigInterface } /** + * @param ServerRequestInterface $request + * * @return ResponseInterface */ - public function getIndexAction(): ResponseInterface + public function getIndexAction(ServerRequestInterface $request): ResponseInterface { $timestamp = (int) $this->getPreference('sitemap.timestamp'); diff --git a/app/Module/SourceListModule.php b/app/Module/SourceListModule.php index abd977ab18..0f29623b02 100644 --- a/app/Module/SourceListModule.php +++ b/app/Module/SourceListModule.php @@ -17,7 +17,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\Controllers\ListController; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\IndividualListService; @@ -26,6 +25,7 @@ use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Auth; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; /** * Class RepositoryListModule @@ -67,17 +67,19 @@ class SourceListModule extends AbstractModule implements ModuleListInterface } /** - * @param Tree $tree - * @param UserInterface $user + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getListAction(Tree $tree, UserInterface $user): ResponseInterface + public function getListAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); $listController = new ListController(app(IndividualListService::class), app(LocalizationService::class)); - return $listController->sourceList($tree); + return $listController->sourceList($request); } /** diff --git a/app/Module/StatisticsChartModule.php b/app/Module/StatisticsChartModule.php index 3c7f723825..5cf1943612 100644 --- a/app/Module/StatisticsChartModule.php +++ b/app/Module/StatisticsChartModule.php @@ -18,15 +18,14 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Date; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Statistics; -use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use function app; use function array_key_exists; use function array_keys; use function array_map; @@ -132,13 +131,15 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa /** * A form to request the chart parameters. * - * @param Tree $tree - * @param UserInterface $user + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getChartAction(Tree $tree, UserInterface $user): ResponseInterface + public function getChartAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + Auth::checkComponentAccess($this, 'chart', $tree, $user); $tabs = [ @@ -171,57 +172,59 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa } /** - * @param Statistics $statistics + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getIndividualsAction(Statistics $statistics): ResponseInterface + public function getIndividualsAction(ServerRequestInterface $request): ResponseInterface { $this->layout = 'layouts/ajax'; return $this->viewResponse('modules/statistics-chart/individuals', [ 'show_oldest_living' => Auth::check(), - 'stats' => $statistics, + 'stats' => app(Statistics::class), ]); } /** - * @param Statistics $stats + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getFamiliesAction(Statistics $stats): ResponseInterface + public function getFamiliesAction(ServerRequestInterface $request): ResponseInterface { $this->layout = 'layouts/ajax'; return $this->viewResponse('modules/statistics-chart/families', [ - 'stats' => $stats, + 'stats' => app(Statistics::class), ]); } /** - * @param Statistics $stats + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getOtherAction(Statistics $stats): ResponseInterface + public function getOtherAction(ServerRequestInterface $request): ResponseInterface { $this->layout = 'layouts/ajax'; return $this->viewResponse('modules/statistics-chart/other', [ - 'stats' => $stats, + 'stats' => app(Statistics::class), ]); } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getCustomAction(Tree $tree): ResponseInterface + public function getCustomAction(ServerRequestInterface $request): ResponseInterface { $this->layout = 'layouts/ajax'; + $tree = $request->getAttribute('tree'); + return $this->viewResponse('modules/statistics-chart/custom', [ 'module' => $this, 'tree' => $tree, @@ -230,12 +233,13 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa /** * @param ServerRequestInterface $request - * @param Statistics $statistics * * @return ResponseInterface */ - public function getCustomChartAction(ServerRequestInterface $request, Statistics $statistics): ResponseInterface + public function getCustomChartAction(ServerRequestInterface $request): ResponseInterface { + $statistics = app(Statistics::class); + $params = $request->getQueryParams(); $x_axis_type = (int) $params['x-as']; diff --git a/app/Module/StoriesModule.php b/app/Module/StoriesModule.php index ae33e86bc5..9cf5146292 100644 --- a/app/Module/StoriesModule.php +++ b/app/Module/StoriesModule.php @@ -196,14 +196,16 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getAdminAction(Tree $tree): ResponseInterface + public function getAdminAction(ServerRequestInterface $request): ResponseInterface { $this->layout = 'layouts/administration'; + $tree = $request->getAttribute('tree'); + $stories = DB::table('block') ->where('module_name', '=', $this->name()) ->where('gedcom_id', '=', $tree->id()) @@ -228,14 +230,14 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function getAdminEditAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function getAdminEditAction(ServerRequestInterface $request): ResponseInterface { $this->layout = 'layouts/administration'; + $tree = $request->getAttribute('tree'); $block_id = (int) ($request->getQueryParams()['block_id'] ?? 0); if ($block_id === 0) { @@ -273,12 +275,12 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postAdminEditAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postAdminEditAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $block_id = (int) ($request->getQueryParams()['block_id'] ?? 0); $params = $request->getParsedBody(); @@ -324,12 +326,12 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postAdminDeleteAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postAdminDeleteAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $block_id = $request->getQueryParams()['block_id']; DB::table('block_setting') @@ -350,12 +352,14 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod } /** - * @param Tree $tree + * @param ServerRequestInterface $request * * @return ResponseInterface */ - public function getShowListAction(Tree $tree): ResponseInterface + public function getShowListAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $stories = DB::table('block') ->where('module_name', '=', $this->name()) ->where('gedcom_id', '=', $tree->id()) diff --git a/app/Module/TimelineChartModule.php b/app/Module/TimelineChartModule.php index 67b4e9188c..87fd82fc1c 100644 --- a/app/Module/TimelineChartModule.php +++ b/app/Module/TimelineChartModule.php @@ -18,7 +18,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Date\GregorianDate; use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\GedcomRecord; @@ -108,13 +107,14 @@ class TimelineChartModule extends AbstractModule implements ModuleChartInterface * A form to request the chart parameters. * * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function getChartAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function getChartAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); + Auth::checkComponentAccess($this, 'chart', $tree, $user); $ajax = $request->getQueryParams()['ajax'] ?? ''; diff --git a/app/Module/UserFavoritesModule.php b/app/Module/UserFavoritesModule.php index 5b6c373229..b549bd2548 100644 --- a/app/Module/UserFavoritesModule.php +++ b/app/Module/UserFavoritesModule.php @@ -154,13 +154,13 @@ class UserFavoritesModule extends AbstractModule implements ModuleBlockInterface /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function postAddFavoriteAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function postAddFavoriteAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $params = $request->getParsedBody(); $note = $params['note']; @@ -188,13 +188,13 @@ class UserFavoritesModule extends AbstractModule implements ModuleBlockInterface /** * @param ServerRequestInterface $request - * @param Tree $tree - * @param UserInterface $user * * @return ResponseInterface */ - public function postDeleteFavoriteAction(ServerRequestInterface $request, Tree $tree, UserInterface $user): ResponseInterface + public function postDeleteFavoriteAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + $user = $request->getAttribute('user'); $favorite_id = $request->getQueryParams()['favorite_id']; if (Auth::check()) { diff --git a/app/Module/UserJournalModule.php b/app/Module/UserJournalModule.php index c80af2f0ee..36ab8d31f3 100644 --- a/app/Module/UserJournalModule.php +++ b/app/Module/UserJournalModule.php @@ -181,12 +181,13 @@ class UserJournalModule extends AbstractModule implements ModuleBlockInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postEditJournalAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postEditJournalAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); + if (!Auth::check()) { throw new AccessDeniedHttpException(); } @@ -223,12 +224,12 @@ class UserJournalModule extends AbstractModule implements ModuleBlockInterface /** * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postDeleteJournalAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postDeleteJournalAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $news_id = $request->getQueryParams()['news_id']; DB::table('news') diff --git a/app/Module/UserMessagesModule.php b/app/Module/UserMessagesModule.php index c2c048161c..c99c64186d 100644 --- a/app/Module/UserMessagesModule.php +++ b/app/Module/UserMessagesModule.php @@ -79,12 +79,12 @@ class UserMessagesModule extends AbstractModule implements ModuleBlockInterface * Delete one or messages belonging to a user. * * @param ServerRequestInterface $request - * @param Tree $tree * * @return ResponseInterface */ - public function postDeleteMessageAction(ServerRequestInterface $request, Tree $tree): ResponseInterface + public function postDeleteMessageAction(ServerRequestInterface $request): ResponseInterface { + $tree = $request->getAttribute('tree'); $message_ids = $request->getParsedBody()['message_id'] ?? []; DB::table('message') diff --git a/app/Router.php b/app/Router.php index e32d926f5a..aca3d9d362 100644 --- a/app/Router.php +++ b/app/Router.php @@ -105,9 +105,7 @@ class Router implements MiddlewareInterface, RequestMethodInterface if (Str::contains($routing, self::SCOPE_OPERATOR)) { [$class, $method] = explode(self::SCOPE_OPERATOR, $routing); - $controller = app(self::CONTROLLER_NAMESPACE . $class); - - return app()->dispatch($controller, $method); + return app(self::CONTROLLER_NAMESPACE . $class)->$method($request); } // Routes defined using a request handler diff --git a/app/Services/MailService.php b/app/Services/MailService.php index 2e4d3d45e5..cc2f98847c 100644 --- a/app/Services/MailService.php +++ b/app/Services/MailService.php @@ -30,7 +30,6 @@ use Swift_Signers_DKIMSigner; use Swift_SmtpTransport; use Swift_Transport; use Throwable; -use function app; use function filter_var; use function function_exists; use function gethostbyaddr; diff --git a/app/SiteUser.php b/app/SiteUser.php index d4cacd7eb7..4bc3be6992 100644 --- a/app/SiteUser.php +++ b/app/SiteUser.php @@ -18,7 +18,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees; use Fisharebest\Webtrees\Contracts\UserInterface; -use Fisharebest\Webtrees\Services\MailService; /** * The site can act as a user, for example to send email. diff --git a/resources/views/admin/trees-preferences.phtml b/resources/views/admin/trees-preferences.phtml index 424cbd0b6b..4e319230ea 100644 --- a/resources/views/admin/trees-preferences.phtml +++ b/resources/views/admin/trees-preferences.phtml @@ -2,7 +2,6 @@ use Fisharebest\Webtrees\Functions\FunctionsEdit; use Fisharebest\Webtrees\I18N; -use Fisharebest\Webtrees\Site; ?> diff --git a/resources/views/emails/approve-user-html.phtml b/resources/views/emails/approve-user-html.phtml index b4fe7d0598..4c14f7cc2c 100644 --- a/resources/views/emails/approve-user-html.phtml +++ b/resources/views/emails/approve-user-html.phtml @@ -1,5 +1,5 @@ - + +
>

' . e($user->realName()) . '') ?> diff --git a/resources/views/lists/individuals-table.phtml b/resources/views/lists/individuals-table.phtml index a076155944..04b3fc28a9 100644 --- a/resources/views/lists/individuals-table.phtml +++ b/resources/views/lists/individuals-table.phtml @@ -401,7 +401,7 @@ $deathAgeData = [ - + xref()]) && $age_at_death_years >= 0 && $age_at_death_years <= $max_age) : ?> diff --git a/resources/views/media-page-menu.phtml b/resources/views/media-page-menu.phtml index 7d63c99e0c..36ff06504e 100644 --- a/resources/views/media-page-menu.phtml +++ b/resources/views/media-page-menu.phtml @@ -1,7 +1,5 @@ - -