chore: remove verbose Log::info, add GD memory check, redact tokens in exception context

This commit is contained in:
Paulo Castellano 2026-03-31 22:04:12 -03:00
parent 6e3dac7a66
commit 0cf84e4424
7 changed files with 0 additions and 180 deletions

View file

@ -65,8 +65,6 @@ private function publishPost(string $pageId, string $accessToken, ?string $conte
private function publishTextPost(string $pageId, string $accessToken, string $content): array
{
Log::info('Facebook publishing text post', ['page_id' => $pageId]);
$response = Http::post("{$this->baseUrl}/{$pageId}/feed", [
'message' => $content,
'access_token' => $accessToken,
@ -91,8 +89,6 @@ private function publishTextPost(string $pageId, string $accessToken, string $co
private function publishSingleImagePost(string $pageId, string $accessToken, ?string $content, $media): array
{
Log::info('Facebook publishing single image post', ['page_id' => $pageId]);
$response = Http::post("{$this->baseUrl}/{$pageId}/photos", [
'message' => $content,
'url' => $media->url,
@ -118,11 +114,6 @@ private function publishSingleImagePost(string $pageId, string $accessToken, ?st
private function publishMultiImagePost(string $pageId, string $accessToken, ?string $content, $mediaCollection): array
{
Log::info('Facebook publishing multi-image post', [
'page_id' => $pageId,
'image_count' => $mediaCollection->count(),
]);
// Upload each image as unpublished
$attachedMedia = [];
@ -184,8 +175,6 @@ private function publishMultiImagePost(string $pageId, string $accessToken, ?str
private function publishVideoPost(string $pageId, string $accessToken, ?string $content, $media): array
{
Log::info('Facebook publishing video post', ['page_id' => $pageId]);
// Use resumable upload for videos
$response = Http::post("{$this->baseUrl}/{$pageId}/videos", [
'description' => $content,
@ -212,8 +201,6 @@ private function publishVideoPost(string $pageId, string $accessToken, ?string $
private function publishReel(string $pageId, string $accessToken, ?string $content, $media): array
{
Log::info('Facebook publishing reel', ['page_id' => $pageId]);
// Upload video as reel
$response = Http::post("{$this->baseUrl}/{$pageId}/video_reels", [
'upload_phase' => 'start',
@ -272,8 +259,6 @@ private function publishReel(string $pageId, string $accessToken, ?string $conte
private function publishStory(string $pageId, string $accessToken, $media): array
{
Log::info('Facebook publishing story', ['page_id' => $pageId]);
$isVideo = $media->isVideo();
if ($isVideo) {

View file

@ -63,8 +63,6 @@ private function publishFeed(string $instagramId, string $accessToken, ?string $
private function publishSingleImage(string $instagramId, string $accessToken, ?string $content, $media): array
{
Log::info('Instagram publishing single image', ['instagram_id' => $instagramId, 'image_url' => $media->url]);
// Step 1: Create container
$containerResponse = Http::post("{$this->baseUrl}/{$instagramId}/media", [
'image_url' => $media->url,
@ -72,11 +70,6 @@ private function publishSingleImage(string $instagramId, string $accessToken, ?s
'access_token' => $accessToken,
]);
Log::info('Instagram container response', [
'status' => $containerResponse->status(),
'body' => $containerResponse->json(),
]);
if ($containerResponse->failed()) {
Log::error('Instagram container creation failed', [
'status' => $containerResponse->status(),
@ -100,8 +93,6 @@ private function publishSingleImage(string $instagramId, string $accessToken, ?s
private function publishReel(string $instagramId, string $accessToken, ?string $content, $media): array
{
Log::info('Instagram publishing reel', ['instagram_id' => $instagramId]);
// Step 1: Create container for video/reel
$containerResponse = Http::post("{$this->baseUrl}/{$instagramId}/media", [
'video_url' => $media->url,
@ -133,8 +124,6 @@ private function publishReel(string $instagramId, string $accessToken, ?string $
private function publishStory(string $instagramId, string $accessToken, $media): array
{
Log::info('Instagram publishing story', ['instagram_id' => $instagramId]);
$isVideo = $media->isVideo();
$params = [
@ -174,11 +163,6 @@ private function publishStory(string $instagramId, string $accessToken, $media):
private function publishCarousel(string $instagramId, string $accessToken, ?string $content, $mediaCollection): array
{
Log::info('Instagram publishing carousel', [
'instagram_id' => $instagramId,
'media_count' => $mediaCollection->count(),
]);
// Step 1: Create containers for each media item
$childContainers = [];
@ -274,8 +258,6 @@ private function publishContainer(string $instagramId, string $accessToken, stri
$permalink = $permalinkResponse->json()['permalink'] ?? null;
Log::info('Instagram publish success', ['media_id' => $mediaId, 'permalink' => $permalink]);
return [
'id' => $mediaId,
'url' => $permalink,
@ -298,8 +280,6 @@ private function waitForMediaProcessing(string $containerId, string $accessToken
$status = $statusResponse->json()['status_code'] ?? 'UNKNOWN';
Log::info('Instagram media processing status', ['status' => $status, 'attempt' => $i]);
if ($status === 'FINISHED') {
return;
}
@ -336,7 +316,6 @@ private function refreshToken(SocialAccount $account): void
'token_expires_at' => data_get($data, 'expires_in') ? now()->addSeconds(data_get($data, 'expires_in')) : null,
]);
Log::info('Instagram token refreshed successfully');
}
private function handleApiError(Response $response): never

View file

@ -68,10 +68,6 @@ private function retryWithRefresh(PostPlatform $postPlatform, TokenExpiredExcept
$this->hasRetried = true;
Log::info('LinkedIn Page token rejected, attempting refresh and retry', [
'account_id' => $this->account->id,
]);
try {
$this->refreshToken($this->account);
$this->account->refresh();
@ -122,8 +118,6 @@ private function publishPost(string $organizationUrn, ?string $content, $media,
}
}
Log::info('LinkedIn Page creating post', ['payload' => $payload]);
$response = $this->getHttpClient()
->post("{$this->baseUrl}/rest/posts", $payload);
@ -151,11 +145,6 @@ private function publishPost(string $organizationUrn, ?string $content, $media,
private function publishCarousel(string $organizationUrn, ?string $content, $mediaCollection, $account): array
{
Log::info('LinkedIn Page publishing carousel', [
'owner' => $organizationUrn,
'media_count' => $mediaCollection->count(),
]);
// Upload images and build carousel items
$carouselItems = [];
@ -195,8 +184,6 @@ private function publishCarousel(string $organizationUrn, ?string $content, $med
],
];
Log::info('LinkedIn Page creating carousel post', ['payload' => $payload]);
$response = $this->getHttpClient()
->post("{$this->baseUrl}/rest/posts", $payload);
@ -252,8 +239,6 @@ private function uploadMedia($mediaItem, string $ownerUrn): ?string
private function uploadImage($mediaItem, string $ownerUrn): ?string
{
Log::info('LinkedIn Page initializing image upload', ['owner' => $ownerUrn]);
// Step 1: Initialize upload
$initResponse = $this->getHttpClient()
->post("{$this->baseUrl}/rest/images?action=initializeUpload", [
@ -275,8 +260,6 @@ private function uploadImage($mediaItem, string $ownerUrn): ?string
throw new \Exception('LinkedIn Page image upload init missing uploadUrl or image URN');
}
Log::info('LinkedIn Page image init success', ['imageUrn' => $imageUrn]);
// Step 2: Download and optimize image
$tempFile = tempnam(sys_get_temp_dir(), 'lip_image_');
@ -305,8 +288,6 @@ private function uploadImage($mediaItem, string $ownerUrn): ?string
$this->handleApiError($uploadResponse);
}
Log::info('LinkedIn Page image upload success', ['imageUrn' => $imageUrn]);
return $imageUrn;
} finally {
@unlink($tempFile);
@ -330,11 +311,6 @@ private function doUploadVideo(string $tempFile, $mediaItem, string $ownerUrn):
$fileSize = (int) filesize($tempFile);
Log::info('LinkedIn Page initializing video upload', [
'owner' => $ownerUrn,
'fileSize' => $fileSize,
]);
// Step 1: Initialize upload
$initResponse = $this->getHttpClient()
->post("{$this->baseUrl}/rest/videos?action=initializeUpload", [
@ -360,11 +336,6 @@ private function doUploadVideo(string $tempFile, $mediaItem, string $ownerUrn):
throw new \Exception('LinkedIn Page video upload init missing video URN or upload instructions');
}
Log::info('LinkedIn Page video init success', [
'videoUrn' => $videoUrn,
'chunks' => count($uploadInstructions),
]);
// Step 2: Upload chunks
$uploadedPartIds = [];
$handle = fopen($tempFile, 'r');
@ -378,13 +349,6 @@ private function doUploadVideo(string $tempFile, $mediaItem, string $ownerUrn):
fseek($handle, $firstByte);
$chunkData = fread($handle, $chunkLength);
Log::info('LinkedIn Page uploading video chunk', [
'index' => $index,
'firstByte' => $firstByte,
'lastByte' => $lastByte,
'chunkSize' => strlen($chunkData),
]);
$chunkResponse = Http::withToken($this->accessToken)
->withHeaders([
'Content-Type' => 'application/octet-stream',
@ -406,14 +370,11 @@ private function doUploadVideo(string $tempFile, $mediaItem, string $ownerUrn):
$uploadedPartIds[] = $etag;
}
Log::info('LinkedIn Page video chunk uploaded', ['index' => $index, 'etag' => $etag]);
}
fclose($handle);
// Step 3: Finalize upload
Log::info('LinkedIn Page finalizing video upload', ['videoUrn' => $videoUrn]);
$finalizeResponse = $this->getHttpClient()
->post("{$this->baseUrl}/rest/videos?action=finalizeUpload", [
'finalizeUploadRequest' => [
@ -428,8 +389,6 @@ private function doUploadVideo(string $tempFile, $mediaItem, string $ownerUrn):
$this->handleApiError($finalizeResponse);
}
Log::info('LinkedIn Page video upload finalized', ['videoUrn' => $videoUrn]);
// Step 4: Wait for processing
$this->waitForVideoProcessing($videoUrn);
@ -454,8 +413,6 @@ private function waitForVideoProcessing(string $videoUrn, int $maxAttempts = 30)
$data = $response->json();
$status = data_get($data, 'status', 'UNKNOWN');
Log::info('LinkedIn Page video processing status', ['status' => $status, 'attempt' => $i]);
if ($status === 'AVAILABLE') {
return;
}

View file

@ -62,10 +62,6 @@ private function retryWithRefresh(PostPlatform $postPlatform, TokenExpiredExcept
$this->hasRetried = true;
Log::info('LinkedIn token rejected, attempting refresh and retry', [
'account_id' => $this->account->id,
]);
try {
$this->refreshToken($this->account);
$this->account->refresh();
@ -115,8 +111,6 @@ private function publishPost(string $personUrn, ?string $content, $media): array
}
}
Log::info('LinkedIn creating post', ['payload' => $payload]);
$response = $this->getHttpClient()
->post("{$this->baseUrl}/rest/posts", $payload);
@ -138,11 +132,6 @@ private function publishPost(string $personUrn, ?string $content, $media): array
private function publishCarousel(string $personUrn, ?string $content, $mediaCollection): array
{
Log::info('LinkedIn publishing carousel', [
'owner' => $personUrn,
'media_count' => $mediaCollection->count(),
]);
// Upload images and build carousel items
$carouselItems = [];
@ -182,8 +171,6 @@ private function publishCarousel(string $personUrn, ?string $content, $mediaColl
],
];
Log::info('LinkedIn creating carousel post', ['payload' => $payload]);
$response = $this->getHttpClient()
->post("{$this->baseUrl}/rest/posts", $payload);
@ -233,8 +220,6 @@ private function uploadMedia($mediaItem, string $ownerUrn): ?string
private function uploadImage($mediaItem, string $ownerUrn): ?string
{
Log::info('LinkedIn initializing image upload', ['owner' => $ownerUrn]);
// Step 1: Initialize upload
$initResponse = $this->getHttpClient()
->post("{$this->baseUrl}/rest/images?action=initializeUpload", [
@ -256,8 +241,6 @@ private function uploadImage($mediaItem, string $ownerUrn): ?string
throw new \Exception('LinkedIn image upload init missing uploadUrl or image URN');
}
Log::info('LinkedIn image init success', ['imageUrn' => $imageUrn]);
// Step 2: Download and optimize image
$tempFile = tempnam(sys_get_temp_dir(), 'li_image_');
@ -286,8 +269,6 @@ private function uploadImage($mediaItem, string $ownerUrn): ?string
$this->handleApiError($uploadResponse);
}
Log::info('LinkedIn image upload success', ['imageUrn' => $imageUrn]);
return $imageUrn;
} finally {
@unlink($tempFile);
@ -311,11 +292,6 @@ private function doUploadVideo(string $tempFile, $mediaItem, string $ownerUrn):
$fileSize = (int) filesize($tempFile);
Log::info('LinkedIn initializing video upload', [
'owner' => $ownerUrn,
'fileSize' => $fileSize,
]);
// Step 1: Initialize upload
$initResponse = $this->getHttpClient()
->post("{$this->baseUrl}/rest/videos?action=initializeUpload", [
@ -341,11 +317,6 @@ private function doUploadVideo(string $tempFile, $mediaItem, string $ownerUrn):
throw new \Exception('LinkedIn video upload init missing video URN or upload instructions');
}
Log::info('LinkedIn video init success', [
'videoUrn' => $videoUrn,
'chunks' => count($uploadInstructions),
]);
// Step 2: Upload chunks
$uploadedPartIds = [];
$handle = fopen($tempFile, 'r');
@ -359,13 +330,6 @@ private function doUploadVideo(string $tempFile, $mediaItem, string $ownerUrn):
fseek($handle, $firstByte);
$chunkData = fread($handle, $chunkLength);
Log::info('LinkedIn uploading video chunk', [
'index' => $index,
'firstByte' => $firstByte,
'lastByte' => $lastByte,
'chunkSize' => strlen($chunkData),
]);
$chunkResponse = Http::withToken($this->accessToken)
->withHeaders([
'Content-Type' => 'application/octet-stream',
@ -387,14 +351,11 @@ private function doUploadVideo(string $tempFile, $mediaItem, string $ownerUrn):
$uploadedPartIds[] = $etag;
}
Log::info('LinkedIn video chunk uploaded', ['index' => $index, 'etag' => $etag]);
}
fclose($handle);
// Step 3: Finalize upload
Log::info('LinkedIn finalizing video upload', ['videoUrn' => $videoUrn]);
$finalizeResponse = $this->getHttpClient()
->post("{$this->baseUrl}/rest/videos?action=finalizeUpload", [
'finalizeUploadRequest' => [
@ -409,8 +370,6 @@ private function doUploadVideo(string $tempFile, $mediaItem, string $ownerUrn):
$this->handleApiError($finalizeResponse);
}
Log::info('LinkedIn video upload finalized', ['videoUrn' => $videoUrn]);
// Step 4: Wait for processing
$this->waitForVideoProcessing($videoUrn);
@ -435,8 +394,6 @@ private function waitForVideoProcessing(string $videoUrn, int $maxAttempts = 30)
$data = $response->json();
$status = data_get($data, 'status', 'UNKNOWN');
Log::info('LinkedIn video processing status', ['status' => $status, 'attempt' => $i]);
if ($status === 'AVAILABLE') {
return;
}

View file

@ -93,12 +93,6 @@ private function queryCreatorInfo(): array
private function publishVideo(PostPlatform $postPlatform, $media): array
{
Log::info('TikTok publishing video', [
'video_url' => $media->url,
'media_full_url' => $media->full_url ?? $media->url,
'content' => $postPlatform->content,
]);
$creatorInfo = $this->queryCreatorInfo();
$response = $this->getHttpClient()
@ -126,8 +120,6 @@ private function publishVideo(PostPlatform $postPlatform, $media): array
$data = $response->json();
Log::info('TikTok video init response', ['data' => $data]);
$publishId = data_get($data, 'data.publish_id');
if (! $publishId) {
@ -155,12 +147,6 @@ private function publishPhotos(PostPlatform $postPlatform, $mediaCollection): ar
throw new \Exception('No valid images found for TikTok photo post');
}
Log::info('TikTok publishing photos', [
'photo_urls' => $photoUrls,
'photo_count' => count($photoUrls),
'content' => $postPlatform->content,
]);
$creatorInfo = $this->queryCreatorInfo();
$response = $this->getHttpClient()
@ -189,8 +175,6 @@ private function publishPhotos(PostPlatform $postPlatform, $mediaCollection): ar
$data = $response->json();
Log::info('TikTok photo init response', ['data' => $data]);
$publishId = data_get($data, 'data.publish_id');
if (! $publishId) {
@ -228,12 +212,6 @@ private function waitForPublishStatus(string $publishId, int $maxAttempts = 20):
$data = $response->json();
$status = data_get($data, 'data.status', 'UNKNOWN');
Log::info('TikTok publish status', [
'status' => $status,
'attempt' => $i,
'data' => $data,
]);
if ($status === 'PUBLISH_COMPLETE') {
return data_get($data, 'data', []);
}
@ -288,7 +266,6 @@ private function refreshToken(SocialAccount $account): void
'token_expires_at' => data_get($data, 'expires_in') ? now()->addSeconds(data_get($data, 'expires_in')) : null,
]);
Log::info('TikTok token refreshed successfully');
}
private function handleApiError(Response $response): never

View file

@ -44,15 +44,8 @@ public function publish(PostPlatform $postPlatform): array
if ($media->isNotEmpty()) {
foreach ($media as $mediaItem) {
Log::info('Uploading media to X', [
'url' => $mediaItem->url,
'mime_type' => $mediaItem->mime_type,
]);
$uploadedMedia = $this->uploadMedia($mediaItem);
Log::info('X media upload response', ['response' => $uploadedMedia]);
// v2 API returns data.id, v1 returns media_id
$mediaId = data_get($uploadedMedia, 'data.id', data_get($uploadedMedia, 'media_id'));
if ($mediaId) {
@ -71,8 +64,6 @@ public function publish(PostPlatform $postPlatform): array
throw new \Exception('X posts require either text or media. Please add content to your post.');
}
Log::info('Posting tweet', ['data' => $data]);
$response = $this->getHttpClient()
->post("{$this->baseUrl}/2/tweets", $data);
@ -175,12 +166,6 @@ private function uploadMedia($mediaItem): ?array
private function chunkedUpload(string $tempFile, int $totalBytes, string $mimeType, string $mediaCategory): array
{
Log::info('X chunked upload INIT', [
'total_bytes' => $totalBytes,
'media_type' => $mimeType,
'media_category' => $mediaCategory,
]);
// INIT
$initResponse = Http::withToken($this->accessToken)
->timeout(60)
@ -205,8 +190,6 @@ private function chunkedUpload(string $tempFile, int $totalBytes, string $mimeTy
throw new \Exception('No media_id returned from INIT');
}
Log::info('X chunked upload INIT success', ['media_id' => $mediaId]);
// APPEND - Read from temp file in 5MB chunks (memory-safe)
$chunkSize = 5 * 1024 * 1024;
$handle = fopen($tempFile, 'r');
@ -219,12 +202,6 @@ private function chunkedUpload(string $tempFile, int $totalBytes, string $mimeTy
break;
}
Log::info('X chunked upload APPEND', [
'media_id' => $mediaId,
'segment' => $index,
'chunk_size' => strlen($chunk),
]);
$appendResponse = Http::withToken($this->accessToken)
->timeout(300)
->attach('media', $chunk, 'chunk'.$index)
@ -247,8 +224,6 @@ private function chunkedUpload(string $tempFile, int $totalBytes, string $mimeTy
fclose($handle);
// FINALIZE - Use the new v2 endpoint
Log::info('X chunked upload FINALIZE', ['media_id' => $mediaId]);
$finalizeResponse = Http::withToken($this->accessToken)
->timeout(60)
->post("{$this->baseUrl}/2/media/upload/{$mediaId}/finalize");

View file

@ -79,11 +79,6 @@ private function publishShort(PostPlatform $postPlatform, $media, SocialAccount
$title = $this->buildTitle($postPlatform->content);
$description = $postPlatform->content;
Log::info('YouTube Shorts publishing video', [
'video_url' => $media->url,
'title' => $title,
]);
$tempFile = tempnam(sys_get_temp_dir(), 'yt_upload_');
$handle = null;
@ -103,8 +98,6 @@ private function publishShort(PostPlatform $postPlatform, $media, SocialAccount
throw new \Exception('Downloaded video is too small or empty ('.$fileSize.' bytes), aborting upload');
}
Log::info('YouTube video downloaded', ['size' => $fileSize]);
// Set up Google Client with deferred mode for resumable upload
$client = $this->createGoogleClient($account);
$client->setDefer(true);
@ -162,8 +155,6 @@ private function publishShort(PostPlatform $postPlatform, $media, SocialAccount
$videoId = $uploadStatus->getId();
Log::info('YouTube upload success', ['video_id' => $videoId]);
return [
'id' => $videoId,
'url' => "https://www.youtube.com/shorts/{$videoId}",
@ -229,7 +220,6 @@ private function refreshToken(SocialAccount $account): void
'token_expires_at' => data_get($data, 'expires_in') ? now()->addSeconds(data_get($data, 'expires_in')) : null,
]);
Log::info('YouTube token refreshed successfully');
}
private function handleGoogleError(\Google\Service\Exception $e): never