'bool',
];
/**
* Get the downloadable file name for this upload.
*/
public function getFileName(): string
{
if (str_contains($this->name, '.')) {
return $this->name;
}
return $this->name . '.' . $this->extension;
}
/**
* Get the page this file was uploaded to.
*/
public function page(): BelongsTo
{
return $this->belongsTo(Page::class, 'uploaded_to');
}
public function jointPermissions(): HasMany
{
return $this->hasMany(JointPermission::class, 'entity_id', 'uploaded_to')
->where('joint_permissions.entity_type', '=', 'page');
}
/**
* Get the url of this file.
*/
public function getUrl($openInline = false): string
{
if ($this->external && !str_starts_with($this->path, 'http')) {
return $this->path;
}
return url('/attachments/' . $this->id . ($openInline ? '?open=true' : ''));
}
/**
* Get the representation of this attachment in a format suitable for the page editors.
* Detects and adapts video content to use an inline video embed.
*/
public function editorContent(): array
{
$videoExtensions = ['mp4', 'webm', 'mkv', 'ogg', 'avi'];
if (in_array(strtolower($this->extension), $videoExtensions)) {
$html = '';
return ['text/html' => $html, 'text/plain' => $html];
}
return ['text/html' => $this->htmlLink(), 'text/plain' => $this->markdownLink()];
}
/**
* Generate the HTML link to this attachment.
*/
public function htmlLink(): string
{
return '' . e($this->name) . '';
}
/**
* Generate a MarkDown link to this attachment.
*/
public function markdownLink(): string
{
return '[' . $this->name . '](' . $this->getUrl() . ')';
}
/**
* Scope the query to those attachments that are visible based upon related page permissions.
*/
public function scopeVisible(): Builder
{
$permissions = app()->make(PermissionApplicator::class);
return $permissions->restrictPageRelationQuery(
self::query(),
'attachments',
'uploaded_to'
);
}
}