payfrit-works/api/servicepoints/list.cfm
2025-12-28 22:34:01 -08:00

136 lines
3 KiB
Text

<cfsetting showdebugoutput="false">
<cfsetting enablecfoutputonly="true">
<cfcontent type="application/json; charset=utf-8">
<cfscript>
function apiAbort(payload) {
writeOutput(serializeJSON(payload));
abort;
}
// Resolve BusinessID tolerant MVP way
bizId = 0;
if (structKeyExists(request, "BusinessID") && isNumeric(request.BusinessID)) {
bizId = int(request.BusinessID);
}
if (bizId LTE 0) {
try {
raw = toString(getHttpRequestData().content);
if (len(trim(raw))) {
body = deserializeJSON(raw);
if (isStruct(body) && structKeyExists(body, "BusinessID") && isNumeric(body.BusinessID)) {
bizId = int(body.BusinessID);
}
}
} catch (any e) {}
}
if (bizId LTE 0 && structKeyExists(url, "BusinessID") && isNumeric(url.BusinessID)) {
bizId = int(url.BusinessID);
}
if (bizId LTE 0) {
apiAbort({ "OK": false, "ERROR": "missing_businessid", "DETAIL": "" });
}
try {
// Detect the correct business FK column in ServicePoints
qCols = queryExecute(
"
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'ServicePoints'
",
[],
{ datasource: "payfrit" }
);
cols = [];
for (r in qCols) arrayAppend(cols, r.COLUMN_NAME);
// Candidates in preferred order (add more if needed)
candidates = [
"BusinessID",
"BusinessId",
"ServicePointBusinessID",
"ServicePointsBusinessID",
"Business_ID",
"Business",
"BusinessFk",
"BusinessFK"
];
bizCol = "";
// First: exact candidate match
for (c in candidates) {
for (colName in cols) {
if (lcase(colName) EQ lcase(c)) {
bizCol = colName;
break;
}
}
if (len(bizCol)) break;
}
// Second: heuristic: any column containing "business" and "id"
if (!len(bizCol)) {
for (colName in cols) {
if (findNoCase("business", colName) && findNoCase("id", colName)) {
bizCol = colName;
break;
}
}
}
if (!len(bizCol)) {
apiAbort({
"OK": false,
"ERROR": "schema_mismatch",
"DETAIL": "Could not find a BusinessID-like column in ServicePoints. Available columns: " & arrayToList(cols, ", ")
});
}
// Build SQL using detected column name (safe because it comes from INFORMATION_SCHEMA)
sql = "
SELECT
ServicePointID,
ServicePointName
FROM ServicePoints
WHERE #bizCol# = ?
ORDER BY ServicePointName
";
q = queryExecute(
sql,
[ { value: bizId, cfsqltype: "cf_sql_integer" } ],
{ datasource: "payfrit" }
);
servicePoints = [];
for (row in q) {
arrayAppend(servicePoints, {
"ServicePointID": row.ServicePointID,
"ServicePointName": row.ServicePointName
});
}
writeOutput(serializeJSON({
"OK": true,
"ERROR": "",
"DETAIL": "",
"BusinessID": bizId,
"BusinessColumn": bizCol,
"COUNT": arrayLen(servicePoints),
"ServicePoints": servicePoints
}));
} catch (any e) {
apiAbort({
"OK": false,
"ERROR": "db_error",
"DETAIL": e.message
});
}
</cfscript>