From ffc1b5c26a4002326e857409a509d44f7484889e Mon Sep 17 00:00:00 2001 From: epriestley Date: Sun, 29 Jun 2014 07:51:03 -0700 Subject: [PATCH] Allow users to search for signatures by name and email substrings Summary: Ref T3116. In the case of anonymous signers, there's no way to do a quick way to check if someone has signed a doc since you can't query by their (nonexistent) external account ID. Move "name" and "email" to first-class columns and let the engine search for them. Test Plan: Searched for signatures with name and email fragments. Reviewers: btrahan, chad Reviewed By: chad Subscribers: epriestley Maniphest Tasks: T3116 Differential Revision: https://secure.phabricator.com/D9776 --- .../sql/autopatches/20140629.legalsig.1.sql | 7 ++++ .../sql/autopatches/20140629.legalsig.2.php | 17 ++++++++++ .../LegalpadDocumentSignController.php | 16 ++++++--- .../query/LegalpadDocumentSignatureQuery.php | 26 ++++++++++++++ .../LegalpadDocumentSignatureSearchEngine.php | 34 ++++++++++++++++--- .../storage/LegalpadDocumentSignature.php | 2 ++ 6 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 resources/sql/autopatches/20140629.legalsig.1.sql create mode 100644 resources/sql/autopatches/20140629.legalsig.2.php diff --git a/resources/sql/autopatches/20140629.legalsig.1.sql b/resources/sql/autopatches/20140629.legalsig.1.sql new file mode 100644 index 0000000000..5efd1164f4 --- /dev/null +++ b/resources/sql/autopatches/20140629.legalsig.1.sql @@ -0,0 +1,7 @@ +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature + ADD signerName VARCHAR(255) NOT NULL COLLATE utf8_general_ci + AFTER signerPHID; + +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature + ADD signerEmail VARCHAR(255) NOT NULL COLLATE utf8_general_ci + AFTER signerName; diff --git a/resources/sql/autopatches/20140629.legalsig.2.php b/resources/sql/autopatches/20140629.legalsig.2.php new file mode 100644 index 0000000000..6ded26b9e0 --- /dev/null +++ b/resources/sql/autopatches/20140629.legalsig.2.php @@ -0,0 +1,17 @@ +establishConnection('w'); +foreach (new LiskMigrationIterator($table) as $signature) { + echo pht("Updating Legalpad signature %d...\n", $signature->getID()); + + $data = $signature->getSignatureData(); + + queryfx( + $conn_w, + 'UPDATE %T SET signerName = %s, signerEmail = %s WHERE id = %d', + $table->getTableName(), + (string)idx($data, 'name'), + (string)idx($data, 'email'), + $signature->getID()); +} diff --git a/src/applications/legalpad/controller/LegalpadDocumentSignController.php b/src/applications/legalpad/controller/LegalpadDocumentSignController.php index e06f944425..35ddd7d918 100644 --- a/src/applications/legalpad/controller/LegalpadDocumentSignController.php +++ b/src/applications/legalpad/controller/LegalpadDocumentSignController.php @@ -82,6 +82,8 @@ final class LegalpadDocumentSignController extends LegalpadController { ->setSignerPHID($signer_phid) ->setDocumentPHID($document->getPHID()) ->setDocumentVersion($document->getVersions()) + ->setSignerName((string)idx($signature_data, 'name')) + ->setSignerEmail((string)idx($signature_data, 'email')) ->setSignatureData($signature_data); // If the user is logged in, show a notice that they haven't signed. @@ -118,11 +120,13 @@ final class LegalpadDocumentSignController extends LegalpadController { if ($request->isFormOrHisecPost() && !$has_signed) { // Require two-factor auth to sign legal documents. - $engine = new PhabricatorAuthSessionEngine(); - $engine->requireHighSecuritySession( - $viewer, - $request, - '/'.$document->getMonogram()); + if ($viewer->isLoggedIn()) { + $engine = new PhabricatorAuthSessionEngine(); + $engine->requireHighSecuritySession( + $viewer, + $request, + '/'.$document->getMonogram()); + } $name = $request->getStr('name'); $agree = $request->getExists('agree'); @@ -157,6 +161,8 @@ final class LegalpadDocumentSignController extends LegalpadController { } $signature_data['email'] = $email; + $signature->setSignerName((string)idx($signature_data, 'name')); + $signature->setSignerEmail((string)idx($signature_data, 'email')); $signature->setSignatureData($signature_data); if (!$agree) { diff --git a/src/applications/legalpad/query/LegalpadDocumentSignatureQuery.php b/src/applications/legalpad/query/LegalpadDocumentSignatureQuery.php index a7dd22d189..9a4ba46776 100644 --- a/src/applications/legalpad/query/LegalpadDocumentSignatureQuery.php +++ b/src/applications/legalpad/query/LegalpadDocumentSignatureQuery.php @@ -8,6 +8,8 @@ final class LegalpadDocumentSignatureQuery private $signerPHIDs; private $documentVersions; private $secretKeys; + private $nameContains; + private $emailContains; public function withIDs(array $ids) { $this->ids = $ids; @@ -34,6 +36,16 @@ final class LegalpadDocumentSignatureQuery return $this; } + public function withNameContains($text) { + $this->nameContains = $text; + return $this; + } + + public function withEmailContains($text) { + $this->emailContains = $text; + return $this; + } + protected function loadPage() { $table = new LegalpadDocumentSignature(); $conn_r = $table->establishConnection('r'); @@ -114,6 +126,20 @@ final class LegalpadDocumentSignatureQuery $this->secretKeys); } + if ($this->nameContains !== null) { + $where[] = qsprintf( + $conn_r, + 'signerName LIKE %~', + $this->nameContains); + } + + if ($this->emailContains !== null) { + $where[] = qsprintf( + $conn_r, + 'signerEmail LIKE %~', + $this->emailContains); + } + return $this->formatWhereClause($where); } diff --git a/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php b/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php index 83d91e8930..497ad48535 100644 --- a/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php +++ b/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php @@ -34,6 +34,9 @@ final class LegalpadDocumentSignatureSearchEngine PhabricatorLegalpadPHIDTypeDocument::TYPECONST, ))); + $saved->setParameter('nameContains', $request->getStr('nameContains')); + $saved->setParameter('emailContains', $request->getStr('emailContains')); + return $saved; } @@ -54,6 +57,16 @@ final class LegalpadDocumentSignatureSearchEngine } } + $name_contains = $saved->getParameter('nameContains'); + if (strlen($name_contains)) { + $query->withNameContains($name_contains); + } + + $email_contains = $saved->getParameter('emailContains'); + if (strlen($email_contains)) { + $query->withEmailContains($email_contains); + } + return $query; } @@ -80,13 +93,26 @@ final class LegalpadDocumentSignatureSearchEngine ->setValue(array_select_keys($handles, $document_phids))); } + $name_contains = $saved_query->getParameter('nameContains', ''); + $email_contains = $saved_query->getParameter('emailContains', ''); + $form ->appendChild( id(new AphrontFormTokenizerControl()) ->setDatasource('/typeahead/common/users/') ->setName('signers') ->setLabel(pht('Signers')) - ->setValue(array_select_keys($handles, $signer_phids))); + ->setValue(array_select_keys($handles, $signer_phids))) + ->appendChild( + id(new AphrontFormTextControl()) + ->setLabel(pht('Name Contains')) + ->setName('nameContains') + ->setValue($name_contains)) + ->appendChild( + id(new AphrontFormTextControl()) + ->setLabel(pht('Email Contains')) + ->setName('emailContains') + ->setValue($email_contains)); } protected function getURI($path) { @@ -159,9 +185,8 @@ final class LegalpadDocumentSignatureSearchEngine $rows = array(); foreach ($signatures as $signature) { - $data = $signature->getSignatureData(); - $name = idx($data, 'name'); - $email = idx($data, 'email'); + $name = $signature->getSignerName(); + $email = $signature->getSignerEmail(); $document = $signature->getDocument(); @@ -189,6 +214,7 @@ final class LegalpadDocumentSignatureSearchEngine } $table = id(new AphrontTableView($rows)) + ->setNoDataString(pht('No signatures match the query.')) ->setHeaders( array( '', diff --git a/src/applications/legalpad/storage/LegalpadDocumentSignature.php b/src/applications/legalpad/storage/LegalpadDocumentSignature.php index d9f569f45d..eed19be524 100644 --- a/src/applications/legalpad/storage/LegalpadDocumentSignature.php +++ b/src/applications/legalpad/storage/LegalpadDocumentSignature.php @@ -10,6 +10,8 @@ final class LegalpadDocumentSignature protected $documentPHID; protected $documentVersion; protected $signerPHID; + protected $signerName; + protected $signerEmail; protected $signatureData = array(); protected $verified; protected $secretKey; -- 2.51.2