homo #8

Merged
ncoronel merged 79 commits from homo into main 2026-09-17 17:52:21 +00:00
17 changed files with 455 additions and 148 deletions
Showing only changes of commit 34058e6a81 - Show all commits

View File

@@ -1249,7 +1249,7 @@
"name": "Ticket",
"item": [
{
"name": "List Ticket",
"name": "List Scan Attempt",
"request": {
"method": "GET",
"header": [
@@ -5998,9 +5998,9 @@
"type": "text"
}
],
"description": "Ruta Laravel: `GET /api/v1/scanner/tickets`\n\nControlador: `App\\Domains\\Ticket\\Controllers\\Scanner\\TicketController@index`\n\nRequiere autenticación Sanctum.",
"description": "Ruta Laravel: `GET /api/v1/scanner/attempts`\n\nControlador: `App\\Domains\\Ticket\\Controllers\\Scanner\\ScanAttemptController`\n\nRequiere autenticación Sanctum.",
"url": {
"raw": "{{base_url}}/api/v1/scanner/tickets?page=1&per_page=20",
"raw": "{{base_url}}/api/v1/scanner/attempts?page=1&per_page=20",
"host": [
"{{base_url}}"
],
@@ -6008,7 +6008,7 @@
"api",
"v1",
"scanner",
"tickets"
"attempts"
],
"query": [
{

View File

@@ -0,0 +1,25 @@
<?php
namespace App\Domains\Ticket\Controllers\Scanner;
use App\Domains\Auth\Models\User;
use App\Domains\Ticket\Requests\ScanAttemptIndexRequest;
use App\Domains\Ticket\Resources\Scanner\ScanAttemptResource;
use App\Domains\Ticket\Services\ScannerTicketService;
use App\Http\Controllers\Controller;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
class ScanAttemptController extends Controller
{
public function __construct(private readonly ScannerTicketService $ticketService) {}
public function __invoke(ScanAttemptIndexRequest $request): AnonymousResourceCollection
{
/** @var User $scanner */
$scanner = $request->user();
return ScanAttemptResource::collection(
$this->ticketService->attemptsBy($scanner, $request->validated())
);
}
}

View File

@@ -3,28 +3,15 @@
namespace App\Domains\Ticket\Controllers\Scanner;
use App\Domains\Auth\Models\User;
use App\Domains\Ticket\Requests\ScanAttemptIndexRequest;
use App\Domains\Ticket\Resources\Scanner\ScanAttemptResource;
use App\Domains\Ticket\Resources\TicketResource;
use App\Domains\Ticket\Services\ScannerTicketService;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
class TicketController extends Controller
{
public function __construct(private readonly ScannerTicketService $ticketService) {}
public function index(ScanAttemptIndexRequest $request): AnonymousResourceCollection
{
/** @var User $scanner */
$scanner = $request->user();
return ScanAttemptResource::collection(
$this->ticketService->attemptsBy($scanner, $request->validated())
);
}
public function show(Request $request, string $ticketUuid): TicketResource
{
/** @var User $scanner */

View File

@@ -1,13 +1,16 @@
<?php
use App\Domains\Ticket\Controllers\Scanner\ScanAttemptController;
use App\Domains\Ticket\Controllers\Scanner\TicketController;
use Illuminate\Support\Facades\Route;
Route::prefix('v1/scanner/tickets')
->middleware(['auth:sanctum', 'scanner.tenant'])
Route::middleware(['auth:sanctum', 'scanner.tenant'])
->group(function (): void {
Route::get('/', [TicketController::class, 'index']);
Route::post('scan', [TicketController::class, 'scan']);
Route::get('{ticketUuid}', [TicketController::class, 'show'])
->whereUuid('ticketUuid');
Route::get('v1/scanner/attempts', ScanAttemptController::class);
Route::prefix('v1/scanner/tickets')->group(function (): void {
Route::post('scan', [TicketController::class, 'scan']);
Route::get('{ticketUuid}', [TicketController::class, 'show'])
->whereUuid('ticketUuid');
});
});

View File

@@ -202,7 +202,7 @@ function queryFor(string $uri): array
['key' => 'page', 'value' => '1'],
['key' => 'per_page', 'value' => '20'],
],
'api/v1/scanner/tickets' => [['key' => 'q', 'value' => '', 'disabled' => true], ['key' => 'page', 'value' => '1'], ['key' => 'per_page', 'value' => '20']],
'api/v1/scanner/attempts' => [['key' => 'q', 'value' => '', 'disabled' => true], ['key' => 'page', 'value' => '1'], ['key' => 'per_page', 'value' => '20']],
'api/storage-test/s3/temporary-url' => [['key' => 'path', 'value' => '{{s3_path}}'], ['key' => 'expires_in_minutes', 'value' => '60']],
default => [],
};

View File

@@ -52,14 +52,14 @@ class ScannerTicketControllerTest extends TestCase
public function test_scanner_routes_require_authentication_and_scan_permission(): void
{
$this->getJson('/api/v1/scanner/tickets')->assertUnauthorized();
$this->getJson('/api/v1/scanner/attempts')->assertUnauthorized();
Sanctum::actingAs(User::factory()->create([
'rol_codigo' => RoleCode::User->value,
'tenant_codigo' => $this->tenant->codigo,
]));
$this->getJson('/api/v1/scanner/tickets')->assertForbidden();
$this->getJson('/api/v1/scanner/attempts')->assertForbidden();
}
public function test_scanner_can_list_only_its_scan_attempts(): void
@@ -82,7 +82,7 @@ class ScannerTicketControllerTest extends TestCase
Sanctum::actingAs($this->scanner);
$this->getJson('/api/v1/scanner/tickets')
$this->getJson('/api/v1/scanner/attempts')
->assertOk()
->assertJsonCount(2, 'data')
->assertJsonPath('data.0.id', $newer->id)
@@ -102,7 +102,7 @@ class ScannerTicketControllerTest extends TestCase
Sanctum::actingAs($this->scanner);
$this->getJson('/api/v1/scanner/tickets?q=aaaaaaaa&per_page=1')
$this->getJson('/api/v1/scanner/attempts?q=aaaaaaaa&per_page=1')
->assertOk()
->assertJsonCount(1, 'data')
->assertJsonPath('data.0.data', $matching->data)
@@ -118,7 +118,7 @@ class ScannerTicketControllerTest extends TestCase
Sanctum::actingAs($this->scanner);
$this->getJson("/api/v1/scanner/tickets?q={$matching->id}")
$this->getJson("/api/v1/scanner/attempts?q={$matching->id}")
->assertOk()
->assertJsonCount(1, 'data')
->assertJsonPath('data.0.id', $matching->id);
@@ -135,7 +135,7 @@ class ScannerTicketControllerTest extends TestCase
Sanctum::actingAs($this->scanner);
$this->getJson('/api/v1/scanner/tickets?q=11%2F08%2F26')
$this->getJson('/api/v1/scanner/attempts?q=11%2F08%2F26')
->assertOk()
->assertJsonCount(1, 'data')
->assertJsonPath('data.0.id', $matching->id);
@@ -350,7 +350,7 @@ class ScannerTicketControllerTest extends TestCase
$ticket = $this->createTicket((string) Str::uuid());
Sanctum::actingAs($admin);
$this->getJson('/api/v1/scanner/tickets')->assertForbidden();
$this->getJson('/api/v1/scanner/attempts')->assertForbidden();
$this->getJson("/api/v1/scanner/tickets/{$ticket->ticket}")->assertForbidden();
$this->postJson('/api/v1/scanner/tickets/scan', ['data' => $ticket->ticket])->assertForbidden();
$this->assertNull($ticket->fresh()->used_at);