Complete port of all 163 API endpoints from Lucee/CFML to PHP 8.3. Shared helpers in api/helpers.php (DB, auth, request/response, security). PDO prepared statements throughout. Same JSON response shapes as CFML.
116 lines
3.6 KiB
PHP
116 lines
3.6 KiB
PHP
<?php
|
|
require_once __DIR__ . '/../helpers.php';
|
|
runAuth();
|
|
|
|
$data = readJsonBody();
|
|
$beaconId = (int) ($data['BeaconID'] ?? 0);
|
|
|
|
if ($beaconId <= 0) {
|
|
apiAbort(['OK' => false, 'ERROR' => 'missing_beacon_id', 'MESSAGE' => 'BeaconID is required']);
|
|
}
|
|
|
|
$qBeacon = queryOne("
|
|
SELECT ID, Name, UUID, BusinessID FROM Beacons
|
|
WHERE ID = ? AND IsActive = 1 LIMIT 1
|
|
", [$beaconId]);
|
|
|
|
if (!$qBeacon) {
|
|
apiAbort(['OK' => false, 'ERROR' => 'not_found', 'MESSAGE' => 'Beacon not found or inactive']);
|
|
}
|
|
|
|
// Get businesses assigned to this beacon (via service points or join table)
|
|
$qAssignments = queryTimed("
|
|
SELECT sp.BusinessID, sp.ID AS ServicePointID, biz.Name AS BusinessName,
|
|
biz.ParentBusinessID, sp.Name AS ServicePointName
|
|
FROM ServicePoints sp
|
|
INNER JOIN Businesses biz ON biz.ID = sp.BusinessID
|
|
WHERE sp.BeaconID = ? AND sp.IsActive = 1
|
|
|
|
UNION
|
|
|
|
SELECT lt.BusinessID, 0 AS ServicePointID, biz.Name AS BusinessName,
|
|
biz.ParentBusinessID, '' AS ServicePointName
|
|
FROM lt_BeaconsID_BusinessesID lt
|
|
INNER JOIN Businesses biz ON biz.ID = lt.BusinessID
|
|
WHERE lt.BeaconID = ?
|
|
AND lt.BusinessID NOT IN (
|
|
SELECT sp2.BusinessID FROM ServicePoints sp2
|
|
WHERE sp2.BeaconID = ? AND sp2.IsActive = 1
|
|
)
|
|
|
|
ORDER BY ParentBusinessID IS NULL DESC, BusinessName ASC
|
|
", [$beaconId, $beaconId, $beaconId]);
|
|
|
|
// Check if any assigned business is a parent
|
|
$parentBusinessID = 0;
|
|
foreach ($qAssignments as $a) {
|
|
$childCount = queryOne("
|
|
SELECT COUNT(*) AS cnt FROM Businesses WHERE ParentBusinessID = ?
|
|
", [(int) $a['BusinessID']]);
|
|
if ($childCount && (int) $childCount['cnt'] > 0) {
|
|
$parentBusinessID = (int) $a['BusinessID'];
|
|
break;
|
|
}
|
|
}
|
|
|
|
$businesses = [];
|
|
|
|
if ($parentBusinessID > 0) {
|
|
$qParent = queryOne("
|
|
SELECT Name, HeaderImageExtension FROM Businesses WHERE ID = ?
|
|
", [$parentBusinessID]);
|
|
|
|
$qChildren = queryTimed("
|
|
SELECT ID, Name, ParentBusinessID, HeaderImageExtension
|
|
FROM Businesses WHERE ParentBusinessID = ? ORDER BY Name ASC
|
|
", [$parentBusinessID]);
|
|
|
|
$firstAssignment = $qAssignments[0] ?? [];
|
|
foreach ($qChildren as $child) {
|
|
$businesses[] = [
|
|
'BusinessID' => (int) $child['ID'],
|
|
'Name' => $child['Name'],
|
|
'ServicePointID' => (int) ($firstAssignment['ServicePointID'] ?? 0),
|
|
'ServicePointName' => $firstAssignment['ServicePointName'] ?? '',
|
|
'IsParent' => false,
|
|
'ParentBusinessID' => $parentBusinessID,
|
|
];
|
|
}
|
|
} else {
|
|
foreach ($qAssignments as $a) {
|
|
$businesses[] = [
|
|
'BusinessID' => (int) $a['BusinessID'],
|
|
'Name' => $a['BusinessName'],
|
|
'ServicePointID' => (int) $a['ServicePointID'],
|
|
'ServicePointName' => $a['ServicePointName'],
|
|
'IsParent' => empty($a['ParentBusinessID']) || (int) $a['ParentBusinessID'] === 0,
|
|
];
|
|
}
|
|
}
|
|
|
|
$response = [
|
|
'OK' => true,
|
|
'ERROR' => '',
|
|
'BEACON' => [
|
|
'BeaconID' => (int) $qBeacon['ID'],
|
|
'Name' => $qBeacon['Name'],
|
|
'UUID' => $qBeacon['UUID'],
|
|
],
|
|
'BUSINESSES' => $businesses,
|
|
'BUSINESS' => $businesses[0] ?? (object) [],
|
|
'SERVICEPOINT' => !empty($businesses) ? [
|
|
'ServicePointID' => $businesses[0]['ServicePointID'],
|
|
'Name' => $businesses[0]['ServicePointName'],
|
|
'IsActive' => true,
|
|
] : (object) [],
|
|
];
|
|
|
|
if ($parentBusinessID > 0) {
|
|
$response['PARENT'] = [
|
|
'BusinessID' => $parentBusinessID,
|
|
'Name' => $qParent['Name'] ?? '',
|
|
'HeaderImageExtension' => trim($qParent['HeaderImageExtension'] ?? ''),
|
|
];
|
|
}
|
|
|
|
jsonResponse($response);
|