Skip to content
This repository has been archived by the owner on Dec 27, 2023. It is now read-only.

Commit

Permalink
feature(Felamimail/MessageFilter): search recipient in message query …
Browse files Browse the repository at this point in the history
…filter
  • Loading branch information
ccheng-dev committed Mar 21, 2023
1 parent 8356ddc commit cbaa0e7
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 28 deletions.
23 changes: 23 additions & 0 deletions tests/tine20/Felamimail/Frontend/JsonTest.php
Expand Up @@ -760,6 +760,29 @@ public function testSearchMessageEmptyQueryFilter()
$this->assertEquals($filterTest['allinboxes'], $allinboxesFilterFound, print_r($result['filter'], true));
}
}

public function testSearchMessageMixedQueryFilter()
{
$fromEmail = 'unittestalias@' . $this->_mailDomain;
$messageToSend = $this->_getMessageData($fromEmail);
$sclever = Tinebase_User::getInstance()->getFullUserByLoginName('sclever');
$messageToSend['to'] = [$sclever->accountEmailAddress];
$messageToSend['subject'] = 'subjectfilter';
$this->_json->saveMessage($messageToSend);
$this->_foldersToClear = array('INBOX', $this->_account->sent_folder);

// check if message is in sent folder
$message = $this->_searchForMessageBySubject($messageToSend['subject'], $this->_account->sent_folder);
//search subject
$result = $this->_json->searchMessages([['field' => 'query', 'operator' => 'contains', 'value' => 'subjectfilter']], '');
$this->assertEquals('subjectfilter', $result['results'][0]['subject'], print_r($result['filter'], true));
//search to email
$result = $this->_json->searchMessages([['field' => 'query', 'operator' => 'contains', 'value' => $sclever->accountEmailAddress]], '');
$this->assertEquals($sclever->accountEmailAddress, $result['results'][0]['to'][0], print_r($result['filter'], true));
//search from email
$result = $this->_json->searchMessages([['field' => 'query', 'operator' => 'contains', 'value' => $fromEmail]], '');
$this->assertEquals($fromEmail, $result['results'][0]['from_email'], print_r($result['filter'], true));
}

/**
* test flags (add + clear + deleted)
Expand Down
42 changes: 18 additions & 24 deletions tine20/Felamimail/Model/MessageFilter.php
Expand Up @@ -40,7 +40,7 @@ class Felamimail_Model_MessageFilter extends Tinebase_Model_Filter_FilterGroup
'id' => array('filter' => 'Tinebase_Model_Filter_Id', 'options' => array('modelName' => 'Felamimail_Model_Message')),
'query' => array(
'filter' => 'Tinebase_Model_Filter_Query',
'options' => array('fields' => array('subject', 'from_email', 'from_name'))
'options' => array('fields' => array('subject', 'from_email', 'from_name', 'to'))
),
'folder_id' => array('filter' => 'Tinebase_Model_Filter_Id'),
'subject' => array('filter' => 'Tinebase_Model_Filter_Text'),
Expand All @@ -52,9 +52,9 @@ class Felamimail_Model_MessageFilter extends Tinebase_Model_Filter_FilterGroup
'has_attachment'=> ['filter' => Tinebase_Model_Filter_Bool::class],
// custom filters
'path' => array('custom' => true),
'to' => array('custom' => true, 'requiredCols' => array('to' => 'felamimail_cache_message_to.*')),
'cc' => array('custom' => true, 'requiredCols' => array('cc' => 'felamimail_cache_message_cc.*')),
'bcc' => array('custom' => true, 'requiredCols' => array('bcc' => 'felamimail_cache_message_bcc.*')),
'to' => array('filter' => Felamimail_Model_RecipientFilter::class),
'cc' => array('filter' => Felamimail_Model_RecipientFilter::class),
'bcc' => array('filter' => Felamimail_Model_RecipientFilter::class),
'flags' => array('custom' => true, 'requiredCols' => array('flags' => 'felamimail_cache_msg_flag.flag')),
'account_id' => array('custom' => true),
'tag' => array('filter' => 'Tinebase_Model_Filter_Tag', 'options' => array(
Expand Down Expand Up @@ -85,7 +85,12 @@ public function appendFilterSql($_select, $_backend)
} else if ($customData['field'] == 'path') {
$this->_addPathSql($_select, $_backend, $customData);
} else {
$this->_addRecipientAndFlagsSql($_select, $_backend, $customData);
$this->_addFlagsSql($_select, $_backend, $customData);
}
}
foreach ($this->_filterObjects as $filterObject) {
if ($filterObject instanceof Felamimail_Model_RecipientFilter) {
$filterObject->appendFilterSql($_select, $_backend);
}
}

Expand Down Expand Up @@ -190,36 +195,29 @@ protected function _getFolderIdsOfAllInboxes()
}

/**
* add to/cc/bcc and flags custom filters
* add flags custom filters
*
* @param Zend_Db_Select $_select
* @param Felamimail_Backend_Cache_Sql_Message $_backend
* @param array $_filterData
* @return void
*/
protected function _addRecipientAndFlagsSql($_select, $_backend, $_filterData)
protected function _addFlagsSql($_select, $_backend, $_filterData)
{
$db = $_backend->getAdapter();
$foreignTables = $_backend->getForeignTables();

// add conditions
$tablename = $foreignTables[$_filterData['field']]['table'];
if ($_filterData['field'] !== 'flags') {
$fieldName = $tablename . '.name';
$fieldEmail = $tablename . '.email';
}


// add filter value
if (! isset($_filterData['value'])) {
$_filterData['value'] = '';
}
if (! is_array($_filterData['value'])) {
$value = '%' . $_filterData['value'] . '%';
} else {
$value = array();
foreach ((array)$_filterData['value'] as $customValue) {
$value[] = '%' . $customValue . '%';
}

$value = array();
foreach ((array)$_filterData['value'] as $customValue) {
$value[] = '%' . $customValue . '%';
}

if ($_filterData['field'] == 'flags') {
Expand All @@ -242,11 +240,7 @@ protected function _addRecipientAndFlagsSql($_select, $_backend, $_filterData)
if ($orConditions) {
$_select->where('(' . $orConditions . ')');
}
} elseif (!empty($_filterData['value'])) {
$_select->where(
$db->quoteInto($fieldName . ' LIKE ?', $value) . ' OR ' .
$db->quoteInto($fieldEmail . ' LIKE ?', $value)
);
}
}

}
63 changes: 63 additions & 0 deletions tine20/Felamimail/Model/RecipientFilter.php
@@ -0,0 +1,63 @@
<?php
/**
* Tine 2.0
*
* @package Felamimail
* @subpackage Filter
* @license http://www.gnu.org/licenses/agpl.html AGPL Version 3
* @copyright Copyright (c) 2023 Metaways Infosystems GmbH (http://www.metaways.de)
* @author Ching En Cheng <c.cheng@metaways.de>
*/

/**
* Felamimail_Model_RecipientFilter
*
* filters for recipients
*
*
* @package Felamimail
* @subpackage Filter
*/
class Felamimail_Model_RecipientFilter extends Tinebase_Model_Filter_Text
{
/**
* add to/cc/bcc custom filters
*
* @param Zend_Db_Select $_select
* @param Felamimail_Backend_Cache_Sql_Message $_backend
* @return void
* @throws Tinebase_Exception_Backend_Database
* @throws Zend_Db_Select_Exception
*/
public function appendFilterSql($_select, $_backend)
{
$db = $_backend->getAdapter();
$prefix = $_backend->getTablePrefix();
$foreignTables = $_backend->getForeignTables();
// add conditions
$tablename = $foreignTables[$this->_field]['table'];
$fieldName = $tablename . '.name';
$fieldEmail = $tablename . '.email';
$from = $_select->getPart(Zend_Db_Select::FROM);
$selectArray = [$this->_field => $this->_dbCommand->getAggregate($tablename . '.' . 'email')];

if (!isset($from[$tablename])) {
$_select->joinLeft(
/* table */ array($tablename => $prefix . $tablename),
/* on */ $this->_db->quoteIdentifier('felamimail_cache_message' . '.' . 'id') . ' = ' . $this->_db->quoteIdentifier($tablename . '.' . 'message_id'),
/* select */ $selectArray
);
} else {
// join is defined already => just add the column
$_select->columns($selectArray, $tablename);
}

if (!empty($this->_value)) {
$value = '%' . $this->_value . '%';
$_select->where(
$db->quoteInto($fieldName . ' LIKE ?', $value) . ' OR ' .
$db->quoteInto($fieldEmail . ' LIKE ?', $value)
);
}
}
}
4 changes: 2 additions & 2 deletions tine20/Felamimail/js/Model.js
Expand Up @@ -189,12 +189,12 @@ Tine.Felamimail.Model.Message.getDefaultData = function() {
* @return {Object} filterModel definition
*/
Tine.Felamimail.Model.Message.getFilterModel = function() {
var app = Tine.Tinebase.appMgr.get('Felamimail');
const app = Tine.Tinebase.appMgr.get('Felamimail');

return [
{filtertype: 'tine.felamimail.folder.filtermodel', app: app},
{label: app.i18n._('Subject/From'),field: 'query', operators: ['contains']},
{label: app.i18n._('Subject'), field: 'subject', operators: ['contains']},
{label: app.i18n._('Subject/From/To'), field: 'query', operators: ['contains']},
{label: app.i18n._('From (Email)'),field: 'from_email', operators: ['contains']},
{label: app.i18n._('From (Name)'), field: 'from_name', operators: ['contains']},
{label: app.i18n._('To'), field: 'to', operators: ['contains']},
Expand Down
4 changes: 2 additions & 2 deletions tine20/Felamimail/translations/de.po
Expand Up @@ -1531,8 +1531,8 @@ msgstr[0] "Nachricht"
msgstr[1] "Nachrichten"

#: js/Model.js:218
msgid "Subject/From"
msgstr "Betreff/Von"
msgid "Subject/From/To"
msgstr "Betreff/Von/An"

#: js/Model.js:221 js/GridPanel.js:522
msgid "From (Name)"
Expand Down

0 comments on commit cbaa0e7

Please sign in to comment.