Simplify some logic in project controllers
Summary: Ref T10010. Several controlers currently have similar logic for handling tags and slugs, loading projects, and canonicalizing URIs. Clean it up a bit. Test Plan: - Visited profile, boards, feed. - Visited by ID and by tag. - Visited by non-normal tag (redircted). - Visited by alternate tag (redirected). - Visited non-policy project by non-normal tag (redirected into policy error). Reviewers: chad Reviewed By: chad Maniphest Tasks: T10010 Differential Revision: https://secure.phabricator.com/D14890
This commit is contained in:
@@ -13,6 +13,72 @@ abstract class PhabricatorProjectController extends PhabricatorController {
|
||||
return $this->project;
|
||||
}
|
||||
|
||||
protected function loadProject() {
|
||||
$viewer = $this->getViewer();
|
||||
$request = $this->getRequest();
|
||||
|
||||
$id = $request->getURIData('id');
|
||||
$slug = $request->getURIData('slug');
|
||||
|
||||
if ($slug) {
|
||||
$normal_slug = PhabricatorSlug::normalizeProjectSlug($slug);
|
||||
$is_abnormal = ($slug !== $normal_slug);
|
||||
$normal_uri = "/tag/{$normal_slug}/";
|
||||
} else {
|
||||
$is_abnormal = false;
|
||||
}
|
||||
|
||||
$query = id(new PhabricatorProjectQuery())
|
||||
->setViewer($viewer)
|
||||
->needMembers(true)
|
||||
->needWatchers(true)
|
||||
->needImages(true)
|
||||
->needSlugs(true);
|
||||
|
||||
if ($slug) {
|
||||
$query->withSlugs(array($slug));
|
||||
} else {
|
||||
$query->withIDs(array($id));
|
||||
}
|
||||
|
||||
$policy_exception = null;
|
||||
try {
|
||||
$project = $query->executeOne();
|
||||
} catch (PhabricatorPolicyException $ex) {
|
||||
$policy_exception = $ex;
|
||||
$project = null;
|
||||
}
|
||||
|
||||
if (!$project) {
|
||||
// This project legitimately does not exist, so just 404 the user.
|
||||
if (!$policy_exception) {
|
||||
return new Aphront404Response();
|
||||
}
|
||||
|
||||
// Here, the project exists but the user can't see it. If they are
|
||||
// using a non-canonical slug to view the project, redirect to the
|
||||
// canonical slug. If they're already using the canonical slug, rethrow
|
||||
// the exception to give them the policy error.
|
||||
if ($is_abnormal) {
|
||||
return id(new AphrontRedirectResponse())->setURI($normal_uri);
|
||||
} else {
|
||||
throw $policy_exception;
|
||||
}
|
||||
}
|
||||
|
||||
// The user can view the project, but is using a noncanonical slug.
|
||||
// Redirect to the canonical slug.
|
||||
$primary_slug = $project->getPrimarySlug();
|
||||
if ($slug && ($slug !== $primary_slug)) {
|
||||
$primary_uri = "/tag/{$primary_slug}/";
|
||||
return id(new AphrontRedirectResponse())->setURI($primary_uri);
|
||||
}
|
||||
|
||||
$this->setProject($project);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public function buildApplicationMenu() {
|
||||
return $this->buildSideNavView(true)->getMenu();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user