diff --git a/resources/sql/autopatches/20140904.macroattach.php b/resources/sql/autopatches/20140904.macroattach.php --- a/resources/sql/autopatches/20140904.macroattach.php +++ b/resources/sql/autopatches/20140904.macroattach.php @@ -16,7 +16,7 @@ foreach ($phids as $phid) { $editor->addEdge( $macro->getPHID(), - PhabricatorObjectHasFileEdgeType::EDGECONST, + 25, $phid); } $editor->save(); diff --git a/src/applications/files/query/PhabricatorFileQuery.php b/src/applications/files/query/PhabricatorFileQuery.php --- a/src/applications/files/query/PhabricatorFileQuery.php +++ b/src/applications/files/query/PhabricatorFileQuery.php @@ -20,6 +20,7 @@ private $builtinKeys; private $isBuiltin; private $storageEngines; + private $attachedObjectPHIDs; public function withIDs(array $ids) { $this->ids = $ids; @@ -61,6 +62,11 @@ return $this; } + public function withAttachedObjectPHIDs(array $phids) { + $this->attachedObjectPHIDs = $phids; + return $this; + } + /** * Select files which are transformations of some other file. For example, * you can use this query to find previously generated thumbnails of an image @@ -347,9 +353,20 @@ id(new PhabricatorTransformedFile())->getTableName()); } + if ($this->shouldJoinAttachmentsTable()) { + $joins[] = qsprintf( + $conn, + 'JOIN %R attachments ON attachments.filePHID = f.phid', + new PhabricatorFileAttachment()); + } + return $joins; } + private function shouldJoinAttachmentsTable() { + return ($this->attachedObjectPHIDs !== null); + } + protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) { $where = parent::buildWhereClauseParts($conn); @@ -482,6 +499,13 @@ $this->storageEngines); } + if ($this->attachedObjectPHIDs !== null) { + $where[] = qsprintf( + $conn, + 'attachments.objectPHID IN (%Ls)', + $this->attachedObjectPHIDs); + } + return $where; } diff --git a/src/applications/files/storage/PhabricatorFile.php b/src/applications/files/storage/PhabricatorFile.php --- a/src/applications/files/storage/PhabricatorFile.php +++ b/src/applications/files/storage/PhabricatorFile.php @@ -1416,12 +1416,6 @@ * @return this */ public function attachToObject($phid) { - $edge_type = PhabricatorObjectHasFileEdgeType::EDGECONST; - - id(new PhabricatorEdgeEditor()) - ->addEdge($phid, $edge_type, $this->getPHID()) - ->save(); - $attachment_table = new PhabricatorFileAttachment(); $attachment_conn = $attachment_table->establishConnection('w'); diff --git a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php --- a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php +++ b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php @@ -1300,7 +1300,6 @@ } $xactions = $this->sortTransactions($xactions); - $file_phids = $this->extractFilePHIDs($object, $xactions); if ($is_preview) { $this->loadHandles($xactions); @@ -1389,10 +1388,6 @@ } } - if ($file_phids) { - $this->attachFiles($object, $file_phids); - } - foreach ($xactions as $xaction) { $this->applyExternalEffects($object, $xaction); } @@ -4353,20 +4348,8 @@ } $phids = array_unique(array_filter(array_mergev($phids))); - if (!$phids) { - return array(); - } - - // Only let a user attach files they can actually see, since this would - // otherwise let you access any file by attaching it to an object you have - // view permission on. - $files = id(new PhabricatorFileQuery()) - ->setViewer($this->getActor()) - ->withPHIDs($phids) - ->execute(); - - return mpull($files, 'getPHID'); + return $phids; } /** @@ -4379,28 +4362,6 @@ } - /** - * @task files - */ - private function attachFiles( - PhabricatorLiskDAO $object, - array $file_phids) { - - if (!$file_phids) { - return; - } - - $editor = new PhabricatorEdgeEditor(); - - $src = $object->getPHID(); - $type = PhabricatorObjectHasFileEdgeType::EDGECONST; - foreach ($file_phids as $dst) { - $editor->addEdge($src, $type, $dst); - } - - $editor->save(); - } - private function applyInverseEdgeTransactions( PhabricatorLiskDAO $object, PhabricatorApplicationTransaction $xaction, @@ -4847,20 +4808,11 @@ } } - $phid = $object->getPHID(); - - $attached_phids = PhabricatorEdgeQuery::loadDestinationPHIDs( - $phid, - PhabricatorObjectHasFileEdgeType::EDGECONST); - if (!$attached_phids) { - return; - } - $omnipotent_viewer = PhabricatorUser::getOmnipotentUser(); $files = id(new PhabricatorFileQuery()) ->setViewer($omnipotent_viewer) - ->withPHIDs($attached_phids) + ->withAttachedObjectPHIDs(array($object->getPHID())) ->execute(); foreach ($files as $file) { $view_policy = $file->getViewPolicy();