activity/lib/data.php

315 строки
9.6 KiB
PHP
Executable File

<?php
/**
* ownCloud - Activity App
*
* @author Frank Karlitschek
* @copyright 2013 Frank Karlitschek frank@owncloud.org
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Activity;
use OCP\Activity\IExtension;
use OCP\DB;
use OCP\User;
use OCP\Util;
/**
* @brief Class for managing the data in the activities
*/
class Data {
/** @var \OCP\Activity\IManager */
protected $activityManager;
/**
* @param \OCP\Activity\IManager $activityManager
*/
public function __construct(\OCP\Activity\IManager $activityManager) {
$this->activityManager = $activityManager;
}
protected $notificationTypes = array();
/**
* @param \OCP\IL10N $l
* @return array Array "stringID of the type" => "translated string description for the setting"
*/
public function getNotificationTypes(\OCP\IL10N $l) {
if (isset($this->notificationTypes[$l->getLanguageCode()])) {
return $this->notificationTypes[$l->getLanguageCode()];
}
// Allow apps to add new notification types
$notificationTypes = $this->activityManager->getNotificationTypes($l->getLanguageCode());
$this->notificationTypes[$l->getLanguageCode()] = $notificationTypes;
return $notificationTypes;
}
/**
* Send an event into the activity stream
*
* @param string $app The app where this event is associated with
* @param string $subject A short description of the event
* @param array $subjectparams Array with parameters that are filled in the subject
* @param string $message A longer description of the event
* @param array $messageparams Array with parameters that are filled in the message
* @param string $file The file including path where this event is associated with. (optional)
* @param string $link A link where this event is associated with (optional)
* @param string $affecteduser If empty the current user will be used
* @param string $type Type of the notification
* @param int $prio Priority of the notification
* @return bool
*/
public static function send($app, $subject, $subjectparams = array(), $message = '', $messageparams = array(), $file = '', $link = '', $affecteduser = '', $type = '', $prio = IExtension::PRIORITY_MEDIUM) {
$timestamp = time();
$user = User::getUser();
if ($affecteduser === '') {
$auser = $user;
} else {
$auser = $affecteduser;
}
// store in DB
$query = DB::prepare('INSERT INTO `*PREFIX*activity`(`app`, `subject`, `subjectparams`, `message`, `messageparams`, `file`, `link`, `user`, `affecteduser`, `timestamp`, `priority`, `type`)' . ' VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )');
$query->execute(array($app, $subject, json_encode($subjectparams), $message, json_encode($messageparams), $file, $link, $user, $auser, $timestamp, $prio, $type));
// fire a hook so that other apps like notification systems can connect
Util::emitHook('OC_Activity', 'post_event', array('app' => $app, 'subject' => $subject, 'user' => $user, 'affecteduser' => $affecteduser, 'message' => $message, 'file' => $file, 'link'=> $link, 'prio' => $prio, 'type' => $type));
return true;
}
/**
* @brief Send an event into the activity stream
*
* @param string $app The app where this event is associated with
* @param string $subject A short description of the event
* @param array $subjectParams Array of parameters that are filled in the placeholders
* @param string $affectedUser Name of the user we are sending the activity to
* @param string $type Type of notification
* @param int $latestSendTime Activity time() + batch setting of $affecteduser
* @return bool
*/
public static function storeMail($app, $subject, array $subjectParams, $affectedUser, $type, $latestSendTime) {
$timestamp = time();
// store in DB
$query = DB::prepare('INSERT INTO `*PREFIX*activity_mq` '
. ' (`amq_appid`, `amq_subject`, `amq_subjectparams`, `amq_affecteduser`, `amq_timestamp`, `amq_type`, `amq_latest_send`) '
. ' VALUES(?, ?, ?, ?, ?, ?, ?)');
$query->execute(array(
$app,
$subject,
json_encode($subjectParams),
$affectedUser,
$timestamp,
$type,
$latestSendTime,
));
// fire a hook so that other apps like notification systems can connect
Util::emitHook('OC_Activity', 'post_email', array(
'app' => $app,
'subject' => $subject,
'subjectparams' => $subjectParams,
'affecteduser' => $affectedUser,
'timestamp' => $timestamp,
'type' => $type,
'latest_send' => $latestSendTime,
));
return true;
}
/**
* Filter the activity types
*
* @param array $types
* @param string $filter
* @return array
*/
public function filterNotificationTypes($types, $filter) {
// Allow apps to add new notification types
return $this->activityManager->filterNotificationTypes($types, $filter);
}
/**
* @brief Read a list of events from the activity stream
* @param GroupHelper $groupHelper Allows activities to be grouped
* @param UserSettings $userSettings Gets the settings of the user
* @param int $start The start entry
* @param int $count The number of statements to read
* @param string $filter Filter the activities
* @return array
*/
public function read(GroupHelper $groupHelper, UserSettings $userSettings, $start, $count, $filter = 'all') {
// get current user
$user = User::getUser();
$enabledNotifications = $userSettings->getNotificationTypes($user, 'stream');
$enabledNotifications = $this->filterNotificationTypes($enabledNotifications, $filter);
$parameters = array_unique($enabledNotifications);
// We don't want to display any activities
if (empty($parameters)) {
return array();
}
$placeholders = implode(',', array_fill(0, sizeof($parameters), '?'));
$limitActivities = " AND `type` IN (" . $placeholders . ")";
array_unshift($parameters, $user);
if ($filter === 'self') {
$limitActivities .= ' AND `user` = ?';
$parameters[] = $user;
}
else if ($filter === 'by') {
$limitActivities .= ' AND `user` <> ?';
$parameters[] = $user;
}
else if ($filter !== 'all') {
list($condition, $params) = $this->activityManager->getQueryForFilter($filter);
if (!is_null($condition)) {
$limitActivities .= ' ';
$limitActivities .= $condition;
if (is_array($params)) {
$parameters = array_merge($parameters, $params);
}
}
}
// fetch from DB
$query = DB::prepare(
'SELECT * '
. ' FROM `*PREFIX*activity` '
. ' WHERE `affecteduser` = ? ' . $limitActivities
. ' ORDER BY `timestamp` DESC',
$count, $start);
$result = $query->execute($parameters);
return $this->getActivitiesFromQueryResult($result, $groupHelper);
}
/**
* Process the result and return the activities
*
* @param \OC_DB_StatementWrapper|int $result
* @param \OCA\Activity\GroupHelper $groupHelper
* @return array
*/
public function getActivitiesFromQueryResult($result, GroupHelper $groupHelper) {
if (DB::isError($result)) {
Util::writeLog('Activity', DB::getErrorMessage($result), Util::ERROR);
} else {
while ($row = $result->fetchRow()) {
$groupHelper->addActivity($row);
}
}
return $groupHelper->getActivities();
}
/**
* Get the casted page number from $_GET
* @return int
*/
public function getPageFromParam() {
if (isset($_GET['page'])) {
return (int) $_GET['page'];
}
return 1;
}
/**
* Get the filter from $_GET
* @return string
* @deprecated Use validateFilter() instead
*/
public function getFilterFromParam() {
if (!isset($_GET['filter']))
return 'all';
return $this->validateFilter($_GET['filter']);
}
/**
* Verify that the filter is valid
*
* @param string $filterValue
* @return string
*/
public function validateFilter($filterValue) {
if (!isset($filterValue)) {
return 'all';
}
switch ($filterValue) {
case 'by':
case 'self':
case 'all':
return $filterValue;
default:
if ($this->activityManager->isFilterValid($filterValue)) {
return $filterValue;
}
return 'all';
}
}
/**
* Delete old events
*
* @param int $expireDays Minimum 1 day
* @return null
*/
public function expire($expireDays = 365) {
$ttl = (60 * 60 * 24 * max(1, $expireDays));
$timelimit = time() - $ttl;
$this->deleteActivities(array(
'timestamp' => array($timelimit, '<'),
));
}
/**
* Delete activities that match certain conditions
*
* @param array $conditions Array with conditions that have to be met
* 'field' => 'value' => `field` = 'value'
* 'field' => array('value', 'operator') => `field` operator 'value'
* @return null
*/
public function deleteActivities($conditions) {
$sqlWhere = '';
$sqlParameters = $sqlWhereList = array();
foreach ($conditions as $column => $comparison) {
$sqlWhereList[] = " `$column` " . ((is_array($comparison) && isset($comparison[1])) ? $comparison[1] : '=') . ' ? ';
$sqlParameters[] = (is_array($comparison)) ? $comparison[0] : $comparison;
}
if (!empty($sqlWhereList)) {
$sqlWhere = ' WHERE ' . implode(' AND ', $sqlWhereList);
}
$query = DB::prepare(
'DELETE FROM `*PREFIX*activity`' . $sqlWhere);
$query->execute($sqlParameters);
}
}