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/grants/list.cfm
John 16a3b7c9a3 Replace queryExecute with queryTimed across all endpoints for perf tracking
Converts 200+ endpoint files to use queryTimed() wrapper which tracks
DB query count and execution time. Restores perf dashboard files that
were accidentally moved to _scripts/. Includes portal UI updates.
2026-02-02 00:28:37 -08:00

112 lines
3.3 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>
data = {};
try {
raw = toString(getHttpRequestData().content);
if (len(trim(raw))) {
data = deserializeJSON(raw);
if (!isStruct(data)) data = {};
}
} catch (any e) { data = {}; }
businessID = val(data.BusinessID ?: 0);
role = lcase(trim(data.Role ?: "owner")); // "owner" or "guest"
statusFilter = structKeyExists(data, "StatusFilter") ? val(data.StatusFilter) : -1; // -1 = all
if (businessID LTE 0) {
// Fall back to request.BusinessID
businessID = val(structKeyExists(request, "BusinessID") ? request.BusinessID : 0);
}
if (businessID LTE 0) {
apiAbort({ "OK": false, "ERROR": "missing_businessid", "MESSAGE": "BusinessID is required." });
}
callerUserID = val(structKeyExists(request, "UserID") ? request.UserID : 0);
if (callerUserID LTE 0) {
apiAbort({ "OK": false, "ERROR": "not_authenticated" });
}
// Build WHERE clause based on role
if (role == "guest") {
whereClause = "g.GuestBusinessID = :bizId";
} else {
whereClause = "g.OwnerBusinessID = :bizId";
}
statusClause = "";
if (statusFilter >= 0) {
statusClause = " AND g.StatusID = :statusFilter";
}
sql = "
SELECT
g.ID AS GrantID,
g.UUID,
g.OwnerBusinessID,
g.GuestBusinessID,
g.ServicePointID,
g.StatusID,
g.EconomicsType,
g.EconomicsValue,
g.EligibilityScope,
g.TimePolicyType,
g.TimePolicyData,
g.CreatedOn,
g.AcceptedOn,
g.RevokedOn,
ob.Name AS OwnerBusinessName,
gb.Name AS GuestBusinessName,
sp.Name AS ServicePointName,
sp.TypeID AS ServicePointTypeID
FROM ServicePointGrants g
JOIN Businesses ob ON ob.ID = g.OwnerBusinessID
JOIN Businesses gb ON gb.ID = g.GuestBusinessID
JOIN ServicePoints sp ON sp.ID = g.ServicePointID
WHERE #whereClause##statusClause#
ORDER BY g.CreatedOn DESC
LIMIT 200
";
params = { bizId: { value = businessID, cfsqltype = "cf_sql_integer" } };
if (statusFilter >= 0) {
params.statusFilter = { value = statusFilter, cfsqltype = "cf_sql_integer" };
}
qGrants = queryTimed(sql, params, { datasource = "payfrit" });
grants = [];
for (row in qGrants) {
arrayAppend(grants, {
"GrantID": row.GrantID,
"UUID": row.UUID,
"OwnerBusinessID": row.OwnerBusinessID,
"GuestBusinessID": row.GuestBusinessID,
"ServicePointID": row.ServicePointID,
"StatusID": row.StatusID,
"EconomicsType": row.EconomicsType,
"EconomicsValue": row.EconomicsValue,
"EligibilityScope": row.EligibilityScope,
"TimePolicyType": row.TimePolicyType,
"TimePolicyData": row.TimePolicyData ?: "",
"CreatedOn": row.CreatedOn,
"AcceptedOn": row.AcceptedOn ?: "",
"RevokedOn": row.RevokedOn ?: "",
"OwnerBusinessName": row.OwnerBusinessName,
"GuestBusinessName": row.GuestBusinessName,
"ServicePointName": row.ServicePointName,
"ServicePointTypeID": row.ServicePointTypeID
});
}
writeOutput(serializeJSON({
"OK": true,
"Role": role,
"BusinessID": businessID,
"Count": arrayLen(grants),
"Grants": grants
}));
</cfscript>