]> BookStack Code Mirror - bookstack/blob - app/Activity/Models/Comment.php
d0385d3962f63f3766f88a4855cf738194796cd6
[bookstack] / app / Activity / Models / Comment.php
1 <?php
2
3 namespace BookStack\Activity\Models;
4
5 use BookStack\App\Model;
6 use BookStack\Users\Models\HasCreatorAndUpdater;
7 use BookStack\Util\HtmlContentFilter;
8 use Illuminate\Database\Eloquent\Factories\HasFactory;
9 use Illuminate\Database\Eloquent\Relations\BelongsTo;
10 use Illuminate\Database\Eloquent\Relations\MorphTo;
11
12 /**
13  * @property int      $id
14  * @property string   $text - Deprecated & now unused (#4821)
15  * @property string   $html
16  * @property int|null $parent_id  - Relates to local_id, not id
17  * @property int      $local_id
18  * @property string   $entity_type
19  * @property int      $entity_id
20  * @property int      $created_by
21  * @property int      $updated_by
22  */
23 class Comment extends Model implements Loggable
24 {
25     use HasFactory;
26     use HasCreatorAndUpdater;
27
28     protected $fillable = ['parent_id'];
29
30     /**
31      * Get the entity that this comment belongs to.
32      */
33     public function entity(): MorphTo
34     {
35         return $this->morphTo('entity');
36     }
37
38     /**
39      * Get the parent comment this is in reply to (if existing).
40      */
41     public function parent(): BelongsTo
42     {
43         return $this->belongsTo(Comment::class, 'parent_id', 'local_id', 'parent')
44             ->where('entity_type', '=', $this->entity_type)
45             ->where('entity_id', '=', $this->entity_id);
46     }
47
48     /**
49      * Check if a comment has been updated since creation.
50      */
51     public function isUpdated(): bool
52     {
53         return $this->updated_at->timestamp > $this->created_at->timestamp;
54     }
55
56     public function logDescriptor(): string
57     {
58         return "Comment #{$this->local_id} (ID: {$this->id}) for {$this->entity_type} (ID: {$this->entity_id})";
59     }
60
61     public function safeHtml(): string
62     {
63         return HtmlContentFilter::removeScriptsFromHtmlString($this->html ?? '');
64     }
65 }