From 279e3544ca0c9186bbbd82b4742377cef6b71780 Mon Sep 17 00:00:00 2001 From: Maxence Lange Date: Fri, 17 Mar 2023 16:34:51 -0100 Subject: [PATCH] direct link to mediaGet on avatar/header Signed-off-by: Maxence Lange --- lib/Db/CoreRequestBuilder.php | 33 ------------ lib/Db/SocialCrossQueryBuilder.php | 74 +++++++++++++++++--------- lib/Db/StreamRequestBuilder.php | 2 +- lib/Model/ActivityPub/Actor/Person.php | 11 ---- 4 files changed, 49 insertions(+), 71 deletions(-) diff --git a/lib/Db/CoreRequestBuilder.php b/lib/Db/CoreRequestBuilder.php index cf46bb0e..65306590 100644 --- a/lib/Db/CoreRequestBuilder.php +++ b/lib/Db/CoreRequestBuilder.php @@ -867,39 +867,6 @@ class CoreRequestBuilder { } - /** - * @param IQueryBuilder $qb - * @param string $alias - * - * @deprecated - */ - protected function selectCacheActors(IQueryBuilder &$qb, string $alias = 'ca') { - if ($qb->getType() !== QueryBuilder::SELECT) { - return; - } - - $pf = (($alias === '') ? $this->defaultSelectAlias : $alias); - $qb->from(self::TABLE_CACHE_ACTORS, $pf); - $qb->selectAlias($pf . '.id', 'cacheactor_id') - ->selectAlias($pf . '.type', 'cacheactor_type') - ->selectAlias($pf . '.account', 'cacheactor_account') - ->selectAlias($pf . '.following', 'cacheactor_following') - ->selectAlias($pf . '.followers', 'cacheactor_followers') - ->selectAlias($pf . '.inbox', 'cacheactor_inbox') - ->selectAlias($pf . '.shared_inbox', 'cacheactor_shared_inbox') - ->selectAlias($pf . '.outbox', 'cacheactor_outbox') - ->selectAlias($pf . '.featured', 'cacheactor_featured') - ->selectAlias($pf . '.url', 'cacheactor_url') - ->selectAlias($pf . '.preferred_username', 'cacheactor_preferred_username') - ->selectAlias($pf . '.name', 'cacheactor_name') - ->selectAlias($pf . '.summary', 'cacheactor_summary') - ->selectAlias($pf . '.public_key', 'cacheactor_public_key') - ->selectAlias($pf . '.source', 'cacheactor_source') - ->selectAlias($pf . '.creation', 'cacheactor_creation') - ->selectAlias($pf . '.local', 'cacheactor_local'); - } - - /** * @param IQueryBuilder $qb * @param string $fieldActorId diff --git a/lib/Db/SocialCrossQueryBuilder.php b/lib/Db/SocialCrossQueryBuilder.php index 884cbbbd..a93aa265 100644 --- a/lib/Db/SocialCrossQueryBuilder.php +++ b/lib/Db/SocialCrossQueryBuilder.php @@ -111,6 +111,7 @@ class SocialCrossQueryBuilder extends SocialCoreQueryBuilder { $this->selectAlias($pf . '.id', 'cacheactor_id') ->selectAlias($pf . '.nid', 'cacheactor_nid') ->selectAlias($pf . '.type', 'cacheactor_type') + ->selectAlias($pf . '.icon_id', 'cacheactor_icon_id') ->selectAlias($pf . '.account', 'cacheactor_account') ->selectAlias($pf . '.following', 'cacheactor_following') ->selectAlias($pf . '.followers', 'cacheactor_followers') @@ -127,6 +128,8 @@ class SocialCrossQueryBuilder extends SocialCoreQueryBuilder { ->selectAlias($pf . '.details', 'cacheactor_details') ->selectAlias($pf . '.creation', 'cacheactor_creation') ->selectAlias($pf . '.local', 'cacheactor_local'); + + $this->leftJoinCacheDocuments('icon_id', $pf, 'cacheactor_', 'cacd'); } @@ -136,54 +139,71 @@ class SocialCrossQueryBuilder extends SocialCoreQueryBuilder { * @return Person * @throws InvalidResourceException */ - public function parseLeftJoinCacheActors(array $data): Person { + public function parseLeftJoinCacheActors(array $data, string $prefix = ''): Person { + $prefix .= 'cacheactor_'; $new = []; foreach ($data as $k => $v) { - if (substr($k, 0, 11) === 'cacheactor_') { - $new[substr($k, 11)] = $v; + if (str_starts_with($k, $prefix)) { + $new[substr($k, strlen($prefix))] = $v; } } $actor = new Person(); $actor->importFromDatabase($new); - $actor->setAvatar( - $this->urlGenerator->linkToRouteAbsolute('social.Local.globalActorAvatar') . '?id=' - . $actor->getId() - ); if (!AP::$activityPub->isActor($actor)) { throw new InvalidResourceException(); } + try { + $icon = $this->parseLeftJoinCacheDocuments($data, $prefix); + $actor->setIcon($icon); + $uuid = ($icon->getResizedCopy() === '') ? $icon->getLocalCopy() : $icon->getResizedCopy(); + $actor->setAvatar( + $this->urlGenerator->linkToRouteAbsolute( + 'social.Api.mediaOpen', + ['uuid' => $uuid] + ) + ); + } catch (InvalidResourceException $e) { + } + return $actor; } /** - * @param string $fieldDocumentId - * @param string $alias + * @param string $linkField + * @param string $linkAlias */ - public function leftJoinCacheDocuments(string $fieldDocumentId, string $alias = '') { + public function leftJoinCacheDocuments( + string $linkField, + string $linkAlias = '', + string $prefix = '', + string $alias = 'cd' + ) { if ($this->getType() !== QueryBuilder::SELECT) { return; } + $prefix .= 'cachedocument_'; + $expr = $this->expr(); - $pf = (($alias === '') ? $this->getDefaultSelectAlias() : $alias); - $this->selectAlias('cd.id', 'cachedocument_id') - ->selectAlias('cd.type', 'cachedocument_type') - ->selectAlias('cd.mime_type', 'cachedocument_mime_type') - ->selectAlias('cd.media_type', 'cachedocument_media_type') - ->selectAlias('cd.url', 'cachedocument_url') - ->selectAlias('cd.local_copy', 'cachedocument_local_copy') - ->selectAlias('cd.caching', 'cachedocument_caching') - ->selectAlias('cd.public', 'cachedocument_public') - ->selectAlias('cd.error', 'cachedocument_error') - ->selectAlias('cd.creation', 'cachedocument_creation') + $pf = (($linkAlias === '') ? $this->getDefaultSelectAlias() : $linkAlias); + $this->selectAlias($alias . '.id', $prefix . 'id') + ->selectAlias($alias . '.type', $prefix . 'type') + ->selectAlias($alias . '.mime_type', $prefix . 'mime_type') + ->selectAlias($alias . '.media_type', $prefix . 'media_type') + ->selectAlias($alias . '.url', $prefix . 'url') + ->selectAlias($alias . '.local_copy', $prefix . 'local_copy') + ->selectAlias($alias . '.caching', $prefix . 'caching') + ->selectAlias($alias . '.public', $prefix . 'public') + ->selectAlias($alias . '.error', $prefix . 'error') + ->selectAlias($alias . '.creation', $prefix . 'creation') ->leftJoin( - $this->getDefaultSelectAlias(), CoreRequestBuilder::TABLE_CACHE_DOCUMENTS, 'cd', - $expr->eq($pf . '.' . $fieldDocumentId, 'cd.id_prim') + $this->getDefaultSelectAlias(), CoreRequestBuilder::TABLE_CACHE_DOCUMENTS, $alias, + $expr->eq($pf . '.' . $linkField, $alias . '.id_prim') ); } @@ -194,11 +214,13 @@ class SocialCrossQueryBuilder extends SocialCoreQueryBuilder { * @return Document * @throws InvalidResourceException */ - public function parseLeftJoinCacheDocuments(array $data): Document { + public function parseLeftJoinCacheDocuments(array $data, string $prefix = ''): Document { $new = []; + $prefix .= 'cachedocument_'; + foreach ($data as $k => $v) { - if (substr($k, 0, 14) === 'cachedocument_') { - $new[substr($k, 14)] = $v; + if (str_starts_with($k, $prefix)) { + $new[substr($k, strlen($prefix))] = $v; } } diff --git a/lib/Db/StreamRequestBuilder.php b/lib/Db/StreamRequestBuilder.php index 9096f9cb..30662033 100644 --- a/lib/Db/StreamRequestBuilder.php +++ b/lib/Db/StreamRequestBuilder.php @@ -142,7 +142,7 @@ class StreamRequestBuilder extends CoreRequestBuilder { protected function timelineHomeLinkCacheActor( SocialQueryBuilder $qb, string $alias = 'ca', string $aliasFollow = 'f' ) { - $qb->linkToCacheActors($alias); + $qb->linkToCacheActors($alias, 'attributed_to_prim'); $expr = $qb->expr(); $orX = $expr->orX(); diff --git a/lib/Model/ActivityPub/Actor/Person.php b/lib/Model/ActivityPub/Actor/Person.php index 4068dddd..dd78d93d 100644 --- a/lib/Model/ActivityPub/Actor/Person.php +++ b/lib/Model/ActivityPub/Actor/Person.php @@ -184,11 +184,6 @@ class Person extends ACore implements IQueryRow, JsonSerializable { * @return string */ public function getAvatar(): string { - if ($this->hasIcon()) { - return $this->getIcon() - ->getId(); - } - return $this->avatar; } @@ -701,12 +696,6 @@ class Person extends ACore implements IQueryRow, JsonSerializable { ->setFeatured($this->validate(self::AS_URL, 'featured', $data, '')) ->setDetailsAll($this->getArray('details', $data, [])); - if ($this->hasIcon()) { - $this->setAvatar($this->getIcon()->getUrl()); - } else { - $this->setAvatar($this->getAvatar()); - } - try { $cTime = new DateTime($this->get('creation', $data, 'yesterday')); $this->setCreation($cTime->getTimestamp());