Differential D14890 Diff 35998 src/applications/project/controller/PhabricatorProjectViewController.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/project/controller/PhabricatorProjectViewController.php
| <?php | <?php | ||||
| final class PhabricatorProjectViewController | final class PhabricatorProjectViewController | ||||
| extends PhabricatorProjectController { | extends PhabricatorProjectController { | ||||
| public function shouldAllowPublic() { | public function shouldAllowPublic() { | ||||
| return true; | return true; | ||||
| } | } | ||||
| public function handleRequest(AphrontRequest $request) { | public function handleRequest(AphrontRequest $request) { | ||||
| $request = $this->getRequest(); | $request = $this->getRequest(); | ||||
| $viewer = $request->getViewer(); | $viewer = $request->getViewer(); | ||||
| $query = id(new PhabricatorProjectQuery()) | $response = $this->loadProject(); | ||||
| ->setViewer($viewer) | if ($response) { | ||||
| ->needMembers(true) | return $response; | ||||
| ->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) { | |||||
| // If this request corresponds to a project but just doesn't have the | |||||
| // slug quite right, redirect to the proper URI. | |||||
| $uri = $this->getNormalizedURI($slug); | |||||
| if ($uri !== null) { | |||||
| return id(new AphrontRedirectResponse())->setURI($uri); | |||||
| } | |||||
| return new Aphront404Response(); | |||||
| } | } | ||||
| $project = $this->getProject(); | |||||
| $columns = id(new PhabricatorProjectColumnQuery()) | $columns = id(new PhabricatorProjectColumnQuery()) | ||||
| ->setViewer($viewer) | ->setViewer($viewer) | ||||
| ->withProjectPHIDs(array($project->getPHID())) | ->withProjectPHIDs(array($project->getPHID())) | ||||
| ->execute(); | ->execute(); | ||||
| if ($columns) { | if ($columns) { | ||||
| $controller = 'board'; | $controller = 'board'; | ||||
| } else { | } else { | ||||
| $controller = 'profile'; | $controller = 'profile'; | ||||
| } | } | ||||
| switch ($controller) { | switch ($controller) { | ||||
| case 'board': | case 'board': | ||||
| $controller_object = new PhabricatorProjectBoardViewController(); | $controller_object = new PhabricatorProjectBoardViewController(); | ||||
| break; | break; | ||||
| case 'profile': | case 'profile': | ||||
| default: | default: | ||||
| $controller_object = new PhabricatorProjectProfileController(); | $controller_object = new PhabricatorProjectProfileController(); | ||||
| break; | break; | ||||
| } | } | ||||
| return $this->delegateToController($controller_object); | return $this->delegateToController($controller_object); | ||||
| } | } | ||||
| private function getNormalizedURI($slug) { | |||||
| if (!strlen($slug)) { | |||||
| return null; | |||||
| } | |||||
| $normal = PhabricatorSlug::normalizeProjectSlug($slug); | |||||
| if ($normal === $slug) { | |||||
| return null; | |||||
| } | |||||
| $viewer = $this->getViewer(); | |||||
| // Do execute() instead of executeOne() here so we canonicalize before | |||||
| // raising a policy exception. This is a little more polished than letting | |||||
| // the user hit the error on any variant of the slug. | |||||
| $projects = id(new PhabricatorProjectQuery()) | |||||
| ->setViewer($viewer) | |||||
| ->withSlugs(array($normal)) | |||||
| ->execute(); | |||||
| if (!$projects) { | |||||
| return null; | |||||
| } | |||||
| return "/tag/{$normal}/"; | |||||
| } | |||||
| } | } | ||||