/** * Presence Heartbeat * Records/updates that a user is at a specific business + service point. * Called on beacon scan + periodic heartbeat from the app. * * POST: { UserID: int, BusinessID: int, ServicePointID: int (optional) } */ response = { "OK": false }; try { requestData = deserializeJSON(toString(getHttpRequestData().content)); userID = val(requestData.UserID ?: 0); businessID = val(requestData.BusinessID ?: 0); servicePointID = val(requestData.ServicePointID ?: 0); if (userID == 0) apiAbort({ "OK": false, "ERROR": "missing_UserID" }); if (businessID == 0) apiAbort({ "OK": false, "ERROR": "missing_BusinessID" }); // Upsert presence (UNIQUE on UserID means one row per user) queryTimed(" INSERT INTO UserPresence (UserID, BusinessID, ServicePointID, LastSeenOn) VALUES (:userID, :businessID, :spID, NOW()) ON DUPLICATE KEY UPDATE BusinessID = VALUES(BusinessID), ServicePointID = VALUES(ServicePointID), LastSeenOn = NOW() ", { userID: { value: userID, cfsqltype: "cf_sql_integer" }, businessID: { value: businessID, cfsqltype: "cf_sql_integer" }, spID: { value: servicePointID > 0 ? servicePointID : javaCast("null", ""), cfsqltype: "cf_sql_integer", null: servicePointID <= 0 } }); apiAbort({ "OK": true }); } catch (any e) { apiAbort({ "OK": false, "ERROR": "server_error", "MESSAGE": e.message }); }