Allow rich object subjects for Notifications
Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
parent
2098648850
commit
b35d2fd8f2
|
@ -24,6 +24,7 @@
|
||||||
namespace OC\Notification;
|
namespace OC\Notification;
|
||||||
|
|
||||||
|
|
||||||
|
use OC\RichObjectStrings\Validator;
|
||||||
use OCP\Notification\IApp;
|
use OCP\Notification\IApp;
|
||||||
use OCP\Notification\IManager;
|
use OCP\Notification\IManager;
|
||||||
use OCP\Notification\INotification;
|
use OCP\Notification\INotification;
|
||||||
|
@ -149,7 +150,9 @@ class Manager implements IManager {
|
||||||
* @since 8.2.0
|
* @since 8.2.0
|
||||||
*/
|
*/
|
||||||
public function createNotification() {
|
public function createNotification() {
|
||||||
return new Notification();
|
return new Notification(
|
||||||
|
new Validator()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -26,8 +26,14 @@ namespace OC\Notification;
|
||||||
|
|
||||||
use OCP\Notification\IAction;
|
use OCP\Notification\IAction;
|
||||||
use OCP\Notification\INotification;
|
use OCP\Notification\INotification;
|
||||||
|
use OCP\RichObjectStrings\InvalidObjectExeption;
|
||||||
|
use OCP\RichObjectStrings\IValidator;
|
||||||
|
|
||||||
class Notification implements INotification {
|
class Notification implements INotification {
|
||||||
|
|
||||||
|
/** @var IValidator */
|
||||||
|
protected $richValidator;
|
||||||
|
|
||||||
/** @var string */
|
/** @var string */
|
||||||
protected $app;
|
protected $app;
|
||||||
|
|
||||||
|
@ -52,6 +58,12 @@ class Notification implements INotification {
|
||||||
/** @var string */
|
/** @var string */
|
||||||
protected $subjectParsed;
|
protected $subjectParsed;
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
|
protected $subjectRich;
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
protected $subjectRichParameters;
|
||||||
|
|
||||||
/** @var string */
|
/** @var string */
|
||||||
protected $message;
|
protected $message;
|
||||||
|
|
||||||
|
@ -81,8 +93,11 @@ class Notification implements INotification {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
|
*
|
||||||
|
* @param IValidator $richValidator
|
||||||
*/
|
*/
|
||||||
public function __construct() {
|
public function __construct(IValidator $richValidator) {
|
||||||
|
$this->richValidator = $richValidator;
|
||||||
$this->app = '';
|
$this->app = '';
|
||||||
$this->user = '';
|
$this->user = '';
|
||||||
$this->dateTime = new \DateTime();
|
$this->dateTime = new \DateTime();
|
||||||
|
@ -92,6 +107,8 @@ class Notification implements INotification {
|
||||||
$this->subject = '';
|
$this->subject = '';
|
||||||
$this->subjectParameters = [];
|
$this->subjectParameters = [];
|
||||||
$this->subjectParsed = '';
|
$this->subjectParsed = '';
|
||||||
|
$this->subjectRich = '';
|
||||||
|
$this->subjectRichParameters = [];
|
||||||
$this->message = '';
|
$this->message = '';
|
||||||
$this->messageParameters = [];
|
$this->messageParameters = [];
|
||||||
$this->messageParsed = '';
|
$this->messageParsed = '';
|
||||||
|
@ -261,6 +278,43 @@ class Notification implements INotification {
|
||||||
return $this->subjectParsed;
|
return $this->subjectParsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $subject
|
||||||
|
* @param array $parameters
|
||||||
|
* @return $this
|
||||||
|
* @throws \InvalidArgumentException if the subject or parameters are invalid
|
||||||
|
* @since 9.2.0
|
||||||
|
*/
|
||||||
|
public function setRichSubject($subject, array $parameters = []) {
|
||||||
|
if (!is_string($subject) || $subject === '') {
|
||||||
|
throw new \InvalidArgumentException('The given parsed subject is invalid');
|
||||||
|
}
|
||||||
|
$this->subjectRich = $subject;
|
||||||
|
|
||||||
|
if (!is_array($parameters)) {
|
||||||
|
throw new \InvalidArgumentException('The given subject parameters are invalid');
|
||||||
|
}
|
||||||
|
$this->subjectRichParameters = $parameters;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
* @since 9.2.0
|
||||||
|
*/
|
||||||
|
public function getRichSubject() {
|
||||||
|
return $this->subjectRich;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array[]
|
||||||
|
* @since 9.2.0
|
||||||
|
*/
|
||||||
|
public function getRichSubjectParameters() {
|
||||||
|
return $this->subjectRichParameters;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $message
|
* @param string $message
|
||||||
* @param array $parameters
|
* @param array $parameters
|
||||||
|
@ -454,6 +508,14 @@ class Notification implements INotification {
|
||||||
* @since 8.2.0
|
* @since 8.2.0
|
||||||
*/
|
*/
|
||||||
public function isValidParsed() {
|
public function isValidParsed() {
|
||||||
|
if ($this->getRichSubject() !== '' || !empty($this->getRichSubjectParameters())) {
|
||||||
|
try {
|
||||||
|
$this->richValidator->validate($this->getRichSubject(), $this->getRichSubjectParameters());
|
||||||
|
} catch (InvalidObjectExeption $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
$this->isValidCommon()
|
$this->isValidCommon()
|
||||||
&&
|
&&
|
||||||
|
|
|
@ -127,6 +127,27 @@ interface INotification {
|
||||||
*/
|
*/
|
||||||
public function getParsedSubject();
|
public function getParsedSubject();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $subject
|
||||||
|
* @param array $parameters
|
||||||
|
* @return $this
|
||||||
|
* @throws \InvalidArgumentException if the subject or parameters are invalid
|
||||||
|
* @since 9.2.0
|
||||||
|
*/
|
||||||
|
public function setRichSubject($subject, array $parameters = []);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
* @since 9.2.0
|
||||||
|
*/
|
||||||
|
public function getRichSubject();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array[]
|
||||||
|
* @since 9.2.0
|
||||||
|
*/
|
||||||
|
public function getRichSubjectParameters();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $message
|
* @param string $message
|
||||||
* @param array $parameters
|
* @param array $parameters
|
||||||
|
|
|
@ -23,16 +23,21 @@ namespace Test\Notification;
|
||||||
|
|
||||||
|
|
||||||
use OC\Notification\Notification;
|
use OC\Notification\Notification;
|
||||||
|
use OCP\Notification\IAction;
|
||||||
use OCP\Notification\INotification;
|
use OCP\Notification\INotification;
|
||||||
|
use OCP\RichObjectStrings\IValidator;
|
||||||
use Test\TestCase;
|
use Test\TestCase;
|
||||||
|
|
||||||
class NotificationTest extends TestCase {
|
class NotificationTest extends TestCase {
|
||||||
/** @var INotification */
|
/** @var INotification */
|
||||||
protected $notification;
|
protected $notification;
|
||||||
|
/** @var IValidator|\PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
protected $validator;
|
||||||
|
|
||||||
public function setUp() {
|
public function setUp() {
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
$this->notification = new Notification();
|
$this->validator = $this->createMock(IValidator::class);
|
||||||
|
$this->notification = new Notification($this->validator);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function dataValidString($maxLength) {
|
protected function dataValidString($maxLength) {
|
||||||
|
@ -416,14 +421,12 @@ class NotificationTest extends TestCase {
|
||||||
|
|
||||||
public function testCreateAction() {
|
public function testCreateAction() {
|
||||||
$action = $this->notification->createAction();
|
$action = $this->notification->createAction();
|
||||||
$this->assertInstanceOf('OCP\Notification\IAction', $action);
|
$this->assertInstanceOf(IAction::class, $action);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testAddAction() {
|
public function testAddAction() {
|
||||||
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
||||||
$action = $this->getMockBuilder('OCP\Notification\IAction')
|
$action = $this->createMock(IAction::class);
|
||||||
->disableOriginalConstructor()
|
|
||||||
->getMock();
|
|
||||||
$action->expects($this->once())
|
$action->expects($this->once())
|
||||||
->method('isValid')
|
->method('isValid')
|
||||||
->willReturn(true);
|
->willReturn(true);
|
||||||
|
@ -441,9 +444,7 @@ class NotificationTest extends TestCase {
|
||||||
*/
|
*/
|
||||||
public function testAddActionInvalid() {
|
public function testAddActionInvalid() {
|
||||||
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
||||||
$action = $this->getMockBuilder('OCP\Notification\IAction')
|
$action = $this->createMock(IAction::class);
|
||||||
->disableOriginalConstructor()
|
|
||||||
->getMock();
|
|
||||||
$action->expects($this->once())
|
$action->expects($this->once())
|
||||||
->method('isValid')
|
->method('isValid')
|
||||||
->willReturn(false);
|
->willReturn(false);
|
||||||
|
@ -455,9 +456,7 @@ class NotificationTest extends TestCase {
|
||||||
|
|
||||||
public function testAddActionSecondPrimary() {
|
public function testAddActionSecondPrimary() {
|
||||||
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
||||||
$action = $this->getMockBuilder('OCP\Notification\IAction')
|
$action = $this->createMock(IAction::class);
|
||||||
->disableOriginalConstructor()
|
|
||||||
->getMock();
|
|
||||||
$action->expects($this->exactly(2))
|
$action->expects($this->exactly(2))
|
||||||
->method('isValid')
|
->method('isValid')
|
||||||
->willReturn(true);
|
->willReturn(true);
|
||||||
|
@ -473,9 +472,7 @@ class NotificationTest extends TestCase {
|
||||||
|
|
||||||
public function testAddParsedAction() {
|
public function testAddParsedAction() {
|
||||||
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
||||||
$action = $this->getMockBuilder('OCP\Notification\IAction')
|
$action = $this->createMock(IAction::class);
|
||||||
->disableOriginalConstructor()
|
|
||||||
->getMock();
|
|
||||||
$action->expects($this->once())
|
$action->expects($this->once())
|
||||||
->method('isValidParsed')
|
->method('isValidParsed')
|
||||||
->willReturn(true);
|
->willReturn(true);
|
||||||
|
@ -493,9 +490,7 @@ class NotificationTest extends TestCase {
|
||||||
*/
|
*/
|
||||||
public function testAddParsedActionInvalid() {
|
public function testAddParsedActionInvalid() {
|
||||||
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
||||||
$action = $this->getMockBuilder('OCP\Notification\IAction')
|
$action = $this->createMock(IAction::class);
|
||||||
->disableOriginalConstructor()
|
|
||||||
->getMock();
|
|
||||||
$action->expects($this->once())
|
$action->expects($this->once())
|
||||||
->method('isValidParsed')
|
->method('isValidParsed')
|
||||||
->willReturn(false);
|
->willReturn(false);
|
||||||
|
@ -507,9 +502,7 @@ class NotificationTest extends TestCase {
|
||||||
|
|
||||||
public function testAddActionSecondParsedPrimary() {
|
public function testAddActionSecondParsedPrimary() {
|
||||||
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
||||||
$action = $this->getMockBuilder('OCP\Notification\IAction')
|
$action = $this->createMock(IAction::class);
|
||||||
->disableOriginalConstructor()
|
|
||||||
->getMock();
|
|
||||||
$action->expects($this->exactly(2))
|
$action->expects($this->exactly(2))
|
||||||
->method('isValidParsed')
|
->method('isValidParsed')
|
||||||
->willReturn(true);
|
->willReturn(true);
|
||||||
|
@ -525,9 +518,7 @@ class NotificationTest extends TestCase {
|
||||||
|
|
||||||
public function testAddActionParsedPrimaryEnd() {
|
public function testAddActionParsedPrimaryEnd() {
|
||||||
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
||||||
$action1 = $this->getMockBuilder('OCP\Notification\IAction')
|
$action1 = $this->createMock(IAction::class);
|
||||||
->disableOriginalConstructor()
|
|
||||||
->getMock();
|
|
||||||
$action1->expects($this->exactly(2))
|
$action1->expects($this->exactly(2))
|
||||||
->method('isValidParsed')
|
->method('isValidParsed')
|
||||||
->willReturn(true);
|
->willReturn(true);
|
||||||
|
@ -535,9 +526,7 @@ class NotificationTest extends TestCase {
|
||||||
->method('isPrimary')
|
->method('isPrimary')
|
||||||
->willReturn(false);
|
->willReturn(false);
|
||||||
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
|
||||||
$action2 = $this->getMockBuilder('OCP\Notification\IAction')
|
$action2 = $this->createMock(IAction::class);
|
||||||
->disableOriginalConstructor()
|
|
||||||
->getMock();
|
|
||||||
$action2->expects($this->once())
|
$action2->expects($this->once())
|
||||||
->method('isValidParsed')
|
->method('isValidParsed')
|
||||||
->willReturn(true);
|
->willReturn(true);
|
||||||
|
@ -570,12 +559,13 @@ class NotificationTest extends TestCase {
|
||||||
*/
|
*/
|
||||||
public function testIsValid($isValidCommon, $subject, $expected) {
|
public function testIsValid($isValidCommon, $subject, $expected) {
|
||||||
/** @var \OCP\Notification\INotification|\PHPUnit_Framework_MockObject_MockObject $notification */
|
/** @var \OCP\Notification\INotification|\PHPUnit_Framework_MockObject_MockObject $notification */
|
||||||
$notification = $this->getMockBuilder('\OC\Notification\Notification')
|
$notification = $this->getMockBuilder(Notification::class)
|
||||||
->setMethods([
|
->setMethods([
|
||||||
'isValidCommon',
|
'isValidCommon',
|
||||||
'getSubject',
|
'getSubject',
|
||||||
'getParsedSubject',
|
'getParsedSubject',
|
||||||
])
|
])
|
||||||
|
->setConstructorArgs([$this->validator])
|
||||||
->getMock();
|
->getMock();
|
||||||
|
|
||||||
$notification->expects($this->once())
|
$notification->expects($this->once())
|
||||||
|
@ -602,12 +592,13 @@ class NotificationTest extends TestCase {
|
||||||
*/
|
*/
|
||||||
public function testIsParsedValid($isValidCommon, $subject, $expected) {
|
public function testIsParsedValid($isValidCommon, $subject, $expected) {
|
||||||
/** @var \OCP\Notification\INotification|\PHPUnit_Framework_MockObject_MockObject $notification */
|
/** @var \OCP\Notification\INotification|\PHPUnit_Framework_MockObject_MockObject $notification */
|
||||||
$notification = $this->getMockBuilder('\OC\Notification\Notification')
|
$notification = $this->getMockBuilder(Notification::class)
|
||||||
->setMethods([
|
->setMethods([
|
||||||
'isValidCommon',
|
'isValidCommon',
|
||||||
'getParsedSubject',
|
'getParsedSubject',
|
||||||
'getSubject',
|
'getSubject',
|
||||||
])
|
])
|
||||||
|
->setConstructorArgs([$this->validator])
|
||||||
->getMock();
|
->getMock();
|
||||||
|
|
||||||
$notification->expects($this->once())
|
$notification->expects($this->once())
|
||||||
|
@ -648,7 +639,7 @@ class NotificationTest extends TestCase {
|
||||||
*/
|
*/
|
||||||
public function testIsValidCommon($app, $user, $timestamp, $objectType, $objectId, $expected) {
|
public function testIsValidCommon($app, $user, $timestamp, $objectType, $objectId, $expected) {
|
||||||
/** @var \OCP\Notification\INotification|\PHPUnit_Framework_MockObject_MockObject $notification */
|
/** @var \OCP\Notification\INotification|\PHPUnit_Framework_MockObject_MockObject $notification */
|
||||||
$notification = $this->getMockBuilder('\OC\Notification\Notification')
|
$notification = $this->getMockBuilder(Notification::class)
|
||||||
->setMethods([
|
->setMethods([
|
||||||
'getApp',
|
'getApp',
|
||||||
'getUser',
|
'getUser',
|
||||||
|
@ -656,6 +647,7 @@ class NotificationTest extends TestCase {
|
||||||
'getObjectType',
|
'getObjectType',
|
||||||
'getObjectId',
|
'getObjectId',
|
||||||
])
|
])
|
||||||
|
->setConstructorArgs([$this->validator])
|
||||||
->getMock();
|
->getMock();
|
||||||
|
|
||||||
$notification->expects($this->any())
|
$notification->expects($this->any())
|
||||||
|
|
Loading…
Reference in New Issue