Files
server/usr/share/psa-horde/imp/lib/Sentmail/Mongo.php
2026-01-07 20:52:11 +01:00

195 lines
4.7 KiB
PHP

<?php
/**
* Copyright 2013-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see http://www.horde.org/licenses/gpl.
*
* @category Horde
* @copyright 2013-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
/**
* Sentmail driver implementation for MongoDB databases.
*
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @copyright 2013-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
class IMP_Sentmail_Mongo extends IMP_Sentmail implements Horde_Mongo_Collection_Index
{
/* Field names. */
const ACTION = 'action';
const MESSAGEID = 'msgid';
const RECIPIENT = 'recip';
const SUCCESS = 'success';
const TS = 'ts';
const WHO = 'who';
/**
* Handle for the current database connection.
*
* @var MongoCollection
*/
protected $_db;
/**
* Indices list.
*
* @var array
*/
protected $_indices = array(
'index_ts' => array(
self::TS => 1
),
'index_who' => array(
self::WHO => 1
),
'index_success' => array(
self::SUCCESS => 1
)
);
/**
* @param array $params Parameters:
* - collection: (string) The name of the sentmail collection.
* - mongo_db: (Horde_Mongo_Client) [REQUIRED] The DB instance.
*/
public function __construct(array $params = array())
{
if (!isset($params['mongo_db'])) {
throw new InvalidArgumentException('Missing mongo_db parameter.');
}
parent::__construct(array_merge(array(
'collection' => 'imp_sentmail'
), $params));
$this->_db = $this->_params['mongo_db']->selectCollection(null, $this->_params['collection']);
}
/**
*/
protected function _log($action, $message_id, $recipient, $success)
{
try {
$this->_db->insert(array(
self::ACTION => $action,
self::MESSAGEID => $message_id,
self::RECIPIENT => $recipient,
self::SUCCESS => intval($success),
self::TS => time(),
self::WHO => $GLOBALS['registry']->getAuth()
));
} catch (MongoException $e) {}
}
/**
*/
public function favouriteRecipients($limit, $filter = null)
{
$query = array(
self::SUCCESS => 1,
self::WHO => $GLOBALS['registry']->getAuth()
);
if (!empty($filter)) {
$query[self::ACTION] = array('$in' => $filter);
}
$out = array();
try {
$res = $this->_db->aggregate(array(
/* Match the query. */
array('$match' => $query),
/* Group by recipient. */
array(
'$group' => array(
'_id' => '$' . self::RECIPIENT,
'count' => array(
'$sum' => 1
)
)
),
/* Sort by recipient. */
array(
'$sort' => array('count' => -1)
),
/* Limit the return. */
array(
'$limit' => $limit
)
));
if (isset($res['result'])) {
foreach ($res['result'] as $val) {
$out[] = $val['_id'];
}
}
} catch (MongoException $e) {}
return $out;
}
/**
*/
public function numberOfRecipients($hours, $user = false)
{
$query = array(
self::SUCCESS => 1,
self::TS => array(
'$gt' => (time() - ($hours * 3600))
)
);
if ($user) {
$query[self::WHO] = $GLOBALS['registry']->getAuth();
}
try {
return $this->_db->count($query);
} catch (MongoException $e) {
return 0;
}
}
/**
*/
protected function _deleteOldEntries($before)
{
try {
$this->_db->remove(array(
self::TS => array(
'$lt' => $before
)
));
} catch (MongoException $e) {}
}
/* Horde_Mongo_Collection_Index methods. */
/**
*/
public function checkMongoIndices()
{
return $this->_params['mongo_db']->checkIndices($this->_db, $this->_indices);
}
/**
*/
public function createMongoIndices()
{
$this->_params['mongo_db']->createIndices($this->_db, $this->_indices);
}
}