]> git.immae.eu Git - github/wallabag/wallabag.git/blobdiff - src/Wallabag/CoreBundle/Controller/ConfigController.php
Merge pull request #4151 from ldidry/fix-4060
[github/wallabag/wallabag.git] / src / Wallabag / CoreBundle / Controller / ConfigController.php
index cea4130317e7ebfea4afc1430534718f7b939642..6655ef93da56781438fb769cd437adbf2e349ae0 100644 (file)
@@ -2,11 +2,14 @@
 
 namespace Wallabag\CoreBundle\Controller;
 
+use JMS\Serializer\SerializationContext;
+use JMS\Serializer\SerializerBuilder;
 use PragmaRX\Recovery\Recovery as BackupCodes;
 use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\RedirectResponse;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 use Symfony\Component\Routing\Annotation\Route;
 use Symfony\Component\Validator\Constraints\Locale as LocaleConstraint;
@@ -15,6 +18,7 @@ use Wallabag\CoreBundle\Entity\TaggingRule;
 use Wallabag\CoreBundle\Form\Type\ChangePasswordType;
 use Wallabag\CoreBundle\Form\Type\ConfigType;
 use Wallabag\CoreBundle\Form\Type\FeedType;
+use Wallabag\CoreBundle\Form\Type\TaggingRuleImportType;
 use Wallabag\CoreBundle\Form\Type\TaggingRuleType;
 use Wallabag\CoreBundle\Form\Type\UserInformationType;
 use Wallabag\CoreBundle\Tools\Utils;
@@ -22,8 +26,6 @@ use Wallabag\CoreBundle\Tools\Utils;
 class ConfigController extends Controller
 {
     /**
-     * @param Request $request
-     *
      * @Route("/config", name="config")
      */
     public function indexAction(Request $request)
@@ -140,6 +142,37 @@ class ConfigController extends Controller
             return $this->redirect($this->generateUrl('config') . '#set5');
         }
 
+        // handle tagging rules import
+        $taggingRulesImportform = $this->createForm(TaggingRuleImportType::class);
+        $taggingRulesImportform->handleRequest($request);
+
+        if ($taggingRulesImportform->isSubmitted() && $taggingRulesImportform->isValid()) {
+            $message = 'flashes.config.notice.tagging_rules_not_imported';
+            $file = $taggingRulesImportform->get('file')->getData();
+
+            if (null !== $file && $file->isValid() && \in_array($file->getClientMimeType(), ['application/json', 'application/octet-stream'], true)) {
+                $content = json_decode(file_get_contents($file->getPathname()), true);
+
+                if (\is_array($content)) {
+                    foreach ($content as $rule) {
+                        $taggingRule = new TaggingRule();
+                        $taggingRule->setRule($rule['rule']);
+                        $taggingRule->setTags($rule['tags']);
+                        $taggingRule->setConfig($config);
+                        $em->persist($taggingRule);
+                    }
+
+                    $em->flush();
+
+                    $message = 'flashes.config.notice.tagging_rules_imported';
+                }
+            }
+
+            $this->addFlash('notice', $message);
+
+            return $this->redirect($this->generateUrl('config') . '#set5');
+        }
+
         return $this->render('WallabagCoreBundle:Config:index.html.twig', [
             'form' => [
                 'config' => $configForm->createView(),
@@ -147,6 +180,7 @@ class ConfigController extends Controller
                 'pwd' => $pwdForm->createView(),
                 'user' => $userForm->createView(),
                 'new_tagging_rule' => $newTaggingRule->createView(),
+                'import_tagging_rule' => $taggingRulesImportform->createView(),
             ],
             'feed' => [
                 'username' => $user->getUsername(),
@@ -243,8 +277,6 @@ class ConfigController extends Controller
     /**
      * Validate OTP code.
      *
-     * @param Request $request
-     *
      * @Route("/config/otp/app/check", name="config_otp_app_check")
      */
     public function otpAppCheckAction(Request $request)
@@ -272,8 +304,6 @@ class ConfigController extends Controller
     }
 
     /**
-     * @param Request $request
-     *
      * @Route("/generate-token", name="generate_token")
      *
      * @return RedirectResponse|JsonResponse
@@ -300,8 +330,6 @@ class ConfigController extends Controller
     }
 
     /**
-     * @param Request $request
-     *
      * @Route("/revoke-token", name="revoke_token")
      *
      * @return RedirectResponse|JsonResponse
@@ -330,8 +358,6 @@ class ConfigController extends Controller
     /**
      * Deletes a tagging rule and redirect to the config homepage.
      *
-     * @param TaggingRule $rule
-     *
      * @Route("/tagging-rule/delete/{id}", requirements={"id" = "\d+"}, name="delete_tagging_rule")
      *
      * @return RedirectResponse
@@ -355,8 +381,6 @@ class ConfigController extends Controller
     /**
      * Edit a tagging rule.
      *
-     * @param TaggingRule $rule
-     *
      * @Route("/tagging-rule/edit/{id}", requirements={"id" = "\d+"}, name="edit_tagging_rule")
      *
      * @return RedirectResponse
@@ -423,8 +447,6 @@ class ConfigController extends Controller
      *
      * @Route("/account/delete", name="delete_account")
      *
-     * @param Request $request
-     *
      * @throws AccessDeniedHttpException
      *
      * @return \Symfony\Component\HttpFoundation\RedirectResponse
@@ -455,8 +477,6 @@ class ConfigController extends Controller
      *
      * @Route("/config/view-mode", name="switch_view_mode")
      *
-     * @param Request $request
-     *
      * @return \Symfony\Component\HttpFoundation\RedirectResponse
      */
     public function changeViewModeAction(Request $request)
@@ -474,8 +494,7 @@ class ConfigController extends Controller
     /**
      * Change the locale for the current user.
      *
-     * @param Request $request
-     * @param string  $language
+     * @param string $language
      *
      * @Route("/locale/{language}", name="changeLocale")
      *
@@ -492,6 +511,32 @@ class ConfigController extends Controller
         return $this->redirect($request->headers->get('referer', $this->generateUrl('homepage')));
     }
 
+    /**
+     * Export tagging rules for the logged in user.
+     *
+     * @Route("/tagging-rule/export", name="export_tagging_rule")
+     *
+     * @return Response
+     */
+    public function exportTaggingRulesAction()
+    {
+        $data = SerializerBuilder::create()->build()->serialize(
+            $this->getUser()->getConfig()->getTaggingRules(),
+            'json',
+            SerializationContext::create()->setGroups(['export_tagging_rule'])
+        );
+
+        return Response::create(
+            $data,
+            200,
+            [
+                'Content-type' => 'application/json',
+                'Content-Disposition' => 'attachment; filename="tagging_rules_' . $this->getUser()->getUsername() . '.json"',
+                'Content-Transfer-Encoding' => 'UTF-8',
+            ]
+        );
+    }
+
     /**
      * Remove all tags for given tags and a given user and cleanup orphan tags.
      *
@@ -558,8 +603,6 @@ class ConfigController extends Controller
 
     /**
      * Validate that a rule can be edited/deleted by the current user.
-     *
-     * @param TaggingRule $rule
      */
     private function validateRuleAction(TaggingRule $rule)
     {