[Media] Fix issues with database file storage

Fixed file quota as well.

There can be more than one file for the same filehash IF the url are different.

Possible states:
  - A file with no url and with filename is a local file.
  - A file with an url but no filename is a remote file that wasn't fetched,
    not even the thumbnail.
  - A file with an url and filename is a fetched remote file (maybe just a
    thumbnail of it).
  - A file with no filename nor url is a redirect.

Routes:
  Given these states, updated routes so that an attachment can only be
  retrieved by id and a file by filehash.

Major API changes:
  File::getByHash now returns a yield of files

Major UI changes:
  - Now remote non stored files are presented.
  - /view became preferred
  - Redirects to remote originals are preferred.

Many other minor bug fixes...
This commit is contained in:
2020-09-21 21:54:23 +01:00
parent e9cd437668
commit 6028175bfc
19 changed files with 578 additions and 415 deletions

View File

@@ -223,16 +223,18 @@ class Router
['q' => '.+']);
$m->connect('search/notice/rss', ['action' => 'noticesearchrss']);
foreach (['' => 'attachment',
'/view' => 'attachment_view',
'/download' => 'attachment_download',
// Attachment page for file
$m->connect("attachment/:attachment",
['action' => 'attachment'],
['attachment' => '[0-9]+']);
// Retrieve local file
foreach (['/view' => 'attachment_view',
'/download' => 'attachment_download',
'/thumbnail' => 'attachment_thumbnail'] as $postfix => $action) {
foreach (['filehash' => '[A-Za-z0-9._-]{64}',
'attachment' => '[0-9]+'] as $type => $match) {
$m->connect("attachment/:{$type}{$postfix}",
$m->connect("attachment/:filehash{$postfix}",
['action' => $action],
[$type => $match]);
}
['filehash' => '[A-Za-z0-9._-]{64}']);
}
$m->connect('notice/new?replyto=:replyto&inreplyto=:inreplyto',