diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 0fb3cbf42d..909849d3ba 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1232,6 +1232,9 @@ phutil_register_library_map(array( 'PhabricatorMailReceiver' => 'applications/metamta/receiver/PhabricatorMailReceiver.php', 'PhabricatorMailReceiverTestCase' => 'applications/metamta/receiver/__tests__/PhabricatorMailReceiverTestCase.php', 'PhabricatorMailReplyHandler' => 'applications/metamta/replyhandler/PhabricatorMailReplyHandler.php', + 'PhabricatorMailingListPHIDTypeList' => 'applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php', + 'PhabricatorMailingListQuery' => 'applications/mailinglists/query/PhabricatorMailingListQuery.php', + 'PhabricatorMailingListSearchEngine' => 'applications/mailinglists/query/PhabricatorMailingListSearchEngine.php', 'PhabricatorMailingListsController' => 'applications/mailinglists/controller/PhabricatorMailingListsController.php', 'PhabricatorMailingListsEditController' => 'applications/mailinglists/controller/PhabricatorMailingListsEditController.php', 'PhabricatorMailingListsListController' => 'applications/mailinglists/controller/PhabricatorMailingListsListController.php', @@ -3207,9 +3210,16 @@ phutil_register_library_map(array( 'PhabricatorMailManagementShowOutboundWorkflow' => 'PhabricatorSearchManagementWorkflow', 'PhabricatorMailManagementWorkflow' => 'PhutilArgumentWorkflow', 'PhabricatorMailReceiverTestCase' => 'PhabricatorTestCase', + 'PhabricatorMailingListPHIDTypeList' => 'PhabricatorPHIDType', + 'PhabricatorMailingListQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorMailingListSearchEngine' => 'PhabricatorApplicationSearchEngine', 'PhabricatorMailingListsController' => 'PhabricatorController', 'PhabricatorMailingListsEditController' => 'PhabricatorMailingListsController', - 'PhabricatorMailingListsListController' => 'PhabricatorMailingListsController', + 'PhabricatorMailingListsListController' => + array( + 0 => 'PhabricatorMailingListsController', + 1 => 'PhabricatorApplicationSearchResultsControllerInterface', + ), 'PhabricatorMainMenuGroupView' => 'AphrontView', 'PhabricatorMainMenuIconView' => 'AphrontView', 'PhabricatorMainMenuSearchView' => 'AphrontView', @@ -3226,7 +3236,11 @@ phutil_register_library_map(array( 'PhabricatorMetaMTAMail' => 'PhabricatorMetaMTADAO', 'PhabricatorMetaMTAMailBodyTestCase' => 'PhabricatorTestCase', 'PhabricatorMetaMTAMailTestCase' => 'PhabricatorTestCase', - 'PhabricatorMetaMTAMailingList' => 'PhabricatorMetaMTADAO', + 'PhabricatorMetaMTAMailingList' => + array( + 0 => 'PhabricatorMetaMTADAO', + 1 => 'PhabricatorPolicyInterface', + ), 'PhabricatorMetaMTAReceivedMail' => 'PhabricatorMetaMTADAO', 'PhabricatorMetaMTAReceivedMailProcessingException' => 'Exception', 'PhabricatorMetaMTAReceivedMailTestCase' => 'PhabricatorTestCase', diff --git a/src/applications/mailinglists/application/PhabricatorApplicationMailingLists.php b/src/applications/mailinglists/application/PhabricatorApplicationMailingLists.php index 8a562d4d96..9d69962e10 100644 --- a/src/applications/mailinglists/application/PhabricatorApplicationMailingLists.php +++ b/src/applications/mailinglists/application/PhabricatorApplicationMailingLists.php @@ -25,7 +25,8 @@ final class PhabricatorApplicationMailingLists extends PhabricatorApplication { public function getRoutes() { return array( '/mailinglists/' => array( - '' => 'PhabricatorMailingListsListController', + '(?:query/(?P[^/]+)/)?' + => 'PhabricatorMailingListsListController', 'edit/(?:(?P[1-9]\d*)/)?' => 'PhabricatorMailingListsEditController', ), diff --git a/src/applications/mailinglists/controller/PhabricatorMailingListsController.php b/src/applications/mailinglists/controller/PhabricatorMailingListsController.php index bce54cf2ab..dd2fb46ccd 100644 --- a/src/applications/mailinglists/controller/PhabricatorMailingListsController.php +++ b/src/applications/mailinglists/controller/PhabricatorMailingListsController.php @@ -2,24 +2,27 @@ abstract class PhabricatorMailingListsController extends PhabricatorController { - public function buildSideNavView($filter = null, $for_app = false) { + public function buildSideNavView($for_app = false) { $user = $this->getRequest()->getUser(); $nav = new AphrontSideNavFilterView(); $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); - $nav->addLabel(pht('Mailing Lists')); - $nav->addFilter('/', pht('All Lists')); - $nav->selectFilter($filter, '/'); if ($for_app) { - $nav->addFilter('edit/', pht('Create List')); + $nav->addFilter('edit', pht('Create List')); } + id(new PhabricatorMailingListSearchEngine()) + ->setViewer($user) + ->addNavigationItems($nav->getMenu()); + + $nav->selectFilter(null); + return $nav; } public function buildApplicationMenu() { - return $this->buildSideNavView(null, true)->getMenu(); + return $this->buildSideNavView(true)->getMenu(); } public function buildApplicationCrumbs() { diff --git a/src/applications/mailinglists/controller/PhabricatorMailingListsEditController.php b/src/applications/mailinglists/controller/PhabricatorMailingListsEditController.php index be5f9dac65..e417d8b9a4 100644 --- a/src/applications/mailinglists/controller/PhabricatorMailingListsEditController.php +++ b/src/applications/mailinglists/controller/PhabricatorMailingListsEditController.php @@ -10,9 +10,14 @@ final class PhabricatorMailingListsEditController } public function processRequest() { + $request = $this->getRequest(); + $viewer = $request->getUser(); if ($this->id) { - $list = id(new PhabricatorMetaMTAMailingList())->load($this->id); + $list = id(new PhabricatorMailingListQuery()) + ->setViewer($viewer) + ->withIDs(array($this->id)) + ->executeOne(); if (!$list) { return new Aphront404Response(); } @@ -25,9 +30,8 @@ final class PhabricatorMailingListsEditController $e_name = true; $errors = array(); - $crumbs = $this->buildApplicationCrumbs($this->buildSideNavView()); + $crumbs = $this->buildApplicationCrumbs(); - $request = $this->getRequest(); if ($request->isFormPost()) { $list->setName($request->getStr('name')); $list->setEmail($request->getStr('email')); @@ -105,10 +109,6 @@ final class PhabricatorMailingListsEditController ->setError($e_uri) ->setCaption(pht('Optional link to mailing list archives or info.')) ->setValue($list->getURI())) - ->appendChild( - id(new AphrontFormStaticControl()) - ->setLabel('PHID') - ->setValue(nonempty($list->getPHID(), '-'))) ->appendChild( id(new AphrontFormSubmitControl()) ->setValue(pht('Save')) @@ -117,13 +117,11 @@ final class PhabricatorMailingListsEditController if ($list->getID()) { $crumbs->addCrumb( id(new PhabricatorCrumbView()) - ->setName(pht('Edit Mailing List')) - ->setHref($this->getApplicationURI('/edit/'.$list->getID().'/'))); + ->setName(pht('Edit Mailing List'))); } else { $crumbs->addCrumb( id(new PhabricatorCrumbView()) - ->setName(pht('Create Mailing List')) - ->setHref($this->getApplicationURI('/edit/'))); + ->setName(pht('Create Mailing List'))); } return $this->buildApplicationPage( diff --git a/src/applications/mailinglists/controller/PhabricatorMailingListsListController.php b/src/applications/mailinglists/controller/PhabricatorMailingListsListController.php index 107e49f2b3..0edb7611aa 100644 --- a/src/applications/mailinglists/controller/PhabricatorMailingListsListController.php +++ b/src/applications/mailinglists/controller/PhabricatorMailingListsListController.php @@ -1,84 +1,51 @@ queryKey = idx($data, 'queryKey'); + } public function processRequest() { $request = $this->getRequest(); - $user = $request->getUser(); - $offset = $request->getInt('offset', 0); + $controller = id(new PhabricatorApplicationSearchController($request)) + ->setQueryKey($this->queryKey) + ->setSearchEngine(new PhabricatorMailingListSearchEngine()) + ->setNavigation($this->buildSideNavView()); - $pager = new AphrontPagerView(); - $pager->setPageSize(250); - $pager->setOffset($offset); - $pager->setURI($request->getRequestURI(), 'offset'); + return $this->delegateToController($controller); + } - $list = new PhabricatorMetaMTAMailingList(); - $conn_r = $list->establishConnection('r'); - $data = queryfx_all( - $conn_r, - 'SELECT * FROM %T - ORDER BY name ASC - LIMIT %d, %d', - $list->getTableName(), - $pager->getOffset(), $pager->getPageSize() + 1); - $data = $pager->sliceResults($data); + public function renderResultsList( + array $lists, + PhabricatorSavedQuery $query) { + assert_instances_of($lists, 'PhabricatorMetaMTAMailingList'); - $nav = $this->buildSideNavView('all'); + $view = id(new PhabricatorObjectItemListView()); - $lists = $list->loadAllFromArray($data); - - $rows = array(); foreach ($lists as $list) { - $rows[] = array( - $list->getName(), - $list->getEmail(), - phutil_tag( - 'a', - array( - 'class' => 'button grey small', - 'href' => $this->getApplicationURI('/edit/'.$list->getID().'/'), - ), - pht('Edit')), - ); + $item = new PhabricatorObjectItemView(); + + $item->setHeader($list->getName()); + $item->setHref($list->getURI()); + $item->addAttribute($list->getEmail()); + $item->addAction( + id(new PHUIListItemView()) + ->setIcon('edit') + ->setHref($this->getApplicationURI('/edit/'.$list->getID().'/'))); + + $view->addItem($item); } - $table = new AphrontTableView($rows); - $table->setHeaders( - array( - pht('Name'), - pht('Email'), - '', - )); - $table->setColumnClasses( - array( - null, - 'wide', - 'action', - )); - - $crumbs = $this->buildApplicationCrumbs($this->buildSideNavView()); - $crumbs->addCrumb( - id(new PhabricatorCrumbView()) - ->setName(pht('All Lists')) - ->setHref($this->getApplicationURI())); - $nav->setCrumbs($crumbs); - - $panel = new AphrontPanelView(); - $panel->appendChild($table); - $panel->setHeader(pht('Mailing Lists')); - $panel->appendChild($pager); - $panel->setNoBackground(); - - $nav->appendChild($panel); - - return $this->buildApplicationPage( - array( - $nav, - ), - array( - 'title' => pht('Mailing Lists'), - 'device' => true, - )); + return $view; } + } diff --git a/src/applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php b/src/applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php new file mode 100644 index 0000000000..ec9462d97d --- /dev/null +++ b/src/applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php @@ -0,0 +1,46 @@ +setViewer($query->getViewer()) + ->withPHIDs($phids) + ->execute(); + } + + public function loadHandles( + PhabricatorHandleQuery $query, + array $handles, + array $objects) { + + foreach ($handles as $phid => $handle) { + $list = $objects[$phid]; + + $handle->setName($list->getName()); + $handle->setURI($list->getURI()); + } + } + + public function canLoadNamedObject($name) { + return false; + } + +} diff --git a/src/applications/mailinglists/query/PhabricatorMailingListQuery.php b/src/applications/mailinglists/query/PhabricatorMailingListQuery.php new file mode 100644 index 0000000000..a7f98a4aa9 --- /dev/null +++ b/src/applications/mailinglists/query/PhabricatorMailingListQuery.php @@ -0,0 +1,56 @@ +ids = $ids; + return $this; + } + + public function withPHIDs($phids) { + $this->phids = $phids; + return $this; + } + + public function loadPage() { + $table = new PhabricatorMetaMTAMailingList(); + $conn_r = $table->establishConnection('r'); + + $data = queryfx_all( + $conn_r, + 'SELECT * FROM %T %Q %Q %Q', + $table->getTableName(), + $this->buildWhereClause($conn_r), + $this->buildOrderClause($conn_r), + $this->buildLimitClause($conn_r)); + + return $table->loadAllFromArray($data); + } + + private function buildWhereClause(AphrontDatabaseConnection $conn_r) { + $where = array(); + + if ($this->ids) { + $where[] = qsprintf( + $conn_r, + 'id IN (%Ld)', + $this->ids); + } + + if ($this->phids) { + $where[] = qsprintf( + $conn_r, + 'phid IN (%Ls)', + $this->phids); + } + + $where[] = $this->buildPagingClause($conn_r); + + return $this->formatWhereClause($where); + } + +} diff --git a/src/applications/mailinglists/query/PhabricatorMailingListSearchEngine.php b/src/applications/mailinglists/query/PhabricatorMailingListSearchEngine.php new file mode 100644 index 0000000000..6f846f5aed --- /dev/null +++ b/src/applications/mailinglists/query/PhabricatorMailingListSearchEngine.php @@ -0,0 +1,54 @@ +appendChild( + id(new AphrontFormMarkupControl()) + ->setValue(pht('No query filters are available for mailing lists.'))); + } + + protected function getURI($path) { + return '/mailinglists/'.$path; + } + + public function getBuiltinQueryNames() { + $names = array( + 'all' => pht('All Lists'), + ); + + return $names; + } + + public function buildSavedQueryFromBuiltin($query_key) { + + $query = $this->newSavedQuery(); + $query->setQueryKey($query_key); + + switch ($query_key) { + case 'all': + return $query; + } + + return parent::buildSavedQueryFromBuiltin($query_key); + } + +} diff --git a/src/applications/mailinglists/storage/PhabricatorMetaMTAMailingList.php b/src/applications/mailinglists/storage/PhabricatorMetaMTAMailingList.php index 3ac298eabb..d9034295c2 100644 --- a/src/applications/mailinglists/storage/PhabricatorMetaMTAMailingList.php +++ b/src/applications/mailinglists/storage/PhabricatorMetaMTAMailingList.php @@ -1,6 +1,7 @@ setPHID($phid); } + // TODO: Move this to PhabricatorPHIDType. + foreach ($type_map as $type => $phids) { switch ($type) { case PhabricatorPHIDConstants::PHID_TYPE_USER: @@ -36,7 +38,7 @@ final class PhabricatorMetaMTAActorQuery extends PhabricatorQuery { case PhabricatorPHIDConstants::PHID_TYPE_XUSR: $this->loadExternalUserActors($actors, $phids); break; - case PhabricatorPHIDConstants::PHID_TYPE_MLST: + case PhabricatorMailingListPHIDTypeList::TYPECONST: $this->loadMailingListActors($actors, $phids); break; default: @@ -127,9 +129,10 @@ final class PhabricatorMetaMTAActorQuery extends PhabricatorQuery { private function loadMailingListActors(array $actors, array $phids) { assert_instances_of($actors, 'PhabricatorMetaMTAActor'); - $lists = id(new PhabricatorMetaMTAMailingList())->loadAllWhere( - 'phid IN (%Ls)', - $phids); + $lists = id(new PhabricatorMailingListQuery()) + ->setViewer($this->getViewer()) + ->withPHIDs($phids) + ->execute(); $lists = mpull($lists, null, 'getPHID'); foreach ($phids as $phid) { diff --git a/src/applications/phid/PhabricatorPHIDConstants.php b/src/applications/phid/PhabricatorPHIDConstants.php index 881f1017af..3d23e4b3b2 100644 --- a/src/applications/phid/PhabricatorPHIDConstants.php +++ b/src/applications/phid/PhabricatorPHIDConstants.php @@ -3,7 +3,6 @@ final class PhabricatorPHIDConstants { const PHID_TYPE_USER = 'USER'; - const PHID_TYPE_MLST = 'MLST'; const PHID_TYPE_TASK = 'TASK'; const PHID_TYPE_FILE = 'FILE'; const PHID_TYPE_PROJ = 'PROJ'; diff --git a/src/applications/phid/handle/PhabricatorObjectHandleData.php b/src/applications/phid/handle/PhabricatorObjectHandleData.php index b907c13bfd..c169addced 100644 --- a/src/applications/phid/handle/PhabricatorObjectHandleData.php +++ b/src/applications/phid/handle/PhabricatorObjectHandleData.php @@ -110,11 +110,6 @@ final class PhabricatorObjectHandleData { $phids); return mpull($projects, null, 'getPHID'); - case PhabricatorPHIDConstants::PHID_TYPE_MLST: - $object = new PhabricatorMetaMTAMailingList(); - $lists = $object->loadAllWhere('phid IN (%Ls)', $phids); - return mpull($lists, null, 'getPHID'); - case PhabricatorPHIDConstants::PHID_TYPE_WIKI: // TODO: Update this to PhrictionDocumentQuery, already pre-package // content DAO @@ -330,24 +325,6 @@ final class PhabricatorObjectHandleData { } break; - case PhabricatorPHIDConstants::PHID_TYPE_MLST: - foreach ($phids as $phid) { - $handle = new PhabricatorObjectHandle(); - $handle->setPHID($phid); - $handle->setType($type); - if (empty($objects[$phid])) { - $handle->setName('Unknown Mailing List'); - } else { - $list = $objects[$phid]; - $handle->setName($list->getName()); - $handle->setURI($list->getURI()); - $handle->setFullName($list->getName()); - $handle->setComplete(true); - } - $handles[$phid] = $handle; - } - break; - case PhabricatorPHIDConstants::PHID_TYPE_CMIT: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); diff --git a/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php b/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php index 167eb5afe0..cca7c53abc 100644 --- a/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php +++ b/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php @@ -198,7 +198,9 @@ final class PhabricatorTypeaheadCommonDatasourceController } if ($need_lists) { - $lists = id(new PhabricatorMetaMTAMailingList())->loadAll(); + $lists = id(new PhabricatorMailingListQuery()) + ->setViewer($viewer) + ->execute(); foreach ($lists as $list) { $results[] = id(new PhabricatorTypeaheadResult()) ->setName($list->getName()) diff --git a/src/infrastructure/edges/constants/PhabricatorEdgeConfig.php b/src/infrastructure/edges/constants/PhabricatorEdgeConfig.php index 4182b9060c..8b09f49648 100644 --- a/src/infrastructure/edges/constants/PhabricatorEdgeConfig.php +++ b/src/infrastructure/edges/constants/PhabricatorEdgeConfig.php @@ -159,8 +159,6 @@ final class PhabricatorEdgeConfig extends PhabricatorEdgeConstants { PhabricatorPHIDConstants::PHID_TYPE_FILE => 'PhabricatorFile', PhabricatorPHIDConstants::PHID_TYPE_USER => 'PhabricatorUser', PhabricatorPHIDConstants::PHID_TYPE_PROJ => 'PhabricatorProject', - PhabricatorPHIDConstants::PHID_TYPE_MLST => - 'PhabricatorMetaMTAMailingList', PhabricatorPHIDConstants::PHID_TYPE_TOBJ => 'HarbormasterObject', PhabricatorPHIDConstants::PHID_TYPE_BLOG => 'PhameBlog', PhabricatorPHIDConstants::PHID_TYPE_POST => 'PhamePost',