Application Emails - add datasource so we can have a typeahead
Summary: Ref T5039. This will be necessary for Herald integration so users can make rules like "if app email is one of x, y, or z add projects foo, bar, and metallica." I think its best to do an actual typeahead here -- users select full email addresses -- rather than support prefix, suffix, etc stuff on the email address. I think the latter approach would yield lots of confusion, as well as prevent us from (more) easily providing diagnostic tools about what happened when and why. Test Plan: hacked a maniphest tokenizer to use this new datasource and it worked Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin, epriestley Maniphest Tasks: T5039 Differential Revision: https://secure.phabricator.com/D11546
This commit is contained in:
		| @@ -1953,6 +1953,7 @@ phutil_register_library_map(array( | ||||
|     'PhabricatorMetaMTAActorQuery' => 'applications/metamta/query/PhabricatorMetaMTAActorQuery.php', | ||||
|     'PhabricatorMetaMTAApplication' => 'applications/metamta/application/PhabricatorMetaMTAApplication.php', | ||||
|     'PhabricatorMetaMTAApplicationEmail' => 'applications/metamta/storage/PhabricatorMetaMTAApplicationEmail.php', | ||||
|     'PhabricatorMetaMTAApplicationEmailDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAApplicationEmailDatasource.php', | ||||
|     'PhabricatorMetaMTAApplicationEmailPHIDType' => 'applications/phid/PhabricatorMetaMTAApplicationEmailPHIDType.php', | ||||
|     'PhabricatorMetaMTAApplicationEmailQuery' => 'applications/metamta/query/PhabricatorMetaMTAApplicationEmailQuery.php', | ||||
|     'PhabricatorMetaMTAAttachment' => 'applications/metamta/storage/PhabricatorMetaMTAAttachment.php', | ||||
| @@ -5184,6 +5185,7 @@ phutil_register_library_map(array( | ||||
|       'PhabricatorMetaMTADAO', | ||||
|       'PhabricatorPolicyInterface', | ||||
|     ), | ||||
|     'PhabricatorMetaMTAApplicationEmailDatasource' => 'PhabricatorTypeaheadDatasource', | ||||
|     'PhabricatorMetaMTAApplicationEmailPHIDType' => 'PhabricatorPHIDType', | ||||
|     'PhabricatorMetaMTAApplicationEmailQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', | ||||
|     'PhabricatorMetaMTAConfigOptions' => 'PhabricatorApplicationConfigOptions', | ||||
|   | ||||
| @@ -6,6 +6,7 @@ final class PhabricatorMetaMTAApplicationEmailQuery | ||||
|   private $ids; | ||||
|   private $phids; | ||||
|   private $addresses; | ||||
|   private $addressPrefix; | ||||
|   private $applicationPHIDs; | ||||
|  | ||||
|   public function withIDs(array $ids) { | ||||
| @@ -23,6 +24,11 @@ final class PhabricatorMetaMTAApplicationEmailQuery | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function withAddressPrefix($prefix) { | ||||
|     $this->addressPrefix = $prefix; | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function withApplicationPHIDs(array $phids) { | ||||
|     $this->applicationPHIDs = $phids; | ||||
|     return $this; | ||||
| @@ -75,6 +81,13 @@ final class PhabricatorMetaMTAApplicationEmailQuery | ||||
|         $this->addresses); | ||||
|     } | ||||
|  | ||||
|     if ($this->addressPrefix !== null) { | ||||
|       $where[] = qsprintf( | ||||
|         $conn_r, | ||||
|         'appemail.address LIKE %>', | ||||
|         $this->addressPrefix); | ||||
|     } | ||||
|  | ||||
|     if ($this->applicationPHIDs !== null) { | ||||
|       $where[] = qsprintf( | ||||
|         $conn_r, | ||||
|   | ||||
| @@ -0,0 +1,43 @@ | ||||
| <?php | ||||
|  | ||||
| final class PhabricatorMetaMTAApplicationEmailDatasource | ||||
|   extends PhabricatorTypeaheadDatasource { | ||||
|  | ||||
|   public function getPlaceholderText() { | ||||
|     return pht('Type an application email address...'); | ||||
|   } | ||||
|  | ||||
|   public function getDatasourceApplicationClass() { | ||||
|     return 'PhabricatorMetaMTAApplication'; | ||||
|   } | ||||
|  | ||||
|   public function loadResults() { | ||||
|     $viewer = $this->getViewer(); | ||||
|     $raw_query = $this->getRawQuery(); | ||||
|  | ||||
|     $emails = id(new PhabricatorMetaMTAApplicationEmailQuery()) | ||||
|       ->setViewer($viewer) | ||||
|       ->withAddressPrefix($raw_query) | ||||
|       ->setLimit($this->getLimit()) | ||||
|       ->execute(); | ||||
|  | ||||
|     if ($emails) { | ||||
|       $handles = id(new PhabricatorHandleQuery()) | ||||
|         ->setViewer($viewer) | ||||
|         ->withPHIDs(mpull($emails, 'getPHID')) | ||||
|         ->execute(); | ||||
|     } else { | ||||
|       $handles = array(); | ||||
|     } | ||||
|  | ||||
|     $results = array(); | ||||
|     foreach ($handles as $handle) { | ||||
|       $results[] = id(new PhabricatorTypeaheadResult()) | ||||
|         ->setName($handle->getName()) | ||||
|         ->setPHID($handle->getPHID()); | ||||
|     } | ||||
|  | ||||
|     return $results; | ||||
|   } | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Bob Trahan
					Bob Trahan