summaryrefslogtreecommitdiffstats
path: root/lib/private
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2016-02-01 16:17:45 +0100
committerThomas Müller <thomas.mueller@tmit.eu>2016-02-01 16:17:45 +0100
commitb4853f3fce696b8b89f0dd898b25d7fde93e1a92 (patch)
tree187da1e729be33aa2975f6f4462adea0e717111b /lib/private
parenta2e13aea1513de2667a70d224396ed641a5dd179 (diff)
parent6dc793338acb3cd17716b5dc886885d0fb2d6181 (diff)
downloadnextcloud-server-b4853f3fce696b8b89f0dd898b25d7fde93e1a92.tar.gz
nextcloud-server-b4853f3fce696b8b89f0dd898b25d7fde93e1a92.zip
Merge pull request #21967 from owncloud/comments-webdav
Comments WebDAV adjustements
Diffstat (limited to 'lib/private')
-rw-r--r--lib/private/comments/manager.php139
-rw-r--r--lib/private/comments/managerfactory.php3
-rw-r--r--lib/private/user/user.php1
3 files changed, 140 insertions, 3 deletions
diff --git a/lib/private/comments/manager.php b/lib/private/comments/manager.php
index 64977c48895..23add3fd2c3 100644
--- a/lib/private/comments/manager.php
+++ b/lib/private/comments/manager.php
@@ -25,7 +25,9 @@ use OCP\Comments\IComment;
use OCP\Comments\ICommentsManager;
use OCP\Comments\NotFoundException;
use OCP\IDBConnection;
+use OCP\IConfig;
use OCP\ILogger;
+use OCP\IUser;
class Manager implements ICommentsManager {
@@ -38,12 +40,17 @@ class Manager implements ICommentsManager {
/** @var IComment[] */
protected $commentsCache = [];
+ /** @var IConfig */
+ protected $config;
+
public function __construct(
IDBConnection $dbConn,
- ILogger $logger
+ ILogger $logger,
+ IConfig $config
) {
$this->dbConn = $dbConn;
$this->logger = $logger;
+ $this->config = $config;
}
/**
@@ -346,10 +353,12 @@ class Manager implements ICommentsManager {
/**
* @param $objectType string the object type, e.g. 'files'
* @param $objectId string the id of the object
+ * @param \DateTime $notOlderThan optional, timestamp of the oldest comments
+ * that may be returned
* @return Int
* @since 9.0.0
*/
- public function getNumberOfCommentsForObject($objectType, $objectId) {
+ public function getNumberOfCommentsForObject($objectType, $objectId, \DateTime $notOlderThan = null) {
$qb = $this->dbConn->getQueryBuilder();
$query = $qb->select($qb->createFunction('COUNT(`id`)'))
->from('comments')
@@ -358,6 +367,12 @@ class Manager implements ICommentsManager {
->setParameter('type', $objectType)
->setParameter('id', $objectId);
+ if(!is_null($notOlderThan)) {
+ $query
+ ->andWhere($qb->expr()->gt('creation_timestamp', $qb->createParameter('notOlderThan')))
+ ->setParameter('notOlderThan', $notOlderThan, 'datetime');
+ }
+
$resultStatement = $query->execute();
$data = $resultStatement->fetch(\PDO::FETCH_NUM);
$resultStatement->closeCursor();
@@ -566,4 +581,124 @@ class Manager implements ICommentsManager {
return is_int($affectedRows);
}
+
+ /**
+ * deletes the read markers for the specified user
+ *
+ * @param \OCP\IUser $user
+ * @return bool
+ * @since 9.0.0
+ */
+ public function deleteReadMarksFromUser(IUser $user) {
+ $qb = $this->dbConn->getQueryBuilder();
+ $query = $qb->delete('comments_read_markers')
+ ->where($qb->expr()->eq('user_id', $qb->createParameter('user_id')))
+ ->setParameter('user_id', $user->getUID());
+
+ try {
+ $affectedRows = $query->execute();
+ } catch (DriverException $e) {
+ $this->logger->logException($e, ['app' => 'core_comments']);
+ return false;
+ }
+ return ($affectedRows > 0);
+ }
+
+ /**
+ * sets the read marker for a given file to the specified date for the
+ * provided user
+ *
+ * @param string $objectType
+ * @param string $objectId
+ * @param \DateTime $dateTime
+ * @param IUser $user
+ * @since 9.0.0
+ */
+ public function setReadMark($objectType, $objectId, \DateTime $dateTime, IUser $user) {
+ $this->checkRoleParameters('Object', $objectType, $objectId);
+
+ $qb = $this->dbConn->getQueryBuilder();
+ $values = [
+ 'user_id' => $qb->createNamedParameter($user->getUID()),
+ 'marker_datetime' => $qb->createNamedParameter($dateTime, 'datetime'),
+ 'object_type' => $qb->createNamedParameter($objectType),
+ 'object_id' => $qb->createNamedParameter($objectId),
+ ];
+
+ // Strategy: try to update, if this does not return affected rows, do an insert.
+ $affectedRows = $qb
+ ->update('comments_read_markers')
+ ->set('user_id', $values['user_id'])
+ ->set('marker_datetime', $values['marker_datetime'], 'datetime')
+ ->set('object_type', $values['object_type'])
+ ->set('object_id', $values['object_id'])
+ ->execute();
+
+ if ($affectedRows > 0) {
+ return;
+ }
+
+ $qb->insert('comments_read_markers')
+ ->values($values)
+ ->execute();
+ }
+
+ /**
+ * returns the read marker for a given file to the specified date for the
+ * provided user. It returns null, when the marker is not present, i.e.
+ * no comments were marked as read.
+ *
+ * @param string $objectType
+ * @param string $objectId
+ * @param IUser $user
+ * @return \DateTime|null
+ * @since 9.0.0
+ */
+ public function getReadMark($objectType, $objectId, IUser $user) {
+ $qb = $this->dbConn->getQueryBuilder();
+ $resultStatement = $qb->select('marker_datetime')
+ ->from('comments_read_markers')
+ ->where($qb->expr()->eq('user_id', $qb->createParameter('user_id')))
+ ->andWhere($qb->expr()->eq('object_type', $qb->createParameter('object_type')))
+ ->andWhere($qb->expr()->eq('object_id', $qb->createParameter('object_id')))
+ ->setParameter('user_id', $user->getUID(), \PDO::PARAM_STR)
+ ->setParameter('object_type', $objectType, \PDO::PARAM_STR)
+ ->setParameter('object_id', $objectId, \PDO::PARAM_STR)
+ ->execute();
+
+ $data = $resultStatement->fetch();
+ $resultStatement->closeCursor();
+ if(!$data || is_null($data['marker_datetime'])) {
+ return null;
+ }
+
+ return new \DateTime($data['marker_datetime']);
+ }
+
+ /**
+ * deletes the read markers on the specified object
+ *
+ * @param string $objectType
+ * @param string $objectId
+ * @return bool
+ * @since 9.0.0
+ */
+ public function deleteReadMarksOnObject($objectType, $objectId) {
+ $this->checkRoleParameters('Object', $objectType, $objectId);
+
+ $qb = $this->dbConn->getQueryBuilder();
+ $query = $qb->delete('comments_read_markers')
+ ->where($qb->expr()->eq('object_type', $qb->createParameter('object_type')))
+ ->andWhere($qb->expr()->eq('object_id', $qb->createParameter('object_id')))
+ ->setParameter('object_type', $objectType)
+ ->setParameter('object_id', $objectId);
+
+ try {
+ $affectedRows = $query->execute();
+ } catch (DriverException $e) {
+ $this->logger->logException($e, ['app' => 'core_comments']);
+ return false;
+ }
+ return ($affectedRows > 0);
+ }
}
diff --git a/lib/private/comments/managerfactory.php b/lib/private/comments/managerfactory.php
index 281e8ca7fef..d3f6c44e539 100644
--- a/lib/private/comments/managerfactory.php
+++ b/lib/private/comments/managerfactory.php
@@ -51,7 +51,8 @@ class ManagerFactory implements ICommentsManagerFactory {
public function getManager() {
return new Manager(
$this->serverContainer->getDatabaseConnection(),
- $this->serverContainer->getLogger()
+ $this->serverContainer->getLogger(),
+ $this->serverContainer->getConfig()
);
}
}
diff --git a/lib/private/user/user.php b/lib/private/user/user.php
index e8ce6b8cc87..5e556575118 100644
--- a/lib/private/user/user.php
+++ b/lib/private/user/user.php
@@ -211,6 +211,7 @@ class User implements IUser {
\OC\Files\Cache\Storage::remove('home::' . $this->uid);
\OC::$server->getCommentsManager()->deleteReferencesOfActor('user', $this->uid);
+ \OC::$server->getCommentsManager()->deleteReadMarksFromUser($this);
}
if ($this->emitter) {