diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2225,6 +2225,7 @@ 'PhabricatorProjectTransactionQuery' => 'applications/project/query/PhabricatorProjectTransactionQuery.php', 'PhabricatorProjectUIEventListener' => 'applications/project/events/PhabricatorProjectUIEventListener.php', 'PhabricatorProjectUpdateController' => 'applications/project/controller/PhabricatorProjectUpdateController.php', + 'PhabricatorProjectViewController' => 'applications/project/controller/PhabricatorProjectViewController.php', 'PhabricatorProjectWatchController' => 'applications/project/controller/PhabricatorProjectWatchController.php', 'PhabricatorProjectWikiExplainController' => 'applications/project/controller/PhabricatorProjectWikiExplainController.php', 'PhabricatorProjectsPolicyRule' => 'applications/policy/rule/PhabricatorProjectsPolicyRule.php', @@ -5445,6 +5446,7 @@ 'PhabricatorProjectTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PhabricatorProjectUIEventListener' => 'PhabricatorEventListener', 'PhabricatorProjectUpdateController' => 'PhabricatorProjectController', + 'PhabricatorProjectViewController' => 'PhabricatorProjectController', 'PhabricatorProjectWatchController' => 'PhabricatorProjectController', 'PhabricatorProjectWikiExplainController' => 'PhabricatorProjectController', 'PhabricatorProjectsPolicyRule' => 'PhabricatorPolicyRule', diff --git a/src/applications/project/application/PhabricatorProjectApplication.php b/src/applications/project/application/PhabricatorProjectApplication.php --- a/src/applications/project/application/PhabricatorProjectApplication.php +++ b/src/applications/project/application/PhabricatorProjectApplication.php @@ -52,8 +52,10 @@ => 'PhabricatorProjectMembersEditController', 'members/(?P<id>[1-9]\d*)/remove/' => 'PhabricatorProjectMembersRemoveController', - 'view/(?P<id>[1-9]\d*)/' + 'profile/(?P<id>[1-9]\d*)/' => 'PhabricatorProjectProfileController', + 'view/(?P<id>[1-9]\d*)/' + => 'PhabricatorProjectViewController', 'picture/(?P<id>[1-9]\d*)/' => 'PhabricatorProjectEditPictureController', 'icon/(?P<id>[1-9]\d*)/' @@ -86,7 +88,7 @@ 'wiki/' => 'PhabricatorProjectWikiExplainController', ), '/tag/' => array( - '(?P<slug>[^/]+)/' => 'PhabricatorProjectProfileController', + '(?P<slug>[^/]+)/' => 'PhabricatorProjectViewController', '(?P<slug>[^/]+)/board/' => 'PhabricatorProjectBoardViewController', ), ); diff --git a/src/applications/project/controller/PhabricatorProjectProfileController.php b/src/applications/project/controller/PhabricatorProjectProfileController.php --- a/src/applications/project/controller/PhabricatorProjectProfileController.php +++ b/src/applications/project/controller/PhabricatorProjectProfileController.php @@ -3,22 +3,11 @@ final class PhabricatorProjectProfileController extends PhabricatorProjectController { - private $id; - private $slug; - public function shouldAllowPublic() { return true; } - public function willProcessRequest(array $data) { - // via /project/view/$id/ - $this->id = idx($data, 'id'); - // via /tag/$slug/ - $this->slug = idx($data, 'slug'); - } - - public function processRequest() { - $request = $this->getRequest(); + public function handleRequest(AphrontRequest $request) { $user = $request->getUser(); $query = id(new PhabricatorProjectQuery()) @@ -27,16 +16,18 @@ ->needWatchers(true) ->needImages(true) ->needSlugs(true); - if ($this->slug) { - $query->withSlugs(array($this->slug)); + $id = $request->getURIData('id'); + $slug = $request->getURIData('slug'); + if ($slug) { + $query->withSlugs(array($slug)); } else { - $query->withIDs(array($this->id)); + $query->withIDs(array($id)); } $project = $query->executeOne(); if (!$project) { return new Aphront404Response(); } - if ($this->slug && $this->slug != $project->getPrimarySlug()) { + if ($slug && $slug != $project->getPrimarySlug()) { return id(new AphrontRedirectResponse()) ->setURI('/tag/'.$project->getPrimarySlug().'/'); } @@ -53,7 +44,7 @@ $project->getPHID(), )); $query->setLimit(50); - $query->setViewer($this->getRequest()->getUser()); + $query->setViewer($request->getUser()); $stories = $query->execute(); $feed = $this->renderStories($stories); diff --git a/src/applications/project/controller/PhabricatorProjectViewController.php b/src/applications/project/controller/PhabricatorProjectViewController.php new file mode 100644 --- /dev/null +++ b/src/applications/project/controller/PhabricatorProjectViewController.php @@ -0,0 +1,60 @@ +<?php + +final class PhabricatorProjectViewController + extends PhabricatorProjectController { + + public function shouldAllowPublic() { + return true; + } + + public function handleRequest(AphrontRequest $request) { + $request = $this->getRequest(); + $user = $request->getUser(); + + $query = id(new PhabricatorProjectQuery()) + ->setViewer($user) + ->needMembers(true) + ->needWatchers(true) + ->needImages(true) + ->needSlugs(true); + $id = $request->getURIData('id'); + $slug = $request->getURIData('slug'); + if ($slug) { + $query->withSlugs(array($slug)); + } else { + $query->withIDs(array($id)); + } + $project = $query->executeOne(); + if (!$project) { + return new Aphront404Response(); + } + + if (!$user->isLoggedIn()) { + $controller = 'profile'; + } else { + $preferences = $user->loadPreferences(); + $controller = $preferences->getPreference( + $project->getDefaultViewPreferenceKey(), + 'profile'); + } + + switch ($controller) { + case 'edit': + $controller_object = new PhabricatorProjectEditMainController(); + break; + case 'board': + $controller_object = new PhabricatorProjectBoardViewController(); + break; + case 'members': + $controller_object = new PhabricatorProjectMembersEditController(); + break; + case 'profile': + default: + $controller_object = new PhabricatorProjectProfileController(); + break; + } + + return $this->delegateToController($controller_object); + } + +} diff --git a/src/applications/project/storage/PhabricatorProject.php b/src/applications/project/storage/PhabricatorProject.php --- a/src/applications/project/storage/PhabricatorProject.php +++ b/src/applications/project/storage/PhabricatorProject.php @@ -273,6 +273,10 @@ return $this->color; } + public function getDefaultViewPreferenceKey() { + return 'proj:defaultview:1:'.$this->getPHID(); + } + public function save() { $this->openTransaction(); $result = parent::save();