summaryrefslogtreecommitdiffstats
path: root/lib/Service/FolderServiceV2.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Service/FolderServiceV2.php')
-rw-r--r--lib/Service/FolderServiceV2.php139
1 files changed, 128 insertions, 11 deletions
diff --git a/lib/Service/FolderServiceV2.php b/lib/Service/FolderServiceV2.php
index ee24addfd..95761b530 100644
--- a/lib/Service/FolderServiceV2.php
+++ b/lib/Service/FolderServiceV2.php
@@ -13,11 +13,14 @@
namespace OCA\News\Service;
-use OCA\News\Db\Feed;
-use OCA\News\Db\FeedMapperV2;
+use OC\AppFramework\Utility\TimeFactory;
use OCA\News\Db\Folder;
use OCA\News\Db\FolderMapperV2;
+use OCA\News\Service\Exceptions\ServiceConflictException;
+use OCA\News\Service\Exceptions\ServiceNotFoundException;
+use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\Entity;
+use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use Psr\Log\LoggerInterface;
/**
@@ -31,14 +34,20 @@ class FolderServiceV2 extends Service
* @var FeedServiceV2
*/
private $feedService;
+ /**
+ * @var FeedServiceV2
+ */
+ private $timeFactory;
public function __construct(
FolderMapperV2 $mapper,
FeedServiceV2 $feedService,
+ TimeFactory $timeFactory,
LoggerInterface $logger
) {
parent::__construct($mapper, $logger);
$this->feedService = $feedService;
+ $this->timeFactory = $timeFactory;
}
/**
@@ -55,7 +64,31 @@ class FolderServiceV2 extends Service
}
/**
- * @param string $userId
+ * Finds a folder of a user
+ *
+ * @param string $userId The name/ID of the user
+ * @param int|null $folderId ID of the folder
+ *
+ * @return Folder
+ *
+ * @throws ServiceConflictException
+ * @throws ServiceNotFoundException
+ */
+ public function findForUser(string $userId, ?int $folderId): Entity
+ {
+ try {
+ return $this->mapper->findFromUser($userId, $folderId);
+ } catch (DoesNotExistException $e) {
+ throw new ServiceNotFoundException('Folder not found');
+ } catch (MultipleObjectsReturnedException $e) {
+ throw new ServiceConflictException('Multiple folders found');
+ }
+ }
+
+ /**
+ * Find all folders and it's feeds.
+ *
+ * @param string $userId The name/ID of the owner
*
* @return Folder[]
*/
@@ -80,33 +113,117 @@ class FolderServiceV2 extends Service
return $this->mapper->findAll();
}
+ /**
+ * Create a folder
+ *
+ * @param string $userId
+ * @param string $name
+ * @param int|null $parent
+ *
+ * @return Folder
+ */
public function create(string $userId, string $name, ?int $parent = null): Entity
{
$folder = new Folder();
$folder->setUserId($userId)
->setName($name)
- ->setParentId($parent);
+ ->setParentId($parent)
+ ->setOpened(true);
return $this->mapper->insert($folder);
}
- public function delete(string $user, int $id)
+ /**
+ * Delete a feed.
+ *
+ * @param string $userId Folder owner
+ * @param int $folderId Folder ID
+ *
+ * @return Folder
+ * @throws ServiceConflictException
+ * @throws ServiceNotFoundException
+ */
+ public function delete(string $userId, int $folderId): Entity
{
- $entity = $this->mapper->findFromUser($user, $id);
+ $folder = $this->findForUser($userId, $folderId);
- $this->mapper->delete($entity);
+ return $this->mapper->delete($folder);
}
+ /**
+ * Purge all deleted folders.
+ */
public function purgeDeleted()
{
$this->mapper->purgeDeleted();
}
- public function rename(string $userId, int $folderId, string $newName)
+ /**
+ * Rename a folder
+ *
+ * @param string $userId Folder owner
+ * @param int $folderId Folder ID
+ * @param string $newName New name
+ *
+ * @return Folder
+ * @throws ServiceConflictException
+ * @throws ServiceNotFoundException
+ */
+ public function rename(string $userId, int $folderId, string $newName): Entity
{
- /** @var Folder $folder */
- $folder = $this->mapper->find($userId, $folderId);
+ $folder = $this->findForUser($userId, $folderId);
$folder->setName($newName);
- $this->mapper->update($folder);
+ return $this->mapper->update($folder);
+ }
+
+ /**
+ * Mark a folder as deleted
+ *
+ * @param string $userId Folder owner
+ * @param int $folderId Folder ID
+ * @param bool $mark If the mark should be added or removed
+ *
+ * @return Folder
+ * @throws ServiceConflictException
+ * @throws ServiceNotFoundException
+ */
+ public function markDelete(string $userId, int $folderId, bool $mark): Entity
+ {
+ $folder = $this->findForUser($userId, $folderId);
+ $time = $mark ? $this->timeFactory->getTime() : 0;
+ $folder->setDeletedAt($time);
+
+ return $this->mapper->update($folder);
+ }
+
+ /**
+ * Mark a folder as opened
+ *
+ * @param string $userId Folder owner
+ * @param int|null $folderId Folder ID
+ * @param bool $open If the mark should be added or removed
+ *
+ * @return Folder
+ * @throws ServiceConflictException
+ * @throws ServiceNotFoundException
+ */
+ public function open(string $userId, ?int $folderId, bool $open): Entity
+ {
+ $folder = $this->findForUser($userId, $folderId);
+ $folder->setOpened($open);
+ return $this->mapper->update($folder);
+ }
+
+ /**
+ * Delete all folders of a user
+ *
+ * @param string $userId User ID/name
+ */
+ public function deleteUser(string $userId): void
+ {
+ $folders = $this->findAllForUser($userId);
+ foreach ($folders as $folder) {
+ $this->mapper->delete($folder);
+ }
}
}