Files
api/services/nginx/app/routes/machineButtonPressRoute.php
T

80 lines
2.8 KiB
PHP

<?php
namespace routes;
use classes\authentication;
use classes\selfserve;
use modules\selfserve\classes\selfserve_wash_flow;
use objects\department_lanes_o;
use objects\logs_o;
use objects\plate_scanners_o;
use traits\route_t;
class machineButtonPressRoute
{
use route_t;
public function run(): void
{
$handler = function () {
global $response;
self::requirePlateScannerAuth();
$plate_scanner = (new authentication())->get_plate_scanner();
if (!$plate_scanner) {
$response->error('Invalid plate scanner session', 403);
}
$lane_id = $this->resolveLaneId($plate_scanner);
$reg = self::isParametersSet(['reg']) ? selfserve::standardize_registration((string)self::getParameter('reg')) : null;
$payload = $this->getParametersAsArray();
unset($payload['token']);
try {
$summary = (new selfserve_wash_flow())->recordMachineStartWebhook($lane_id, $reg, $payload);
} catch (\RuntimeException $e) {
$response->error($e->getMessage(), 404);
}
(new logs_o())->add('relay', $plate_scanner->department_id->value(), 1, 0, 'TRIGGER_BUTTON_PRESS', 'Button was pressed on the machine with the plate scanner: ' . $plate_scanner->id . ' for lane ' . $lane_id);
$response->success([
'message' => 'Button press recorded.',
'scanner' => $plate_scanner->name->value(),
'lane_id' => $lane_id,
'selfserve' => $summary,
], 201);
};
$this->get('/relay/button/press/post', $handler, [
'add_button_press' => 'Add a button press'
]);
$this->post('/relay/button/press/post', $handler, [
'add_button_press' => 'Add a button press'
]);
}
private function resolveLaneId(plate_scanners_o $plateScanner): int
{
global $response;
if (self::isParametersSet(['lane_id'])) {
$lane = (new department_lanes_o())->select((int)self::getParameter('lane_id'));
if (!$lane->exists()) {
$response->error('Department lane not found', 404);
}
if ((int)$lane->department->value() !== (int)$plateScanner->department_id->value()) {
$response->error('The lane does not belong to the plate scanner department', 403);
}
return (int)$lane->id;
}
$lanes = (new department_lanes_o())->getDepartmentLanes((int)$plateScanner->department_id->value());
if (count($lanes) === 1) {
return (int)$lanes[0]->id;
}
$response->error('lane_id is required when the department has multiple self-serve lanes', 400);
}
}