1
0
Fork 0
mirror of https://github.com/wallabag/wallabag.git synced 2025-08-16 18:01:38 +00:00

Allow to remove all archived entries

Since we still support fucking SQLite, we need to retrieve all tags & annotations for archived entries before deleting them.

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel 2017-03-30 16:24:59 +02:00 committed by Nicolas Lœuillet
parent fa884b30ba
commit 6da1aebc94
18 changed files with 205 additions and 1 deletions

View file

@ -248,7 +248,7 @@ class ConfigController extends Controller
break;
case 'entries':
// SQLite doesn't care about cascading remove, so we need to manually remove associated stuf
// SQLite doesn't care about cascading remove, so we need to manually remove associated stuff
// otherwise they won't be removed ...
if ($this->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver) {
$this->getDoctrine()->getRepository('WallabagAnnotationBundle:Annotation')->removeAllByUserId($this->getUser()->getId());
@ -260,6 +260,19 @@ class ConfigController extends Controller
$this->getDoctrine()
->getRepository('WallabagCoreBundle:Entry')
->removeAllByUserId($this->getUser()->getId());
break;
case 'archived':
if ($this->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver) {
$this->removeAnnotationsForArchivedByUserId($this->getUser()->getId());
}
// manually remove tags to avoid orphan tag
$this->removeTagsForArchivedByUserId($this->getUser()->getId());
$this->getDoctrine()
->getRepository('WallabagCoreBundle:Entry')
->removeArchivedByUserId($this->getUser()->getId());
break;
}
$this->get('session')->getFlashBag()->add(
@ -299,6 +312,50 @@ class ConfigController extends Controller
$em->flush();
}
/**
* Remove all tags for a given user and cleanup orphan tags.
*
* @param int $userId
*/
private function removeTagsForArchivedByUserId($userId)
{
$tags = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findTagsForArchivedArticles($userId);
if (empty($tags)) {
return;
}
$this->getDoctrine()
->getRepository('WallabagCoreBundle:Entry')
->removeTags($userId, $tags);
// cleanup orphan tags
$em = $this->getDoctrine()->getManager();
foreach ($tags as $tag) {
if (count($tag->getEntries()) === 0) {
$em->remove($tag);
}
}
$em->flush();
}
private function removeAnnotationsForArchivedByUserId($userId)
{
$em = $this->getDoctrine()->getManager();
$archivedEntriesAnnotations = $this->getDoctrine()
->getRepository('WallabagAnnotationBundle:Annotation')
->findAllByArchivedEntriesAndUserId($userId);
foreach ($archivedEntriesAnnotations as $archivedEntriesAnnotation) {
$em->remove($archivedEntriesAnnotation);
}
$em->flush();
}
/**
* Validate that a rule can be edited/deleted by the current user.
*