]> BookStack Code Mirror - bookstack/commitdiff
Added command to regenerate comment content
authorDan Brown <redacted>
Fri, 1 May 2020 22:41:47 +0000 (23:41 +0100)
committerDan Brown <redacted>
Fri, 1 May 2020 22:41:47 +0000 (23:41 +0100)
app/Actions/CommentRepo.php
app/Console/Commands/RegenerateCommentContent.php [new file with mode: 0644]
app/Console/Commands/RegeneratePermissions.php
tests/CommandsTest.php

index 0d8a12ce9ed60f6b911458b944e9c95fcd6e21ac..4dfe3ddb64f86f3252418b3b83d04ef6367d39b6 100644 (file)
@@ -70,7 +70,7 @@ class CommentRepo
     /**
      * Convert the given comment markdown text to HTML.
      */
-    protected function commentToHtml(string $commentText): string
+    public function commentToHtml(string $commentText): string
     {
         $converter = new CommonMarkConverter([
             'html_input' => 'strip',
diff --git a/app/Console/Commands/RegenerateCommentContent.php b/app/Console/Commands/RegenerateCommentContent.php
new file mode 100644 (file)
index 0000000..587a5ed
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+
+namespace BookStack\Console\Commands;
+
+use BookStack\Actions\Comment;
+use BookStack\Actions\CommentRepo;
+use Illuminate\Console\Command;
+
+class RegenerateCommentContent extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'bookstack:regenerate-comment-content {--database= : The database connection to use.}';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Regenerate the stored HTML of all comments';
+
+    /**
+     * @var CommentRepo
+     */
+    protected $commentRepo;
+
+    /**
+     * Create a new command instance.
+     */
+    public function __construct(CommentRepo $commentRepo)
+    {
+        $this->commentRepo = $commentRepo;
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $connection = \DB::getDefaultConnection();
+        if ($this->option('database') !== null) {
+            \DB::setDefaultConnection($this->option('database'));
+        }
+
+        Comment::query()->chunk(100, function ($comments) {
+            foreach ($comments as $comment) {
+                $comment->html = $this->commentRepo->commentToHtml($comment->text);
+                $comment->save();
+            }
+        });
+
+        \DB::setDefaultConnection($connection);
+        $this->comment('Comment HTML content has been regenerated');
+    }
+}
index 430b8fcb05fdad572a4f587548d271a230ea8394..4fde08e6b60e515004bdc0f5aea741a7fd44b91e 100644 (file)
@@ -30,8 +30,6 @@ class RegeneratePermissions extends Command
 
     /**
      * Create a new command instance.
-     *
-     * @param \BookStack\Auth\\BookStack\Auth\Permissions\PermissionService $permissionService
      */
     public function __construct(PermissionService $permissionService)
     {
index e55b047d49dfd7542ce160e466540c66d73ecf22..bfc0ac0eb4bb1b8ab6ea9d0c1aae4b8cebcffd05 100644 (file)
@@ -1,5 +1,7 @@
 <?php namespace Tests;
 
+use BookStack\Actions\Comment;
+use BookStack\Actions\CommentRepo;
 use BookStack\Auth\Permissions\JointPermission;
 use BookStack\Entities\Bookshelf;
 use BookStack\Entities\Page;
@@ -194,4 +196,26 @@ class CommandsTest extends TestCase
         $this->expectException(RuntimeException::class);
         $this->artisan('bookstack:update-url https://cats.example.com');
     }
+
+    public function test_regenerate_comment_content_command()
+    {
+        Comment::query()->forceCreate([
+            'html' => 'some_old_content',
+            'text' => 'some_fresh_content',
+        ]);
+
+        $this->assertDatabaseHas('comments', [
+            'html' => 'some_old_content',
+        ]);
+
+        $exitCode = \Artisan::call('bookstack:regenerate-comment-content');
+        $this->assertTrue($exitCode === 0, 'Command executed successfully');
+
+        $this->assertDatabaseMissing('comments', [
+            'html' => 'some_old_content',
+        ]);
+        $this->assertDatabaseHas('comments', [
+            'html' => "<p>some_fresh_content</p>\n",
+        ]);
+    }
 }