api = new LemmyApiService($account->instance_url); $this->account = $account; $this->thumbnailUploader = new ThumbnailUploader($account->instance_url); } /** * @param array $extractedData * @return array * * @throws PlatformAuthException * @throws Exception */ public function publishToChannel(Article $article, array $extractedData, PlatformChannel $channel): array { $authService = resolve(LemmyAuthService::class); $token = $authService->getToken($this->account); $thumbnail = $this->hostedThumbnail($extractedData, $channel, $article, $token); try { return $this->createPost($token, $extractedData, $channel, $article, $thumbnail); } catch (Exception $e) { // If the cached token was stale, refresh and retry once if (str_contains($e->getMessage(), 'not_logged_in') || str_contains($e->getMessage(), 'Unauthorized')) { $token = $authService->refreshToken($this->account); return $this->createPost($token, $extractedData, $channel, $article, $thumbnail); } throw $e; } } /** * Uploaded once per publish, outside the stale-token retry: the upload is the expensive * part and a retry would otherwise re-download, re-encode and re-log. * * @param array $extractedData */ private function hostedThumbnail(array $extractedData, PlatformChannel $channel, Article $article, string $token): ?string { $source = $extractedData['thumbnail'] ?? null; $source = is_string($source) && $source !== '' ? $source : null; if ($source === null) { return null; } $hosted = $this->thumbnailUploader->upload($source, $token); if ($hosted === null) { app(LogSaver::class)->warning('Thumbnail upload failed; publishing without one', $channel, [ 'article_id' => $article->id, 'source' => $source, ]); } return $hosted; } /** * @param array $extractedData * @return array */ private function createPost(string $token, array $extractedData, PlatformChannel $channel, Article $article, ?string $thumbnail = null): array { $languageId = $extractedData['language_id'] ?? null; return $this->api->createPost( $token, $extractedData['title'] ?? 'Untitled', $extractedData['description'] ?? '', $channel->channel_id, $article->url, $thumbnail, $languageId ); } }