diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..89292e6 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,71 @@ +name: Tests + +on: + push: + branches: [dev, v1, main] + pull_request: + branches: [dev, v1, main] + +jobs: + test: + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + php: [8.2, 8.3, 8.4] + laravel: [11.*, 12.*] + stability: [prefer-stable] + include: + - laravel: 11.* + testbench: 9.* + - laravel: 12.* + testbench: 10.* + + name: PHP ${{ matrix.php }} - Laravel ${{ matrix.laravel }} - ${{ matrix.stability }} + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv + coverage: none + + - name: Setup problem matchers + run: | + echo "::add-matcher::${{ runner.tool_cache }}/php.json" + echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" + + - name: Install dependencies + run: | + composer require "laravel/framework:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" --no-interaction --no-update + composer update --${{ matrix.stability }} --prefer-dist --no-interaction + + - name: Execute tests + run: vendor/bin/phpunit --testdox + + code-style: + runs-on: ubuntu-latest + + name: Code Style + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 8.3 + extensions: dom, curl, libxml, mbstring, zip + coverage: none + + - name: Install dependencies + run: composer install --no-interaction --prefer-dist + + - name: Check code style + run: vendor/bin/pint --test diff --git a/src/Actions/SendWhatsappMessageAction.php b/src/Actions/SendWhatsappMessageAction.php index 77fdc4a..5831d68 100644 --- a/src/Actions/SendWhatsappMessageAction.php +++ b/src/Actions/SendWhatsappMessageAction.php @@ -66,7 +66,7 @@ class SendWhatsappMessageAction extends Action $this->modalWidth('lg'); - $this->form(fn(): array => $this->getFormSchema()); + $this->form(fn (): array => $this->getFormSchema()); $this->action(function (array $data): void { $this->sendMessage($data); @@ -238,21 +238,21 @@ class SendWhatsappMessageAction extends Action $this->getLatitudeInput(), $this->getLongitudeInput(), ]) - ->visible(fn(Get $get): bool => $get('type') === MessageTypeEnum::LOCATION->value), + ->visible(fn (Get $get): bool => $get('type') === MessageTypeEnum::LOCATION->value), Grid::make(2) ->schema([ $this->getLocationNameInput(), $this->getLocationAddressInput(), ]) - ->visible(fn(Get $get): bool => $get('type') === MessageTypeEnum::LOCATION->value), + ->visible(fn (Get $get): bool => $get('type') === MessageTypeEnum::LOCATION->value), Grid::make(2) ->schema([ $this->getContactNameInput(), $this->getContactNumberInput(), ]) - ->visible(fn(Get $get): bool => $get('type') === MessageTypeEnum::CONTACT->value), + ->visible(fn (Get $get): bool => $get('type') === MessageTypeEnum::CONTACT->value), ]; } @@ -337,7 +337,7 @@ class SendWhatsappMessageAction extends Action $types = ! empty($this->allowedTypes) ? $this->allowedTypes : $allTypes; return collect($types) - ->mapWithKeys(fn(MessageTypeEnum $type) => [$type->value => $type->getLabel()]) + ->mapWithKeys(fn (MessageTypeEnum $type) => [$type->value => $type->getLabel()]) ->toArray(); } @@ -346,8 +346,8 @@ class SendWhatsappMessageAction extends Action return Textarea::make('message') ->label(__('filament-evolution::action.message')) ->default($this->defaultMessage) - ->required(fn(Get $get): bool => $get('type') === MessageTypeEnum::TEXT->value) - ->visible(fn(Get $get): bool => $get('type') === MessageTypeEnum::TEXT->value) + ->required(fn (Get $get): bool => $get('type') === MessageTypeEnum::TEXT->value) + ->visible(fn (Get $get): bool => $get('type') === MessageTypeEnum::TEXT->value) ->rows(4) ->placeholder(__('filament-evolution::action.message_placeholder')); } @@ -356,7 +356,7 @@ class SendWhatsappMessageAction extends Action { return Textarea::make('caption') ->label(__('filament-evolution::action.caption')) - ->visible(fn(Get $get): bool => in_array($get('type'), [ + ->visible(fn (Get $get): bool => in_array($get('type'), [ MessageTypeEnum::IMAGE->value, MessageTypeEnum::VIDEO->value, MessageTypeEnum::DOCUMENT->value, @@ -369,13 +369,13 @@ class SendWhatsappMessageAction extends Action { return FileUpload::make('media') ->label(__('filament-evolution::action.media')) - ->required(fn(Get $get): bool => in_array($get('type'), [ + ->required(fn (Get $get): bool => in_array($get('type'), [ MessageTypeEnum::IMAGE->value, MessageTypeEnum::VIDEO->value, MessageTypeEnum::AUDIO->value, MessageTypeEnum::DOCUMENT->value, ])) - ->visible(fn(Get $get): bool => in_array($get('type'), [ + ->visible(fn (Get $get): bool => in_array($get('type'), [ MessageTypeEnum::IMAGE->value, MessageTypeEnum::VIDEO->value, MessageTypeEnum::AUDIO->value, @@ -383,7 +383,7 @@ class SendWhatsappMessageAction extends Action ])) ->disk($this->mediaDisk ?? config('filament-evolution.media.disk', 'public')) ->directory(config('filament-evolution.media.directory', 'whatsapp-media')) - ->acceptedFileTypes(fn(Get $get): array => $this->getAcceptedFileTypes($get('type'))) + ->acceptedFileTypes(fn (Get $get): array => $this->getAcceptedFileTypes($get('type'))) ->maxSize(config('filament-evolution.media.max_size', 16384)) ->helperText(__('filament-evolution::action.media_helper')); } @@ -411,7 +411,7 @@ class SendWhatsappMessageAction extends Action { return TextInput::make('latitude') ->label(__('filament-evolution::action.latitude')) - ->required(fn(Get $get): bool => $get('type') === MessageTypeEnum::LOCATION->value) + ->required(fn (Get $get): bool => $get('type') === MessageTypeEnum::LOCATION->value) ->numeric() ->step(0.000001) ->placeholder('-23.5505'); @@ -421,7 +421,7 @@ class SendWhatsappMessageAction extends Action { return TextInput::make('longitude') ->label(__('filament-evolution::action.longitude')) - ->required(fn(Get $get): bool => $get('type') === MessageTypeEnum::LOCATION->value) + ->required(fn (Get $get): bool => $get('type') === MessageTypeEnum::LOCATION->value) ->numeric() ->step(0.000001) ->placeholder('-46.6333'); @@ -445,7 +445,7 @@ class SendWhatsappMessageAction extends Action { return TextInput::make('contact_name') ->label(__('filament-evolution::action.contact_name')) - ->required(fn(Get $get): bool => $get('type') === MessageTypeEnum::CONTACT->value) + ->required(fn (Get $get): bool => $get('type') === MessageTypeEnum::CONTACT->value) ->placeholder('John Doe'); } @@ -453,7 +453,7 @@ class SendWhatsappMessageAction extends Action { return TextInput::make('contact_number') ->label(__('filament-evolution::action.contact_number')) - ->required(fn(Get $get): bool => $get('type') === MessageTypeEnum::CONTACT->value) + ->required(fn (Get $get): bool => $get('type') === MessageTypeEnum::CONTACT->value) ->tel() ->placeholder('5511999999999'); } diff --git a/src/Data/InstanceData.php b/src/Data/InstanceData.php index f86e0a3..67b85bd 100644 --- a/src/Data/InstanceData.php +++ b/src/Data/InstanceData.php @@ -51,7 +51,7 @@ class InstanceData extends Data 'read_messages' => $this->readMessages, 'read_status' => $this->readStatus, 'sync_full_history' => $this->syncFullHistory, - ], fn($value) => $value !== null && $value !== false && $value !== ''); + ], fn ($value) => $value !== null && $value !== false && $value !== ''); if (! empty($settings)) { $payload = array_merge($payload, $settings); diff --git a/src/Filament/Resources/WhatsappInstanceResource.php b/src/Filament/Resources/WhatsappInstanceResource.php index e46a336..497dd8b 100644 --- a/src/Filament/Resources/WhatsappInstanceResource.php +++ b/src/Filament/Resources/WhatsappInstanceResource.php @@ -10,7 +10,6 @@ use Filament\Actions\DeleteBulkAction; use Filament\Actions\EditAction; use Filament\Actions\ViewAction; use Filament\Forms\Components\TextInput; -use Filament\Forms\Components\Toggle; use Filament\Forms\Components\ToggleButtons; use Filament\Resources\Resource; use Filament\Schemas\Components\Section; @@ -140,7 +139,7 @@ class WhatsappInstanceResource extends Resource TextInput::make('msg_call') ->label(__('filament-evolution::resource.fields.msg_call')) ->helperText(__('filament-evolution::resource.fields.msg_call_helper')) - ->hidden(fn($get) => $get('reject_call') == false) + ->hidden(fn ($get) => $get('reject_call') == false) ->maxLength(255) ->default(config('filament-evolution.instance.msg_call', '')) ->columnSpanFull(), @@ -160,7 +159,7 @@ class WhatsappInstanceResource extends Resource ->label('') ->alignCenter() ->circular() - ->defaultImageUrl(fn() => 'https://ui-avatars.com/api/?name=WA&color=7F9CF5&background=EBF4FF'), + ->defaultImageUrl(fn () => 'https://ui-avatars.com/api/?name=WA&color=7F9CF5&background=EBF4FF'), TextColumn::make('name') ->label(__('filament-evolution::resource.fields.name')) @@ -200,8 +199,8 @@ class WhatsappInstanceResource extends Resource ->label(__('filament-evolution::resource.actions.connect')) ->icon(Heroicon::QrCode) ->color('success') - ->action(fn($record, $livewire) => $livewire->openConnectModal((string) $record->id)) - ->hidden(fn($record): bool => $record->status === StatusConnectionEnum::OPEN), + ->action(fn ($record, $livewire) => $livewire->openConnectModal((string) $record->id)) + ->hidden(fn ($record): bool => $record->status === StatusConnectionEnum::OPEN), ViewAction::make(), EditAction::make(), ]) diff --git a/src/Filament/Resources/WhatsappInstanceResource/Pages/CreateWhatsappInstance.php b/src/Filament/Resources/WhatsappInstanceResource/Pages/CreateWhatsappInstance.php index 12f444e..8e7997f 100644 --- a/src/Filament/Resources/WhatsappInstanceResource/Pages/CreateWhatsappInstance.php +++ b/src/Filament/Resources/WhatsappInstanceResource/Pages/CreateWhatsappInstance.php @@ -51,7 +51,7 @@ class CreateWhatsappInstance extends CreateRecord Notification::make() ->warning() ->title(__('filament-evolution::resource.messages.created')) - ->body('Instance saved locally. API sync failed: ' . $e->getMessage()) + ->body('Instance saved locally. API sync failed: '.$e->getMessage()) ->send(); } } diff --git a/src/Filament/Resources/WhatsappInstanceResource/Pages/ViewWhatsappInstance.php b/src/Filament/Resources/WhatsappInstanceResource/Pages/ViewWhatsappInstance.php index 2f3e41d..ed062c7 100644 --- a/src/Filament/Resources/WhatsappInstanceResource/Pages/ViewWhatsappInstance.php +++ b/src/Filament/Resources/WhatsappInstanceResource/Pages/ViewWhatsappInstance.php @@ -4,7 +4,9 @@ declare(strict_types=1); namespace WallaceMartinss\FilamentEvolution\Filament\Resources\WhatsappInstanceResource\Pages; -use Filament\Actions\{Action, DeleteAction, EditAction}; +use Filament\Actions\Action; +use Filament\Actions\DeleteAction; +use Filament\Actions\EditAction; use Filament\Notifications\Notification; use Filament\Resources\Pages\ViewRecord; use Filament\Support\Icons\Heroicon; @@ -24,9 +26,9 @@ class ViewWhatsappInstance extends ViewRecord ->label(__('filament-evolution::resource.actions.connect')) ->icon(Heroicon::QrCode) ->color('success') - ->visible(fn() => $this->record->status !== StatusConnectionEnum::OPEN) + ->visible(fn () => $this->record->status !== StatusConnectionEnum::OPEN) ->modalHeading(__('filament-evolution::resource.actions.view_qrcode')) - ->modalContent(fn() => view('filament-evolution::components.qr-code-modal', [ + ->modalContent(fn () => view('filament-evolution::components.qr-code-modal', [ 'instance' => $this->record, ])) ->modalWidth('md') @@ -37,7 +39,7 @@ class ViewWhatsappInstance extends ViewRecord ->label(__('filament-evolution::resource.actions.disconnect')) ->icon(Heroicon::XCircle) ->color('danger') - ->visible(fn() => $this->record->status === StatusConnectionEnum::OPEN) + ->visible(fn () => $this->record->status === StatusConnectionEnum::OPEN) ->requiresConfirmation() ->action(function () { try { @@ -89,7 +91,7 @@ class ViewWhatsappInstance extends ViewRecord } // Extract profile picture URL from fetchInstance response - $instanceData = is_array($instances) ? ($instances[0] ?? $instances) : $instances; + $instanceData = is_array($instances) ? ($instances[0] ?? $instances) : $instances; $profilePictureUrl = $instanceData['profilePicUrl'] ?? $instanceData['instance']['profilePicUrl'] ?? null; @@ -98,20 +100,20 @@ class ViewWhatsappInstance extends ViewRecord $state = $client->getConnectionState($this->record->name); $connectionState = $state['state'] ?? $state['instance']['state'] ?? 'close'; - $status = match (strtolower($connectionState)) { + $status = match (strtolower($connectionState)) { 'open', 'connected' => StatusConnectionEnum::OPEN, 'connecting' => StatusConnectionEnum::CONNECTING, - default => StatusConnectionEnum::CLOSE, + default => StatusConnectionEnum::CLOSE, }; $this->record->update([ - 'status' => $status, + 'status' => $status, 'profile_picture_url' => $profilePictureUrl, ]); Notification::make() ->success() - ->title(__('filament-evolution::resource.fields.status') . ': ' . $status->getLabel()) + ->title(__('filament-evolution::resource.fields.status').': '.$status->getLabel()) ->send(); } catch (EvolutionApiException $e) { // If 404, instance doesn't exist - try to create it diff --git a/src/Filament/Resources/WhatsappMessageResource.php b/src/Filament/Resources/WhatsappMessageResource.php index be7a229..32f9270 100644 --- a/src/Filament/Resources/WhatsappMessageResource.php +++ b/src/Filament/Resources/WhatsappMessageResource.php @@ -10,7 +10,9 @@ use Filament\Support\Icons\Heroicon; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Filters\SelectFilter; use Filament\Tables\Table; -use WallaceMartinss\FilamentEvolution\Enums\{MessageDirectionEnum, MessageStatusEnum, MessageTypeEnum}; +use WallaceMartinss\FilamentEvolution\Enums\MessageDirectionEnum; +use WallaceMartinss\FilamentEvolution\Enums\MessageStatusEnum; +use WallaceMartinss\FilamentEvolution\Enums\MessageTypeEnum; use WallaceMartinss\FilamentEvolution\Filament\Resources\WhatsappMessageResource\Pages; use WallaceMartinss\FilamentEvolution\Models\WhatsappMessage; @@ -95,7 +97,7 @@ class WhatsappMessageResource extends Resource TextColumn::make('content.text') ->label(__('filament-evolution::message.fields.content')) ->limit(50) - ->tooltip(fn($state) => $state) + ->tooltip(fn ($state) => $state) ->searchable(query: function ($query, string $search) { return $query->whereRaw("JSON_UNQUOTE(JSON_EXTRACT(content, '$.text')) LIKE ?", ["%{$search}%"]); }), @@ -136,7 +138,7 @@ class WhatsappMessageResource extends Resource { return [ 'index' => Pages\ListWhatsappMessages::route('/'), - 'view' => Pages\ViewWhatsappMessage::route('/{record}'), + 'view' => Pages\ViewWhatsappMessage::route('/{record}'), ]; } } diff --git a/src/Filament/Resources/WhatsappMessageResource/Pages/ViewWhatsappMessage.php b/src/Filament/Resources/WhatsappMessageResource/Pages/ViewWhatsappMessage.php index 944b2d9..4ef2764 100644 --- a/src/Filament/Resources/WhatsappMessageResource/Pages/ViewWhatsappMessage.php +++ b/src/Filament/Resources/WhatsappMessageResource/Pages/ViewWhatsappMessage.php @@ -57,27 +57,27 @@ class ViewWhatsappMessage extends ViewRecord TextEntry::make('content.media_caption') ->label(__('filament-evolution::message.fields.media_caption')) ->columnSpanFull() - ->visible(fn($record) => !empty($record->content['media_caption'])), + ->visible(fn ($record) => ! empty($record->content['media_caption'])), TextEntry::make('content.media_url') ->label(__('filament-evolution::message.fields.media_url')) ->columnSpanFull() - ->url(fn($state) => $state) - ->visible(fn($record) => !empty($record->content['media_url'])), + ->url(fn ($state) => $state) + ->visible(fn ($record) => ! empty($record->content['media_url'])), TextEntry::make('location') ->label(__('filament-evolution::message.fields.location')) - ->state(fn($record) => $record->content['latitude'] && $record->content['longitude'] + ->state(fn ($record) => $record->content['latitude'] && $record->content['longitude'] ? "Lat: {$record->content['latitude']}, Lng: {$record->content['longitude']}" : null) - ->visible(fn($record) => !empty($record->content['latitude']) && !empty($record->content['longitude'])), + ->visible(fn ($record) => ! empty($record->content['latitude']) && ! empty($record->content['longitude'])), TextEntry::make('media') ->label(__('filament-evolution::message.fields.media')) ->columnSpanFull() - ->state(fn($record) => $this->formatPayloadAsHtml($record->media)) + ->state(fn ($record) => $this->formatPayloadAsHtml($record->media)) ->html() - ->visible(fn($record) => !empty($record->media)), + ->visible(fn ($record) => ! empty($record->media)), ]), Section::make(__('filament-evolution::message.sections.timestamps')) @@ -104,10 +104,10 @@ class ViewWhatsappMessage extends ViewRecord ->schema([ TextEntry::make('raw_payload_display') ->hiddenLabel() - ->state(fn($record) => $this->formatPayloadAsHtml($record->raw_payload)) + ->state(fn ($record) => $this->formatPayloadAsHtml($record->raw_payload)) ->html() ->copyable() - ->copyableState(fn($record) => $this->formatPayloadAsText($record->raw_payload)) + ->copyableState(fn ($record) => $this->formatPayloadAsText($record->raw_payload)) ->copyMessage('Payload copiado!') ->copyMessageDuration(1500), ]) @@ -152,7 +152,7 @@ class ViewWhatsappMessage extends ViewRecord // Colore null $highlighted = preg_replace('/:\s*(null)/', ': $1', $highlighted); - return '
' . $highlighted . '
'; + return '
'.$highlighted.'
'; } protected function formatPayloadAsText(mixed $payload): string diff --git a/src/Filament/Resources/WhatsappWebhookResource.php b/src/Filament/Resources/WhatsappWebhookResource.php index 5dbc0a6..c6f9974 100644 --- a/src/Filament/Resources/WhatsappWebhookResource.php +++ b/src/Filament/Resources/WhatsappWebhookResource.php @@ -119,8 +119,8 @@ class WhatsappWebhookResource extends Resource TernaryFilter::make('has_error') ->label(__('filament-evolution::webhook.fields.has_error')) ->queries( - true: fn($query) => $query->whereNotNull('error'), - false: fn($query) => $query->whereNull('error'), + true: fn ($query) => $query->whereNotNull('error'), + false: fn ($query) => $query->whereNull('error'), ), ]); } diff --git a/src/Filament/Resources/WhatsappWebhookResource/Pages/ViewWhatsappWebhook.php b/src/Filament/Resources/WhatsappWebhookResource/Pages/ViewWhatsappWebhook.php index 2a82b78..176ead6 100644 --- a/src/Filament/Resources/WhatsappWebhookResource/Pages/ViewWhatsappWebhook.php +++ b/src/Filament/Resources/WhatsappWebhookResource/Pages/ViewWhatsappWebhook.php @@ -32,8 +32,8 @@ class ViewWhatsappWebhook extends ViewRecord TextEntry::make('processed') ->label(__('filament-evolution::webhook.fields.processed')) ->badge() - ->formatStateUsing(fn($state) => $state ? __('filament-evolution::webhook.status.yes') : __('filament-evolution::webhook.status.no')) - ->color(fn($state) => $state ? 'success' : 'warning'), + ->formatStateUsing(fn ($state) => $state ? __('filament-evolution::webhook.status.yes') : __('filament-evolution::webhook.status.no')) + ->color(fn ($state) => $state ? 'success' : 'warning'), TextEntry::make('processing_time_ms') ->label(__('filament-evolution::webhook.fields.processing_time')) @@ -58,16 +58,16 @@ class ViewWhatsappWebhook extends ViewRecord ->prose() ->color('danger'), ]) - ->visible(fn($record) => ! empty($record->error)), + ->visible(fn ($record) => ! empty($record->error)), Section::make(__('filament-evolution::webhook.sections.payload')) ->schema([ TextEntry::make('payload_display') ->hiddenLabel() - ->state(fn($record) => $this->formatPayloadAsHtml($record->payload)) + ->state(fn ($record) => $this->formatPayloadAsHtml($record->payload)) ->html() ->copyable() - ->copyableState(fn($record) => $this->formatPayloadAsText($record->payload)) + ->copyableState(fn ($record) => $this->formatPayloadAsText($record->payload)) ->copyMessage('Payload copiado!') ->copyMessageDuration(1500), ]) @@ -111,7 +111,7 @@ class ViewWhatsappWebhook extends ViewRecord // Colore null $highlighted = preg_replace('/:\s*(null)/', ': $1', $highlighted); - return '
' . $highlighted . '
'; + return '
'.$highlighted.'
'; } protected function formatPayloadAsText(mixed $payload): string diff --git a/src/Jobs/ProcessWebhookJob.php b/src/Jobs/ProcessWebhookJob.php index 66cf1b1..52070a3 100644 --- a/src/Jobs/ProcessWebhookJob.php +++ b/src/Jobs/ProcessWebhookJob.php @@ -7,12 +7,19 @@ namespace WallaceMartinss\FilamentEvolution\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; -use Illuminate\Queue\{InteractsWithQueue, SerializesModels}; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Log; -use WallaceMartinss\FilamentEvolution\Data\Webhooks\{ConnectionUpdateData, MessageUpsertData, QrCodeUpdatedData}; +use WallaceMartinss\FilamentEvolution\Data\Webhooks\ConnectionUpdateData; +use WallaceMartinss\FilamentEvolution\Data\Webhooks\MessageUpsertData; +use WallaceMartinss\FilamentEvolution\Data\Webhooks\QrCodeUpdatedData; use WallaceMartinss\FilamentEvolution\Enums\WebhookEventEnum; -use WallaceMartinss\FilamentEvolution\Events\{InstanceConnected, InstanceDisconnected, MessageReceived, QrCodeUpdated}; -use WallaceMartinss\FilamentEvolution\Models\{WhatsappInstance, WhatsappWebhook}; +use WallaceMartinss\FilamentEvolution\Events\InstanceConnected; +use WallaceMartinss\FilamentEvolution\Events\InstanceDisconnected; +use WallaceMartinss\FilamentEvolution\Events\MessageReceived; +use WallaceMartinss\FilamentEvolution\Events\QrCodeUpdated; +use WallaceMartinss\FilamentEvolution\Models\WhatsappInstance; +use WallaceMartinss\FilamentEvolution\Models\WhatsappWebhook; class ProcessWebhookJob implements ShouldQueue { @@ -38,7 +45,7 @@ class ProcessWebhookJob implements ShouldQueue try { $instanceName = $this->payload['instance'] ?? $this->payload['instanceName'] ?? null; - if (!$instanceName) { + if (! $instanceName) { $this->markWebhookFailed('No instance name in payload'); return; @@ -46,7 +53,7 @@ class ProcessWebhookJob implements ShouldQueue $instance = WhatsappInstance::where('name', $instanceName)->first(); - if (!$instance) { + if (! $instance) { $this->markWebhookFailed("Instance not found: {$instanceName}"); return; @@ -60,8 +67,8 @@ class ProcessWebhookJob implements ShouldQueue if (config('filament-evolution.logging.webhook_errors', true)) { Log::channel(config('filament-evolution.logging.channel', 'stack')) ->error('Webhook processing failed', [ - 'event' => $this->event, - 'error' => $e->getMessage(), + 'event' => $this->event, + 'error' => $e->getMessage(), 'payload' => $this->payload, ]); } @@ -76,10 +83,10 @@ class ProcessWebhookJob implements ShouldQueue match ($eventEnum) { WebhookEventEnum::CONNECTION_UPDATE => $this->handleConnectionUpdate($instance), - WebhookEventEnum::QRCODE_UPDATED => $this->handleQrCodeUpdated($instance), - WebhookEventEnum::MESSAGES_UPSERT => $this->handleMessageUpsert($instance), - WebhookEventEnum::MESSAGES_UPDATE => $this->handleMessageUpdate($instance), - default => $this->handleUnknownEvent($instance), + WebhookEventEnum::QRCODE_UPDATED => $this->handleQrCodeUpdated($instance), + WebhookEventEnum::MESSAGES_UPSERT => $this->handleMessageUpsert($instance), + WebhookEventEnum::MESSAGES_UPDATE => $this->handleMessageUpdate($instance), + default => $this->handleUnknownEvent($instance), }; } @@ -103,8 +110,8 @@ class ProcessWebhookJob implements ShouldQueue $data = QrCodeUpdatedData::fromWebhook($this->payload); $instance->update([ - 'qr_code' => $data->base64, - 'pairing_code' => $data->pairingCode, + 'qr_code' => $data->base64, + 'pairing_code' => $data->pairingCode, 'qr_code_updated_at' => now(), ]); @@ -126,23 +133,23 @@ class ProcessWebhookJob implements ShouldQueue if (config('filament-evolution.storage.messages', true)) { // Extract remoteJid from payload $messageData = $this->payload['data'] ?? $this->payload; - $key = $messageData['key'] ?? []; - $remoteJid = $key['remoteJid'] ?? $data->message->phone; + $key = $messageData['key'] ?? []; + $remoteJid = $key['remoteJid'] ?? $data->message->phone; $instance->messages()->create([ 'message_id' => $data->message->messageId, 'remote_jid' => $remoteJid, - 'phone' => $data->message->phone, - 'direction' => $data->message->direction, - 'type' => $data->message->type, - 'content' => [ - 'text' => $data->message->text, - 'media_url' => $data->message->mediaUrl, + 'phone' => $data->message->phone, + 'direction' => $data->message->direction, + 'type' => $data->message->type, + 'content' => [ + 'text' => $data->message->text, + 'media_url' => $data->message->mediaUrl, 'media_caption' => $data->message->mediaCaption, - 'latitude' => $data->message->latitude, - 'longitude' => $data->message->longitude, + 'latitude' => $data->message->latitude, + 'longitude' => $data->message->longitude, ], - 'status' => $data->message->status, + 'status' => $data->message->status, 'raw_payload' => $this->payload, ]); } @@ -153,13 +160,13 @@ class ProcessWebhookJob implements ShouldQueue protected function handleMessageUpdate(WhatsappInstance $instance): void { // Only update if message storage is enabled - if (!config('filament-evolution.storage.messages', true)) { + if (! config('filament-evolution.storage.messages', true)) { return; } $messageData = $this->payload['data'] ?? $this->payload; - $key = $messageData['key'] ?? []; - $update = $messageData['update'] ?? []; + $key = $messageData['key'] ?? []; + $update = $messageData['update'] ?? []; if (isset($key['id']) && isset($update['status'])) { $instance->messages() @@ -175,7 +182,7 @@ class ProcessWebhookJob implements ShouldQueue if (config('filament-evolution.logging.webhook_events', false)) { Log::channel(config('filament-evolution.logging.channel', 'stack')) ->info('Unknown webhook event received', [ - 'event' => $this->event, + 'event' => $this->event, 'instance' => $instance->name, ]); } diff --git a/src/Models/WhatsappMessage.php b/src/Models/WhatsappMessage.php index 11d3ce6..c32b3b0 100644 --- a/src/Models/WhatsappMessage.php +++ b/src/Models/WhatsappMessage.php @@ -8,7 +8,9 @@ use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; -use WallaceMartinss\FilamentEvolution\Enums\{MessageDirectionEnum, MessageStatusEnum, MessageTypeEnum}; +use WallaceMartinss\FilamentEvolution\Enums\MessageDirectionEnum; +use WallaceMartinss\FilamentEvolution\Enums\MessageStatusEnum; +use WallaceMartinss\FilamentEvolution\Enums\MessageTypeEnum; use WallaceMartinss\FilamentEvolution\Models\Concerns\HasTenant; class WhatsappMessage extends Model @@ -38,15 +40,15 @@ class WhatsappMessage extends Model protected function casts(): array { return [ - 'direction' => MessageDirectionEnum::class, - 'type' => MessageTypeEnum::class, - 'status' => MessageStatusEnum::class, - 'content' => 'array', - 'media' => 'array', - 'raw_payload' => 'array', - 'sent_at' => 'datetime', + 'direction' => MessageDirectionEnum::class, + 'type' => MessageTypeEnum::class, + 'status' => MessageStatusEnum::class, + 'content' => 'array', + 'media' => 'array', + 'raw_payload' => 'array', + 'sent_at' => 'datetime', 'delivered_at' => 'datetime', - 'read_at' => 'datetime', + 'read_at' => 'datetime', ]; } @@ -93,7 +95,7 @@ class WhatsappMessage extends Model public function markAsSent(): void { $this->update([ - 'status' => MessageStatusEnum::SENT, + 'status' => MessageStatusEnum::SENT, 'sent_at' => now(), ]); } @@ -101,7 +103,7 @@ class WhatsappMessage extends Model public function markAsDelivered(): void { $this->update([ - 'status' => MessageStatusEnum::DELIVERED, + 'status' => MessageStatusEnum::DELIVERED, 'delivered_at' => now(), ]); } @@ -109,7 +111,7 @@ class WhatsappMessage extends Model public function markAsRead(): void { $this->update([ - 'status' => MessageStatusEnum::READ, + 'status' => MessageStatusEnum::READ, 'read_at' => now(), ]); } diff --git a/src/Services/WhatsappService.php b/src/Services/WhatsappService.php index 99a5235..a9e735b 100644 --- a/src/Services/WhatsappService.php +++ b/src/Services/WhatsappService.php @@ -47,7 +47,7 @@ class WhatsappService // If Brazilian number without country code, add it if (strlen($number) === 10 || strlen($number) === 11) { - $number = '55' . $number; + $number = '55'.$number; } return $number;