Files
api/routes/bookingsRoute.php
T
Jepp9350 2a35b7ce4d Refactor pagination and filtering logic
Replaced redundant SQL queries with reusable methods for paginating, filtering, and searching records. Improved query safety using prepared statements and enhanced flexibility with dynamic order and filter processing. Updated related routes and objects to support the new structure.
2025-01-13 15:50:09 +01:00

162 lines
7.5 KiB
PHP

<?php
namespace routes;
use classes\authentication;
use classes\response;
use objects\bookings_o;
use objects\departments_o;
use objects\logs_o;
use traits\route_t;
class bookingsRoute
{
use route_t;
public function run(): void
{
/** All bookings */
$this->get('/bookings', function () {
// Require the user to be logged in
global
/** @var response $response */
$EMAIL_WASH_CERTIFICATE_TOKEN,
$response;
$this->requirePermission('list_bookings');
// Get the user object
$user = (new authentication())->get_user();
// Check if the request was successful
if ($user) {
// Log the incident
(new logs_o())->add('bookings', 'global', 1, $user->id, 'LIST_BOOKINGS', 'Successfully listed bookings');
// If the user has the permission to issue wash certificates, add the wash certificate key to the response
if ($user->hasPermission('issue_wash_certificates')) {
$response->add_meta('wash_certificate_token', $EMAIL_WASH_CERTIFICATE_TOKEN);
}
// Return the list of bookings
$response->success(
(new bookings_o())->listObjectsWithPaginationIfSet()
);
} else {
// Log the incident
(new logs_o())->add('bookings', 'global', 1, 0, 'LIST_BOOKINGS', 'No user found, or invalid session');
// Return an error
$response->error('Invalid session', 400);
}
});
/** Own bookings */
$this->get('/user/bookings', function () {
// Require the user to be logged in
global /** @var response $response */
$response;
$this->requirePermission('list_own_bookings');
// Get the user object
$user = (new authentication())->get_user();
// Check if the request was successful
if ($user) {
// Log the incident
(new logs_o())->add('bookings', 'global', 1, $user->id, 'LIST_OWN_BOOKINGS', 'Successfully listed own bookings');
// Return the list of departments
$response->success(
(new bookings_o())->getCustomerBookingsPaginated(
$user->customer_number->value(),
($this->fromRequest('page') ?? 1),
($this->fromRequest('limit') ?? 10),
['id' => 'DESC'],
$this->fromRequest('search') === null ? '' : $this->fromRequest('search'),
$this->fromRequest('filters') === null ? [] :
$response->parseFilters($this->fromRequest('filters')) ?? []
)
);
} else {
// Log the incident
(new logs_o())->add('bookings', 'global', 1, 0, 'LIST_OWN_BOOKINGS', 'No user found, or invalid session');
// Return an error
$response->error('Invalid session', 400);
}
});
// Synchronize booking from the external system
$this->post('/admin/bookings/sync', function () {
// Require the user to be logged in
global $response;
if ($this->fromRequest('auth_key') !== 'earm8BX4MFTgS6JCNQdqW5EzHUutv2Vx')
$this->requirePermission('sync_bookings');
// Check if the request was successful
$booking = [
'id' => $this->fromRequest('id'),
'customer_number' => $this->fromRequest('customer_number'),
'wash_type' => $this->fromRequest('wash_type'),
'contact_email' => $this->fromRequest('contact_email'),
'reference_number' => $this->fromRequest('reference_number'),
'regNrTraekker' => $this->fromRequest('regNrTraekker'),
'regNrTrailer' => $this->fromRequest('regNrTrailer'),
'washCertificateEmail' => $this->fromRequest('washCertificateEmail'),
'date' => $this->fromRequest('date'),
'department' => $this->fromRequest('department'),
'pickup_bool' => $this->fromRequest('pickup_bool'),
'notes' => $this->fromRequest('notes'),
'washCertificateStatus' => $this->fromRequest('washCertificateStatus'),
'washCertificateUrl' => $this->fromRequest('washCertificateUrl'),
'status' => $this->fromRequest('status'),
];
// Log the incident
(new logs_o())->add('bookings', 'global', 1, 0, 'SYNC_BOOKINGS', 'Successfully synced bookings');
// Add the booking, if it doesn't exist, update it if it does
(new bookings_o())->addOrUpdate(
(int)$booking['id'],
(int)$booking['customer_number'],
(string)$booking['wash_type'],
(string)$booking['contact_email'],
(string)$booking['reference_number'],
(string)$booking['regNrTraekker'],
(string)$booking['regNrTrailer'],
(string)$booking['washCertificateEmail'],
(string)$booking['date'],
(string)$booking['department'],
(string)$booking['pickup_bool'],
(string)$booking['notes'],
(string)$booking['washCertificateStatus'],
(string)$booking['washCertificateUrl'],
(string)$booking['status']
);
$response->success(
['message' => 'Successfully synced booking']
);
});
// Get a departments unfulfilled bookings (count) for the day
$this->get('/admin/bookings/department/count', function () {
// Require the user to be logged in
global $response;
$this->requirePermission('list_department_bookings_count');
// Get the user object
$user = (new authentication())->get_user();
// Check if the request was successful
if ($user) {
// Check if the department_id is set
if ($this->fromRequest('department_id') === null) {
$response->error('Department ID is required', 400);
}
// Check if the department id is a valid number
if (!is_numeric($this->fromRequest('department_id'))) {
$response->error('Department ID must be a number', 400);
}
// Check if the department exists
if (!(new departments_o())->selectId((int)$this->fromRequest('department_id'))->exists()) {
$response->error('Department not found', 404);
}
// Log the incident
(new logs_o())->add('bookings', 'global', 1, $user->id, 'LIST_DEPARTMENT_BOOKINGS_COUNT', 'Successfully listed department bookings');
// Return the list of departments
$response->success(
(new bookings_o())->getDepartmentBookingsUnfulfilledCount((int)$this->fromRequest('department_id'))
);
} else {
// Log the incident
(new logs_o())->add('bookings', 'global', 1, 0, 'LIST_DEPARTMENT_BOOKINGS_COUNT', 'No user found, or invalid session');
// Return an error
$response->error('Invalid session', 400);
}
});
}
}