diff --git a/app/Domains/Ticket/Controllers/Scanner/TicketController.php b/app/Domains/Ticket/Controllers/Scanner/TicketController.php index 17640aa..d079cd7 100644 --- a/app/Domains/Ticket/Controllers/Scanner/TicketController.php +++ b/app/Domains/Ticket/Controllers/Scanner/TicketController.php @@ -3,10 +3,13 @@ namespace App\Domains\Ticket\Controllers\Scanner; use App\Domains\Auth\Models\User; +use App\Domains\Ticket\Resources\Scanner\ScannerScanResultResource; use App\Domains\Ticket\Resources\TicketResource; use App\Domains\Ticket\Services\ScannerTicketService; use App\Http\Controllers\Controller; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Symfony\Component\HttpFoundation\Response; class TicketController extends Controller { @@ -22,13 +25,13 @@ class TicketController extends Controller ); } - public function scan(Request $request): TicketResource + public function scan(Request $request): JsonResponse { /** @var User $scanner */ $scanner = $request->user(); - return TicketResource::make( + return ScannerScanResultResource::make( $this->ticketService->scan($scanner, $request->input('data')) - ); + )->response()->setStatusCode(Response::HTTP_OK); } } diff --git a/app/Domains/Ticket/Resources/Scanner/ScanAttemptResource.php b/app/Domains/Ticket/Resources/Scanner/ScanAttemptResource.php index 97226de..13cdffe 100644 --- a/app/Domains/Ticket/Resources/Scanner/ScanAttemptResource.php +++ b/app/Domains/Ticket/Resources/Scanner/ScanAttemptResource.php @@ -16,8 +16,10 @@ class ScanAttemptResource extends JsonResource return [ 'id' => $this->id, 'data' => $this->data, + 'ticket_id' => $this->ticket_id, 'ticket' => $this->ticket?->ticket, 'attempted_at' => $this->created_at, + 'resolved_at' => $this->resolved_at, 'result' => $this->result->value, 'can_view_ticket' => $this->ticket !== null && $this->result !== ScanAttemptResult::CategoryForbidden, diff --git a/app/Domains/Ticket/Resources/Scanner/ScannerScanResultResource.php b/app/Domains/Ticket/Resources/Scanner/ScannerScanResultResource.php new file mode 100644 index 0000000..1b38a88 --- /dev/null +++ b/app/Domains/Ticket/Resources/Scanner/ScannerScanResultResource.php @@ -0,0 +1,28 @@ + */ + public function toArray(Request $request): array + { + $ticket = $this->ticket; + $client = $ticket?->user; + + return [ + 'scan_attempt' => ScanAttemptResource::make($this->resource), + 'ticket' => $ticket === null ? null : TicketResource::make($ticket), + 'client' => $client === null ? null : [ + 'id' => $client->id, + 'nombre_apellido' => $client->nombre_apellido, + ], + ]; + } +} diff --git a/app/Domains/Ticket/Services/ScannerTicketService.php b/app/Domains/Ticket/Services/ScannerTicketService.php index c1324c7..336ebed 100644 --- a/app/Domains/Ticket/Services/ScannerTicketService.php +++ b/app/Domains/Ticket/Services/ScannerTicketService.php @@ -98,7 +98,7 @@ class ScannerTicketService return $query->firstOrFail(); } - public function scan(User $scanner, mixed $scannedData): Ticket + public function scan(User $scanner, mixed $scannedData): ScanAttempt { $scanAttempt = ScanAttempt::query()->create([ 'tenant_code' => $scanner->tenant_codigo, @@ -125,7 +125,7 @@ class ScannerTicketService $scanAttempt, &$ticketId, &$failureResult, - ): Ticket { + ): ScanAttempt { $ticket = $this->baseQuery() ->where('tenant_code', $scanner->tenant_codigo) ->where('ticket', $scannedData) @@ -172,7 +172,9 @@ class ScannerTicketService $ticketId, ); - return $ticket->refresh()->load($this->relations()); + $ticket = $ticket->refresh()->load($this->relations()); + + return $scanAttempt->refresh()->setRelation('ticket', $ticket); }); } catch (Throwable $exception) { $result = $exception instanceof ModelNotFoundException diff --git a/tests/Feature/Ticket/ScannerTicketControllerTest.php b/tests/Feature/Ticket/ScannerTicketControllerTest.php index 3e2b138..e208b58 100644 --- a/tests/Feature/Ticket/ScannerTicketControllerTest.php +++ b/tests/Feature/Ticket/ScannerTicketControllerTest.php @@ -87,7 +87,9 @@ class ScannerTicketControllerTest extends TestCase ->assertJsonCount(2, 'data') ->assertJsonPath('data.0.id', $newer->id) ->assertJsonPath('data.0.data', $newer->data) + ->assertJsonPath('data.0.ticket_id', $newerTicket->id) ->assertJsonPath('data.0.ticket', $newerTicket->ticket) + ->assertJsonPath('data.0.resolved_at', $newer->resolved_at->toJSON()) ->assertJsonPath('data.0.result', ScanAttemptResult::Accepted->value) ->assertJsonPath('data.0.can_view_ticket', true) ->assertJsonPath('data.1.id', $older->id) @@ -194,10 +196,17 @@ class ScannerTicketControllerTest extends TestCase $this->postJson('/api/v1/scanner/tickets/scan', ['data' => $ticket->ticket]) ->assertOk() - ->assertJsonPath('data.ticket', $ticket->ticket) - ->assertJsonPath('data.scanner_user_id', $this->scanner->id) - ->assertJsonPath('data.is_valid', false) - ->assertJsonPath('data.is_used', true); + ->assertJsonPath('data.scan_attempt.data', $ticket->ticket) + ->assertJsonPath('data.scan_attempt.ticket_id', $ticket->id) + ->assertJsonPath('data.scan_attempt.ticket', $ticket->ticket) + ->assertJsonPath('data.scan_attempt.result', ScanAttemptResult::Accepted->value) + ->assertJsonPath('data.ticket.ticket', $ticket->ticket) + ->assertJsonPath('data.ticket.scanner_user_id', $this->scanner->id) + ->assertJsonPath('data.ticket.is_valid', false) + ->assertJsonPath('data.ticket.is_used', true) + ->assertJsonPath('data.ticket.client', $this->ticketOwner->nombre_apellido) + ->assertJsonPath('data.client.id', $this->ticketOwner->id) + ->assertJsonPath('data.client.nombre_apellido', $this->ticketOwner->nombre_apellido); $this->assertDatabaseHas('tickets', [ 'id' => $ticket->id, @@ -308,7 +317,7 @@ class ScannerTicketControllerTest extends TestCase $this->postJson('/api/v1/scanner/tickets/scan', ['data' => $ticket->ticket]) ->assertOk() - ->assertJsonPath('data.scanner_user_id', $this->scanner->id); + ->assertJsonPath('data.ticket.scanner_user_id', $this->scanner->id); } public function test_disabled_category_validation_does_not_allow_scanning_another_tenant(): void