. // }}} namespace Component\Attachment; use App\Core\Cache; use App\Core\Event; use App\Core\Modules\Component; use App\Core\Router\RouteLoader; use App\Entity\Note; use Component\Attachment\Controller as C; use Component\Attachment\Entity as E; use Component\Attachment\Entity\AttachmentToNote; class Attachment extends Component { public function onAddRoute(RouteLoader $r): bool { $r->connect('attachment_show', '/object/attachment/{id<\d+>}', [C\Attachment::class, 'attachment_show']); $r->connect('attachment_view', '/object/attachment/{id<\d+>}/view', [C\Attachment::class, 'attachment_view']); $r->connect('attachment_download', '/object/attachment/{id<\d+>}/download', [C\Attachment::class, 'attachment_download']); $r->connect('attachment_thumbnail', '/object/attachment/{id<\d+>}/thumbnail/{size}', [C\Attachment::class, 'attachment_thumbnail']); return Event::next; } /** * Get a unique representation of a file on disk * * This can be used in the future to deduplicate images by visual content */ public function onHashFile(string $filename, ?string &$out_hash): bool { $out_hash = hash_file(E\Attachment::FILEHASH_ALGO, $filename); return Event::stop; } public function onNoteDeleteRelated(Note &$note): bool { Cache::delete("note-attachments-{$note->getId()}"); E\AttachmentToNote::removeWhereNoteId($note->getId()); foreach($note->getAttachments() as $attachment) { $attachment->kill(); } return Event::next; } }