This repository has been archived on 2026-03-21. You can view files and clone it, but cannot push or open issues or pull requests.
payfrit-biz/api/assignments/list.cfm
John Mizerek 428129a93e Add sharding support to beacon list and assignments APIs
For businesses using beacon sharding:
- beacons/list.cfm now returns ServicePoints with BeaconMinor as beacons
- assignments/list.cfm now shows sharding assignments (SP + Minor)
- Both APIs include USES_SHARDING flag and sharding info

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 12:34:49 -08:00

93 lines
3.1 KiB
Text

<cfsetting showdebugoutput="false">
<cfsetting enablecfoutputonly="true">
<cfcontent type="application/json; charset=utf-8" reset="true">
<cfheader name="Cache-Control" value="no-store">
<cfscript>
function apiAbort(obj) {
writeOutput(serializeJSON(obj));
abort;
}
if (!structKeyExists(request, "BusinessID") || !isNumeric(request.BusinessID) || request.BusinessID LTE 0) {
apiAbort({ OK=false, ERROR="no_business_selected" });
}
</cfscript>
<!--- Check if this business uses beacon sharding --->
<cfquery name="qBiz" datasource="payfrit">
SELECT BeaconShardID, BeaconMajor
FROM Businesses
WHERE ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#request.BusinessID#">
LIMIT 1
</cfquery>
<cfset usesSharding = qBiz.recordCount GT 0 AND val(qBiz.BeaconShardID) GT 0>
<cfset assignments = []>
<cfif usesSharding>
<!--- Sharding: assignments are ServicePoints with BeaconMinor --->
<cfquery name="qShard" datasource="payfrit">
SELECT UUID FROM BeaconShards WHERE ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#qBiz.BeaconShardID#">
</cfquery>
<cfset shardUUID = qShard.recordCount GT 0 ? qShard.UUID : "">
<cfquery name="qSharding" datasource="payfrit">
SELECT
sp.ID AS ServicePointID,
sp.BeaconMinor,
sp.Name AS ServicePointName
FROM ServicePoints sp
WHERE sp.BusinessID = <cfqueryparam cfsqltype="cf_sql_integer" value="#request.BusinessID#">
AND sp.BeaconMinor IS NOT NULL
AND sp.IsActive = 1
ORDER BY sp.BeaconMinor, sp.Name
</cfquery>
<cfloop query="qSharding">
<cfset arrayAppend(assignments, {
"ServicePointID" = qSharding.ServicePointID,
"BeaconID" = 0,
"BusinessID" = request.BusinessID,
"BeaconName" = qSharding.ServicePointName & " (Minor " & qSharding.BeaconMinor & ")",
"UUID" = shardUUID,
"Major" = qBiz.BeaconMajor,
"Minor" = qSharding.BeaconMinor,
"ServicePointName"= qSharding.ServicePointName,
"IsSharding" = true
})>
</cfloop>
<cfelse>
<!--- Legacy: assignments via ServicePoints.BeaconID -> Beacons --->
<cfquery name="q" datasource="payfrit">
SELECT
sp.ID AS ServicePointID,
sp.BeaconID,
sp.BusinessID AS BusinessID,
sp.AssignedByUserID,
b.Name AS BeaconName,
b.UUID,
sp.Name AS ServicePointName
FROM ServicePoints sp
JOIN Beacons b ON b.ID = sp.BeaconID
WHERE sp.BusinessID = <cfqueryparam cfsqltype="cf_sql_integer" value="#request.BusinessID#">
AND sp.BeaconID IS NOT NULL
ORDER BY b.Name, sp.Name
</cfquery>
<cfloop query="q">
<cfset arrayAppend(assignments, {
"ServicePointID" = q.ServicePointID,
"BeaconID" = q.BeaconID,
"BusinessID" = q.BusinessID,
"BeaconName" = q.BeaconName,
"UUID" = q.UUID,
"ServicePointName"= q.ServicePointName,
"IsSharding" = false
})>
</cfloop>
</cfif>
<cfoutput>#serializeJSON({ OK=true, ERROR="", COUNT=arrayLen(assignments), ASSIGNMENTS=assignments, USES_SHARDING=usesSharding })#</cfoutput>