mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-11 17:32:41 +01:00
275f67294c
Summary: Ref T1809. Ref T603. Ref T3599. Makes flags policy aware. This change reduces the utility of flag search/browse; the next change will switch it to ApplicationSearch to restore utility. Representing all that ordering in terms of cursor paging is also a giant pain. Test Plan: Viewed Differential, Flags, etc. Grepped for all PhabricatorFlagQuery callsites. Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T603, T1809, T3599 Differential Revision: https://secure.phabricator.com/D6746
138 lines
3.1 KiB
PHP
138 lines
3.1 KiB
PHP
<?php
|
|
|
|
final class PhabricatorFlagQuery
|
|
extends PhabricatorCursorPagedPolicyAwareQuery {
|
|
|
|
private $ownerPHIDs;
|
|
private $types;
|
|
private $objectPHIDs;
|
|
private $colors;
|
|
|
|
private $needHandles;
|
|
private $needObjects;
|
|
|
|
public function withOwnerPHIDs(array $owner_phids) {
|
|
$this->ownerPHIDs = $owner_phids;
|
|
return $this;
|
|
}
|
|
|
|
public function withTypes(array $types) {
|
|
$this->types = $types;
|
|
return $this;
|
|
}
|
|
|
|
public function withObjectPHIDs(array $object_phids) {
|
|
$this->objectPHIDs = $object_phids;
|
|
return $this;
|
|
}
|
|
|
|
public function withColors(array $colors) {
|
|
$this->colors = $colors;
|
|
return $this;
|
|
}
|
|
|
|
public function needHandles($need) {
|
|
$this->needHandles = $need;
|
|
return $this;
|
|
}
|
|
|
|
public function needObjects($need) {
|
|
$this->needObjects = $need;
|
|
return $this;
|
|
}
|
|
|
|
public static function loadUserFlag(PhabricatorUser $user, $object_phid) {
|
|
// Specifying the type in the query allows us to use a key.
|
|
return id(new PhabricatorFlagQuery())
|
|
->setViewer($user)
|
|
->withOwnerPHIDs(array($user->getPHID()))
|
|
->withTypes(array(phid_get_type($object_phid)))
|
|
->withObjectPHIDs(array($object_phid))
|
|
->executeOne();
|
|
}
|
|
|
|
|
|
public function loadPage() {
|
|
$table = new PhabricatorFlag();
|
|
$conn_r = $table->establishConnection('r');
|
|
|
|
$data = queryfx_all(
|
|
$conn_r,
|
|
'SELECT * FROM %T flag %Q %Q %Q',
|
|
$table->getTableName(),
|
|
$this->buildWhereClause($conn_r),
|
|
$this->buildOrderClause($conn_r),
|
|
$this->buildLimitClause($conn_r));
|
|
|
|
return $table->loadAllFromArray($data);
|
|
}
|
|
|
|
public function willFilterPage(array $flags) {
|
|
|
|
if ($this->needObjects) {
|
|
$objects = id(new PhabricatorObjectQuery())
|
|
->setViewer($this->getViewer())
|
|
->withPHIDs(mpull($flags, 'getObjectPHID'))
|
|
->execute();
|
|
$objects = mpull($objects, null, 'getPHID');
|
|
foreach ($flags as $key => $flag) {
|
|
$object = idx($objects, $flag->getObjectPHID());
|
|
if ($object) {
|
|
$flags[$key]->attachObject($object);
|
|
} else {
|
|
unset($flags[$key]);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($this->needHandles) {
|
|
$handles = id(new PhabricatorHandleQuery())
|
|
->setViewer($this->getViewer())
|
|
->withPHIDs(mpull($flags, 'getObjectPHID'))
|
|
->execute();
|
|
|
|
foreach ($flags as $flag) {
|
|
$flag->attachHandle($handles[$flag->getObjectPHID()]);
|
|
}
|
|
}
|
|
|
|
return $flags;
|
|
}
|
|
|
|
private function buildWhereClause($conn_r) {
|
|
$where = array();
|
|
|
|
if ($this->ownerPHIDs) {
|
|
$where[] = qsprintf(
|
|
$conn_r,
|
|
'flag.ownerPHID IN (%Ls)',
|
|
$this->ownerPHIDs);
|
|
}
|
|
|
|
if ($this->types) {
|
|
$where[] = qsprintf(
|
|
$conn_r,
|
|
'flag.type IN (%Ls)',
|
|
$this->types);
|
|
}
|
|
|
|
if ($this->objectPHIDs) {
|
|
$where[] = qsprintf(
|
|
$conn_r,
|
|
'flag.objectPHID IN (%Ls)',
|
|
$this->objectPHIDs);
|
|
}
|
|
|
|
if ($this->colors) {
|
|
$where[] = qsprintf(
|
|
$conn_r,
|
|
'flag.color IN (%Ld)',
|
|
$this->colors);
|
|
}
|
|
|
|
$where[] = $this->buildPagingClause($conn_r);
|
|
|
|
return $this->formatWhereClause($where);
|
|
}
|
|
|
|
}
|