221 lines
7.6 KiB
PHP
221 lines
7.6 KiB
PHP
<?php
|
|
|
|
/**
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; under version 2
|
|
* of the License (non-upgradable).
|
|
*
|
|
* This program 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 General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* Copyright (c) 2020 (original work) Open Assessment Technologies SA;
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace oat\tao\model\notification\implementation;
|
|
|
|
use common_exception_NotFound;
|
|
use common_persistence_Persistence as Persistence;
|
|
use common_persistence_SqlPersistence;
|
|
use Doctrine\DBAL\Driver\Statement;
|
|
use Doctrine\DBAL\Platforms\AbstractPlatform;
|
|
use oat\generis\model\OntologyAwareTrait;
|
|
use oat\generis\persistence\PersistenceManager;
|
|
use oat\generis\persistence\sql\SchemaProviderInterface;
|
|
use oat\tao\model\notification\AbstractNotificationService;
|
|
use oat\tao\model\notification\Notification;
|
|
|
|
/**
|
|
* @deprecated This class is used by client only. It will be moved to client specific extension
|
|
*/
|
|
abstract class AbstractSqlNotificationService extends AbstractNotificationService implements SchemaProviderInterface
|
|
{
|
|
use OntologyAwareTrait;
|
|
|
|
public const NOTIFICATION_TABLE = 'notifications';
|
|
|
|
public const NOTIFICATION_FIELD_ID = 'id';
|
|
public const NOTIFICATION_FIELD_RECIPIENT = 'recipient';
|
|
public const NOTIFICATION_FIELD_TITLE = 'title';
|
|
public const NOTIFICATION_FIELD_STATUS = 'status';
|
|
public const NOTIFICATION_FIELD_SENDER = 'sender_id';
|
|
public const NOTIFICATION_FIELD_SENDER_NAME = 'sender_name';
|
|
public const NOTIFICATION_FIELD_MESSAGE = 'message';
|
|
public const NOTIFICATION_FIELD_CREATION = 'created_at';
|
|
public const NOTIFICATION_FIELD_UPDATED = 'updated_at';
|
|
|
|
public const OPTION_PERSISTENCE = 'persistence';
|
|
|
|
public const DEFAULT_PERSISTENCE = 'default';
|
|
|
|
/**
|
|
* @var Persistence
|
|
*/
|
|
protected $persistence;
|
|
|
|
public function sendNotification(Notification $notification): Notification
|
|
{
|
|
$this->getPersistence()->insert(self::NOTIFICATION_TABLE, $this->prepareNotification($notification));
|
|
return $notification;
|
|
}
|
|
|
|
/**
|
|
* @return Notification[]
|
|
*/
|
|
public function getNotifications(string $userId): array
|
|
{
|
|
$notification = [];
|
|
$persistence = $this->getPersistence();
|
|
|
|
$selectQuery = 'SELECT ' . self::NOTIFICATION_FIELD_ID . ' , ' . $this->getAllFieldString() .
|
|
' FROM ' . self::NOTIFICATION_TABLE . ' WHERE ' .
|
|
self::NOTIFICATION_FIELD_RECIPIENT . ' = ? ' .
|
|
'ORDER BY ' . self::NOTIFICATION_FIELD_CREATION . ' DESC ' .
|
|
'LIMIT 20';
|
|
|
|
$params = [
|
|
$userId
|
|
];
|
|
|
|
$result = $persistence->query($selectQuery, $params)->fetchAll();
|
|
|
|
foreach ($result as $notificationDetail) {
|
|
$notification[] = $this->createNotification($notificationDetail);
|
|
}
|
|
|
|
return $notification;
|
|
}
|
|
|
|
protected function getPersistence(): Persistence
|
|
{
|
|
if ($this->persistence === null) {
|
|
$persistence = self::DEFAULT_PERSISTENCE;
|
|
|
|
if ($this->hasOption(self::OPTION_PERSISTENCE)) {
|
|
$persistence = $this->getOption(self::OPTION_PERSISTENCE);
|
|
}
|
|
|
|
$persistenceManager = $this->getServiceLocator()->get(PersistenceManager::SERVICE_ID);
|
|
$this->persistence = $persistenceManager->getPersistenceById($persistence);
|
|
}
|
|
return $this->persistence;
|
|
}
|
|
|
|
/**
|
|
* @throws common_exception_NotFound
|
|
*/
|
|
public function getNotification(string $id): Notification
|
|
{
|
|
/** @var common_persistence_SqlPersistence $persistence */
|
|
$persistence = $this->getPersistence();
|
|
|
|
$selectQuery = 'SELECT ' . self::NOTIFICATION_FIELD_ID . ' , ' . $this->getAllFieldString() .
|
|
' FROM ' . self::NOTIFICATION_TABLE . ' WHERE ' .
|
|
self::NOTIFICATION_FIELD_ID . ' = ? ';
|
|
|
|
$params = [
|
|
$id,
|
|
];
|
|
|
|
$notificationDetail = $persistence->query($selectQuery, $params)->fetch();
|
|
|
|
if ($notificationDetail) {
|
|
return $this->createNotification($notificationDetail);
|
|
}
|
|
|
|
throw new common_exception_NotFound('Error notification not found , requested id: ' . $id);
|
|
}
|
|
|
|
protected function getAllFieldString(): string
|
|
{
|
|
return self::NOTIFICATION_FIELD_RECIPIENT . ' , '
|
|
. self::NOTIFICATION_FIELD_STATUS . ' , '
|
|
. self::NOTIFICATION_FIELD_SENDER . ' , '
|
|
. self::NOTIFICATION_FIELD_SENDER_NAME . ' , '
|
|
. self::NOTIFICATION_FIELD_TITLE . ' , '
|
|
. self::NOTIFICATION_FIELD_MESSAGE . ' , '
|
|
. self::NOTIFICATION_FIELD_CREATION . ' , '
|
|
. self::NOTIFICATION_FIELD_UPDATED;
|
|
}
|
|
|
|
public function notificationCount(string $userId): array
|
|
{
|
|
$persistence = $this->getPersistence();
|
|
$count = [ Notification::CREATED_STATUS => 0 ];
|
|
|
|
$selectQuery = 'SELECT '
|
|
. self::NOTIFICATION_FIELD_STATUS
|
|
. ' , COUNT('
|
|
. self::NOTIFICATION_FIELD_ID
|
|
. ') as cpt'
|
|
. ' FROM '
|
|
. self::NOTIFICATION_TABLE
|
|
. ' WHERE '
|
|
. self::NOTIFICATION_FIELD_RECIPIENT
|
|
. ' = ? '
|
|
. ' GROUP BY '
|
|
. self::NOTIFICATION_FIELD_STATUS;
|
|
|
|
$params = [
|
|
$userId,
|
|
];
|
|
|
|
/** @var Statement $statement */
|
|
$statement = $persistence->query($selectQuery, $params);
|
|
|
|
if (($result = $statement->fetchAll()) !== false) {
|
|
foreach ($result as $statusCount) {
|
|
$count[$statusCount[self::NOTIFICATION_FIELD_STATUS]] = $statusCount['cpt'];
|
|
}
|
|
}
|
|
|
|
return $count;
|
|
}
|
|
|
|
public function changeStatus(Notification $notification): bool
|
|
{
|
|
$updateQuery = 'UPDATE ' . self::NOTIFICATION_TABLE . ' SET ' .
|
|
self::NOTIFICATION_FIELD_UPDATED . ' = ? ,' .
|
|
self::NOTIFICATION_FIELD_STATUS . ' = ? ' .
|
|
' WHERE ' . self::NOTIFICATION_FIELD_ID . ' = ? ';
|
|
|
|
$persistence = $this->getPersistence();
|
|
/** @var AbstractPlatform $platform */
|
|
$platform = $this->getPersistence()->getPlatForm();
|
|
|
|
$data =
|
|
[
|
|
$platform->getNowExpression(),
|
|
$notification->getStatus(),
|
|
$notification->getId(),
|
|
];
|
|
|
|
return (bool)$persistence->exec($updateQuery, $data);
|
|
}
|
|
|
|
private function createNotification(array $notificationDetail): Notification
|
|
{
|
|
return new Notification(
|
|
$notificationDetail[self::NOTIFICATION_FIELD_RECIPIENT],
|
|
$notificationDetail[self::NOTIFICATION_FIELD_TITLE],
|
|
$notificationDetail[self::NOTIFICATION_FIELD_MESSAGE],
|
|
$notificationDetail[self::NOTIFICATION_FIELD_SENDER],
|
|
$notificationDetail[self::NOTIFICATION_FIELD_SENDER_NAME],
|
|
$notificationDetail[self::NOTIFICATION_FIELD_ID],
|
|
$notificationDetail[self::NOTIFICATION_FIELD_CREATION],
|
|
$notificationDetail[self::NOTIFICATION_FIELD_UPDATED],
|
|
$notificationDetail[self::NOTIFICATION_FIELD_STATUS]
|
|
);
|
|
}
|
|
|
|
abstract protected function prepareNotification(Notification $notification): array;
|
|
}
|