mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-19 12:00:55 +01:00
Conpherence - implement PhabricatorDestructibleInterface so threads can be deleted
Summary: Fixes T7694. I had to complicate the `ConpherenceThreadQuery` code slightly so that if we specify id(s) or phid(s) then we don't bother with all that join stuff we need to make sure we have a reasonable query in production. Test Plan: `bin/remove destroy ZXX` worked! tried to visit `ZXX` and got a nice 404. Clicked around and couldn't find anything broken because of the deletion Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin, epriestley Maniphest Tasks: T7756, T7694 Differential Revision: https://secure.phabricator.com/D12304
This commit is contained in:
parent
8fc45e1774
commit
d24b3dcb7d
4 changed files with 64 additions and 4 deletions
|
@ -3446,6 +3446,7 @@ phutil_register_library_map(array(
|
|||
'ConpherenceDAO',
|
||||
'PhabricatorPolicyInterface',
|
||||
'PhabricatorApplicationTransactionInterface',
|
||||
'PhabricatorDestructibleInterface',
|
||||
),
|
||||
'ConpherenceThreadIndexer' => 'PhabricatorSearchDocumentIndexer',
|
||||
'ConpherenceThreadListView' => 'AphrontView',
|
||||
|
|
|
@ -35,4 +35,34 @@ final class PhabricatorConpherenceThreadPHIDType extends PhabricatorPHIDType {
|
|||
}
|
||||
}
|
||||
|
||||
public function canLoadNamedObject($name) {
|
||||
return preg_match('/^Z\d*[1-9]\d*$/i', $name);
|
||||
}
|
||||
|
||||
public function loadNamedObjects(
|
||||
PhabricatorObjectQuery $query,
|
||||
array $names) {
|
||||
|
||||
$id_map = array();
|
||||
foreach ($names as $name) {
|
||||
$id = (int)substr($name, 1);
|
||||
$id_map[$id][] = $name;
|
||||
}
|
||||
|
||||
$objects = id(new ConpherenceThreadQuery())
|
||||
->setViewer($query->getViewer())
|
||||
->withIDs(array_keys($id_map))
|
||||
->execute();
|
||||
$objects = mpull($objects, null, 'getID');
|
||||
|
||||
$results = array();
|
||||
foreach ($objects as $id => $object) {
|
||||
foreach (idx($id_map, $id, array()) as $name) {
|
||||
$results[$name] = $object;
|
||||
}
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -133,7 +133,7 @@ final class ConpherenceThreadQuery
|
|||
}
|
||||
|
||||
$viewer = $this->getViewer();
|
||||
if ($viewer->isLoggedIn()) {
|
||||
if ($this->shouldJoinForViewer($viewer)) {
|
||||
$joins[] = qsprintf(
|
||||
$conn_r,
|
||||
'LEFT JOIN %T v ON v.conpherencePHID = conpherence_thread.phid '.
|
||||
|
@ -147,6 +147,15 @@ final class ConpherenceThreadQuery
|
|||
return implode(' ', $joins);
|
||||
}
|
||||
|
||||
private function shouldJoinForViewer(PhabricatorUser $viewer) {
|
||||
if ($viewer->isLoggedIn() &&
|
||||
$this->ids === null &&
|
||||
$this->phids === null) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected function buildWhereClause($conn_r) {
|
||||
$where = array();
|
||||
|
||||
|
@ -181,11 +190,11 @@ final class ConpherenceThreadQuery
|
|||
}
|
||||
|
||||
$viewer = $this->getViewer();
|
||||
if ($viewer->isLoggedIn()) {
|
||||
if ($this->shouldJoinForViewer($viewer)) {
|
||||
$where[] = qsprintf(
|
||||
$conn_r,
|
||||
'conpherence_thread.isRoom = 1 OR v.participantPHID IS NOT NULL');
|
||||
} else {
|
||||
} else if ($this->phids === null && $this->ids === null) {
|
||||
$where[] = qsprintf(
|
||||
$conn_r,
|
||||
'conpherence_thread.isRoom = 1');
|
||||
|
|
|
@ -3,7 +3,8 @@
|
|||
final class ConpherenceThread extends ConpherenceDAO
|
||||
implements
|
||||
PhabricatorPolicyInterface,
|
||||
PhabricatorApplicationTransactionInterface {
|
||||
PhabricatorApplicationTransactionInterface,
|
||||
PhabricatorDestructibleInterface {
|
||||
|
||||
protected $title;
|
||||
protected $isRoom = 0;
|
||||
|
@ -339,4 +340,23 @@ final class ConpherenceThread extends ConpherenceDAO
|
|||
return $timeline;
|
||||
}
|
||||
|
||||
|
||||
/* -( PhabricatorDestructibleInterface )----------------------------------- */
|
||||
|
||||
|
||||
public function destroyObjectPermanently(
|
||||
PhabricatorDestructionEngine $engine) {
|
||||
|
||||
$this->openTransaction();
|
||||
$this->delete();
|
||||
|
||||
$participants = id(new ConpherenceParticipant())
|
||||
->loadAllWhere('conpherencePHID = %s', $this->getPHID());
|
||||
foreach ($participants as $participant) {
|
||||
$participant->delete();
|
||||
}
|
||||
|
||||
$this->saveTransaction();
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue