tao-test/app/tao/models/classes/notification/implementation/AbstractSqlNotificationService.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;
}