1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2025-01-22 20:51:10 +01:00

Use Application PHIDs for ANSW

Summary:
Ref T2715. Ref T3578.

  - Use Application PHIDs for Ponder Answers.
  - Make Ponder answers policy-aware.
  - Make PonderAnswerQuery policy-aware.

Test Plan: Used `phid.query`; browsed Ponder.

Reviewers: btrahan

Reviewed By: btrahan

CC: aran

Maniphest Tasks: T2715, T3578

Differential Revision: https://secure.phabricator.com/D6582
This commit is contained in:
epriestley 2013-07-26 13:19:49 -07:00
parent f98ca03d7d
commit ce16369f8e
7 changed files with 109 additions and 39 deletions

View file

@ -1889,6 +1889,7 @@ phutil_register_library_map(array(
'PonderLiterals' => 'applications/ponder/constants/PonderLiterals.php',
'PonderMail' => 'applications/ponder/mail/PonderMail.php',
'PonderMentionMail' => 'applications/ponder/mail/PonderMentionMail.php',
'PonderPHIDTypeAnswer' => 'applications/ponder/phid/PonderPHIDTypeAnswer.php',
'PonderPHIDTypeQuestion' => 'applications/ponder/phid/PonderPHIDTypeQuestion.php',
'PonderPostBodyView' => 'applications/ponder/view/PonderPostBodyView.php',
'PonderQuestion' => 'applications/ponder/storage/PonderQuestion.php',
@ -3984,11 +3985,12 @@ phutil_register_library_map(array(
0 => 'PonderDAO',
1 => 'PhabricatorMarkupInterface',
2 => 'PonderVotableInterface',
3 => 'PhabricatorPolicyInterface',
),
'PonderAnswerEditor' => 'PhabricatorEditor',
'PonderAnswerListView' => 'AphrontView',
'PonderAnswerPreviewController' => 'PonderController',
'PonderAnswerQuery' => 'PhabricatorOffsetPagedQuery',
'PonderAnswerQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PonderAnswerSaveController' => 'PonderController',
'PonderAnswerViewController' => 'PonderController',
'PonderAnsweredMail' => 'PonderMail',
@ -4007,6 +4009,7 @@ phutil_register_library_map(array(
'PonderLiterals' => 'PonderConstants',
'PonderMail' => 'PhabricatorMail',
'PonderMentionMail' => 'PonderMail',
'PonderPHIDTypeAnswer' => 'PhabricatorPHIDType',
'PonderPHIDTypeQuestion' => 'PhabricatorPHIDType',
'PonderPostBodyView' => 'AphrontView',
'PonderQuestion' =>

View file

@ -12,7 +12,6 @@ final class PhabricatorPHIDConstants {
const PHID_TYPE_OASC = 'OASC';
const PHID_TYPE_OASA = 'OASA';
const PHID_TYPE_TOBJ = 'TOBJ';
const PHID_TYPE_ANSW = 'ANSW';
const PHID_TYPE_ACNT = 'ACNT';
const PHID_TYPE_PDCT = 'PDCT';
const PHID_TYPE_PRCH = 'PRCH';

View file

@ -0,0 +1,45 @@
<?php
final class PonderPHIDTypeAnswer extends PhabricatorPHIDType {
const TYPECONST = 'ANSW';
public function getTypeConstant() {
return self::TYPECONST;
}
public function getTypeName() {
return pht('Answer');
}
public function newObject() {
return new PonderAnswer();
}
public function loadObjects(
PhabricatorObjectQuery $query,
array $phids) {
return id(new PonderAnswerQuery())
->setViewer($query->getViewer())
->withPHIDs($phids)
->execute();
}
public function loadHandles(
PhabricatorHandleQuery $query,
array $handles,
array $objects) {
foreach ($handles as $phid => $handle) {
$answer = $objects[$phid];
$id = $answer->getID();
$qid = $answer->getQuestionID();
$handle->setName("Answer {$id}");
$handle->setURI("/Q{$qid}#A{$id}");
}
}
}

View file

@ -1,27 +1,13 @@
<?php
final class PonderAnswerQuery extends PhabricatorOffsetPagedQuery {
final class PonderAnswerQuery
extends PhabricatorCursorPagedPolicyAwareQuery {
private $ids;
private $phids;
private $authorPHIDs;
private $questionIDs;
private $viewer;
public function setViewer(PhabricatorUser $viewer) {
$this->viewer = $viewer;
return $this;
}
public function getViewer() {
return $this->viewer;
}
public function executeOne() {
return head($this->execute());
}
public function withIDs(array $ids) {
$this->ids = $ids;
return $this;
@ -66,14 +52,12 @@ final class PonderAnswerQuery extends PhabricatorOffsetPagedQuery {
$this->authorPHIDs);
}
$where[] = $this->buildPagingClause($conn_r);
return $this->formatWhereClause($where);
}
private function buildOrderByClause($conn_r) {
return 'ORDER BY id ASC';
}
public function execute() {
public function loadPage() {
$answer = new PonderAnswer();
$conn_r = $answer->establishConnection('r');
@ -82,12 +66,13 @@ final class PonderAnswerQuery extends PhabricatorOffsetPagedQuery {
'SELECT a.* FROM %T a %Q %Q %Q',
$answer->getTableName(),
$this->buildWhereClause($conn_r),
$this->buildOrderByClause($conn_r),
$this->buildOrderClause($conn_r),
$this->buildLimitClause($conn_r));
$answers = $answer->loadAllFromArray($data);
return $answer->loadAllFromArray($data);
}
if ($answers) {
public function willFilterPage(array $answers) {
$questions = id(new PonderQuestionQuery())
->setViewer($this->getViewer())
->withIDs(mpull($answers, 'getQuestionID'))
@ -97,8 +82,12 @@ final class PonderAnswerQuery extends PhabricatorOffsetPagedQuery {
$question = idx($questions, $answer->getQuestionID());
$answer->attachQuestion($question);
}
}
return $answers;
}
protected function getReversePaging() {
return true;
}
}

View file

@ -1,11 +1,13 @@
<?php
final class PonderAnswer extends PonderDAO
implements PhabricatorMarkupInterface, PonderVotableInterface {
implements
PhabricatorMarkupInterface,
PonderVotableInterface,
PhabricatorPolicyInterface {
const MARKUP_FIELD_CONTENT = 'markup:content';
protected $phid;
protected $authorPHID;
protected $questionID;
@ -60,7 +62,7 @@ final class PonderAnswer extends PonderDAO
public function generatePHID() {
return PhabricatorPHID::generateNewPHID(
PhabricatorPHIDConstants::PHID_TYPE_ANSW);
PonderPHIDTypeAnswer::TYPECONST);
}
public function setContentSource(PhabricatorContentSource $content_source) {
@ -111,4 +113,36 @@ final class PonderAnswer extends PonderDAO
public function getVotablePHID() {
return $this->getPHID();
}
/* -( PhabricatorPolicyInterface )----------------------------------------- */
public function getCapabilities() {
return array(
PhabricatorPolicyCapability::CAN_VIEW,
PhabricatorPolicyCapability::CAN_EDIT,
);
}
public function getPolicy($capability) {
switch ($capability) {
case PhabricatorPolicyCapability::CAN_VIEW:
return $this->getQuestion()->getPolicy($capability);
case PhabricatorPolicyCapability::CAN_EDIT:
return PhabricatorPolicies::POLICY_NOONE;
}
}
public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
switch ($capability) {
case PhabricatorPolicyCapability::CAN_VIEW:
return $this->getQuestion()->hasAutomaticCapability(
$capability,
$viewer);
case PhabricatorPolicyCapability::CAN_EDIT:
return ($this->getAuthorPHID() == $viewer->getPHID());
}
}
}

View file

@ -172,6 +172,7 @@ final class PonderQuestion extends PonderDAO
public function getCapabilities() {
return array(
PhabricatorPolicyCapability::CAN_VIEW,
PhabricatorPolicyCapability::CAN_EDIT,
);
}
@ -188,7 +189,7 @@ final class PonderQuestion extends PonderDAO
}
public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
return false;
return ($viewer->getPHID() == $this->getAuthorPHID());
}
/* -( PhabricatorTokenReceiverInterface )---------------------------------- */

View file

@ -155,7 +155,6 @@ final class PhabricatorEdgeConfig extends PhabricatorEdgeConstants {
static $class_map = array(
PhabricatorPHIDConstants::PHID_TYPE_TOBJ => 'HarbormasterObject',
PhabricatorPHIDConstants::PHID_TYPE_ANSW => 'PonderAnswer',
PhabricatorPHIDConstants::PHID_TYPE_ACNT => 'PhortuneAccount',
PhabricatorPHIDConstants::PHID_TYPE_PRCH => 'PhortunePurchase',
PhabricatorPHIDConstants::PHID_TYPE_CHRG => 'PhortuneCharge',