[Avatar] Preserve uploaded filename and use Avatar's own route instead of attachment
This commit is contained in:
parent
f70eb8f12d
commit
036e9cb58e
@ -28,8 +28,6 @@ use App\Core\Router\Router;
|
|||||||
use App\Util\Common;
|
use App\Util\Common;
|
||||||
use Component\Avatar\Controller as C;
|
use Component\Avatar\Controller as C;
|
||||||
use Component\Avatar\Exception\NoAvatarException;
|
use Component\Avatar\Exception\NoAvatarException;
|
||||||
use Symfony\Component\Asset\Package;
|
|
||||||
use Symfony\Component\Asset\VersionStrategy\EmptyVersionStrategy;
|
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
|
||||||
class Avatar extends Component
|
class Avatar extends Component
|
||||||
@ -96,17 +94,11 @@ class Avatar extends Component
|
|||||||
/**
|
/**
|
||||||
* Get the cached avatar associated with the given GSActor id, or the current user if not given
|
* Get the cached avatar associated with the given GSActor id, or the current user if not given
|
||||||
*/
|
*/
|
||||||
public static function getAvatarUrl(?int $gsactor_id = null): string
|
public static function getAvatarUrl(?int $gsactor_id = null, string $size = 'full'): string
|
||||||
{
|
{
|
||||||
$gsactor_id = $gsactor_id ?: Common::userId();
|
$gsactor_id = $gsactor_id ?: Common::userId();
|
||||||
return Cache::get("avatar-url-{$gsactor_id}", function () use ($gsactor_id) {
|
return Cache::get("avatar-url-{$gsactor_id}", function () use ($gsactor_id) {
|
||||||
$attachment_id = self::getAvatarFileInfo($gsactor_id)['id'];
|
return Router::url('avatar', ['gsactor_id' => $gsactor_id, 'size' => 'full']);
|
||||||
if ($attachment_id !== null) {
|
|
||||||
return Router::url('attachment_view', ['id' => $attachment_id]);
|
|
||||||
} else {
|
|
||||||
$package = new Package(new EmptyVersionStrategy());
|
|
||||||
return $package->getUrl(Common::config('avatar', 'default'));
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,7 +112,7 @@ class Avatar extends Component
|
|||||||
{
|
{
|
||||||
$res = Cache::get("avatar-file-info-{$gsactor_id}",
|
$res = Cache::get("avatar-file-info-{$gsactor_id}",
|
||||||
function () use ($gsactor_id) {
|
function () use ($gsactor_id) {
|
||||||
return DB::dql('select f.id, f.filename, f.mimetype ' .
|
return DB::dql('select f.id, f.filename, a.filename title, f.mimetype ' .
|
||||||
'from App\Entity\Attachment f ' .
|
'from App\Entity\Attachment f ' .
|
||||||
'join Component\Avatar\Entity\Avatar a with f.id = a.attachment_id ' .
|
'join Component\Avatar\Entity\Avatar a with f.id = a.attachment_id ' .
|
||||||
'where a.gsactor_id = :gsactor_id',
|
'where a.gsactor_id = :gsactor_id',
|
||||||
@ -129,10 +121,16 @@ class Avatar extends Component
|
|||||||
);
|
);
|
||||||
if ($res === []) { // Avatar not found
|
if ($res === []) { // Avatar not found
|
||||||
$filepath = INSTALLDIR . '/public/assets/default-avatar.svg';
|
$filepath = INSTALLDIR . '/public/assets/default-avatar.svg';
|
||||||
return ['id' => null, 'file_path' => $filepath, 'mimetype' => 'image/svg+xml', 'title' => null];
|
return [
|
||||||
|
'id' => null,
|
||||||
|
'filepath' => $filepath,
|
||||||
|
'mimetype' => 'image/svg+xml',
|
||||||
|
'filename' => null,
|
||||||
|
'title' => 'default_avatar.svg',
|
||||||
|
];
|
||||||
} else {
|
} else {
|
||||||
$res = $res[0]; // A user must always only have one avatar.
|
$res = $res[0]; // A user must always only have one avatar.
|
||||||
$res['file_path'] = DB::findOneBy('attachment', ['id' => $res['id']])->getPath();
|
$res['filepath'] = DB::findOneBy('attachment', ['id' => $res['id']])->getPath();
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ class Avatar extends Controller
|
|||||||
switch ($size) {
|
switch ($size) {
|
||||||
case 'full':
|
case 'full':
|
||||||
$res = \Component\Avatar\Avatar::getAvatarFileInfo($gsactor_id);
|
$res = \Component\Avatar\Avatar::getAvatarFileInfo($gsactor_id);
|
||||||
return M::sendFile($res['file_path'], $res['mimetype'], $res['title']);
|
return M::sendFile($res['filepath'], $res['mimetype'], $res['title']);
|
||||||
default:
|
default:
|
||||||
throw new Exception('Not implemented');
|
throw new Exception('Not implemented');
|
||||||
}
|
}
|
||||||
@ -114,7 +114,7 @@ class Avatar extends Controller
|
|||||||
DB::persist($attachment);
|
DB::persist($attachment);
|
||||||
// Can only get new id after inserting
|
// Can only get new id after inserting
|
||||||
DB::flush();
|
DB::flush();
|
||||||
DB::persist(AvatarEntity::create(['gsactor_id' => $gsactor_id, 'attachment_id' => $attachment->getId()]));
|
DB::persist(AvatarEntity::create(['gsactor_id' => $gsactor_id, 'attachment_id' => $attachment->getId(), 'filename' => $file->getClientOriginalName()]));
|
||||||
DB::flush();
|
DB::flush();
|
||||||
Event::handle('AvatarUpdate', [$user->getId()]);
|
Event::handle('AvatarUpdate', [$user->getId()]);
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,7 @@ class Avatar extends Entity
|
|||||||
// @codeCoverageIgnoreStart
|
// @codeCoverageIgnoreStart
|
||||||
private int $gsactor_id;
|
private int $gsactor_id;
|
||||||
private int $attachment_id;
|
private int $attachment_id;
|
||||||
|
private ?string $filename;
|
||||||
private DateTimeInterface $created;
|
private DateTimeInterface $created;
|
||||||
private DateTimeInterface $modified;
|
private DateTimeInterface $modified;
|
||||||
|
|
||||||
@ -73,6 +74,22 @@ class Avatar extends Entity
|
|||||||
return $this->attachment_id;
|
return $this->attachment_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return null|string
|
||||||
|
*/
|
||||||
|
public function getFilename(): ?string
|
||||||
|
{
|
||||||
|
return $this->filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param null|string $filename
|
||||||
|
*/
|
||||||
|
public function setFilename(?string $filename): void
|
||||||
|
{
|
||||||
|
$this->filename = $filename;
|
||||||
|
}
|
||||||
|
|
||||||
public function setCreated(DateTimeInterface $created): self
|
public function setCreated(DateTimeInterface $created): self
|
||||||
{
|
{
|
||||||
$this->created = $created;
|
$this->created = $created;
|
||||||
@ -142,6 +159,7 @@ class Avatar extends Entity
|
|||||||
'fields' => [
|
'fields' => [
|
||||||
'gsactor_id' => ['type' => 'int', 'foreign key' => true, 'target' => 'GSActor.id', 'multiplicity' => 'one to one', 'not null' => true, 'description' => 'foreign key to gsactor table'],
|
'gsactor_id' => ['type' => 'int', 'foreign key' => true, 'target' => 'GSActor.id', 'multiplicity' => 'one to one', 'not null' => true, 'description' => 'foreign key to gsactor table'],
|
||||||
'attachment_id' => ['type' => 'int', 'foreign key' => true, 'target' => 'Attachment.id', 'multiplicity' => 'one to one', 'not null' => true, 'description' => 'foreign key to attachment table'],
|
'attachment_id' => ['type' => 'int', 'foreign key' => true, 'target' => 'Attachment.id', 'multiplicity' => 'one to one', 'not null' => true, 'description' => 'foreign key to attachment table'],
|
||||||
|
'filename' => ['type' => 'varchar', 'length' => 191, 'description' => 'file name of resource when available'],
|
||||||
'created' => ['type' => 'datetime', 'not null' => true, 'description' => 'date this record was created', 'default' => 'CURRENT_TIMESTAMP'],
|
'created' => ['type' => 'datetime', 'not null' => true, 'description' => 'date this record was created', 'default' => 'CURRENT_TIMESTAMP'],
|
||||||
'modified' => ['type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified', 'default' => 'CURRENT_TIMESTAMP'],
|
'modified' => ['type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified', 'default' => 'CURRENT_TIMESTAMP'],
|
||||||
],
|
],
|
||||||
|
Loading…
Reference in New Issue
Block a user