From c39f302c048ae973f5f989918d4d14c12c07fe77 Mon Sep 17 00:00:00 2001 From: Bob Trahan Date: Thu, 22 May 2014 15:16:16 -0700 Subject: [PATCH] Project - use hashtag as a way to access project profile in URI, e.g. /project/hashtag/ Summary: Fixes T4022. Hooks up the project profile controller to understanding URIs like /project/hashtag/ Also, makes handles have the new /project/hashtag/ URI by default, thus upselling that feature super duper heavily. Test Plan: clicked some project links, noted pretty uri and page working nicely. Reviewers: epriestley Reviewed By: epriestley Subscribers: chad, epriestley, Korvin Maniphest Tasks: T4022 Differential Revision: https://secure.phabricator.com/D9260 --- .../PhabricatorApplicationProject.php | 4 ++++ .../PhabricatorProjectProfileController.php | 20 +++++++++++++++---- .../PhabricatorProjectPHIDTypeProject.php | 5 +++-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/applications/project/application/PhabricatorApplicationProject.php b/src/applications/project/application/PhabricatorApplicationProject.php index 494bd9fa1b..0fe314f025 100644 --- a/src/applications/project/application/PhabricatorApplicationProject.php +++ b/src/applications/project/application/PhabricatorApplicationProject.php @@ -67,6 +67,10 @@ final class PhabricatorApplicationProject extends PhabricatorApplication { 'history/(?P[1-9]\d*)/' => 'PhabricatorProjectHistoryController', '(?Pwatch|unwatch)/(?P[1-9]\d*)/' => 'PhabricatorProjectWatchController', + + ), + '/tag/' => array( + '(?P[^/]+)/' => 'PhabricatorProjectProfileController', ), ); } diff --git a/src/applications/project/controller/PhabricatorProjectProfileController.php b/src/applications/project/controller/PhabricatorProjectProfileController.php index 688f78ccd6..5d701376f4 100644 --- a/src/applications/project/controller/PhabricatorProjectProfileController.php +++ b/src/applications/project/controller/PhabricatorProjectProfileController.php @@ -4,29 +4,41 @@ 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(); $user = $request->getUser(); - $project = id(new PhabricatorProjectQuery()) + $query = id(new PhabricatorProjectQuery()) ->setViewer($user) - ->withIDs(array($this->id)) ->needMembers(true) ->needWatchers(true) - ->needImages(true) - ->executeOne(); + ->needImages(true); + if ($this->slug) { + $query->withSlugs(array($this->slug)); + } else { + $query->withIDs(array($this->id)); + } + $project = $query->executeOne(); if (!$project) { return new Aphront404Response(); } + if ($this->slug && $this->slug != $project->getPrimarySlug()) { + return id(new AphrontRedirectResponse()) + ->setURI('/tag/'.$project->getPrimarySlug().'/'); + } $picture = $project->getProfileImageURI(); diff --git a/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php b/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php index f67d36f63e..bb7a5a1a07 100644 --- a/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php +++ b/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php @@ -43,10 +43,11 @@ final class PhabricatorProjectPHIDTypeProject extends PhabricatorPHIDType { $name = $project->getName(); $id = $project->getID(); + $slug = $project->getPrimarySlug(); $handle->setName($name); - $handle->setObjectName('#'.rtrim($project->getPhrictionSlug(), '/')); - $handle->setURI("/project/view/{$id}/"); + $handle->setObjectName('#'.$slug); + $handle->setURI("/tag/{$slug}/"); $handle->setImageURI($project->getProfileImageURI()); if ($project->isArchived()) {