/**
* 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',
--- /dev/null
+<?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');
+ }
+}
/**
* Create a new command instance.
- *
- * @param \BookStack\Auth\\BookStack\Auth\Permissions\PermissionService $permissionService
*/
public function __construct(PermissionService $permissionService)
{
<?php namespace Tests;
+use BookStack\Actions\Comment;
+use BookStack\Actions\CommentRepo;
use BookStack\Auth\Permissions\JointPermission;
use BookStack\Entities\Bookshelf;
use BookStack\Entities\Page;
$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",
+ ]);
+ }
}