Jenkins file
Laverie/backend/pipeline/head There was a failure building this commit

This commit is contained in:
bastien
2026-07-04 22:42:58 +02:00
parent 10ee859602
commit d95bfa6c58
244 changed files with 16 additions and 15 deletions
@@ -0,0 +1,134 @@
<?php
namespace App\Http\Controllers\Api\V1;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Concerns\RespondsWithJson;
use App\Http\Resources\MachineResource;
use App\Models\Booking;
use App\Models\Machine;
use App\Services\PricingService;
use App\Support\WashCycleProgress;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class MachineController extends Controller
{
use RespondsWithJson;
public function __construct(
private readonly PricingService $pricingService,
) {}
public function show(string $uuid): JsonResponse
{
$machine = Machine::query()
->where('uuid', $uuid)
->with('establishment')
->firstOrFail();
return $this->success([
'machine' => new MachineResource($machine),
'pricing' => [
'price' => $this->pricingService->getActivePrice($machine),
'currency' => 'EUR',
],
'estimated_duration_minutes' => WashCycleProgress::estimateDurationMinutes($machine->type),
]);
}
public function lookup(Request $request): JsonResponse
{
$request->validate([
'qr_code' => ['required_without:machine_uuid', 'nullable', 'string', 'max:255'],
'machine_uuid' => ['required_without:qr_code', 'nullable', 'uuid'],
]);
$machine = $request->filled('machine_uuid')
? Machine::query()->where('uuid', $request->string('machine_uuid')->toString())->firstOrFail()
: Machine::query()->where('qr_code', $request->string('qr_code')->toString())->firstOrFail();
$machine->load('establishment');
return $this->success([
'machine' => new MachineResource($machine),
'pricing' => [
'price' => $this->pricingService->getActivePrice($machine),
'currency' => 'EUR',
],
'estimated_duration_minutes' => WashCycleProgress::estimateDurationMinutes($machine->type),
]);
}
public function availability(Request $request, string $uuid): JsonResponse
{
$machine = Machine::query()
->where('uuid', $uuid)
->with('establishment')
->firstOrFail();
$date = $request->filled('date')
? Carbon::parse($request->string('date')->toString())->startOfDay()
: now()->startOfDay();
$slotDuration = $request->integer('slot_minutes', 60);
$dayStart = $date->copy()->setTime(7, 0);
$dayEnd = $date->copy()->setTime(22, 0);
$bookings = Booking::query()
->where('machine_id', $machine->id)
->whereIn('status', ['pending', 'confirmed', 'active'])
->where('slot_start', '<', $dayEnd)
->where('slot_end', '>', $dayStart)
->get(['slot_start', 'slot_end']);
$slots = [];
$cursor = $dayStart->copy();
while ($cursor->copy()->addMinutes($slotDuration)->lte($dayEnd)) {
$slotEnd = $cursor->copy()->addMinutes($slotDuration);
$isAvailable = $cursor->isFuture() && ! in_array($machine->status, ['offline', 'maintenance', 'out_of_order'], true);
if ($isAvailable) {
foreach ($bookings as $booking) {
if ($booking->slot_start < $slotEnd && $booking->slot_end > $cursor) {
$isAvailable = false;
break;
}
}
}
if ($isAvailable) {
$slots[] = [
'start' => $cursor->toIso8601String(),
'end' => $slotEnd->toIso8601String(),
];
}
$cursor->addMinutes($slotDuration);
}
return $this->success([
'machine_uuid' => $machine->uuid,
'date' => $date->toDateString(),
'slots' => $slots,
]);
}
public function pricing(string $uuid): JsonResponse
{
$machine = Machine::query()
->where('uuid', $uuid)
->with('establishment')
->firstOrFail();
$price = $this->pricingService->getActivePrice($machine);
return $this->success([
'machine_uuid' => $machine->uuid,
'price' => $price,
'currency' => 'EUR',
]);
}
}